コンテンツにスキップ

決済フロー

位置づけ: 第1弾(催事+アイテム+商社)

商社(卸)モジュールでは、卸案件(WholesaleCase)ごとに決済区分を1つ選択し、選択した区分に応じて工程列が確定する。工程は直列に進行し、直前工程が完了するまで発注・請求は行えない。発注可否・請求可否の判定、入金の分割消込、案件一覧・ダッシュボードのステータス集計は、いずれもこの工程列を単一のソースとして導出する。

決済区分は 前金 / 掛売 / 三社間 / カード / その他 の5値。元請案件(deals)とは別軸の案件(WholesaleCase)として管理し、案件作成時に決済区分を選択する。現行実装(wholesale.ts)は決済区分を変更する操作を持たず、案件作成時に選択した値をそのまま保持する。業務上決済区分の途中変更を許容するかどうかは未確定であり、後述「確認事項」を参照。

本ページはドメインロジック(crm_app/app/src/lib/wholesale.ts)を正として記述する。卸金額マスタ・販売店発注フォーム・パイプライン全体の仕様は features/wholesale を参照。

項目内容
対象卸案件(WholesaleCase)の決済区分・工程進行・発注ゲート・請求ゲート・入金消込
対象外卸金額マスタ、販売店発注フォーム、タスク(features/wholesale を参照)
情報源定例で確定した新要件(卸金額・発注管理・決済フロー・商社別軸)。正本は redesign/meeting-log
関連ページfeatures/wholesaleglossaryredesign/valueos-gap

卸案件は1件の中に発注・請求・入金を複数保持する集約構造とする。

エンティティ主キー主なフィールド役割
WholesaleCaseid(W-0001形式)dealer, settlement, approvalNo, items[], 進捗フラグ, memo卸案件の本体。工程進行の起点
WOrderidorderNo(PO-0001形式), orderDate, supplier, amount, status, deliveredDate発注の実体。1案件に複数保持可
WInvoiceidinvoiceNo(INV-0001形式), invoiceDate, dueDate, amount, status請求の実体。1案件に複数保持可
WPaymentidpaymentDate, amount, method入金の実体。1案件に複数保持可(分割入金)

WholesaleCase は工程進行を判定するための進捗フラグを持つ。フラグとエンティティ登録(発注書・請求書の追加)は連動して更新する。

フラグ意味対応する工程
settlementConfirmed決済条件の確定settlement
paymentReceived入金完了prepay / payment(同一フラグを共有)
ordered発注済order
delivered納品済deliver
invoiced請求済invoice

決済区分ごとに工程数が異なる。前金は4工程、掛売・その他は5工程、三社間・カードは4工程とする。三社間とカードは工程列そのものが完全に一致する。

決済区分工程数特徴
前金4入金確認後に発注する。VE(当方)のリスクを最小にする区分
掛売5先に発注し、全納品後に請求する(売りかけ)
三社間4審査完了(承認番号)で先に発注し、工事後にローン会社から入金される
カード4カード会社の承認で先に発注し、カード会社から入金される
その他5掛売と同一の工程列を使用する

工程は7種類のキーで定義し、settlement(決済条件確定)と approval(承認番号確認)は排他、prepay(前金入金確認)は前金のみ、invoice(販売店へ請求)は掛売・その他のみに登場する。担当は経理(settlement/approval/prepay/invoice/payment)と発注担当(order/deliver)の2ロールに限定する。

工程キー表示名担当完了条件登場する決済区分
settlement決済条件の確定経理settlementConfirmed = true掛売・前金・その他
approval審査OK(承認番号)の確認経理approvalNo が空文字でない三社間・カード
prepay前金の請求・入金確認経理paymentReceived = true前金
order商社/メーカーへ発注発注担当ordered = true全区分
deliver納品確認発注担当delivered = true全区分
invoice販売店へ請求経理invoiced = true掛売・その他
payment入金の消込経理paymentReceived = true掛売・三社間・カード・その他

区分別の工程順序は次のとおり。

決済区分STEP1STEP2STEP3STEP4STEP5
前金settlement(経理)prepay(経理)order(発注担当)deliver(発注担当)
掛売settlement(経理)order(発注担当)deliver(発注担当)invoice(経理)payment(経理)
三社間approval(経理)order(発注担当)deliver(発注担当)payment(経理)
カードapproval(経理)order(発注担当)deliver(発注担当)payment(経理)
その他settlement(経理)order(発注担当)deliver(発注担当)invoice(経理)payment(経理)

工程は配列順に直列進行し、未完了の先頭工程を常に「現在の工程」として扱う。スキップ・並行実行は行わない。

前金は末尾に独立した payment 工程を持たず、prepay の入金確認をもって金銭処理を完結させる。三社間とカードは工程配列が完全に同一であり、両者を区別するのは決済区分の値と approvalNo フィールドの内容のみである。prepaypayment はいずれも paymentReceived という同一のブール値で完了判定する。前金だけが prepay を、他区分だけが payment を持つため、判定上の衝突は生じない。

発注可否(canOrder)と請求可否(canInvoice)は、工程配列上の位置関係から機械的に判定する。画面はこの判定結果を表示するレイヤーであり、判定ロジック自体は持たない。

  • 発注ゲート: order より前の工程がすべて完了し、かつ未発注のときに true とする。
  • 発注ブロック時のメッセージは、未完了の直前工程名を含む動的な文言(例:「決済条件の確定が未完了」)とする。
  • 請求ゲート: invoice 工程を持つ区分(掛売・その他)でのみ判定し、invoice より前の工程がすべて完了し、かつ未請求のときに true とする。三社間・カード・前金は請求工程を持たないため、この判定自体が発生しない。
  • 請求ブロック時のメッセージは「納品などの前工程が未完了」という固定文言とする。
  • 画面では発注・請求ボタンにブロック理由をツールチップで表示し、ボタン文言を可否に応じて出し分ける。
決済区分発注(order)解放条件請求(invoice)解放条件備考
前金前金入金確認(prepay)完了後該当なし請求工程自体を持たない
掛売決済条件確定(settlement)後納品確認(deliver)完了後標準フロー
三社間承認番号確認(approval)後該当なし入金は payment 工程のみで判定
カード承認番号確認(approval)後該当なし三社間と同一構造
その他決済条件確定(settlement)後納品確認(deliver)完了後掛売と同一実装

入金管理(分割入金と残高消込)

Section titled “入金管理(分割入金と残高消込)”

1案件の payments[] に複数の入金を登録でき、残高消込方式で管理する。残高は保存された値ではなく、請求・入金の実額から都度計算する派生値とする。

関数計算内容
wholesaleBilled請求書(invoices)があればその合計、なければ品目合計(卸金額)を採用
wholesalePaid入金(payments)の合計
wholesaleBalancemax(0, wholesaleBilled − wholesalePaid)

請求書のステータスは 請求済 / 一部入金 / 入金済 の3値とする。payment 工程の完了判定は残高計算ではなく、案件単位の paymentReceived フラグで行う。入金(WPayment)は案件単位の配列として保持し、特定の請求書(WInvoice)に紐付ける識別子は持たない。複数請求がある案件での入金対応関係は、案件のメモ欄で管理する運用とする。

掛売は与信枠の範囲内で先に発注する区分と位置づけるが、与信枠を表すデータ項目は現行仕様に存在しない。案件のメモ欄に自由記述で残す運用とする。与信枠のデータ構造化は次節「確認事項」を参照。

三社間・カードは工程列の先頭に approval(承認番号確認)を置き、WholesaleCase.approvalNo という単一の任意文字列フィールドを両区分で共用する。承認番号の発行元(三社間=決済事業者、カード=カード会社)を区別する専用フィールドは持たず、区別は決済区分の値と案件メモに委ねる。承認番号の形式(桁数・書式)に対するバリデーションは行わない。

ステータスバケット(進捗ビュー)

Section titled “ステータスバケット(進捗ビュー)”

案件一覧・ダッシュボードは、現在の工程から自動導出する6バケットで集計・絞り込みを行う。バケットは手動変更の対象にしない。

バケット対応する工程
決済待ちsettlement, approval
発注待ちorder
納品待ちdeliver
請求待ちinvoice
入金待ちprepay, payment
完了全工程完了

区分ごとに通過するバケットの並びが異なる点に注意する。前金は「決済待ち → 入金待ち(prepay) → 発注待ち → 納品待ち → 完了」の順で、入金待ちを発注待ちより前に通過する。掛売・その他・三社間・カードは入金に相当する工程が末尾に来るため、この4区分と前金とではバケットの通過順が逆になる。三社間・カードは請求待ちを経由しない。

マイルストーン(発注・請求/入金の予定日)

Section titled “マイルストーン(発注・請求/入金の予定日)”

案件作成日(createdAt)を起点に、決済区分ごとのリードタイムで発注予定日・請求/入金予定日を投影し、タイムライン表示に用いる。実績(ordered・invoiced・paymentReceived が完了)が入るとマイルストーンは完了表示に切り替わる。

区分発注までのリードタイム金銭マイルストーンの種別
前金5日(ただし入金確認が発注より先に到来する)入金 → 発注の順
掛売1日発注 → 請求の順
三社間2日発注 → 入金の順
カード2日発注 → 入金の順
その他3日発注 → 請求の順

前金以外は「発注」の10日後に納品、その3日後に請求または入金が到来する想定でマイルストーンを算出する。前金のみ、入金確認マイルストーンを発注マイルストーンより前に置く。

ValueOSは決済区分を case_settlements.settlement_type で保持し、区分ごとに fee_rate / fee_amount(三社間の手数料)、deposit_rate / deposit_amount(頭金)、payment_terms(掛売の支払条件)、card_brand / card_status(カード)、finance_company / approval_number / loan_status(三社間)を専用カラムとして分離する。当方は同じ「承認番号確認」の情報を WholesaleCase.approvalNo という単一フィールドに集約しており、三社間とカードで発行元を区別する専用カラムは持たない。

発注可否・請求可否の判定は、ValueOSでは WorkflowEngine(canOrder / canInvoice)が担い、画面は表示レイヤーに徹する設計である。当方の wholesaleFlow(canOrder / canInvoice の判定と工程進行)はこの設計思想に沿っており、判定ロジックを工程配列から機械的に導出する点で対応する。

観点当方(WholesaleCase)ValueOS
決済区分settlement(5値)case_settlements.settlement_type
発注可否判定wholesaleFlow.canOrderWorkflowEngine.canOrder
請求可否判定wholesaleFlow.canInvoiceWorkflowEngine.canInvoice
発注実体orders[](WOrder)orders テーブル
請求実体invoices[](WInvoice)invoices テーブル
入金実体payments[](WPayment)payments テーブル
三社間・カードの専用項目approvalNo(単一・共用)finance_company / approval_number / loan_status(三社間)、card_brand / card_status(カード)

差分の全体像は redesign/valueos-gap を参照(同ページの発注・請求・入金に関する記述は、本ページで示すWOrder/WInvoice/WPaymentのエンティティ化が実装された後の内容に更新する必要がある)。

  • 与信枠(掛売)のデータ構造と、超過時の挙動(発注ブロック/警告のみ/前金への切替提案)
  • 承認番号の発行元区別(三社間/カード)を専用フィールドとして分離する要否
  • 前金における一部入金時の発注可否(現行は入金の有無のみを判定し、金額の充足は判定しない)
  • 決済区分の途中変更、および工程完了の取り消し(差し戻し)を許容する運用の要否
  • 請求ステータス(請求済/一部入金/入金済)の自動遷移の要否と実装位置
  • 同一バケット滞在日数の閾値超過を検知する滞留アラートの自動化要否
  • 担当ロール単位ではなく担当者個人単位で「自分の待ち」に絞るビューの要否