Phase 0: 販売帳票PDF・値引・納品書連携・端数統一 #53
Labels
No labels
h1-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
joe/o2#53
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
概要
販売管理の実務フロー(見積→受注→納品→請求→適格請求書)を弥生販売に並ぶ水準へ。帳票PDF・値引・端数統一を実装。
対応内容
InvoiceSetting拡張、/invoice-settings画面・API)GET /api/quotations/{id}/pdfGET /api/delivery-notes/{id}/pdf+ 納品書一覧API・画面・ナビGET /api/billing/{id}/pdf(適格請求書は維持)total = subtotal - discount + tax)deliverで納品書を自動作成・紐付け(二重計上防止:source=sales_order, completed)InvoiceSetting.rounding_method準拠)テスト結果
a3f8c1d20b47,b8e2d6f0a4c1,d4b7e2c9f0a1,e1a2b3c4d5f6)docs/openapi.json再生成済み関連コミット
c141999販売帳票PDF・値引・納品書連携ebd0c75請求書・適格請求書への値引反映16d8963消費税端数処理の統一c4f1b9a(push 済み)既知の設計課題(次フェーズ)
CustomerとCounterpartyの二重管理次のステップ
完了
Phase 0 を main にマージ(
--no-ff,c4f1b9a)し、origin/mainへ push 済み。次の対応
追記: 入金消込(Phase 0 完了)
入金消込の専用UIと自動割当APIを追加し、main にマージ(
--no-ff,ad9720f)・push 済み。allocate_receipt: 1回の入金を未収の複数請求へ期日順に自動割当、仕訳は1本(貸方 売掛金 / 借方 現金・預金)GET /api/billing/outstanding/POST /api/billing/receipts/allocate/receipts画面(自動割当プレビュー・部分入金・消込実行)+ナビ「入金消込」これで Phase 0(販売管理の実務フロー)完了。次は Phase 1(h1⇔o2 同期+監査)の設計。
追記: ドキュメント整備
Phase 0/1 の実装を反映してドキュメントを整備し、main にマージ・push 済み(
--no-ff,55962c6)。README.md: 販売管理の重複セクション統合、帳票PDF/値引/納品書/入金消込/端数統一を追記、h1-c2 連携・同期・監査(Phase 1)節、テスト数(5810)・画面一覧更新docs/ARCHITECTURE.md: 同期・監査(Phase 1)節と新モジュールdocs/OPERATIONS.md: 端末トークン・同期・監査の運用手順AGENTS.md: 販売計算・帳票(Phase 0)/同期・監査(Phase 1)の規約、h1 連携を現行化docs/README.md: ADR/specs/Phase 1 設計への索引docs/adr/0001-sync-audit-mode-issuance.md、docs/specs/sales-calculation.md、docs/superpowers/specs/2026-09-20-phase1-sync-audit-design.md残(後続): h1 側 Dart 実装、型付きモデルへの射影、
DocumentIssuance+Google OAuth/Gmail、e-Tax。追記: Phase 1d(帳票発行一元化・Google OAuth/Gmail)
main にマージ・push 済み(
0cf5ef5, ドキュメントc1e1f0c)。全 5864 passed。1d-1 発行一元化
DocumentIssuance(発行者/端末/チャネル/方法/状態)+ migrationd1e2f3a4b5c6POST/GET /api/issuance・/summary、担当者端末へSyncOutbox通知、/issuance発行履歴画面1d-2 Google/Gmail
GoogleCredential(テナント×用途、トークン Fernet 暗号化)+ migrationa7b8c9d0e1f2google_oauth_service(認可URL・state検証・コード交換・refresh)、gmail_service(帳票PDF添付送信)/api/google/{authorize,callback,status,disconnect}、POST /api/issuance/send、/google-settings画面、請求一覧のメール送信ボタンhttpxを実行時依存に追加注意
残(後続)
h1 ⇄ o2 実通信を確認(2026-09-21)
h1 と o2 の Phase 1 同期の実通信に成功しました。
joe/h1-c2): 端末登録 / push / pull / 承認キュー / 発行報告(POST /api/issuance直呼び+o2_issuance_queue退避、o2_api_keyでapi-key-login再取得)/api/issuance直呼び)に一本化。o2 側で試作した push 取込は二重経路回避のため revert(1ccd027)4635025)残(後続)
型付きモデルへの射影、
SyncOutbox自動生成(監査/修正の自動配信)、Drive/Sheets、Google 実接続検証、e-Tax。追記: Phase 1e(h1 データの射影・会計統合・監督)
main にマージ・push 済み。全 5958 passed。
Product/Counterpartyへ upsert(論理キーcode or id)GET /api/h1-documents(読み取り専用)+/h1-documents画面salesSlip→売掛金/売上、paymentReceipt→現金/売掛金)。H1JournalLink(tenant_id, source_uuid)で冪等(二重計上なし)。migratione2f3a4b5c6d7GET /api/sync/supervision/{summary,duplicates}/POST .../scan、端末間重複検出+AuditFinding(kind=duplicate)、/h1-supervision画面code→idフォールバックに(0a39f19)scripts/issue_test_credentials.py(8473c50)docs/superpowers/specs/2026-09-21-phase1e-projection-design.md(二重計上ポリシー含む)4ce8c12)残(後続)
SyncOutbox自動生成(監査/修正の自動配信)、Drive/Sheets、Google 実接続検証、e-Tax(最後)。追記: G3(Google)拡張と競合自動配信
main にマージ・push 済み。全 5998 passed。
SyncOutbox自動生成):POST /api/sync/corrections/dispatch(集約の端末間マスタ競合を LWW 勝者に揃えて h1 承認キューへ。pending 冪等)/api/issuance/send)/api/issuance/archive、purpose=drive)POST /api/export/sheets/h1-documents、purpose=sheets)scripts/verify_google_connection.py(--check-config/--send-to)3c3b4be)残
e-Tax(最後。実提出は電子証明書・国税庁接続が外部依存)。Google 実接続検証はクレデンシャル設定後に実施。
追記: e-Tax(棚卸しと統合修正)
main にマージ・push 済み。全 6012 passed。
棚卸し(
docs/superpowers/specs/2026-09-21-etax-status.md)今回の統合修正(外部非依存)
summary_dataを永続化 → XBRL 付表連携が成立TaxReturn.status/submission_log_idに連動(SENT→SUBMITTED、ACCEPTED→ACCEPTED、ERROR→PREPARED)O2_ETAX_ENDPOINTで設定可能に(未設定はダミー)fc64377)残(別フェーズ)
XMLDSig 正式署名化、公式スキーマ検証、電子証明書読取、国税庁 API 実接続。実提出は不可(外部依存)。
追記: 既知の設計課題の修正と実データ取扱い
main にマージ・push 済み。全 6019 passed。
設計課題の修正
deliverで、在庫管理対象(在庫行あり)の通常商品をStockMovement(SALES_OUT)で減算。セット商品は構成商品のみ消費(排他)。在庫行が無い商品はスキップ、不足はOrderError(2ec37c7)DELIVERED/INVOICEDの cancel で受注由来納品書を取消+売上仕訳の逆仕訳(借方 売上 / 貸方 売掛金)を作成し帳簿を整合(88602d7)Customer/Counterparty二重管理(未対応。マスタ射影はCounterparty)実データの取扱い
.gitignoreを強化:*.db.*(o2.db.bak-*)/*.db-wal|shm|journal/*.sqlite3、*.pem/*.key/*.p12/*.pfx、data//uploads//logs//*.log、.env(8f84826)docs/OPERATIONS.mdに「実データの取扱い」を追記(DB はリポジトリ外パス推奨、鍵は外パス)06b9c02)次
残る設計課題は
Customer/Counterparty二重管理のみ(大規模・要設計)。追記: 残課題の自律対応
main にマージ・push 済み。全 6057 passed。
1. Customer/Counterparty 二重管理(段階解消)
Counterpartyを正典とし、legacyCustomerの create/update を同一 Tx でCounterpartyに同期(customer_counterparty_sync)CustomerをCounterpartyへバックフィルする migrationb1a2c3d4e5f6(冪等)4d2b5be)2. e-Tax 署名・証明書・スキーマ
xmldsig_service: enveloped / rsa-sha256 / exc-c14n)。証明書があれば XMLDSig、無ければ legacy コメント署名(フェイルクローズ維持)O2_ETAX_PKCS12_PATH/PASSWORD、O2_ETAX_CERT_PATH)O2_ETAX_XSD_DIR/O2_ETAX_XSD_PATH。配置すれば検証、無ければスキップ)signxml/lxmlを依存に追加(87824f5,a116ba0)68f9b10)残(外部依存)
IC カード読取(PKCS#11)、国税庁 API 実接続、公式 xsd の入手、e-Tax 仕様への完全適合検証、Google 実接続(クレデンシャル)、Counterparty→Customer 逆同期。
追記: o2 を h1-c2 のスーパーセットへ(汎用伝票・弥生風フォーム・内税・事業所切替)
main に順次マージ・push 済み。全 6345 passed。
汎用伝票層(h1 DocumentModel を包含)
Document/DocumentItem+DocType12種、h1 全項目(件名/案件/作業報告/明細のメーカー・型番・測定値・備考/content_hash/version/is_locked等)(tenant_id, uuid)で汎用層へ射影(冪等、delete=取消)弥生風フォーム(全画面)
.doc-*(表題部/明細部/合計部/税計算)+o2.openRefModal+o2.pageShortcuts(F2=新規/クリア, F8=参照, F12=登録)h1 上位互換の残り
include_tax): 計算/プレビュー/フォーム/PDF(税率グループround(incl*rate/(1+rate)))gross_only/net_amount/gross_with_note(PDF/画面)事業所(テナント)切替
GET /api/auth/tenants/POST /api/auth/switch-tenant、メニューバーの切替(PLATFORM_ADMIN は任意、一般は自事業所)APIで全フィールド制御
exclude_unsetに統一(送信フィールドを設定・nullで解除・省略は不変)。経費PUTを新設、仕入先counterparty_idを追加docs
bacd72b)残(外部依存・任意)
電子証明書/PKCS#11・国税庁API(e-Tax)、Google実接続、伝票の不変版管理チェーン・分割請求、
transfer_feeの会計分離。