スコープ
Phase 1は「発注書と請求書を紙で回すのをやめる」ことだけを達成する。施工管理(写真・工程表・チャット)には手を出さない。電子署名・タイムスタンプ・電子帳簿保存法の完全対応はPhase 2に置くが、後から載せられるデータ構造を最初から作るのがPhase 1の隠れた要件。
Phase 1でやる
- マルチテナント基盤(元請テナント+協力会社アカウント)
- 取引先台帳と登録番号の自動検証(国税庁Web-API)
- 見積依頼 → 見積回答 → 相見積比較
- 発注(承認ルート付き)→ 注文請書 → 変更発注
- 検収(部分検収対応)
- 請求受領 → 発注・検収との3点突合 → 承認
- 支払一覧・全銀フォーマット出力・仕訳CSV出力
- 実行予算 vs 発注 vs 検収 vs 請求のリアルタイム粗利
- 帳票PDF自動生成(発注書・注文請書・支払通知書)
- 常用(人工)発注と日次の人工報告
- 材料支給・立替の控除と支払通知書
- 基本契約約款の版管理と同意取得
- スマートフォン対応(PWA)
Phase 1でやらない
- 電子署名・タイムスタンプ付与 Phase 2
- 電子帳簿保存法の完全要件充足・JIIMA認証 Phase 2-3
- 会計ソフトAPI連携(CSV出力までとする) Phase 2
- 施工管理(写真・工程表・図面・チャット) Phase 3
- ネイティブアプリ
- 顧客・営業管理(引合〜受注)
- 入金管理(元請が施主から受け取る側)
- 見積の自動評価・AI査定
後から作り直すと全データが対象になり地獄を見るため、以下は初期実装に含める。①物理削除の禁止(全テーブル論理削除+変更履歴テーブル)②生成PDFのSHA-256ハッシュ保存と原本の上書き禁止 ③取引先に「電子化の承諾」フラグと承諾日時の欄(建設業法の電子契約に必要)④全レコードに取引年月日・取引金額・取引先の検索用インデックス(電帳法の検索要件)。
受発注の業務フロー自体は建設業の商慣行であり、特定サービスの専有物ではない。一方で画面レイアウト・配色・アイコン・キャッチコピー・帳票の体裁を似せることは避ける。本書の配色(藍+山吹)、画面構成、機能名称はすべて独自案として起こしている。実装時も既存サービスのスクリーンショットを見ながら作らないこと。懸念が残る場合は着手前に弁護士・弁理士へ確認を。
ロールと権限
ロールは元請テナント側5種+協力会社側2種。承認権限だけはロールに固定せず、金額閾値つきの承認ルート設定(G-92)で個別に指定する。中小の元請では「社長が全部承認」から「500万超だけ社長」まで運用がばらつくため。
| 機能 | 管理者 | 経営者 | 工事担当 | 経理 | 閲覧のみ | 協力会社 管理者 | 協力会社 担当者 |
|---|---|---|---|---|---|---|---|
| 案件の作成・編集 | ○ | ○ | △ | — | — | — | — |
| 実行予算の編集 | ○ | ○ | △ | — | — | — | — |
| 取引先の登録・招待 | ○ | ○ | ○ | ○ | — | — | — |
| 見積依頼の送信 | ○ | ○ | △ | — | — | — | — |
| 見積回答の提出 | — | — | — | — | — | ○ | ○ |
| 発注の起票 | ○ | ○ | △ | — | — | — | — |
| 発注の承認 | 承認ルート設定で指定されたユーザーのみ | — | — | ||||
| 注文請書の提出 | — | — | — | — | — | ○ | — |
| 検収の登録 | ○ | ○ | △ | — | — | — | — |
| 請求書の提出 | — | — | — | — | — | ○ | ○ |
| 請求の承認 | ○ | ○ | — | ○ | — | — | — |
| 支払データ出力 | ○ | — | — | ○ | — | — | — |
| 原価・粗利ダッシュボード | ○ | ○ | △ | ○ | ○ | — | — |
| ユーザー・マスタ管理 | ○ | — | — | — | — | ○ | — |
| 監査ログ閲覧 | ○ | ○ | — | — | — | — | — |
協力会社ユーザーには自社宛の取引だけが見える。案件の予算額、他社の見積金額、粗利、他の協力会社の存在は一切見せない。相見積の宛先社数も見せない。ここが漏れると信用が即座に失われるため、テナント分離とは別にクエリ層でpartner_idを強制するガードを実装する。
業務フロー
Phase 1が扱う9ステップ。元請と協力会社が同じ1件のデータを交互に触るのが本システムの本体で、メールやFAXでの受け渡しは一度も発生しない。
画面一覧
全54画面。ただし全部を同時には作らない。A は最初に動く受発注ループを成立させる必須画面、B はPhase 1後半で足す画面。Aだけなら33画面で、これが実質のMVP境界。
本節には主要46画面を載せ、常用発注・控除・契約約款に関わる残り8画面は、設計の文脈が必要なため 09章〜12章の各末尾に置いた。
共通(C)
| ID | 画面 | 利用者 | 目的と主な要素 | 優先 |
|---|---|---|---|---|
| C-01 | ログイン | 全員 | メール+パスワード。ログイン後、ロールに応じて G-01 / P-01 へ振り分け。 | A |
| C-02 | パスワード再設定 | 全員 | メールリンク方式。トークン有効期限60分。 | A |
| C-03 | 招待受諾 | 協力会社 | 元請から届いた招待メールのリンクから、会社情報・登録番号・振込口座・パスワードを一度に設定する初回オンボーディング。ここの離脱率がサービスの生命線なので3画面以内に収める。 | A |
| C-04 | 通知一覧 | 全員 | 種別(依頼・承認・差戻し・期限)でフィルタ。未読バッジ。 | A |
| C-05 | アカウント設定 | 全員 | 氏名・メール・パスワード変更、メール通知のON/OFF。 | A |
| C-06 | 帳票プレビュー | 全員 | 生成PDFのモーダル表示・ダウンロード・再生成履歴。全画面から共通で呼ばれる。 | A |
元請 — ダッシュボードと案件(G-0x / G-1x)
| ID | 画面 | 利用者 | 目的と主な要素 | 優先 |
|---|---|---|---|---|
| G-01 | ダッシュボード | 元請全員 | 「自分が今やること」だけを出す。承認待ちn件/見積回答期限切れn件/未検収n件/請求突合差異n件のカード。下段に今月の発注額・請求額・支払予定額。ロールで表示カードを出し分け。 | A |
| G-10 | 案件一覧 | 元請全員 | 案件コード・名称・担当・工期・ステータス・契約金額・粗利率。担当者/ステータス/工期での絞込と保存済フィルタ。 | A |
| G-11 | 案件登録・編集 | 管理者・経営者・工事 | 案件コード(自動採番+手動上書き)、名称、施主、現場住所、工期、契約金額、担当者。 | A |
| G-12 | 案件詳細 | 元請全員 | タブ構成:サマリ/実行予算/発注/検収/請求/書類/履歴。上部に予算・発注・検収・請求・支払の5段プログレスバーを常時表示し、案件の資金状況を一目で出す。 | A |
| G-13 | 実行予算編集 | 管理者・経営者・工事 | 工種別の行編集(工種/内容/数量/単位/単価/金額)。Excel貼り付け対応、CSV取込、テンプレート保存。予算改定は版管理し、初回予算と最新予算の両方を残す。 | A |
| G-14 | 案件別原価・粗利 | 管理者・経営者・経理 | 工種行ごとに「予算 / 発注済 / 検収済 / 請求済 / 支払済」を横並び。予算超過行を山吹色で強調。着地見込粗利=契約金額 −(発注済+未発注予算)を表示。 | A |
| G-15 | 全社ダッシュボード | 経営者・管理者 | 案件別粗利率ランキング、月次の発注・請求推移、協力会社別の発注額。 | B |
元請 — 取引先(G-2x)
| ID | 画面 | 利用者 | 目的と主な要素 | 優先 |
|---|---|---|---|---|
| G-20 | 取引先一覧 | 元請全員 | 会社名・登録番号・適格/免税/要確認のバッジ・招待状態(未招待/招待中/利用中)・主要工種・当年発注額。 | A |
| G-21 | 取引先登録・編集 | 元請全員 | 登録番号を入力した瞬間に国税庁APIを叩き、公表されている法人名を自動で引いて入力欄に反映。不一致・失効はその場で警告。振込口座、支払条件(締日・支払サイト)、電子化の承諾状況。 | A |
| G-22 | 取引先詳細 | 元請全員 | 取引履歴(発注・請求・支払)、担当者一覧、登録番号の検証履歴、書類一覧。 | A |
| G-23 | 取引先招待 | 元請全員 | メールアドレス指定で招待送信・再送・取消。未受諾の一覧と経過日数。 | A |
| G-24 | 登録番号 検証結果 | 管理者・経理 | 月次バッチの結果一覧。失効・氏名変更を検知した取引先だけを上に出す。CSV一括検証も可。 | B |
元請 — 見積(G-3x)
| ID | 画面 | 利用者 | 目的と主な要素 | 優先 |
|---|---|---|---|---|
| G-30 | 見積依頼一覧 | 元請全員 | 案件・工種・回答期限・回答状況(3社中2社回答)・ステータス。期限超過を強調。 | A |
| G-31 | 見積依頼作成 | 管理者・経営者・工事 | 案件と工種を選び、明細(内容/数量/単位)と回答期限、図面等の添付、宛先を複数社まとめて指定。予算額は協力会社に送信しない(画面上でも別枠に置く)。 | A |
| G-32 | 見積依頼詳細 | 元請全員 | 宛先ごとの回答状況、督促送信、依頼内容の差替え(差替え時は全社に再通知)。 | A |
| G-33 | 見積比較 | 管理者・経営者・工事 | 明細行を縦、協力会社を横に並べた比較表。行ごとの最安値を強調、合計金額と予算差を表示。採用ボタンから G-41 に金額を引き継いで発注起票。 | A |
元請 — 発注・検収(G-4x / G-5x)
| ID | 画面 | 利用者 | 目的と主な要素 | 優先 |
|---|---|---|---|---|
| G-40 | 発注一覧 | 元請全員 | 発注番号・案件・協力会社・金額・ステータス・請書状況。ステータスタブ(下書き/承認待ち/発行済/承諾済/検収待ち/完了)。 | A |
| G-41 | 発注作成・編集 | 管理者・経営者・工事 | 見積からの引き継ぎ、明細行の予算工種への紐付けが必須。入力中に「この工種の予算残:¥1,240,000 → 発注後 ¥40,000」を常時表示し、マイナスになる場合はその場で警告し承認ルートを1段上げる。工期・支払条件・現場搬入先。 | A |
| G-42 | 発注詳細 | 元請全員 | 明細、帳票PDF、操作履歴タイムライン(誰がいつ承認・発行・請書受領したか)、関連する検収・請求へのリンク、変更発注の親子関係。 | A |
| G-43 | 変更発注作成 | 管理者・経営者・工事 | 元発注を複製して増減を入力。元発注との差分だけを金額表示し、口頭で流れがちな追加工事を必ずデータ化させる。承認ルートは金額の絶対値で判定。 | A |
| G-44 | 承認待ち一覧 | 承認者 | 自分が承認すべき発注・請求を1画面に集約。金額・予算残・申請者・コメントを見て一括承認。スマホでの操作を前提に、1件2タップで完結させる。 | A |
| G-50 | 検収一覧 | 元請全員 | 協力会社からの完了連絡が来た発注を上位に。未検収の経過日数を警告表示。 | A |
| G-51 | 検収登録 | 管理者・経営者・工事 | 発注明細ごとに検収数量を入力(全量/部分)。写真・書類の添付。部分検収を残高付きで扱うため、明細ごとに「発注数量 / 検収済 / 今回 / 残」を並べる。 | A |
| G-52 | 検収の一括登録 | 工事 | 月末に複数発注をまとめて全量検収するための一覧チェック方式。 | B |
元請 — 請求・支払(G-6x / G-7x)
| ID | 画面 | 利用者 | 目的と主な要素 | 優先 |
|---|---|---|---|---|
| G-60 | 請求一覧 | 経理・管理者・経営者 | 受領した請求の一覧。適格/区分記載のバッジ、突合結果(一致/差異あり)、承認状況、支払予定日。締日でのグルーピング。 | A |
| G-61 | 請求詳細・承認 | 経理・管理者・経営者 | 請求と発注・検収の3点突合結果を上部に固定表示し、差異金額と差異行を弁柄色で名指しする。承認・差戻し(理由必須)。差戻しは協力会社に即時通知。 | A |
| G-62 | 請求の代理登録 | 経理 | システムを使わない取引先の紙請求書を元請側で代理入力する逃げ道。これが無いと導入初期に必ず詰まる。 | A |
| G-70 | 支払一覧 | 経理・管理者 | 支払予定日ごとの一覧。振込先口座・金額・源泉/相殺(材料支給・立替)の控除行。支払予定日の一括変更。 | A |
| G-71 | 支払データ出力 | 経理・管理者 | 対象を選んで全銀フォーマット(総合振込)、仕訳CSV、支払通知書PDFを出力。出力済フラグと出力履歴を持ち、二重振込を防ぐ。 | A |
| G-72 | 支払消込 | 経理 | 振込実行後の消込。銀行明細CSVの取込による自動消込はPhase 2。 | B |
元請 — 設定(G-9x)
| ID | 画面 | 利用者 | 目的と主な要素 | 優先 |
|---|---|---|---|---|
| G-90 | 自社情報設定 | 管理者 | 会社名・住所・登録番号・建設業許可番号・ロゴ・角印画像・振込元口座。 | A |
| G-91 | ユーザー管理 | 管理者 | 招待・ロール変更・無効化。無効化は削除ではなくdisabled_atで行い、過去の承認履歴を保持する。 | A |
| G-92 | 承認ルート設定 | 管理者 | 金額閾値ごとの多段承認(例:〜50万=工事長、〜300万=部長、超=社長)。予算超過時の強制ルートを別途指定。 | A |
| G-93 | マスタ管理 | 管理者 | 工種、単位、税区分(10% / 軽減8% / 不課税)、支払条件、締日、勘定科目の対応表。 | A |
| G-94 | 帳票テンプレート | 管理者 | 発注書・注文請書・支払通知書のロゴ位置・注記文言・約款のカスタマイズ。 | B |
| G-95 | 監査ログ | 管理者・経営者 | 操作者・日時・対象・変更前後の値。期間とユーザーで絞込、CSV出力。 | B |
協力会社(P)
協力会社側は画面数を極限まで減らす。現場から片手のスマホで操作する前提で、1画面1アクションに徹する。
| ID | 画面 | 利用者 | 目的と主な要素 | 優先 |
|---|---|---|---|---|
| P-01 | ダッシュボード | 協力会社全員 | 「やること」だけの縦1列。見積依頼n件/未提出の請書n件/完了連絡できる工事n件/請求できるn件/差戻しn件。それ以外は置かない。 | A |
| P-10 | 見積依頼一覧 | 協力会社全員 | 元請名・案件・工種・回答期限。期限順。 | A |
| P-11 | 見積回答 | 協力会社全員 | 明細に単価を入れるだけで合計と消費税が自動計算。一式計上、工期の申し出、コメント、辞退ボタン。下書き保存可。 | A |
| P-20 | 発注一覧 | 協力会社全員 | 自社宛の発注のみ。ステータス(請書未提出/施工中/検収済/請求済/入金済)。 | A |
| P-21 | 発注詳細・請書提出 | 協力会社管理者 | 発注書PDFの確認 →「承諾して請書を出す」1ボタン。内容に相違があれば差戻し依頼(理由必須)。Phase 2でここに電子署名が入る。 | A |
| P-30 | 完了連絡 | 協力会社全員 | 全量完了/出来高(%または数量)を選んで送信。写真添付は任意。現場から30秒で終わることが要件。 | A |
| P-40 | 請求作成 | 協力会社全員 | 検収済の明細から請求書を自動生成し、協力会社は締日と金額を確認して出すだけ。登録番号・税率ごとの区分・税額は自社設定から自動で埋まるため、適格請求書の要件不備が構造的に起きない。 | A |
| P-41 | 請求一覧 | 協力会社全員 | 提出済・承認済・支払予定日・入金済のステータス確認。「いつ入るか」が見えることが協力会社側の最大の導入動機になる。 | A |
| P-50 | 自社情報設定 | 協力会社管理者 | 会社名・住所・登録番号(入力時に国税庁APIで検証)・振込口座・担当者。 | A |
| P-51 | ユーザー管理 | 協力会社管理者 | 自社の職長・事務担当の追加。 | B |
| P-52 | 取引元請一覧 | 協力会社管理者 | 複数の元請から招待された場合の切替。ネットワーク効果の入口なので構造だけはPhase 1で作る。 | A |
ER図
取引の骨格となる16テーブル。見積 → 発注 → 検収 → 請求 → 支払が左から右へ一本の鎖でつながり、それぞれが明細テーブルを1つ持つ対称構造にしてある。協力会社は下段から3箇所に参照されるバスとして描いた。
trades / tax_categories / payment_terms / approval_routes)、協力会社の付随テーブル(partner_users / partner_invitations / invoice_reg_checks)、および全レコードを対象とするポリモーフィック横断テーブル(approvals / documents / attachments / notifications / audit_logs、いずれも target_type + target_id で紐づく)。設計上の要点は右下の破線。
po_items.budget_item_id が発注明細を実行予算の行に直結させており、これが「予算残の即時表示」と「案件別粗利」を成立させる唯一の経路。ここを NULL 許容にすると粗利が合わなくなるため必須制約にする。テーブル定義
主要テーブルの列定義。id(UUID)、tenant_id、created_at / updated_at / created_by / updated_by、deleted_at(論理削除)は全テーブル共通のため以下では省略する。金額はdecimal(14,2)、数量はdecimal(14,3)で統一する(浮動小数点は使わない)。
組織・取引先
| テーブル | 主な列 | 備考 |
|---|---|---|
| tenants | name / corporate_no / reg_no / address / license_no / logo_url / seal_url / closing_day / plan | 元請1社=1テナント。license_noは建設業許可番号で、発注書への記載に使う。 |
| tenant_users | email / name / role / disabled_at / last_login_at | role = admin / executive / site / accounting / viewer。削除はせずdisabled_at。 |
| partners | name / reg_no / reg_status / reg_checked_at / reg_name_official / address / bank_* / payment_term_id / econtract_agreed_at / invited_state | reg_status = qualified(適格)/ exempt(免税)/ invalid(失効・不一致)/ unchecked。econtract_agreed_atはPhase 2の建設業法対応で必須になる承諾日時を先に確保しておく列。 |
| partner_users | partner_id / email / name / role / disabled_at | role = admin / member。請書の提出はadminのみ。 |
| partner_invitations | partner_id / email / token / expires_at / accepted_at | トークンは単回使用。有効期限14日。 |
| invoice_reg_checks | partner_id / reg_no / checked_at / result / name_official / registered_on / revoked_on / raw_response | 国税庁APIの生レスポンスを丸ごと保存する。後日の税務調査で「いつ時点で適格と確認したか」の証跡になる。 |
案件・予算
| テーブル | 主な列 | 備考 |
|---|---|---|
| projects | code / name / client_name / site_address / starts_on / ends_on / contract_amount / manager_id / status | status = planning / in_progress / completed / closed。 |
| budget_versions | project_id / version_no / approved_at / note | 予算改定の版管理。初回版と最新版の差が「予算増減」として粗利分析に効く。 |
| budget_items | budget_version_id / project_id / trade_id / description / qty / unit / unit_price / amount / sort_no | 粗利計算の基準行。ここに発注明細がぶら下がる。 |
| trades | tenant_id / name / code / sort_no | 工種マスタ。仮設・土工・基礎・木工事…など。 |
見積
| テーブル | 主な列 | 備考 |
|---|---|---|
| quote_requests | project_id / trade_id / title / description / due_at / status / issued_at | status = draft / sent / closed / cancelled。 |
| quote_request_items | quote_request_id / description / qty / unit / sort_no | 単価は空で送る。数量は元請が指定する。 |
| quote_request_targets | quote_request_id / partner_id / notified_at / status | 宛先社ごとの状態。他社の存在を協力会社に見せないため、このテーブルへのアクセスは元請ロールに限定する。 |
| quotes | quote_request_id / partner_id / total_amount / valid_until / lead_time_days / note / status / submitted_at | status = draft / submitted / awarded / rejected / declined。 |
| quote_items | quote_id / quote_request_item_id / qty / unit / unit_price / amount | 依頼明細と1:1で対応させ、比較表を機械的に組めるようにする。 |
発注・検収
| テーブル | 主な列 | 備考 |
|---|---|---|
| purchase_orders | po_no / project_id / partner_id / quote_id / parent_po_id / title / starts_on / ends_on / subtotal / tax_amount / total_amount / status / issued_at / accepted_at / payment_term_id | parent_po_idが入っているものが変更発注。親子の合計が案件の発注総額になる。po_noはテナント内で一意、変更発注は-1のような枝番。 |
| purchase_order_items | po_id / budget_item_id / description / qty / unit / unit_price / amount / tax_category_id / inspected_qty / invoiced_qty | budget_item_idはNOT NULL。inspected_qty / invoiced_qtyは集計結果のキャッシュ列で、部分検収の残量判定を高速化する。 |
| inspections | po_id / inspected_on / inspector_id / kind / total_amount / status / note | kind = partial / final。finalが登録されると発注が検収完了になる。 |
| inspection_items | inspection_id / po_item_id / qty / amount | 検収数量の累計が発注数量を超えないことをDB制約とアプリ両方で担保する。 |
| completion_reports | po_id / partner_user_id / reported_on / progress_rate / note | 協力会社からの完了連絡(P-30)。検収の起票トリガーになるだけで、金額は持たない。 |
請求・支払
| テーブル | 主な列 | 備考 |
|---|---|---|
| supplier_invoices | invoice_no / po_id / partner_id / project_id / reg_no_snapshot / is_qualified / billing_period_from / billing_period_to / subtotal_by_rate / tax_by_rate / total_amount / status / submitted_at / approved_at / payment_batch_id / scheduled_pay_on | reg_no_snapshotとis_qualifiedは提出時点の値を固定保存する。後に取引先が失効しても、過去の請求の適格性判定は変わってはいけない。subtotal_by_rate / tax_by_rateはJSONで税率別に保持。 |
| supplier_invoice_items | invoice_id / po_item_id / inspection_item_id / description / qty / unit_price / amount / tax_rate | 検収明細から生成する。手入力を許すのは代理登録(G-62)の場合のみ。 |
| invoice_deductions | invoice_id / kind / description / amount | 相殺行。kind = material(材料支給)/ advance(立替)/ retention(保留金)/ other。支払額=請求額−控除。 |
| payment_batches | tenant_id / pay_on / closing_on / total_amount / status / exported_at / exported_by / file_hash | exported_atが入ったバッチは編集不可。二重振込の防止はここが要。 |
横断
| テーブル | 主な列 | 備考 |
|---|---|---|
| approval_routes | tenant_id / target_type / min_amount / max_amount / step_no / approver_id / is_budget_over_route | 金額帯 × 段数で承認者を決める。予算超過専用ルートを別に持てる。 |
| approvals | target_type / target_id / step_no / approver_id / result / comment / acted_at | result = pending / approved / rejected。差戻し理由は必須。 |
| documents | target_type / target_id / kind / file_url / sha256 / generated_at / version_no | 生成PDFの原本。上書き禁止、再生成は新バージョン。sha256がPhase 2の改ざん防止要件にそのまま接続する。 |
| attachments | target_type / target_id / file_url / file_name / size / uploaded_by | 図面・写真などの添付。 |
| notifications | recipient_type / recipient_id / kind / target_type / target_id / read_at / mailed_at | アプリ内通知とメール送信を1本で管理する。 |
| audit_logs | actor_type / actor_id / action / target_type / target_id / before / after / ip / ua | 金額・ステータス・承認に関わる操作は全件記録。before / afterはJSON。 |
ステータス遷移
本システムの実装量の半分はここに集中する。どの状態で誰が何を編集できるかを先に固めないと、後から必ず「承認後に金額が書き換わる」事故が出る。原則として承認済以降のレコードは編集不可とし、金額を変えたい場合は変更発注または差戻しで対応する。
発注(purchase_orders)
draftのみ。pending以降で内容を変えたい場合は差戻すか、accepted以降なら変更発注(親子関係を持つ新規レコード)を起こす。承諾済に到達した発注は取り消せない——協力会社が請書を出した時点で契約が成立しているため、システム上も同じ扱いにする。部分検収の間はacceptedのままpartially_inspectedフラグを立て、最終検収でinspectedへ移す。請求(supplier_invoices)
submittedに入った瞬間に3点突合が自動実行され、差異があればreviewing画面の先頭に差異行が提示される。approved以降は協力会社側からも元請側からも金額を変更できず、訂正が必要なら差戻して赤伝を起こす。差戻しは協力会社にとって最も不快な体験なので、理由をテンプレートから選ばせたうえで自由記述を必須にし、どの明細行が問題かを必ず指し示す。その他のステータス
| 対象 | 状態 | 遷移の条件 |
|---|---|---|
| quote_requests | draft → sent → closed / cancelled | 1社でも採用されたらclosed。回答期限を過ぎても自動では閉じず、督促対象として残す。 |
| quotes | draft → submitted → awarded / rejected / declined | 元請が1社を採用した時点で、同一依頼の他社は自動的にrejected。不採用の通知は必ず出す(出さないと次から見積が返ってこなくなる)。 |
| projects | planning → in_progress → completed → closed | closedは全発注がpaidになった後に手動で締める。締めた案件は編集不可。 |
| partners | reg_status: unchecked → qualified / exempt / invalid | 登録時と月次バッチで更新。invalidになった取引先には発注時に警告を出すが、ブロックはしない(免税事業者との取引自体は適法であり、システムが取引可否を判断してはいけない)。 |
| payment_batches | draft → confirmed → exported → settled | exportedで編集ロック。取り消す場合は理由を残して新バッチを起こす。 |
主要ロジック仕様
8.1 登録番号の自動検証
国税庁の適格請求書発行事業者公表システムはWeb-APIを無償公開している(利用にはアプリケーションIDの事前申請が必要)。登録番号を渡すと、公表されている氏名・名称、登録年月日、失効年月日、所在地が返る。
- 即時検証:G-21・P-50で登録番号を入力した瞬間に照会し、公表名称を取得して入力欄へ反映。手入力の社名と食い違う場合はその場で警告する。
- 月次バッチ:全取引先を毎月1日に再照会。失効・名称変更を検知したら管理者と経理に通知し、G-24に一覧化する。
- スナップショット:請求提出時に
reg_no_snapshotとis_qualifiedを請求レコードへ固定保存する。取引先が後から失効しても、過去の請求の判定は不変。 - フォールバック:API障害時は
uncheckedのまま処理を続行させ、業務を止めない。未検証件数はダッシュボードに出す。
8.2 消費税と端数処理
適格請求書では、1つの請求書につき、税率ごとに1回だけ端数処理を行う。明細行ごとに消費税を計算して積み上げる実装は要件を満たさない。したがって明細(supplier_invoice_items)は税抜金額と税率のみを保持し、消費税額は請求書単位で税率別に集計してから端数処理する。端数処理の方法(切捨て・切上げ・四捨五入)はテナント設定とし、tenantsに持つ。
計算順序を明示する。① 明細を税率(10% / 軽減8% / 不課税)でグループ化し、税抜金額を合計 → ② 各グループの合計額に税率を乗じ、そこで初めて端数処理 → ③ 税率別の税抜合計・税額・税込合計をsubtotal_by_rate / tax_by_rateに保存 → ④ 帳票にはこの3組を税率ごとに印字する。見積・発注も同じ計算器を共有し、見積・発注・請求で税額がずれない状態にする。
8.3 予算残高チェック
発注明細は必ず予算行に紐づく(po_items.budget_item_id)。発注入力中、対象の予算行について次を常時表示する。
予算残 = 予算行の金額 − その予算行に紐づく発注済(下書き・取消を除く)合計 − 入力中の金額
残高がマイナスになる場合、警告を出したうえで承認ルートを予算超過ルートに強制的に切り替える。ブロックはしない——現場では予算超過が実際に起きるため、止めると運用外の口頭発注に逃げられ、システムを使わなくなる。止めずに記録し、承認者に必ず見せるのが正しい設計。
8.4 3点突合
請求がsubmittedになった時点で自動実行し、結果をreviewing画面の先頭に固定表示する。
| チェック | 判定 | 内容と扱い |
|---|---|---|
| 請求額 vs 検収額 | 差異 | 明細単位で数量・単価・金額を比較。1円でも差があれば差異行として名指しする。 |
| 請求累計 vs 発注額 | 超過 | 過去の請求を含む累計が発注額を超えたら超過警告。変更発注が漏れているサインなので、その旨を文言で示す。 |
| 未検収分の請求 | 先行 | 検収されていない明細が請求に含まれている場合。 |
| 登録番号の失効 | 注意 | 提出時点でinvalidだった場合に注意表示。処理はブロックしない。 |
| 支払条件の不一致 | 注意 | 請求書に記載の支払期日が、取引先マスタの締日・支払サイトと合わない場合。 |
| すべて一致 | 一致 | ワンクリック承認を可能にする。ここを気持ちよくすることが経理の導入動機になる。 |
8.5 承認ルートの判定
申請時にapproval_routesから、対象種別・金額帯に合致する行をstep_no順に取得し、approvalsレコードを一括生成する。多段の場合は前段がapprovedになって初めて次段に通知が飛ぶ。予算超過が検出された発注はis_budget_over_routeのルートを優先する。承認者が不在(無効化済み)の場合は管理者にエスカレーションする。
8.6 全銀フォーマット出力
総合振込データ(全銀協規定・固定長120バイト、ヘッダ/データ/トレーラ/エンドの4レコード構成、半角カナ)を生成する。実装上の注意点。
- 受取人名は半角カナへの正規化が必要。濁点・半濁点は1文字として分離、長音・記号の変換表を持つ。ここは自動変換に頼らず、取引先マスタにカナ名を人が確認して保存する欄を用意する。
- 金融機関コード・支店コード・預金種目・口座番号はマスタ側で桁数と数値のみを検証する。
- 出力したバッチは
exported_atとfile_hashを記録して以後編集不可。再出力は履歴を残したうえで許可する。 - 銀行によって細部の要求が異なるため、最初の顧客の取引銀行の仕様書を必ず入手してから実装する。汎用実装を先に書くと確実に手戻る。
8.7 採番規則
| 対象 | 規則 | 備考 |
|---|---|---|
| 案件コード | YY-NNN | 年度+連番。手動上書き可(既存の社内コードに合わせるため)。 |
| 発注番号 | PO-YYMM-NNNN | テナント内で一意。変更発注は-1, -2の枝番。 |
| 請求番号 | 協力会社側の任意入力 | 協力会社の自社番号を尊重し、システムは内部IDで管理する。空欄なら自動採番。 |
| 検収番号 | IN-YYMM-NNNN |
8.8 通知
アプリ内通知とメールを同一イベントから発火する。過剰な通知は最速で嫌われるため、Phase 1では次の8種のみに絞る。①見積依頼が届いた ②見積回答が届いた ③発注が届いた ④請書が届いた ⑤完了連絡が届いた ⑥検収された(=請求できる)⑦請求が届いた/差戻された ⑧承認依頼が来た。加えて、期限系のリマインドを1日1回のダイジェストで送る(個別には送らない)。
発注形態 — 請負と常用
建設業の発注には性質の違う2種類があり、これを1つの明細構造で扱おうとすると必ず破綻する。purchase_orders.order_typeで分岐させる。
| 請負(contract) | 常用・人工(daywork) | |
|---|---|---|
| 約束するもの | 仕事の完成。金額は先に確定する。 | 労務の提供。金額は後から決まる。 |
| 明細の中身 | 内容 / 数量 / 単位 / 単価 / 金額 | 職種 / 日単価 / 予定人工数(=上限の目安) |
| 進捗の報告 | 完了連絡(全量 or 出来高%) | 日々の人工報告(作業日・人数・工数) |
| 検収 | 数量ベース。部分検収あり。 | 期間内の人工報告を承認して集計。 |
| 予算との関係 | 発注時点で予算を消費。 | 発注時は予定額で仮消費し、実績確定時に差額を戻す。 |
| 粗利への影響 | 発注した瞬間に確定。 | 月末まで読めない。粗利が動く主因はここ。 |
常用発注のデータ設計
常用は「発注書を出して終わり」ではなく、日々の記録が金額を作る。したがってdaywork_reportsを独立テーブルとして持ち、検収はその集約として組み立てる。
| テーブル | 主な列 | 備考 |
|---|---|---|
| daywork_reports | po_id / work_date / trade_name / workers / hours / unit_price_snapshot / amount / reporter_id / status / approved_by / approved_at | 協力会社が現場から日々入力する(P-31)。status = reported / approved / rejected。unit_price_snapshotで報告時点の日単価を固定し、後の単価改定に影響されないようにする。 |
| purchase_orders | + order_type / planned_workers / daily_rate | order_type = contract / daywork。常用の場合total_amountは予定額であり、確定額ではないことをUI上も明示する。 |
予算残の計算(8.3)で常用発注を「予定額」で丸ごと消費させると、実際には少ない人工で終わった分の予算が塞がったままになり、現場が予算残を信用しなくなる。したがって常用は「予定額での仮消費」と「実績額での確定消費」の2つを別々に持ち、G-14の粗利画面では「確定+仮」を分けて表示する。予算残の警告判定には予定額を使い、粗利の着地見込みには実績+未消化の予定額を使う。
追加画面
| ID | 画面 | 利用者 | 目的と主な要素 | 優先 |
|---|---|---|---|---|
| P-31 | 人工報告 | 協力会社全員 | 今日の日付が既定で入り、人数を選んで送信するだけ。過去7日分の未報告日を上に出して入力漏れを防ぐ。現場からの操作は3タップ以内。 | A |
| G-53 | 人工承認 | 管理者・経営者・工事 | 発注ごと・週ごとにまとまった人工報告を一覧で承認。予定人工数に対する消化率をバーで表示し、超過しそうな発注を先に見せる。 | A |
控除・相殺・保留金
元請が材料を支給した分を「請求書の金額から差し引く」運用は広く行われているが、システムとしては請求書(適格請求書)の記載金額を元請が改変してはならない。協力会社が発行した請求は不変とし、控除は支払側の調整として別テーブルに持つ。支払通知書には「請求額 − 控除内訳 = 振込額」を明示する。この分離を最初にやらないと、後から消費税の計算が合わなくなる。
控除の発生源をデータで持つ
控除額を経理が手入力する設計にすると、金額の根拠が失われて協力会社と揉める。控除は必ず発生源のレコードから自動で積み上げる。
| 種別 | 発生源 | 控除のタイミングと扱い |
|---|---|---|
材料支給material | material_supplies | 元請が材料を出した時点で登録(G-63)。協力会社にも即時に見える。次回の支払時に自動で控除行に乗る。有償支給か無償支給かで消費税の扱いが変わるため、is_taxableを必ず持つ。 |
立替advance | material_supplies(同テーブル、kind違い) | 駐車場代・産廃処分費などの元請立替分。 |
機材リースrent | material_supplies | 足場・重機の又貸し分。 |
保留金retention | purchase_orders.retention_rate | 各支払時に自動で一定率を留保し、完工後に解除する。後述。 |
その他other | 手入力 | 理由の記述を必須にする。ここが多用されている顧客は運用が壊れているサインなので、利用率を計測する。 |
| テーブル | 主な列 | 備考 |
|---|---|---|
| material_supplies | tenant_id / partner_id / project_id / po_id / kind / description / amount / is_taxable / tax_rate / supplied_on / deduct_scheduled_on / deducted_invoice_id | deducted_invoice_idが入るまでが未控除残高。協力会社側(P-42)にも同じ残高を見せる。 |
| invoice_deductions | invoice_id / kind / source_id / description / amount / tax_rate | 請求ごとの控除確定行。source_idで発生源へ遡れる。 |
| retentions | po_id / partner_id / withheld_amount / withheld_invoice_id / release_scheduled_on / released_on / released_payment_id | 留保した都度1行。解除は完工+設定期間後。 |
保留金はオプション機能にする
年商5〜30億規模の元請では保留金を取らない会社のほうが多い。テナント設定で既定OFFとし、ONにしたときだけ発注画面に保留率の欄と支払時の自動留保が現れる構成にする。データ構造はPhase 1で入れておくが、UIは設定で隠す。
追加画面
| ID | 画面 | 利用者 | 目的と主な要素 | 優先 |
|---|---|---|---|---|
| G-63 | 材料支給・立替登録 | 経理・工事 | 取引先・案件・発注を指定して支給内容と金額を登録。未控除残高の一覧。登録した時点で協力会社に通知する(後出しにすると必ず揉める)。 | A |
| G-73 | 保留金管理 | 経理・管理者 | 案件・取引先ごとの留保残高と解除予定日。一括解除。設定OFFのテナントには表示しない。 | B |
| P-42 | 控除内訳の確認 | 協力会社全員 | 「請求額 − 控除 = 入金予定額」を1画面で。控除の1行ごとに日付・内容・金額・元請の登録者名を出す。ここの透明性が協力会社の定着率を決める。 | A |
マルチ元請とアカウント構造
協力会社は複数の元請と取引する。ここを「元請ごとに別アカウント」で作ると、協力会社は元請の数だけログインを持つことになり、2社目の導入時点で必ず嫌われる。法人を表すグローバルなテーブルを1枚挟むのが唯一の解で、これは後付けするとデータ移行が極めて重くなるためPhase 1で構造だけ入れる。
companiesに1つだけ置き、元請ごとの取引条件・支払サイト・与信はpartners(元請テナントに属する台帳レコード)が持つ。協力会社ユーザーはcompany_usersとして1つのログインで全元請の仕事を横断して見られる一方、元請側からは自テナントのpartnersより先へは一切到達できない。取引先の名寄せは法人番号(無い個人事業主は登録番号または元請の手動指定)で行う。| テーブル | 主な列 | 備考 |
|---|---|---|
| companies | corporate_no / reg_no / name / address / verified_at | グローバル。テナントに属さない唯一のテーブル。法人番号または登録番号で名寄せする。 |
| company_users | company_id / email / name / role / disabled_at | 協力会社のログイン主体。元請テナントからこのテーブルを直接引くことは禁止。 |
| partners | + company_id | 既存のpartnersにcompany_idを追加。未招待の取引先はcompany_idがNULLでよく、招待受諾時に名寄せまたは新規作成する。 |
元請Aが「株式会社山田工務店」を登録番号付きで登録済みのところへ、元請Bが同じ登録番号で登録すると、companiesは1つに束ねられる。このとき元請Aが入力した社名・住所を元請Bの操作で書き換えてはならない。companiesは国税庁APIから取得した公表情報のみを正とし、各元請が独自に付けた呼称(「山田さん」など社内通称)はpartners.display_nameにテナント固有で持たせる。
帳票と建設業法
建設業法は、請負契約の締結にあたって定められた事項を記載した書面を相互に交付することを求めており、電磁的方法による場合はあらかじめ相手方の承諾を得ることが要件となる。加えて国土交通省のガイドラインは、注文書・請書のみをやりとりする方式について基本契約書の締結または基本契約約款の添付を求めている。
Phase 1には電子署名・タイムスタンプが無いため、「注文書・請書の電子的なやりとり」であって、紙の契約書面の完全な代替ではない。導入時は基本契約書を紙で1回だけ締結し、個別の注文はシステムで回す運用を推奨する。この点は営業資料でも正直に書くこと——後から「法対応済み」と言っていたと問題になるほうが致命的。完全電子化はPhase 2で電子署名を入れてから謳う。ここは施行状況の確認を含め、着手前に弁護士へ一度当てること。
基本契約約款の管理
約款はテナントごとに版管理し、協力会社は初回に同意する。同意の記録が後々の紛争時の証跡になる。
| テーブル | 主な列 | 備考 |
|---|---|---|
| contract_terms | tenant_id / version_no / title / body / file_url / sha256 / published_at | 約款の本文。改定は必ず新バージョンとして追加し、旧版は消さない。 |
| contract_agreements | partner_id / contract_terms_id / agreed_by / agreed_at / ip / user_agent / econtract_consent | 同意の記録。econtract_consentが電磁的方法による契約への承諾にあたる。同意していない取引先には発注を発行させない。 |
帳票の記載項目
| 帳票 | 必ず載せる項目 |
|---|---|
| 注文書 (発注書) | 発注番号 / 発注日 / 元請の商号・住所・建設業許可番号・登録番号 / 協力会社名 / 工事名称・工事場所 / 工事内容(明細)/ 請負代金の額(税抜・消費税・税込)/ 着手時期・完成時期 / 支払の時期および方法 / 材料支給の有無と内容 / 検査および引渡しの時期 / 「本注文は◯年◯月◯日付基本契約約款 第N版による」旨の明記 / 元請の記名 |
| 注文請書 | 対応する注文書番号 / 承諾日 / 協力会社の商号・住所・許可番号・登録番号 / 承諾する旨 / 協力会社の記名 |
| 支払通知書 | 支払予定日 / 対象請求書番号 / 請求額 / 控除内訳の各行 / 差引支払額 / 振込先口座 / 保留金がある場合はその額と解除予定 |
| 請求書 (協力会社が発行) | 発行者の氏名または名称と登録番号 / 取引年月日 / 取引内容(軽減税率対象がある場合はその旨)/ 税率ごとに区分した対価の額の合計と適用税率 / 税率ごとに区分した消費税額等 / 交付を受ける事業者の氏名または名称 |
請求書の記載項目は適格請求書の要件そのもので、これらはP-40の自動生成で構造的に必ず埋まる。協力会社が手書きで作った請求書のように項目が欠けることが起きない、というのがこのシステムの元請側への最大の売り文句になる。
追加画面
| ID | 画面 | 利用者 | 目的と主な要素 | 優先 |
|---|---|---|---|---|
| G-96 | 基本契約約款の管理 | 管理者 | 約款本文の登録・改定・版一覧。取引先ごとの同意状況と未同意の一覧。 | A |
| P-22 | 基本契約への同意 | 協力会社管理者 | 初回ログイン時に約款を提示して同意を取得。同時に電磁的方法による契約への承諾も取得する。同意するまで発注が受け取れないため、C-03の直後に必ず通す。 | A |
会計処理と仕訳出力
税抜経理か税込経理かで仕訳の形が変わるため、tenants.tax_accounting(excluded / included)で分岐する。既定は税抜。
仕訳のパターン
| タイミング | 借方 | 貸方 | 備考 |
|---|---|---|---|
| 請求承認時 (税抜経理) | 外注費 1,000,000 仮払消費税 100,000 | 工事未払金 1,100,000 | 外注費の科目は工種からaccount_mappingsで引く(材料費/労務費/外注費の別)。 |
| 請求承認時 (税込経理) | 外注費 1,100,000 | 工事未払金 1,100,000 | 1行で済む。 |
| 材料支給の控除 | 工事未払金 55,000 | 材料売上 50,000 仮受消費税 5,000 | 有償支給の場合。無償支給は控除自体が発生しない。 |
| 保留金の留保 | 工事未払金 50,000 | 預り金(保留金)50,000 | 解除時に逆仕訳。 |
| 支払実行時 | 工事未払金 1,045,000 | 普通預金 1,045,000 | 振込手数料の負担者はテナント設定。 |
出力形式
Phase 1は汎用の仕訳CSVのみとする(日付/伝票区分/借方科目/借方補助/借方金額/借方税区分/貸方科目/貸方補助/貸方金額/貸方税区分/摘要/取引先コード/案件コード)。マネーフォワードや勘定奉行の専用インポート形式は仕様が細かく、実際の顧客が使っているソフトが判明してから1本だけ作るほうが確実に速い。汎用CSVでも大半の会計ソフトは取込設定で吸える。
| テーブル | 主な列 | 備考 |
|---|---|---|
| account_mappings | tenant_id / source_type / source_id / account_code / sub_account_code / tax_category | source_type = trade(工種)/ deduction_kind(控除種別)/ fixed(固定)。会計ソフト側の科目コードをそのまま持つ。 |
| journal_exports | tenant_id / period_from / period_to / row_count / file_hash / exported_at / exported_by | 出力履歴。同一期間の二重出力を警告する。 |
技術構成
提案であり確定ではない。方針はコンポーネント数を最小にすること——少人数で運用する自社SaaSでは、動く部品が増えるほど障害対応が回らなくなる。キューも全文検索もPostgreSQLに載せて、管理対象をアプリとDBとストレージの3つに抑える。
| 層 | 選択 | 理由 |
|---|---|---|
| アプリ | Next.js(App Router)+ TypeScript | 画面とAPIを1つのリポジトリで完結させる。協力会社側のPWAも同じアプリで配信。 |
| DB | PostgreSQL + Row Level Security | テナント分離をDB側でも担保する。金額を扱うためnumeric型が必須。 |
| ORM | Drizzle | RLSを使うには接続ごとにSET LOCALでテナントを注入する必要があり、生SQLに近い層のほうが事故が少ない。 |
| ジョブ | pg-boss(PostgreSQL上のキュー) | PDF生成・メール送信・月次の登録番号バッチ。Redisを増やさないための選択。 |
| PDF生成 | Playwright(HTML→PDF) | 帳票をHTMLで書けるため、テンプレートの調整が速い。ジョブキュー経由で非同期実行。 |
| ストレージ | S3互換(Cloudflare R2) | 7年保存を見据えると転送量課金の無いR2が効く。署名付きURLで配信。 |
| メール | Resend または Amazon SES | 招待メールが迷惑メール判定されると導入が死ぬため、独自ドメインのSPF / DKIM / DMARCを最初に設定する。 |
| ホスティング | Railway | 既存プロダクトの運用実績に合わせる。学習コストを増やさない。 |
| 監視 | Sentry + 構造化ログ | 金額に関わるエラーは即時通知の対象にする。 |
テナント分離を二重にする
アプリ層のスコープ漏れは必ず起きる。1箇所のバグが他社のデータ流出に直結するのがマルチテナントSaaSの最大のリスクなので、DB側にも同じ制約を置いて二重にする。
WHERE tenant_idを1箇所書き忘れた瞬間に他社のデータが見える。DB接続時にSET LOCAL app.tenant_idを必ず通し、全テーブルのRLSポリシーで同じ条件を再適用する。協力会社ユーザーにはpartner_idの条件も追加され、自社宛の取引以外はDBのレベルで存在しないものとして扱われる。この設計はテストも書きやすい——スコープを故意に外したクエリが0件を返すことを自動テストで担保できる。非機能要件
| 項目 | 要件 |
|---|---|
| テナント分離 | 全クエリにtenant_idを強制。ORM層のスコープだけに頼らず、Row Level Securityで二重に担保する。協力会社ユーザーにはpartner_idのガードを追加。 |
| 認証 | メール+パスワード(bcrypt / argon2)。セッションはHttpOnly Cookie。管理者ロールは2要素認証を任意で有効化。協力会社側には2FAを必須にしない(現場が離脱する)。 |
| データ保持 | 物理削除を行わない。監査ログと帳票原本は最低7年保持(電帳法の保存期間を見据える)。 |
| 性能 | 一覧画面は1,000件で1秒以内。案件別粗利(G-14)は集計結果をキャッシュ列に持ち、発注・検収・請求の更新時に非同期で再計算。 |
| 同時実行 | 承認・検収・請求提出には楽観ロック(version列)。二重承認・二重請求を防ぐ。 |
| モバイル | PWA。P-01・P-21・P-30・P-40およびG-44はスマートフォンを第一の画面サイズとして設計する。 |
| 対応環境 | Chrome / Safari / Edge の各最新2バージョン。IEは非対応。iOS Safariの古い端末が現場に残っているため、最低ラインは実際の顧客の端末を見てから決める。 |
| ファイル | S3互換ストレージ。1ファイル50MBまで、署名付きURLで配信。ウイルススキャンはPhase 2。 |
| バックアップ | 日次フルバックアップ+ポイントインタイムリカバリ。復元手順を文書化し、四半期に1回実際に復元テストを行う。 |
| 可用性 | 目標99.5%。締日直後と月末は絶対に落とさないため、メンテナンス枠は毎月10〜20日の深夜に限定する。 |
| 監査 | 金額・ステータス・承認・権限に関わる操作は全件audit_logsへ。管理者はCSVで抽出できる。 |
| 運用 | 問い合わせ窓口はチャットとメール。協力会社からの「ログインできない」への即応が解約率に直結するため、対応フローを先に決めておく。 |
開発順序
2週間スプリント×8本=約4ヶ月。S4の終わりで一度、実際の元請1社に触ってもらうことを前提に順序を組んでいる。そこまでで「見積依頼を出して発注して請書が返る」までが動く。
| SP | やること | この時点で何が動くか |
|---|---|---|
| S1 | 基盤・認証・テナント/ユーザー(C-01〜05, G-90, G-91) | 元請がログインして社員を招待できる。 |
| S2 | 取引先・招待・登録番号検証(G-20〜23, C-03, P-50, P-52) | 協力会社を招待し、協力会社が自分でログインできる。ここが最大の関門なので早めに実地で試す。 |
| S3 | 案件・実行予算・マスタ(G-10〜13, G-93) | 案件を登録して予算を組める。 |
| S4 | 見積依頼〜回答〜比較(G-30〜33, P-10, P-11) | ◀ パイロット開始:相見積が実際に取れる。 |
| S5 | 発注・承認ルート・帳票PDF(G-40〜44, G-92, P-20, P-21, C-06) | 発注書を出して請書が返る。紙が1枚減る。 |
| S6 | 完了連絡・検収(G-50, G-51, P-30)と変更発注 | 出来高が記録され、粗利が動き出す。 |
| S7 | 請求・3点突合・代理登録(G-60〜62, P-40, P-41) | 請求書が紙で来なくなる。 |
| S8 | 支払・全銀出力・仕訳CSV・粗利画面(G-70, G-71, G-14) | ◀ 業務が一周する:発注から振込まで完結。 |
技術ではなくS2の協力会社オンボーディング。招待メールが迷惑メールに入る、パスワードが覚えられない、会社のメールアドレスを持っていない職人がいる——このあたりで実際に止まる。SMSでの招待、電話番号ログイン、元請の事務員による代理登録のいずれかを、実地で試したうえでS2の中に入れること。ここが抜けると、後続の全機能が「使われない」まま完成する。
残る論点 — 実データを見るまで確定しないもの
09〜13章で商慣行まわりは設計を確定させた。以下は設計ではなく数値と運用の問題なので、パイロット1社の実データを見てから詰める。
- 常用の日単価の持ち方——取引先ごとに固定か、職種ごとか、現場ごとに変わるか。テーブル構造は決まっているが、単価マスタをどの粒度で持つかは実際の運用次第。
- 締日と支払サイトのばらつき——20日締め翌月末払いが多いが、取引先ごとに違う会社もある。
payment_termsを取引先単位にするか全社一律にするかで、支払一覧の作りが変わる。 - 全銀フォーマットの銀行別の差異——8.6のとおり、最初の顧客の取引銀行の仕様書を入手してから実装する。
- 会計ソフトの specific な取込形式——汎用CSVで足りるか、専用形式が要るか。
- 協力会社のログイン手段——メールアドレスを持たない職人がどの程度いるか。SMS招待・電話番号ログイン・元請による代理登録のどれが必要かは、実際の取引先名簿を見ないと判断できない。S2の着手前に必ず確認する。
改訂履歴
| 版 | 日付 | 内容 |
|---|---|---|
| v0.1 | 2026-08-20 | 初版。スコープ、ロール、業務フロー、画面一覧47件、ER図、テーブル定義、ステータス遷移、主要ロジック、非機能、開発順序。5件の未決論点を明示。 |
| v0.2 | 2026-08-20 | 未決論点のうち設計に属する5件を確定。09章(請負と常用の分岐)、10章(控除・相殺・保留金)、11章(マルチ元請のアカウント構造)、12章(帳票と建設業法)、13章(会計処理と仕訳出力)、14章(技術構成)を追加。画面を54件に更新。印刷レイアウトを追加し社内共有用とした。 |
この文書の使い方
- 意思決定に使う章——01(何を作り何を作らないか)、16(いつ何が動くか)。ここだけ読めば投資判断ができる。
- 開発が参照する章——04〜08、14。実装中はここを見る。
- 業務側・営業と擦り合わせる章——03、09〜13。ここに書いた商慣行の理解が間違っていると全部が崩れるので、建設業の実務を知っている人に必ず読ませる。
- 12章の法令解釈は着手前に弁護士へ当てること。本書はその確認を代替しない。