iT邦幫忙

2023 iThome 鐵人賽

DAY 28
0

有了載具發票之後,可以透過發票號碼、消費日期、載具條碼、載具驗證碼來查詢發票購買細項

通常這邊發票會很多(因為一個月通常會有很多發票),例如我昨天在發票表頭 API get_carrier_invoices_header 是一次抓去一個月份的發票,也因此我已經有大量的發票載具

像是我在今年五月總共有 24 張發票存在載具,因此一次會抓回 24 張。這時候非同步的方式會發揮威力,就不用一張一張等,舉裡可以一次丟 10 個 request。

https://ithelp.ithome.com.tw/upload/images/20230927/20114380AYIFtXFyQH.png

載具 - 載具發票詳細查詢

get_carrier_invoices_detail

@classmethod
@handle_exceptions
async def get_carrier_invoices_detail(cls):
    """
    載具 - 載具發票詳細查詢
    """
    data_dao = DataDao()
    conn = data_dao.conn
    query = {
        "tag": "invoice_carrier",
        "data.gov.status": "審查中",
    }
    invoices = await conn.find_all_async(query)
    logging.info("本次可更新發票張數為: {} 張".format(len(invoices)))
    await cls.process_chunks_with_semaphore(invoices, cls.process_carrier_invoice_detail, conn)
    conn.close()

process_carrier_invoice_detail

我們先透過 carrier_id 取得這張載具條碼和驗證碼

carrier_query = {"_id": ObjectId(my_inv["carrier_id"])}
carrier = conn.find_one(carrier_query)

接著就可以查詢載具細項 get_carrier_invoices_detail

而回傳的資訊做不同的處理與之前大同小異,詳細參考下方程式碼

try:
    # format invDate
    invDate = cls.date_format(my_inv["response"]["invDate"])
    # call API
    response = await asyncio.to_thread(
        twi.get_carrier_invoices_detail,
        CARD_TYPE,
        carrier["data"]["card_no"],
        my_inv["response"]["invNum"],
        invDate,
        decrypt_with_salt(carrier["data"]["card_encrypt"])
    )
    logging.info("response:{}".format(response))
except APIError as e:
    error_msg = str(e)
    error_code = error_msg.split()[0].strip('<>')
    error_msg = ' '.join(error_msg.split()[1:])
    if error_msg=="參數驗證碼錯誤":
        update_carrier_data = {
            "updated_timestamp": datetime.now(tz),
            "data.gov.status": "載具失效",
            "data.gov.gov_status": "[載具詳細]排程執行成功",
            "data.gov.error_msg": str(error_code) + str(error_msg),
        }
        update_invoice_data = {
            "updated_timestamp": datetime.now(tz),
            "data.gov.status": "載具失效",
            "data.gov.gov_status": "排程執行成功",
            "data.gov.error_msg": str(error_code) + str(error_msg),
        }
        conn.update_one(update_carrier_data)
    else:
        update_invoice_data = {
            "updated_timestamp": datetime.now(tz),
            "data.gov.status": "審查中",
            "data.gov.gov_status": "排程執行失敗",
            "data.gov.error_msg": str(error_code) + str(error_msg),
        }
except JSONDecodeError:
    update_invoice_data = {
        "updated_timestamp": datetime.now(tz),
        "data.gov.status": "審查中",
        "data.gov.gov_status": "排程執行失敗",
        "data.gov.error_msg": "JSONDecodeError",
    }
except Exception as e:
    update_invoice_data = {
        "updated_timestamp": datetime.now(tz),
        "data.gov.status": "審查中",
        "data.gov.gov_status": "排程執行失敗",
        "data.gov.error_msg": str(e),
    }
else:
    details = response["details"]
    if not "details" in response:
        update_invoice_data = {
            "updated_timestamp": datetime.now(tz),
            "data.gov.status": "資料異常",
            "data.gov.gov_status": "排程執行成功",
            "data.gov.error_msg": "沒有 detail",
        }
    else:
        update_invoice_data = {
            "updated_timestamp": datetime.now(tz),
            "data.gov.status": "已完成",
            "data.gov.gov_status": "排程執行成功",
            "data.gov.error_msg": "",
            "data.gov.response.details": details,
        }

https://ithelp.ithome.com.tw/upload/images/20230927/20114380i1jTCyS8ne.png

透過以上程式碼,我們就可以取得自己的發票囉!
大功告成,到這邊為止,我們已經成功取得紙本電子發票、載具發票!


上一篇
Day 27:設計查詢載具發票 DAG - 1
下一篇
Day 29:進行大量測試 發現重大問題!
系列文
透過 python 建立發票系統 - 自己的發票自己查30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言