企業経費精算資料整理
ユーザーから渡された多数の生の経費精算資料を、構造化され、命名規則に従い、財務部門に直接提出可能な成果物に整理します。バケットに分類された資料、記入済みの経費明細表、財務担当者向けの追加説明、トレーサブルなプロセス台帳が含まれます。
絶対に破ってはいけない三つのルール
- 元の資料と元のテンプレートは決して変更しない。 すべての変更はバックアップとテンプレートのコピーに対して行います。
- 情報を決して捏造しない。 読み取れない、一致しない、必須項目が不足しているものは、疑義リストにまとめてユーザーに確認し、尋ねることを選んでも作成はしません。
- 1回の支出は表の1行のみに記録し、二重計上は絶対に行わない。 請求書とその支払いスクリーンショットは同一の取引です。変更前後の航空券は同一区間です。会社が既に代行支払いした部分は申請しません。詳細は
references/分類と命名規則.mdのセクション 3.1–3.3、セクション6を参照してください。
コマンドは必ず
python3を使用してください(多くの環境にpythonエイリアスはありません)。スクリプトのパスは、このスキルディレクトリからの相対パスscripts/...を使用します。
開始前に入手すべき入力
- 生資料フォルダのパス(中には jpg/png/pdf/ofd/excel/各種形式が混在している可能性があり、サブディレクトリがある場合もあります)。
- 経費精算テンプレートの .xlsx パス。
- 身元情報(氏名、部門、提出日、通貨、デフォルト所属部門、デフォルト所属プロジェクトコード、現金前渡し額)。
- まず
プロセスファイル/身元情報.jsonが既に存在するか確認します(前回実行時に保存されたもの)。存在すれば読み込んで再利用し、ユーザーに継続して使用するか確認します。 - 存在しないか不完全な場合は、ユーザーに不足しているフィールドを尋ね、
プロセスファイル/身元情報.jsonに書き込み、次回再利用できるようにします。
- まず
テンプレートのフィールド、列の意味、事由の必須項目については references/テンプレートとフィールドマッピング.md を参照し、作業開始前に必ず読んでください。
調整可能な3つのデフォルト動作(ユーザーの一言で変更可能)
- 自律度(デフォルト:確信がない時だけ確認)。信頼度の高いものは自動的に分類・バケット入れします。出張交通費か市内交通費かの区別がつかない、金額が読み取れない、私的消費の疑いがある、事由の要素が不足しているものは、疑義リストにまとめて一度にユーザーに確認します。ユーザーは 全自動 または 一件ずつ確認 を要求することもできます。
- 身元情報(デフォルト:初回のみ質問し、保存して再利用)。上記参照。
- 複数通貨(デフォルト:RMBに換算して表に記入)。外貨建ての領収書(USD/KRWなど、海外Uberの領収書など)は、ユーザー指定のレートで換算します。レートが指定されていない場合は自分で決めないでください。まず疑義リストに記載してユーザーに確認するか(または領収書の日付の中国銀行公示レートを使用し、出典を明記します)。元の通貨/金額/レート/結果は
追加説明/に書き込み、台帳の「元の通貨金額/レート」列に記入します。元の通貨のまま記入し、レートはユーザー自身で処理するよう変更することもできます。
ワークフロー
ステップ 0:ワークスペースのセットアップ + バックアップ(スクリプト)
python3 scripts/setup_workspace.py --source <生資料フォルダ> [--out <ワークスペースルート>] [--template <経費精算テンプレート.xlsx>]
--outは省略可能:デフォルトでは生資料フォルダの隣(その親ディレクトリ=デフォルト位置)に、意味のある名前のワークスペース<元のフォルダ名>_経費精算整理_<YYYYMMDD>を作成します。--outでユーザーが希望するディレクトリを指定することもできます。--templateは省略可能:ユーザーによってテンプレートが異なる場合や、テンプレートがない場合があります。テンプレートがない場合は「テンプレートなし」の分岐(ステップ6参照)に進み、最後にmake_default_table.pyを使用して汎用の経費明細表を生成します。 これにより、10個のサブフォルダ(領収書あり/領収書なし/補助資料/確認待ち/代替領収書/追加説明/プロセスファイル/バックアップ/補足資料/関係なし)が作成され、生資料がすべてバックアップ/にコピーされます(テンプレート自体と*.skillは資料として扱われず、自動的にスキップされます)。テンプレートがある場合は、テンプレートの原本をバックアップ/_テンプレート原本/に保存し、書き込み可能なコピー<元の名前>_記入済み.xlsxを生成します。プロセスファイル/manifest.jsonを生成します。 ワークスペースは生資料フォルダの外に作成されます。stdout で各キーパス(workspace/writable_template、テンプレートがない場合はwritable_templateは null)が返されます。すべてのスクリプトは純粋なpython3、**クロスプラットフォーム(mac/linux/windows 共通)**で、システム固有のコマンドに依存しません。
ステップ 1:資料の読み取りと理解
manifest.json の順序に従って1つずつ読み取り、タイプに応じて読み取り方法を選択します。
- 画像(jpg/png/webp など):直接視覚で理解します(このモデルは画像を読めます)。最初にOCRする必要はありません。以下の要素を読み取ります:消費日、店舗/プロジェクト、金額、正式な請求書かどうか、出発地/到着地、人数など。
- PDF:まず
extract-textまたは pdf-reading スキルでテキストを抽出します。スキャン文書/定型文書でテキストが抽出できない場合は、画像に変換してから視覚で読み取ります(pdf-reading スキルのラスタライズ方法を参照)。 - OFD(国家標準電子請求書):
テキストが抽出できない場合(純粋なレイヤーOFD)、フォールバック:画像に変換した後、視覚認識します。python3 scripts/extract_ofd.py <file.ofd> --json- 鉄道電子客票:「運賃」(通常乗車の請求額)か「払戻手数料/差額払戻」(払戻、金額が非常に小さい)を読み取り、「始発変更」マークに注意します。
- 増値税請求書:**表に記入する金額は価格税合計(税込)**を取得します。税抜きの「金額」ではありません(
references/テンプレートとフィールドマッピング.md参照)。
- Excel/CSV:
extract-text file.xlsxまたは pandas で読み取ります。これは通話明細、取引明細書、明細集計などでよく見られます。 - その他/不明な形式:まず
file <path>でタイプを確認し、適切な読み取り方法を選択します。それでも読み取れない場合は、疑義リストに追加します。
各資料から抽出された要素は プロセスファイル/extracted/<元の名前>.json に書き込みます。
ステップ 2:バケット分類 + カテゴリ分類 + イベントの関連付け
references/分類と命名規則.md に従います。
- 領収書あり / 領収書なし / 補助資料 のどのバケットに入れるか判断します(判断基準は参考ファイルのセクション1を参照)。重要:正式な請求書のない実際の消費のスクリーンショットのみは「領収書なし」(それが主たる証拠です)に入ります。「補助資料」(セクション1.1)ではありません。補助資料の隣には主たる証拠が必要です。領収書なしの項目が出現した場合、コミュニケーションでクライアントに
代替領収書/に代替領収書を入れるよう注意を促します(『特別ディレクトリ・代替領収書/』参照)。 - 12の費用カテゴリのどれに属するか判断します→テンプレートのどの列に対応するか(列のマッピングは
references/テンプレートとフィールドマッピング.md参照)。J 出張交通費と Q 市内交通費の区別に注意します。 - 同じ取引の複数の資料に同じイベント番号を割り当てます(請求書 + 支払いスクリーンショット + 旅程表 + 払戻スクリーンショットをすべて同じイベント番号に紐付けます)。変更前後、会社代行支払い/個人立替払いも同じイベントに紐付けます(セクション3.1–3.3)。
- 私的/今回の旅程と無関係と思われるもの(個人のサブスクリプション、無関係な国のビザ、領収書なしの高額伝票など)は疑義リストに入れ、デフォルトでは計上しません(セクション5)。ユーザーの確認により今回と無関係/申請しない/期間外のものは、
関係なし/に移動します(今期には計上しません)。 - 確信が持てないものは無理に詰め込まない:バケット/カテゴリ/申請可否が判断できない資料は、まず
確認待ち/に入れます。決して最初から領収書あり/や領収書なし/に入れません。疑義リストにまとめてユーザーに確認し、確認が取れた後、確認待ち/から正しいバケットに移動します。
ステップ 3:台帳の作成(プロセスファイル)
プロセスファイル/物料台帳.csv(UTF-8-SIG)に、各生資料を1行として記録します。列構造は references/分類と命名規則.md のセクション4を参照してください。台帳は、後続の記入とレビュー報告のための唯一のデータソースです。まず台帳を正しく作成します。
ステップ 4:コピー + リネーム + バケットへの格納
命名規則 日付_費用タイプ_キー情報_金額 に従い、バックアップ/ から対応するバケットに資料をコピーしてリネームします。同じイベントが異なるバケットにまたがる場合は同名、同じバケット内では意味的なサフィックスを追加します(規則は参考ファイル参照)。新しいファイル名を台帳に書き戻します。
ステップ 5:追加説明の作成(必要に応じて)
統合、一部払戻、外貨換算、分割/AA、または資料の金額と表への記入金額が異なる場合は、references/追加説明の書き方.md に従って 追加説明/ に txt ファイルを作成し、台帳の「備考」にそのファイルを指すようにします。
ステップ 6:台帳 → 重複排除とクロスチェック → Ledger生成 → テンプレートコピーへの記入(スクリプト)
最初に重複排除とクロスチェックを行います(references/分類と命名規則.md セクション6):イベント番号ごとに台帳を「1イベント1行」に折り畳みます。請求書/領収書なしの主たる証拠から金額を取得し、補助資料と払戻スクリーンショットは単独の行にしません。払戻は払戻手数料のみを計上します。会社代行支払いは個人立替払いのみを計上します。外貨はRMBに換算します。Σ(ledger 金額)をクロスチェックの基準として記録します。
時系列順に並べる:テンプレートのヘッダーは「時系列順に記入すること」を要求しています。ledger 内のアイテムは消費発生日の昇順に並べる必要があります(同日に複数ある場合は「正規の領収書→払戻/差額補充」の順に並べます)。fill_template.py はデフォルトでも 月/日 の安定した昇順でソートします(指定した順序を保持したい場合は --no-sort を使用します)。
次に プロセスファイル/ledger.json を整理します(構造は scripts/fill_template.py の上部コメント参照:identity + items、各アイテムは「列」または「カテゴリ」+ 金額 + 事由 + 出発地/到着地/部門/プロジェクトコード)。事由は references/テンプレートとフィールドマッピング.md に従って財務承認に必要な要素をすべて含める必要があります。その後:
python3 scripts/fill_template.py --xlsx <書き込み可能テンプレート> --ledger プロセスファイル/ledger.json
fill_template.py は自動的に31行を超える場合の行挿入とSUMの拡張を処理し、出力の computed に各列の小計/合計の期待値を直接提供します。まずそれがクロスチェック基準と一致するか確認します。
次に数式を再計算します(2つの選択肢):
# 推奨: xlsx スキル(LibreOffice が必要)
python3 /mnt/skills/public/xlsx/scripts/recalc.py <書き込み可能テンプレート>
# LibreOffice がない/そのパスが存在しない場合、このスキルに含まれるフォールバックを使用(--write で値を書き戻し、成果物に直接数字を表示):
python3 scripts/recalc_fallback.py <書き込み可能テンプレート> --write
必ず total_errors が 0 であること、そして再計算結果が fill_template の computed および台帳の集計と3つが一致することを確認します。
テンプレートなしの分岐:ユーザーにテンプレートがない場合、fill_template.py/recalc をスキップし、代わりにスクリプトを使用して汎用の経費明細表を生成します(値と合計を直接書き込み、.md プレビューも添付します):
python3 scripts/make_default_table.py --ledger プロセスファイル/ledger.json --out <ワークスペース>/<意味のある名前>.xlsx
この場合、ledger.json は「テンプレートなし」バージョンの構造を使用します(make_default_table.py の上部コメント参照:identity にはタイトル/申請者/部門などを含めることができ、各アイテムには 日付/カテゴリ/事由/店舗/通貨/元の金額/レート/金額(RMB)/備考)。生成された xlsx の合計は台帳の集計と一致する必要があります。
ステップ 7:レビュー報告書 + 納品
ワークスペースのルートディレクトリに レビュー報告書.md を作成します:
- 費用カテゴリ別の金額集計、総申請額。
- クロスチェック:台帳集計 = テンプレート総額 = 各バケットの材料金額の合計(項目ごとにリストアップし、不一致は赤色で説明)。
- 疑義リスト:ユーザーに補足が必要な項目(接待人数、出張日数、為替レート、読み取れない金額、私的消費の疑いがあるものなど)。
- 各バケットのファイル数、追加説明リスト。
<書き込み可能テンプレート>を最初に配置します(present_filesのような表示ツールがあれば使用し、なければワークスペースのパスとファイルリストを直接提供します)。レビュー報告書とともにユーザーに提示し、疑義リストについて直接確認します。
特別ディレクトリ(必要に応じて処理、いずれもメインフローのクロスチェックに影響しない)
上記の0~7のコアフローに加えて、必要に応じて有効にする4つのディレクトリがあります。これらはそれぞれ独立しており、領収書あり/領収書なし/補助資料の台帳とクロスチェックに影響しません。
確認待ち/ —— 確信が持てないものを一時的にここに保存
判断がつかない(どのバケットに入れるか、どのカテゴリか、申請できるかどうか)資料は、まず 確認待ち/ に入れます。絶対に最初から 領収書あり/ や 領収書なし/ に入れません。疑義リストにまとめて一度にユーザーに確認します。ユーザーが決定した後、確認待ち/ から正しいバケットに移動して計上します。納品時には 確認待ち/ は空であることが理想的です。未解決の項目が残っている場合は、レビュー報告書で明記します。
関係なし/ —— 今回の申請と無関係 / 今期は申請しない / 期間外
ユーザーが今回の経費精算と無関係、今期は申請しない、または次期に繰り越すと確認した資料(期間外の航空券、今回の旅程と無関係なビザなど)は、バックアップから 関係なし/ にコピーして別途保管し、今期の台帳とテンプレートには計上しません。レビュー報告書には「関係なしに移動済み」と記載します。クロスチェックを汚染せず、資料も失いません。
代替領収書/ —— 任意の代替領収書プール(領収書ありに移動せず、金額も計上しない)
一部の「領収書なし」の項目は、実際の消費ではあるが正式な請求書を入手できない場合です(会社の賃貸住宅の光熱費、個人による少額の立替払いなど)。クライアントは任意で、他の消費の正規の請求書を 代替領収書/ に入れることができます。これにより、これらの領収書なしの項目の金額をおおよそ合わせ、財務部門に請求書を添付します。提供しなくても構いません。
最も重要な点:代替領収書は、領収書なしの項目と1対1で対応する実際の領収書ではなく、単に金額が近いだけです。 したがって:
- 代替領収書は決して
領収書あり/に移動せず、領収書なしの項目も決して「領収書あり」に変更しません。領収書なしは常に領収書なしとして管理されます(それがこの実際の消費の記録です)。 - 代替領収書は
代替領収書/に残し、財務部門に別途添付します。台帳の費用行には含めず、申請金額にも計上しません(そうしないと領収書なしの項目と二重に計上することになります)。 プロセスファイル/代替領収書プール.csvに代替領収書のリストとプールの総額のみを記録し、領収書なしの総額と大まかなカバレッジを比較します。1対1のマッピングは行わず、バケットも変更せず、ledger も変更しません。- 領収書なしの項目が出現したら、コミュニケーションでクライアントに代替領収書を入れるオプションがあることを一言注意します(領収書なしの項目と合計金額をリストアップし、「提供しても、しなくても構いません」と説明します)。クライアントに代わって無理に揃えたり、必ず補填されると仮定したりしません。
補足資料/ —— クライアントが後から補足した資料(処理後に空にする)
クライアントが後から補足した資料(以前不足していた請求書、抜けていた領収書)は 補足資料/ に入れます。再度実行する際に以下のように処理し、処理後は 補足資料/ を空にします:
- バックアップとして保存:各資料を
バックアップ/_補足_<日付>/にコピーします(原本は失いません)。 - 理解 + イベント関連付け:ステップ1の読み取り方法を使用して識別し、既存のイベント番号に紐付けるか、新しいイベントを作成します。
- 請求書補完アクション:ある取引が元々「領収書なし(請求書待ち)」だった場合、正式な請求書が届いたら、請求書は
領収書あり/に、元のスクリーンショットは補助資料/に再分類します。台帳のそのイベントのバケット/信頼度/金額(価格税合計を使用)を一緒に更新し、対応する疑義項目を削除します。 - 重複排除とクロスチェック + 再記入のやり直し:ステップ6に従って再計算し、総額が更新され、依然として3者が一致することを確認します。
補足資料/を空にする:処理後、ファイルを削除します(バックアップと各バケットにコピーが既にあります)。空の状態を保ち、次回に備えます。
完了後のディレクトリ構造
<ワークスペース>/
├── <元の名前>_記入済み.xlsx ← 記入済みの経費明細表(成果物)
├── レビュー報告書.md
├── 領収書あり/ 正式な領収書があり、独立した証拠となるもの(確認済みで間違いないもののみ)
├── 領収書なし/ 実際の消費だが正式な請求書がない主たる証拠(確認済みで間違いないもののみ)
├── 補助資料/ 間接的な証拠(注文/支払い/旅程のスクリーンショット)
├── 確認待ち/ 確信が持てないもの(バケット/カテゴリ/申請可否)を一時的に保管。急いで領収書あり/なしに入れない。確認後移動。
├── 代替領収書/ 任意の代替領収書プール:領収書なしの金額をおおよそ揃えて財務に渡す。領収書ありに移動せず、金額も計上しない(『特別ディレクトリ』参照)
├── 追加説明/ 財務向けのtxtファイル(統合/払戻/外貨/分割)
├── プロセスファイル/ 身元情報.json、manifest.json、extracted/、物料台帳.csv、ledger.json、(代替領収書プール.csv)
├── バックアップ/ 生資料の1:1バックアップ + _テンプレート原本/(テンプレートと *.skill は資料バックアップに含めない)
├── 補足資料/ クライアントが後から補足した資料をここに配置。処理後は空になる(『特別ディレクトリ』参照)
└── 関係なし/ 確認済みで今回と無関係/今期は申請しない/期間外の資料を別途保管。今期には計上しない
完了時自己チェックリスト
- 生資料と元のテンプレートは変更されていない(バックアップ/コピーのみ操作)
- すべての資料がいずれかのディレクトリに入っており、台帳に1行存在する
- 二重計上なし:各イベント番号は ledger に1行のみ。請求書+支払いスクリーンショット、変更前後、払戻相殺は複数の取引としてカウントされていない
- 増値税請求書は**価格税合計(税込)**で表に記入。払戻は払戻手数料のみ計上。会社代行支払いは個人立替払いのみ計上
- 外貨は換算済みで、為替レートに出典がある(または疑義としてリストアップ済み)
- テンプレートは時系列順に記入。再計算後、数式エラーゼロ。テンプレート総額 = ledger 集計 =
fill_templateの computed - 事由はすべて対応する承認要件を満たしている(人数/期間/出発地到着地/日数など)
-
確認待ち/は空(すべて確定済み)、補足資料/は空。代替領収書/(ある場合)は金額に計上されていない - 私的消費/無関係項目およびその他の疑義項目はすべてユーザーに直接確認済み