假設要設計雲端載具系統,基本上會有會員資料、發票資料去紀錄資料。但其中的發票資料,我認為至少要用三張表格去儲存,分別為手動輸入的發票、財政部查詢的正確發票及購買細項。而會員資料假設我們已經創建好名稱為 user。
表格名稱:invoice_manual
Private key | Foreign key | Field | Type | Description | Source | Required | Default | Ref | ENUM | Error Msg |
---|---|---|---|---|---|---|---|---|---|---|
✅ | invoicesManual_id | string | 系統產手動發票 Id | |||||||
✅ | userId | string | userId | 前端 | ☑ | user | ||||
save_type | string | 存入方式 | 前端 | Barcode、QRcode | ||||||
invNum | string | 發票號碼 | 前端 | ☑ | ||||||
invDate | string | 發票日期 | 前端 | ☑ | ||||||
random_number | string | 隨機碼 | 前端 | |||||||
encrypt | string | QRcode 驗證 | 前端 | |||||||
sellerId | string | 賣家統一編號 | 前端 | |||||||
status | string | 狀態碼 | 後端改 | 審查中 | 審查中/未通過/已通過 |
名稱:invoice
Private key | Foreign key | Field | Type | Description | Source | Required | Default | Ref | ENUM | Error Msg |
---|---|---|---|---|---|---|---|---|---|---|
✅ | invoice_id | string | 系統產發票 Id | |||||||
✅ | userId | string | userId | 原本就有 | ☑ | user | ||||
save_type | string | 存入方式 | 原本就有 | ☑ | Barcode、QRCode、Carrier | |||||
random_number | string | 隨機碼 | 原本就有 | Barcode、QRCode 需要 | ||||||
invNum | string | 發票號碼 | 財政部 | ☑ | ||||||
cardNo | string | 載具條碼 | 財政部 | ☑ | 有可能因為是跨境會變成 email | |||||
cardType | string | 卡別 | 財政部 | ☑ | 5G0001:跨境、3J0002:手機、1K0001:悠遊卡、2G0001:iCash | |||||
sellerName | string | 賣家名稱 | 財政部 | ☑ | ||||||
invStatus | string | 發票狀態 | 財政部 | ☑ | 查詢中/已確認 | |||||
invDonatable | boolean | 可否捐贈 | ||||||||
☑ | ||||||||||
amount | float | 購買總金額 | 財政部 | ☑ | ||||||
invPeriod | string | 發票期別 | 財政部 | ☑ | ||||||
donateMark | boolean | 是否捐贈 | 財政部 | ☑ | ||||||
invDate | string | 發票日期 | 財政部 | ☑ | ||||||
sellerBan | string | 賣家統一編號 | 財政部 | ☑ | ||||||
sellerAddress | string | 賣家地址 | 財政部 | ☑ | ||||||
invoiceTime | string | 發票時間 | 財政部 | ☑ | ||||||
buyerBan | string | 買家統一編號 | 財政部 | ☑ | ||||||
currency | string | 幣別 | 財政部 | ☑ |
名稱:item
Private key | Foreign key | Field | Type | Description | Required | Default | Ref | ENUM | Error Msg |
---|---|---|---|---|---|---|---|---|---|
✅ | Item_id | string | 系統產細項 Id | ||||||
✅ | invoice_id | string | 發票 Id | invoice | |||||
description | string | 細項名稱 | |||||||
quantity | float | 數量 | |||||||
unitPrice | float | 單價 | |||||||
amount | float | 小計 |
ItemId | invoiceId | description | quantity | unitPrice | amount |
---|---|---|---|---|---|
AAAAAA | 1 | Subscription | 1 | 390 | 390 |
BBBBBB | 2 | 義美無加糖厚濃高纖黑豆奶 | 2 | 32 | 64 |
CCCCC | 2 | 低溫促 | 1 | 0 | -12 |
大概需要設計包含這幾項表格,但我認為使用關聯式設計發票資料有點複雜,如果要列出所有發票細項,要再去查詢另外一張表格。
用關聯式資料庫的時候,不但要先定義好所有的資料格式,並且在存入的時候也要事先定義好所有資料庫欄位,如下程式碼。
# 寫入 Invoice
new_invoice = Invoice(
fb_id=inv.fb_id,
invoice_manual_id=inv.invoiceManual_id,
save_type=inv.save_type,
invNum=response["invNum"],
sellName=response["sellerName"],
invStatus=response["invStatus"],
invDonatable=False,
amount=response["amount"],
invPeriod=response["invPeriod"],
donateMark=False,
invDate=response["invDate"],
sellerBan=response["sellerBan"],
sellerAddress=response["sellerAddress"],
invoiceTime=response["invoiceTime"],
buyerBan=response["buyerBan"],
currency=response["currency"],
random_number=inv.random_number,
status="審查中",
gov_status="排程執行成功",
error_msg="",
)
session.add(new_invoice)
session.commit()
往後要改動資料庫欄位需要亦要做資料庫遷移,我認為以小型專案的快速開發而言,可以先考慮用非關聯式資料庫比較好寫,明天將會說明如何改用 MongoDB 設計。