コンテンツにスキップ

ValueOS データモデル

位置づけ: クライアントERP(ValueOS)

本ページはValueOS(正本 github.com/stanaka-blip/valueos)の全テーブルをカタログとして一覧化する。概要・アーキテクチャが5本柱を軸にした構造の要約、業務フローが決済区分別の判定ロジックを扱うのに対し、本ページはテーブル単位の主キー・主要カラム・関連(外部キー)を網羅する参照ページである。

情報源はlib/database.types.ts(Supabase生成の型定義)・supabase/migrations配下のDDL・各テーブルの登録画面(app/**/new/page.tsx)のコードである。lib/database.types.tsは主要28テーブルを型定義済みだが、コメントに明記される通り「既存テーブルはライブスキーマから抽出した互換型」であり、外部キー制約・登録画面のコードから実在を確認できる関連テーブルが型定義の範囲外になお存在する。本ページは型定義済みの28テーブルに加え、そうした関連テーブルも含めて整理する。確認できた主要テーブルは39本である(別途、API側のレート制御専用テーブルが1本ある。本ページ末尾の「インフラ用テーブル」の節を参照)。

ValueOSの主キー設計は一貫している。全テーブルがUUID(idまたはrequest_id)を主キーに持ち、case_noVE-…)・order_noinvoice_noのような人間可読の業務番号は別列として保持する。当方のProduct.model(型番を主キーとする設計)やWholesaleCase.idW-XXXX形式の文字列を主キーとする設計)とは主キー設計の方針が異なる。詳細は当方データモデルとの対応を参照。

このページの対象はValueOSのテーブル構造(エンティティ・主キー・主要カラム・関連)である。決済区分別の発注可否・請求可否ロジック、三社間金銭フローの詳細な計算式は対象外とし、業務フローを参照する。当方CRMとの項目突合・機能差分の詳細は対象外とし、差分・突合を参照する。

データ(分類別テーブル一覧)

Section titled “データ(分類別テーブル一覧)”
テーブル主キー主要カラム関連
casesidcase_nodealer_idcustomer_name/customer_phonesite_addressorder_typeorder_received_datedesired_delivery_dateconstruction_desired_date/construction_completed_datestatusdepartmentassigned_userprioritydealersdealer_idでID参照)
case_productsidcase_idline_typeproduct_idpackage_idsupplier_idquantitypurchase_price/sales_price/gross_profit(価格スナップショット)、sales_price_id/purchase_price_id(採用した価格レコードの参照)、is_manual_priceprice_fetched_atcasesproductspackagessales_pricespurchase_prices
case_packagesidcase_idpackage_idquantitycase_product_idcase_productsとの1対1紐付)case_productspackages
case_package_itemsidcase_package_idproduct_idsource_package_item_idquantityunit_purchase_price/total_purchase_price(NULL可。案件登録時に価格未確定でも保存できる)、requirement_typeselection_group、商品名等のスナップショット列群、is_selected/is_added_manually/is_hiddencase_packagesproducts
tasksidcase_id(null可)、titlestatusdue_dateassigned_userprioritycases(null可=未紐付けを許容)
テーブル主キー主要カラム関連
sales_pricesiddealer_idprice_target_typePRODUCT/PACKAGE)、product_id/package_id、単価、is_activestart_date/end_datedealersproducts/packages
purchase_pricesidsupplier_idprice_target_typeproduct_id/package_idpurchase_price(単価)、is_activestart_date/end_datesuppliersproducts/packages

有効価格の判定条件は両テーブル共通で、is_active = trueかつstart_date <= 基準日かつ(end_dateが未設定またはend_date >= 基準日)を満たすレコードのうちstart_date降順の先頭1件を採用する。purchase_pricesdealer_id列はない(仕入価格は仕入先軸のみ)。基準日は原則order_received_date。金額はROUND(単価×数量)で保存し、画面プレビューは単価のみを返す。

テーブル主キー主要カラム関連
case_settlementsidcase_id(1対1)、settlement_type(正式値: 前金/売掛/3社間決済/カード)、fee_rate/fee_amountdeposit_rate/deposit_amountpayment_termscard_brand/card_status/card_status_updated_atfinance_company/approval_numberloan_status/loan_status_updated_atcases

settlement_typeは2026-08-01のマイグレーションで正規化済み。旧値「掛売」は「売掛」へ、「ローン」「三社間決済」は「3社間決済」へ移行し、「その他」はレガシー値として保持するが正式区分には含めない。判定ロジックの詳細は業務フローを参照。

テーブル主キー主要カラム関連
three_party_money_requestsrequest_idactioncase_idresource_idstatuspayload_hashresponsecases(3社間金銭アクションの冪等リクエスト表)
finance_receiptsidcase_idfinance_companyscheduled_date/scheduled_amountactual_date/actual_amountstatuscancelled_at/cancel_reasoncorrects_id(訂正元への自己参照)casesfinance_receipts(自己参照)
dealer_settlementsidcase_iddealer_idstatement_noissue_datefinance_receipt_idinvoice_idcredit_received_amountve_share_amountadjustment_total_amountpayout_amountscheduled_payout_date/actual_payout_date/actual_payout_amountstatuscorrects_idcasesdealersfinance_receiptsinvoicesdealer_settlements(自己参照)
dealer_settlement_linesiddealer_settlement_idsort_orderline_kindtransfer_fee/discount/offset/other等)、descriptionamountmemodealer_settlements
supplier_paymentsidcase_idsupplier_idorder_iddue_datescheduled_amountpaid_date/paid_amountstatuscancelled_at/cancel_reasoncorrects_idcasessuppliersorderssupplier_payments(自己参照)
paymentsidinvoice_idcase_idpayment_datepayment_amountpayment_methodpayer_namebank_accountstatus(確認待ち/入金確認済/取消)invoices

finance_receipts(信販会社からの入金)・dealer_settlements+dealer_settlement_lines(販売店への仕切精算)・supplier_payments(仕入先への支払)は、3社間決済の案件が持つ3系統の独立した金銭実体である。paymentsは既存の入金管理(前金・売掛向け)と独立しており、3社間決済では使わない。

テーブル主キー主要カラム関連
ordersidcase_idsupplier_idorder_noorder_dateexpected_delivery_datedelivered_dateorder_amountstatusmemocasessuppliers
order_itemsidorder_idproduct_idcase_product_idquantityunit_priceamountmemosort_orderordersproductscase_products
テーブル主キー主要カラム関連
invoicesidcase_idinvoice_noinvoice_datedue_dateinvoice_amountsubtotal_ex_tax/tax_amount(2026-08-07追加、NULL可)、statuscases
invoice_line_itemsidinvoice_idsort_orderline_kind(product/package/custom)、descriptionquantityunitunit_price_ex_tax/amount_ex_taxtax_ratecase_product_idsource_product_id/source_package_idinvoicescase_productsproducts/packages

請求明細はスナップショットであり、パッケージ内の構成商品は展開せず1行として計上する。

テーブル主キー主要カラム関連
productsidmanufacturer_idseries_idcategorymodel_nonamecapacityunitproduct_typespecificationprice_list_categorydefault_supplier_idis_activemanufacturersproduct_seriessuppliers
packagesidmanufacturer_idseries_idnamepackage_codecapacity/capacity_unitsystem_typewarranty_yearsspecificationpricing_methoddefault_supplier_idis_activemanufacturersproduct_seriessuppliers
package_itemsidpackage_idproduct_idquantityrequirement_typesort_orderpackagesproducts
manufacturersidnamecompany_typecontact_namephoneemailmemo
product_seriesidmanufacturer_idname、説明、is_activemanufacturers
suppliersidnamesupplier_typecontact_namephoneemailorder_method(発注方法)、closing_day(締日)、payment_site(支払サイト)、credit_limit(買掛上限)、memo
dealersidnamecontact_namephoneemailaddresspayment_typecredit_limit(与信枠)、sales_personmemo
contractorsidnamepostal_code/address/phonedelivery_name/delivery_address/delivery_phone(配送先)、receiver_namememois_active案件への外部キー・同期は持たない独立マスタ
company_settingsidboolean。単一行運用)company_namepostal_code/address/phone/fax/emailinvoice_registration_number(インボイス登録番号)、bank_name/bank_branch/bank_account_type/bank_account_number/bank_account_holder
staff_profilesidauth.users.idと一致)display_nameis_activeis_adminauth.users(emailはauth.users側を正式値とし本テーブルには持たない)

すべてrequest_id(UUID)を主キーとし、statuspayload_hash(入力の正規化ハッシュ)・error_code/error_messageresponse(結果JSON)・completed_atという共通カラム構成を持つ。書込はservice_role専用(RLSは無効化し、GRANT/REVOKEによるACLでPUBLIC/anon/authenticatedから権限を剥奪、service_roleにのみSELECT/INSERT/UPDATEを付与)。

テーブル対象RPC参照先(対象エンティティ)
case_registration_requestscreate_case_registration(案件新規登録)cases
case_line_append_requestsappend_case_line(既存案件への明細追加)casescase_productscase_packages
product_setup_requestscreate_product_setup(新規商品セットアップ)products
existing_product_price_setup_requestscreate_existing_product_price_setup(既存商品への価格追加)products
supplier_purchase_price_bulk_requestscreate_supplier_purchase_prices(仕入価格一括登録)suppliers
dealer_sales_price_bulk_requestscreate_dealer_sales_prices(販売価格一括登録)dealers
package_bulk_setup_requestscreate_package_bulk_setup(パッケージ+構成商品一括登録)manufacturers
product_bulk_setup_requestscreate_product_bulk_setup(商品一括登録)manufacturers
purchase_order_create_requestscreate_purchase_orders(発注一括作成。仕入先ごとにordersorder_itemsをトランザクション生成)cases
テーブル主キー主要カラム関連
case_attachmentsidcase_idattachment_typeoriginal_filenamecontent_typebyte_sizestorage_bucket/storage_pathuploaded_by_sid/uploaded_by_user_id/uploaded_by_labelis_activedeleted_at/deleted_by_sid/deleted_by_user_idcases
case_attachment_upload_intentsidattachment_idcase_idattachment_typeoriginal_filenamecontent_typedeclared_byte_sizestorage_bucket/storage_pathstatusexpires_atcompleted_atcasescase_attachments

ファイル本体はSupabase Storageの非公開バケットcase-attachmentsにDirect-to-Storageで保存し、case_attachmentsはメタデータのみを持つ。case_attachment_upload_intentsはアップロード発行から完了までの中間状態(署名URLの有効期限管理)を扱う。

gateway_rate_limits(主キーbucket_key)はAPIゲートウェイのレート制御専用テーブルであり、業務データを持たないため上記9分類の対象外とする。

erDiagram
cases ||--o| case_settlements : "1:1"
cases ||--o{ case_products : "line_type"
case_products ||--o{ case_packages : "内包"
case_packages ||--o{ case_package_items : "展開明細"
cases ||--o{ orders : "supplier_id別"
orders ||--o{ order_items : "明細"
cases ||--o{ invoices : "請求"
invoices ||--o{ invoice_line_items : "明細スナップショット"
invoices ||--o{ payments : "入金(複数可)"
cases ||--o{ three_party_money_requests : "3社間ledger"
cases ||--o{ finance_receipts : "信販入金"
cases ||--o{ dealer_settlements : "仕切精算"
dealer_settlements ||--o{ dealer_settlement_lines : "明細"
cases ||--o{ supplier_payments : "仕入先支払"
cases ||--o{ tasks : "case_id(null可)"
products }o--|| manufacturers : "manufacturer_id"
products }o--o| product_series : "series_id"
packages ||--o{ package_items : "構成部材"
products ||--o{ sales_prices : "dealer別価格"
products ||--o{ purchase_prices : "supplier別原価"

テーブル群と対応する主要画面の関係を示す。各画面の業務仕様は概要・アーキテクチャ、判定ロジックは業務フローを参照する。

画面領域対応テーブル群
app/casescasescase_productscase_packagescase_package_itemscase_settlements
app/ordersordersorder_items
app/invoicesinvoicesinvoice_line_items
app/paymentspayments
app/taskstasks
app/productsapp/packagesapp/seriesapp/manufacturersproductspackagespackage_itemsproduct_seriesmanufacturers
app/suppliersapp/dealersapp/contractorssuppliersdealerscontractors
app/pricesapp/sales-pricespurchase_pricessales_prices
app/dealer-settlementsdealer_settlementsdealer_settlement_lines
app/queues申請系テーブル全般(処理状況の監視)
app/dealer/orders/newcasescase_products/case_packages/case_package_itemscase_settlements(販売店発注の入口。現行はRPC非経由の直接INSERT)
app/settingsapp/staffapp/admincompany_settingsstaff_profiles
  • スナップショット設計: case_productscase_package_itemsinvoice_line_itemsは登録時点の価格・商品名をコピー保持する。マスタ側の価格・名称変更は既存の案件・請求データに影響しない。
  • 価格の有効判定: sales_pricespurchase_pricesとも、is_activeかつ有効期間内のレコードをstart_date降順で1件採用する。共通ロジックであり画面ごとの個別実装はない。
  • 申請系の冪等性: 申請系テーブルはすべてrequest_id(クライアント発行UUID)とpayload_hashにより、同一リクエストの再送を安全に処理する。書込権限はservice_roleに限定し、クライアントから直接INSERT/UPDATEはできない。
  • 訂正・取消の履歴保全: finance_receiptsdealer_settlementssupplier_paymentsは確定済み金額を直接UPDATEしない。訂正はcorrects_idで元レコードを参照する新規行、取消はcancelled_at/cancel_reasonの記録で扱い、常に履歴が残る。
  • 発注可否・請求可否の判定: case_settlements.settlement_typeを起点にWorkflowEngineが機械判定する。テーブル構造上の前提条件(例: 売掛の請求可否はorders全件のstatus/delivered_dateに依存)は本ページの各テーブルに現れるが、判定ロジックそのものは業務フローを正本とする。

社内ユーザーの認証はSupabase Authが担い、staff_profiles.is_activeis_adminでアカウント有効性・管理者権限を判定する。販売店発注フォーム(app/dealer/orders/new)は社内認証の外側にあり、案件系テーブルへ直接INSERTする(申請系の冪等RPC経路は現行未接続)。三社間金銭アクション・申請系RPCへの書込権限はservice_roleに限定する。これらのテーブルはRLSを無効化したうえでGRANT/REVOKEによるACLを用い、PUBLIC/anon/authenticatedからの権限を剥奪してservice_roleのみに書込を許可する方式であり、RLSポリシーによる制御ではない。

当方の新エンティティ全体像は先行スコープのデータモデルを参照。ValueOSとの構造的な対応は次のとおりである。

当方(/data-model/entities-phase1/ValueOS対応関係
WholesaleCasecases概ね一致。当方はIDW-XXXXが主キー、ValueOSはUUID主キー+case_no表示番号
WOrder/WInvoice/WPaymentWholesaleCaseに内包する配列)orders/invoices/payments(独立テーブル)構造差。ValueOSは番号・日付・金額を個別エンティティで保持し、当方はフラグ集約に近い内包配列
WholesalePrice(品目×仕入先の単一テーブル)sales_prices(販売店×商品/パッケージ)/purchase_prices(仕入先×商品/パッケージ)軸差。ValueOSは販売価格・仕入価格を別テーブルに分離し、対象を商品/パッケージで型分けする
WholesaleTasktasksフィールド構成が一致(case_idnull許容/statusdue_dateassigneepriority
EventCompany(代理店・名称一致でWholesaleCaseと結合)dealerscases.dealer_idでID参照)ValueOSはID参照、当方は名称一致。当方側の正規化課題
Suppliersuppliers概ね一致。ValueOSはorder_method/closing_day/payment_site/credit_limitなど経理項目を持ち、当方のSupplierマスタは薄い
Product(型番modelが主キー)products(UUID主キー+model_no列)主キー設計が異なる。ValueOSは型番変更をUUID固定のまま列更新で扱える
なし(決済区分はWholesaleCase.settlementに内包)case_settlements(案件と1対1の独立テーブル)ValueOSは決済詳細(手数料・頭金・カード情報・ローン情報)を専用テーブルに分離
なしthree_party_money_requestsfinance_receiptsdealer_settlements(+明細)/supplier_payments当方に対応エンティティなし。三社間の下流精算(信販入金・販売店仕切・仕入先支払)はValueOSのみが構造化済み

項目単位の詳細な突合・差分は差分・突合を正本とする。用語の対応表は用語統一を参照する。