Fab Forward Dev/

DDD ドキュメント

業務ルール集 / Business Rules

各ドメインの不変条件・ポリシー・ステート遷移ルールを集約。コード実装時はこのドキュメントのルールを検証ロジックとして反映すること。

見積・受注 (Quotation & Order)

見積・受注 (Quotation & Order)

IDルール種別説明

見積ルール

IDルール種別説明
Q-001見積合計 = 明細合計INV`quotation.totalAmount` = Σ `lines[].amount`
Q-002承認後のみ受注変換可POL`quotationStatus === 'approved'` が前提条件
Q-003改訂は追記のみINV改訂番号は単調増加。前版は読取専用になる
Q-004改訂時は全明細コピーPOL部分改訂は不可。全行を新版にコピーして編集
Q-005見積有効期限POL作成日から 30 日 (企業設定で変更可能)
Q-006否認は終端ステータスPOL否認された見積は改訂 (新版作成) でのみ再提出可能。否認→承認待ちの直接遷移は禁止
Q-007見積費目は区分マスタに準拠INV明細の費目は企業ごとの見積費目区分 (材料費・設計費・組付費・現地作業費 etc.) から選択
Q-008明細金額 = 数量 × 単価INV`lineAmount = quantity × unitPrice`。数量・単価いずれかの変更時に即時再計算
Q-009諸経費は自動計算POL品名が「諸経費」の行は `amount = Σ(他の全行amount) × overheadRate%`。率は得意先マスタの諸経費率を優先、未設定時はシステム既定値にフォールバック
Q-010得意先別単価の自動適用POL部品コード入力時、得意先別単価マスタ (見積単価区分) を検索し、該当あれば部品マスタ単価を上書き
Q-011見積保存時に得意先別単価を自動登録POL見積登録時に明細の単価を得意先別単価マスタに自動保存。次回以降の見積で参照される
Q-012承認には電子印と日時を記録INV承認時に承認者コードと承認日を必ず記録。否認時も同様
Q-013参照作成は新規扱いPOL既存見積をコピーして新規作成する場合、見積番号はクリアされ、ステータスは作成中にリセット。改訂番号は引き継がない
Q-014得意先変更時に既定値を再取得POL得意先コード変更時、受渡条件・支払条件・有効期限を得意先マスタから再取得。未設定の場合はシステム既定値にフォールバック
Q-015粗利・限界利益の自動計算INV`粗利 = 見積合計 - 原価合計`、`粗利率 = 粗利 / 見積合計 × 100`、`限界利益 = 見積合計 - 外部原価合計`、`限界利益率 = 限界利益 / 見積合計 × 100`
Q-016品名必須VAL明細行にデータが入力されている場合、品名 (`itemName`) は必須

受注ルール

IDルール種別説明
O-001見積なし受注は禁止POL必ず承認済み見積を経由して受注を作成
O-002受注番号は全社一意INV採番管理テーブルで prefix + auto-increment。番号体系は企業設定
O-003完了は全工程終了後POL全手配・全製作指示が完了するまで受注完了不可
O-004キャンセルは未着手分のみPOL着手済み手配・指示がある場合はキャンセル不可
O-005受注ステータスは売上連動POL「工事完了-未売上」→「工事完了-売上済」の遷移は売上計上によって自動遷移。手動での売上済みマークは不可
O-006工事完了ロックINV`completedDate` が設定されている受注は、手配入力・製作指示・実績入力のすべての編集操作を拒否する。関連画面のアクション (保存・確定・承認・発注・着手・完了・取消) をすべて無効化
O-007売上保存時に受注金額を自動更新POL売上登録時に `受注.売上金額 = Σ(売上明細金額)`、`受注.売上日 = MAX(売上日)` を自動更新。受注金額が 0 の場合は売上合計額で初期化

手配ルーティング & 外注手配 (Procurement Routing & Procurement)

手配ルーティング & 外注手配 (Procurement Routing & Procurement)

IDルール種別説明

手配ルーティング

IDルール種別説明
RT-001受注明細は手配品種別でルーティングPOL購入品 (`purchased_item`) → PurchaseOrder (外注手配)、製作品 (`fabricated_item`) → ProductionInstruction (製作指示)
RT-002社内部署は仕入先として登録可能POL内製加工を外注手配と同一フローで管理する場合、社内部署を仕入先 (`SupplierClassification.internal`) として扱う。原価は内部振替として計上
RT-003ルーティングは受注確定時に実行POL受注確定時に明細ごとの手配品種別に基づき PurchaseOrder / ProductionInstruction を自動生成。手動での振り分け変更も可能
RT-004ルーティングは3分岐INV手配品種別 (`procurementType`) + 社内外区分 (`internalExternal`) の組合せで保存先が決定: ①購入品 → PurchaseOrder (外注手配)、②製作品+社外 → PurchaseOrder (外注手配)、③製作品+社内 → ProductionInstruction (製作指示)。同一入力で異なる集約に書き込まれる
RT-005購入品に社内仕入先は不可VAL購入品の行に社内部署を仕入先として選択することは禁止
RT-006製作指示は社内仕入先のみVAL製作指示操作は製作品+社内の行のみ選択可能。購入品または製作品+社外の行が含まれる場合はエラー

外注手配ルール

IDルール種別説明
P-001発注済みは変更不可INV注文書発行後の手配データは凍結
P-002仕入先はマスタに存在INV仕入先マスタに存在チェック
P-003手配不要は受注直後のみPOL作業着手後に不要判定はできない
P-004分納可能POL1 つの手配に複数回の受入を許容
P-005手配品区分の設定必須INV材料 / 部品 / 購入品 / 外注のいずれかを指定。費目区分に連動
P-006注文書出力方法は仕入先依存POL紙 / FAX / メール / 出力なし を仕入先マスタで設定
P-007承認ワークフロー必須POL手配は作成→申請→確認→確定→承認→発注の承認フローを経る。金額閾値による承認スキップも企業設定で可能
P-008ステータスによるフィールド編集制御INV作成中・申請中: 全フィールド編集可。確定済: 納期・備考のみ編集可。承認済: 納期のみ編集可。発注済以降: 完全に読取専用
P-009確定には必須フィールド検証VAL確定 (確認→確定済) には図番・型式、仕入先、数量、納期がすべて必須
P-010承認には金額上限検証VAL承認 (確定済→承認済) には `amount <= approver.maxProcurementApprovalAmount` が必要。超過時はエラー
P-011承認は確定済のみINV承認操作は確定済の行に対してのみ実行可能
P-012発注は承認済のみINV発注操作は承認済の行に対してのみ実行可能
P-013手配金額 = 数量 × 単価INV`amount = quantity × purchaseUnitPrice`。数量・単価は小数2桁、金額は整数
P-014部品コード入力で価格履歴検索POL型式入力時、過去の受入実績から価格履歴をリアルタイム検索し候補表示。選択時に品番・品名・型式・材質・単価・仕入先を自動入力
P-015SEQ 採番規約INV手動追加行は SEQ >= 90000 を使用。Excel インポート行は SEQ < 90000。手動行のみ削除可能 (インポート行は削除不可)
P-016申請は作成中のみINV申請操作は作成中かつ手配不要でない行に対してのみ実行可能。数量必須・納期必須
P-017注文書は同一ユニットコード制約VAL注文書発行時、選択された明細はすべて同一のユニットコードに属する必要がある
P-018注文書番号にバーコード付与POL注文書発行時に `barcode = *{poNumber}*` (Code 39 形式) を自動生成
P-019一括設定POL選択された行に対して仕入先と納期を一括で設定可能 (バルク操作)

受入 (Goods Receiving)

IDルール種別説明
R-001受入数 <= 発注数VAL過剰入荷は警告 (ブロックではない)
R-002受入後は仕入自動計上POLGoodsReceipt → APReceipt を自動生成
R-003品質差異は記録必須POL数量・品質に差異がある場合は差異イベント発行
R-004受入単価は仕入先回答単価を優先POL仕入先の回答単価 (`quotedPrice`) が 0 でなければ発注単価 (`orderPrice`) より優先して使用
R-005受入数量の自動計算INV`receivingQty = Max(0, orderedQty - alreadyReceivedQty)`。初回受入時は発注数量全量、分納時は残数量
R-006受入で手配ステータスを自動遷移INV検収チェックON、または累計受入数量 >= 発注数量の場合 → ステータスを「検収済」に遷移 + 検収者コード・検収日を記録。それ以外は「受入済」に遷移
R-007受入時にマスタを自動生成POL受入登録時、部品マスタに該当品番が存在しなければ自動作成。単価マスタに該当がなければ自動作成。マスタの事前登録なしで受入可能
R-008受入単価ゼロは確認必須VAL納入単価が 0 の場合は確認ダイアログを表示 (ソフト警告、ブロックではない)
R-009半年経過ロックアウトPOL月次更新から 6 ヶ月以上経過した注文データは編集不可 (参照モードに強制)
R-010受入取消は受入済以降不可INVステータスが受入済以上の場合は取消不可。取消時は備考 (理由) 必須
R-011納入金額の累計計算INV`cumulativeAmount = previousCumulative - (prevQty × prevPrice) + (currentQty × currentPrice)`。数量・単価変更時に即時再計算

製作指示・作業日報 (Production)

IDルール種別説明
W-001日報は指示に紐付くINV製作指示なしの日報は禁止
W-002完了指示への日報禁止INV完了済み製作指示に日報を追加できない
W-003作業時間の自動計算 (休憩控除付き)INV`netMinutes = rawMinutes - breakOverlapMinutes`。rawMinutes = endTime - startTime (深夜跨ぎ時は +24h)。休憩時間はテナント設定の休憩区間ごとに作業時間との重複分を計算して控除。netMinutes が 0 の場合は rawMinutes にフォールバック (作業が休憩内に収まるケース)。結果は小数時間に変換 (分→時の変換は小数2桁で round-half-up)
W-004労務費 = 時間 × 単価INV`amount = workHours × employee.chargeRate`。ただし更新モード時は保存済み単価が 0 でなければ保存済み単価を使用 (過去の単価レートを保全)
W-0051 日 24h 上限VAL同一作業者の同日合計が 24h 超で警告
W-006残数量の自動計算INV`remainingQty = orderedQty - producedQty`。0 未満にならない (0 でフロア)
W-007完了時に累計実績を記録INV完了操作時に `totalProduced = 今回数量 + 前回までの累計`、最終単価、最終日を記録
W-008作業単価は社員マスタの時間単価INV製作実績の単価は担当者の社員マスタの時間単価 (chargeRate) から自動取得
W-009取消は完了前のみINV製作指示の取消は完了済みの場合は不可
W-010工事完了後の編集禁止INV受注の完了日が設定済みの場合、着手・完了・実績削除・指示取消のすべての操作を無効化 (O-006 と連動)
W-011作業区分による操作分岐POL作業区分「着手」→ ステータスを着手済に遷移、「完了」→ 完了済に遷移

売上・請求 (Sales & Billing)

売上・請求 (Sales & Billing)

IDルール種別説明
S-001検収金額 <= 受注金額VAL超過は警告 (分割検収の最終回で調整)
S-002検収合格後のみ売上計上POL検収 → 売上の順序は厳守
S-003売掛残高の整合性INV`残高` = `前期残` + `当期請求` - `当期入金` - `相殺`
S-004締日は得意先マスタ依存POL得意先マスタの締日設定で月次締め日を判定 (10日/15日/20日/25日/末日 等)
S-005入金消込は残高以内INV消込額が売掛残高を超過してはならない
S-006請求計算方法は得意先依存POL明細単位 (per_line) または合算 (aggregated) で税額計算。得意先マスタで設定
S-007端数処理は得意先依存POL四捨五入 / 切捨て / 切上げ を得意先マスタで個別設定。デフォルトは切捨て
S-008入金方法は区分マスタ準拠INV現金 / 銀行振込 / 小切手 / 手形 / 相殺 / 手数料 / 値引き / その他 から選択
S-009金額計算は得意先の端数処理に従うINV`amount = calcAmount(roundingPolicy, quantity, unitPrice)`: 四捨五入 (round) / 切捨て (floor) / 切上げ (ceiling)。得意先マスタの端数処理設定で決定
S-010売上保存時に受注金額を自動更新POL売上登録時に `order.salesAmount = Σ(売上明細金額)`、`order.salesDate = MAX(売上日)` を自動更新。受注金額が 0 の場合は売上合計額で上書き (O-007 と同一)
S-011更新モードでは得意先・売上番号変更不可INV既存売上の編集時、得意先コード・売上番号フィールドは読取専用になる
S-012納品書出力は得意先設定依存POL得意先マスタの納品書出力設定が「出力しない」の場合は納品書印刷をスキップ。請求書出力設定により請求書の同時発行も可能
S-013納品書の明細行数はタイプ依存POL納品書タイプ「納品書」の場合は 1 ページ 20 行、「納品書+受領書」の場合は 10 行
S-014売上行の削除は論理削除INV売上明細の削除は論理削除。削除時に受注金額も再計算
S-015受注番号は得意先に紐付くVAL売上明細の受注番号は入力中の得意先に属する受注のみ選択可能。存在しない場合はエラー
S-016入金登録時は得意先を先に選択VAL受注番号選択前に得意先が必須。得意先未選択で受注番号入力時はエラー
S-017入金種別は全種類同一フローPOL現金・手形・小切手・相殺・調整すべて同一の入力構造。種別による条件分岐なし

月次更新ルール (AR Closing)

IDルール種別説明
SC-001売上請求と売掛残高は別テーブルで管理INV売上請求 (Invoice) と売掛残高 (ARBalance) は別々に集計。入金の扱い方が異なる (手数料の分離 vs 包含)
SC-002期間は締日で決定INV売上請求は得意先ごとの締日、売掛残高はシステム全体の締日で期間を区切る。末日以外 (10日・20日・25日等) も対応
SC-003繰越残高は2ヶ月分保持INV前月残高と前々月残高の2世代を保持。`carryover = prevBalance - collections`
SC-004削除→再作成パターンINV月次更新は当月データを全削除してから再計算・再作成。冪等性のある再実行が可能
SC-005税額は2モードで計算INV得意先の税計算方法に従う: ①明細単位 → 各売上明細の日付で税率取得し行ごとに端数処理、②合算 → 期間合計にシステム税率を適用して一括端数処理
SC-006税率は日付依存INV税率は売上日 (明細単位時) または期末日 (合算時) で決定。税率変更 (例: 8%→10%) をまたぐ期間でも正確に計算
SC-007月次更新で得意先マスタを更新POL売上請求集計時に得意先マスタの請求日・請求残高を更新。売掛集計時は更新しない
SC-008売上・入金データにスタンプINV月次更新処理済みの売上・入金データに集計日をスタンプ。二重集計を防止
SC-009請求残高の計算式INV`invoiceBalance = carryover + periodSales + tax` (売上請求)。`arBalance = carryover + periodSales + tax` (売掛残高)。carryover の計算で入金の扱いが異なる

買掛・支払 (Accounts Payable)

買掛・支払 (Accounts Payable)

IDルール種別説明
A-001仕入 = 受入と 1:1INV受入実績 1 件に対し仕入 1 件
A-002費目はマスタに存在INVテナントの費目区分マスタに存在チェック
A-003買掛残高の整合性INV`残高` = `前期残` + `当期仕入` - `当期支払` - `相殺`
A-004支払日は仕入先マスタ依存POL仕入先マスタの締日・支払月オフセット (当月/翌月/翌々月/翌々々月) で支払予定日を算出
A-005支払方法は区分マスタ準拠INV銀行振込 / 手形 / 現金 / クレジットカード / 相殺 / 前払い 等から選択
A-006端数処理は仕入先依存POL仕入先マスタで個別の端数処理方法を設定。得意先と同様に四捨五入/切捨て/切上げ
A-007社内仕入先への支払は不可VAL社内部署 (内部振替用仕入先) への支払登録は禁止
A-008支払方法は全種類同一フローPOL銀行振込・手形・現金すべて同一の入力構造。手形固有の条件分岐なし

月次更新ルール (AP Closing)

IDルール種別説明
AC-001買掛残高は削除→再作成INVAR Closing と同じパターン。当月データを全削除してから再計算・再作成
AC-002支払は現金と手形に分離集計INV現金系支払 (手形以外) と手形支払を別々に集計。`carryover = prevBalance - (cashPayments + billPayments)`
AC-003仕入金額は受入ベースで計算INV仕入金額は受入実績 (GoodsReceipt) の `quantity × unitPrice` を行ごとに端数処理して合算。非課税品 (taxExempt=true) は税額計算から除外
AC-004税額は AR と同じ2モードINV仕入先の税計算方法に従う: 明細単位 (受入日で税率取得) または合算 (期末日の税率)。端数処理も仕入先依存
AC-005月次更新で仕入先マスタを更新POLAP Closing 時に仕入先マスタの支払日・支払残高を更新
AC-006買掛残高の計算式INV`apBalance = carryover + periodPurchases + tax`。carryover = 前月残高 - (現金支払 + 手形支払)

原価分析 (Cost Analysis)

IDルール種別説明
C-001実際原価 = 材料費 + 労務費INV`totalCost` = `materialCost` + `labourCost`
C-002粗利率の計算INV`profitMargin` = (`billing` - `totalCost`) / `billing`
C-003リスク判定基準POLgreen >= 20%, yellow >= 10%, red < 10%
C-004仕掛 = 原価 - 売上INV売上未計上の場合は原価全額が仕掛
C-005仕掛リスク = 原価 - 検収額×70%INV`wipRisk = totalCost - Round(billingAmount × 0.7, 0)`。検収額の 70% を回収見込み (整数に丸め) とし、原価との差額を仕掛リスクとして計上。未完了受注 (completedDate が未設定) のみ対象
C-006原価は費目別に動的列で集計INV外注原価は費目区分 (ExpenseCategory) ごと、製造原価は社内工程区分 (InternalProcessCategory) ごとに動的に列を生成して集計。ゼロ列は自動非表示
C-007得意先別年間原価は会計年度で集計INV受注金額は受注日ベース、仕入原価は受入日ベース、製造原価は作業日ベースで会計年度期間内をフィルタ。`grossProfit = orderAmount - (purchaseCost + manufacturingCost)`

営業CRM (Sales)

IDルール種別説明
CRM-001案件クロージングは不可逆POL受注/失注後のステージ変更は禁止
CRM-002確度は 0-100%INV`probability` は 0 以上 100 以下
CRM-003取引先削除は案件なし時のみPOLアクティブ案件が紐付く取引先は削除不可
CRM-004日報は 1 日 1 件INV同一ユーザー・同一日付の日報は 1 件のみ

採番・区分管理 (Numbering & Classifications)

IDルール種別説明
N-001採番は prefix + auto-incrementINV伝票番号は prefix (M/C/S/N/P/U/R/A/B etc.) + 連番。prefix は企業設定で変更可能
N-002採番管理テーブルで排他制御INV同時発行時の重複防止。`SELECT ... WITH(UPDLOCK)` で行ロック取得後 `UPDATE VALUE=VALUE+1` で採番。悲観的ロックによりギャップなしの連番を保証
N-003区分マスタはテナント単位POL単位・費目・支払方法・仕入先区分等のドロップダウン値はテナントが自由に設定可能
N-004区分コードは不変INV区分のコード (キー) は変更不可。名称の変更のみ許可。コード廃止時は論理削除

共通計算ルール (Cross-Cutting Calculation Rules)

IDルール種別説明
CALC-001端数処理は3モードINV①四捨五入 (round-half-up): `.5` は常にゼロから離れる方向に丸める (バンカーラウンドではない)。②切捨て (truncate): ゼロ方向に切捨て。③切上げ (round-up): ゼロから離れる方向に切上げ。正負両方で正しく動作
CALC-002税率は日付依存INV税率はテナント設定テーブルに有効日付閾値として保存。各閾値に対して閾値前レートと閾値後レートを保持。税率変更 (例: 5%→8%→10%) を時系列で正確に処理
CALC-003会計年度はテナント設定INV決算月 (`fiscalYearEndMonth`) を基準に会計年度を算出。`対象月 <= 決算月` の場合は `年 - 1`、それ以外は `年`。例: 決算月=3月の場合、2026年2月は2025年度
CALC-004締日期間の算出INV末日締め: 月初1日〜月末日 (2月は28/29日を正しく処理)。それ以外 (例: 20日締め): 前月の締日翌日〜当月の締日。得意先ごとに異なる締日を設定可能
CALC-005作業時間は小数時間で管理INV時刻 (HH:MM) を小数時間に変換。分の変換は `Floor(minutes/60 × 100 + 0.5) / 100` (小数2桁で round-half-up)。例: 8:30 → 8.50、1:45 → 1.75
CALC-006文字列幅はバイト単位INVDB カラム幅の検証は Shift_JIS バイト単位。ASCII=1バイト、全角=2バイト。CSV入出力も Shift_JIS エンコーディング

権限・アクセス制御 (Authorization)

IDルール種別説明
AUTH-001権限は画面単位POL画面 (機能) ごとにアクセスレベルを設定: 使用不可 / 参照のみ / 更新可
AUTH-002権限はロールベースPOLロール (権限コード) を社員に割り当て。1 社員 = 1 ロール
AUTH-003見積承認は金額閾値付きPOL社員マスタに見積承認権限 (有無フラグ) と見積最大承認金額を設定。見積合計が最大承認金額を超過する場合、その社員は承認不可
AUTH-004手配承認も金額閾値付きPOL社員マスタに手配承認権限 (有無フラグ) と手配最大承認金額を設定。手配金額が最大承認金額を超過する場合、承認・発注ともに不可
AUTH-005承認・確認には社員コードと日時を記録INV確認操作: 確認者コード + 確認日、承認操作: 承認者コード + 承認日、申請操作: 申請日をそれぞれ記録。監査証跡として変更不可

システム連携 (Integration)

IDルール種別説明
I-001顧客コードは Sales が採番POLSales がマスタオーナー。PMS は同期先
I-002製品コードは PMS が採番POLPMS がマスタオーナー。Sales はミラー
I-003イベントは冪等INV`event_id` による重複排除を受信側で実施
I-004コントラクト変更は合意必須POLIntegration Contracts の変更は両チーム合意
I-005受注変換は Deal.won 経由のみPOLSales → PMS の受注作成は案件クロージング経由
I-006区分マスタはテナント単位で同期POLテナント固有の区分値 (単位・費目・支払方法 等) は PMS → Sales へ同期