1 OCR受領書類
joe edited this page 2026-08-11 14:01:25 +09:00
This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

OCR受領書類データ管理統合

作成日: 2026-07-14 バージョン: v1.4.357 DBバージョン: v27

設計思想

「OCRで取り込んだ請求書・レシートを、受領書類として台帳に変換し、自動仕訳まで一気通貫で行う」

従来はOCR結果が imported_documents テーブルに蓄積されるだけで、伝票(documents テーブル)への変換は手作業でした。本統合により、OCR取り込み → 内容確認 → 受領書類伝票化 → 自動仕訳までのワークフローを一本化します。

【撮影/OCR】                【確認・変換】              【確定・仕訳】
QuickScanScreen    ─┐
InvoiceScanScreen  ─┼─→ imported_documents  ──→ ScanConvertScreen  ──→ DocumentPage  ──→ AutoJournalService
ReceiptPhotoScreen ─┘    (status: scanned       (status: verified)     (status: confirmed)   (journal_entries)
                         → ocr_done
                         → verified
                         → converted)

新規追加したDocumentType

タイプ 名称 プレフィックス 用途
receivedInvoice 受領請求書 RI 仕入先から受領した請求書
receivedReceipt 受領領収証 RR 支払いの証拠として受領した領収証

表示色

タイプ ベース色 バッジ色
receivedInvoice 0xFF5C6BC0(インディゴ) 0xFF5C6BC0
receivedReceipt 0xFF26A69A(ティール) 0xFF26A69A

PDF出力

  • docTypeTitle: 受領請求書 / 受領領収証
  • amountLabel: 御請求金額 / 領収金額
  • totalLabel: 御請求合計 / 領収金額合計
  • documentTitleMessage: 「下記の通り、受領いたしました。」「上記の金額を正に受領いたしました。」

imported_documents テーブル拡張(DB v27)

追加カラム

カラム 型 用途
status TEXT DEFAULT 'scanned' ライフサイクル状態
verified_at TEXT 内容確認日時
converted_document_id TEXT 変換先のDocumentModel ID
vendor_customer_id TEXT 連携した顧客マスターID
duplicate_of_id TEXT 重複元のimported_documents ID

ImportedDocStatus(ステータス遷移)

scanned → ocr_done → verified → converted
                    ↘ rejected
ステータス label 説明
scanned スキャン済 撮影済み(OCR未実行)
ocr_done OCR済 OCR実行済み・パースフィールドあり
verified 確認済 内容確認済み・変換待ち
converted 変換済 伝票に変換済み
rejected 却下 不要と判断

マイグレーション

  • database_migration_v27_v27.dart で safeAddColumn により安全に追加
  • 既存の processed = 1 レコードは status = 'ocr_done' に移行
  • _databaseVersion を 26 → 27 に更新

モデル・リポジトリ

ImportedDocumentモデル(lib/models/imported_document_model.dart)

新カラム対応のため拡張。ImportedDocStatus enumを定義し、fromMap/toMap/copyWith で取り扱い。

ImportedDocumentRepository(lib/services/imported_document_repository.dart)

追加メソッド:

メソッド 用途
listConvertible() 変換可能(ocr_done/verified・重複なし)一覧
listConverted() 変換済み一覧
updateStatus(id, status, ...) ステータス更新(verified_at/converted_document_idも同時更新)
markDuplicate(id, masterId) 重複マーク
findDuplicate(vendor, total, date) 重複検出(vendor+total+dateの完全一致)

画面構成

ScanConvertScreen(新規)

lib/plugins/documents/screens/scan_convert_screen.dart

OCR結果を編集フォームで確認し、受領書類伝票に変換する画面。

機能:

  • 画像プレビュー
  • タイプ切替(受領請求書 / 受領領収証)の SegmentedButton
  • 取引先名入力 + 顧客マスターサジェスト(部分一致)
  • 日付・金額・消費税・品目編集
  • 確定 → DocumentPage を編集モードで開く
  • 却下 → status を rejected に変更

変換ロジック:

  • 品目は1行のサマリー行に統合(unitPrice = total、includeTax = false)
  • DocumentPage 保存時に totalAmount で上書きされるため、subtotal = total になるよう調整
  • DocumentPage が返す saved.id を converted_document_id に設定

ScanDetailScreen(拡張)

lib/plugins/documents/screens/scan_detail_screen.dart

  • ステータスチップ表示(scanned/ocrDone/verified/converted/rejected)
  • 「受領書類として伝票へ変換」ボタン追加
  • 変換済みの場合は変換先伝票IDを表示

ScanProcessScreen(拡張)

lib/plugins/documents/screens/scan_process_screen.dart

  • initialDocType パラメータ追加(入口統合用)
  • OCR完了後の登録ダイアログに「伝票へ変換」選択肢を追加(invoice/receiptのみ)
  • 保存時の status を ocr_done に設定

入口統合

従来4つのOCR入口を統合:

画面 変更 実装
InvoiceScanScreen ScanProcessScreenのエイリアス化 ScanProcessScreen(initialDocType: DocType.invoice)
ReceiptPhotoScreen ScanProcessScreenのエイリアス化 ScanProcessScreen(initialDocType: DocType.receipt)
QuickScanScreen 既存のまま —
ScanProcessScreen initialDocType でタイプ事前選択 新規パラメータ

効果: OCR入口のコード重複を解消、保存後の変換ステップを統一。


自動仕訳

AutoJournalService(lib/plugins/accounting2/services/auto_journal_service.dart)

追加メソッド:

createFromReceivedInvoice

受領請求書確定時:
  仕入高(501) / 買掛金(201)  — 総額を仕入高に計上

注意: 仮払消費税勘定が存在しないため、税抜き分割は行わず総額を仕入高に計上。

createFromReceivedReceipt

受領領収証確定時:
  買掛金(201) / 現金(101)  — 支払いの事実を記録

document_preview_page.dart

確定フロー(_confirm 内)に受領書類の自動仕訳を追加:

} else if (widget.document.documentType == DocumentType.receivedInvoice) {
  await journal.createFromReceivedInvoice(
    documentId: widget.document.id,
    total: widget.document.total,
    date: widget.document.date,
    vendorName: widget.document.customerName,
  );
} else if (widget.document.documentType == DocumentType.receivedReceipt) {
  await journal.createFromReceivedReceipt(
    documentId: widget.document.id,
    amount: widget.document.total,
    date: widget.document.date,
    vendorName: widget.document.customerName,
  );
}

データフロー全体図

[撮影]
  QuickScanScreen / InvoiceScanScreen / ReceiptPhotoScreen
        │
        ▼
  ScanProcessScreen
        │ OCR実行 (Gemini OCR / ML Kit)
        ▼
  imported_documents テーブル
  (status: ocr_done, parsed_vendor/total/date/name 設定)
        │
        ├─ 「伝票へ変換」選択 ──→ ScanConvertScreen
        │                              │ 顧客マスター連携
        │                              │ フィールド編集
        │                              ▼
        │                         status: verified
        │                              │
        │                              ▼
        │                         DocumentPage (編集モード)
        │                              │ 保存
        │                              ▼
        │                         documents テーブル
        │                         (documentType: receivedInvoice/receivedReceipt)
        │                              │ 確定
        │                              ▼
        │                         document_preview_page.dart
        │                              │ 自動仕訳フック
        │                              ▼
        │                         AutoJournalService
        │                              │
        │                              ▼
        │                         journal_entries テーブル
        │                         (仕入高/買掛金 or 買掛金/現金)
        │
        └─ 「管理画面へ」選択 ──→ ScanListScreen
                                   │
                                   ▼
                              ScanDetailScreen
                                   │ 変換ボタン
                                   ▼
                              ScanConvertScreen (上記フローへ)

変更対象ファイル一覧

新規作成

ファイル 用途
lib/services/database_migration_v27_v27.dart DB v27マイグレーション
lib/plugins/documents/screens/scan_convert_screen.dart OCR→受領書類変換画面

変更

ファイル 変更内容
lib/models/document_type.dart receivedInvoice/receivedReceipt enum追加
lib/models/document_type_colors.dart 色・バッジ色追加
lib/utils/theme_utils.dart AppBar背景色追加
lib/models/invoice_helpers.dart 短縮ラベル・伝票名・プレフィックス追加
lib/plugins/documents/logic/document_pdf_common.dart PDFラベル・メッセージ追加
lib/plugins/documents/explorer/document_explorer_config.dart フィルタ選択肢・アイコン追加
lib/plugins/documents/services/document_repository.dart 伝票番号プレフィックス追加
lib/plugins/project/widgets/stage_action_card.dart アイコン追加
lib/plugins/documents/documents_plugin.dart CREATE TABLE・safeAddColumn更新
lib/services/database_helper.dart _databaseVersion 27へ
lib/services/database_migration_service.dart v27ルート追加
lib/models/imported_document_model.dart 新カラム対応・ImportedDocStatus enum
lib/services/imported_document_repository.dart ステータス更新・変換済み一覧・重複検出
lib/plugins/documents/screens/scan_detail_screen.dart 変換ボタン・ステータスチップ
lib/plugins/documents/screens/scan_process_screen.dart initialDocType・変換ステップ追加
lib/plugins/documents/screens/invoice_scan_screen.dart ScanProcessScreenのエイリアス化
lib/plugins/accounting2/screens/receipt_photo_screen.dart ScanProcessScreenのエイリアス化
lib/plugins/accounting2/services/auto_journal_service.dart 受領書類用仕訳メソッド追加
lib/plugins/documents/explorer/document_preview_page.dart 確定フローに自動仕訳追加
pubspec.yaml v1.4.357

今後の拡張候補

項目 優先度 概要
仮払消費税勘定の追加 中 勘定マスターに追加後、税抜き分割仕訳を有効化
重複検出の自動化 中 OCR保存時に findDuplicate を自動実行し警告
バッチ変換 低 複数の受領書類を一括変換する機能
顧客マスター自動新規作成 低 未連携のvendor名から顧客マスターを自動生成
PDF添付 低 受領書類伝票にOCR元画像を添付