← 一覧に戻る

thomsons-invoice

トムソンからの月次売上報告を受けて請求書PDFを発行するツール

GitHub ↗ Python 最終push: 2026/6/24 11:16

WIP(現在進行中)

Work In Progress

このプロジェクトで現在進行中の作業と、過去のスナップショットを記録する。

現在の状況

トムソン売上報告 → 請求書 PDF 発行ツール。月次運用フェーズ。

今セッションで 2026年4月度の請求書を発行完了(出力結果/請求書202604月分.pdf、御請求 ¥653,872)。報告書メールも 過去のメール/2026-04_.../ に保存済み。月次フローを 3 ステップで確定し、ユーザーメモリ invoice-workflow に記録した。

毎月の手順(メモリ参照):

  1. Gmail で最新報告書メールを確認
  2. .venv/bin/python main.py -y → 添付取得 + 出力結果/請求書YYYYMM月分.pdf 生成
  3. .venv/bin/python scripts/dump_thomson_mails.py --limit 1過去のメール/ へ保存

次に動くタイミング: 5月度の報告書メール着信時。

詰まっていること: 特になし(token は再認証済み。token.json.bak-20260624 は失効済みバックアップなので適宜削除可)


過去のWIPアーカイブ

(新しい「現在の状況」を書く前に、古いものをここに追記でアーカイブする。新しいものが上)

2026-06-24 11:10 時点のスナップショット

トムソン売上報告 → 請求書 PDF 発行ツール。ツール本体は完成しており、月次運用フェーズ。

「プロジェクトを ~/cdev/ 配下に移動したことの追従」が完結:

  • HIKITUGI.md のパス記述・運用対象記述を更新
  • .devnotes/ 運用(DEVLOG/WIP/DECISIONS/ROADMAP)を導入
  • dev-tracked topic 付与

次に動くタイミング:

  • 月初〜上旬にトムソンから売上報告メールが届いたら python main.py で請求書発行
  • トムソン側 Excel のフォーマット変更があれば src/parser.py を追従

詰まっていること: 特になし

2026-05-03 16:10 時点のスナップショット

(以下、README・直近コミット履歴・HIKITUGI.md からの推測)

トムソン売上報告 → 請求書 PDF 発行ツールの開発・運用フェーズ。 ツール本体(main.py / src/parser.py / src/invoice.py / src/gmail_client.py)は一通り動く状態で、 実運用(毎月の請求書発行)に入っている段階に見える。

直近の作業:

  • プロジェクトを ~/トムソン売上報告/ から ~/cdev/invoice-thomson/ へ移動(→ .devnotes/ 運用対象に組み込み)
  • HIKITUGI.md の作成・パス更新
  • CLI に --attachments-dir / --output-dir オプションを追加(91f100c)
  • Dropbox の退避先パスを 重要/thomsons-invoice/ に追従(62e46d3)
  • RECOVERY.md → 復旧.md にリネーム

次にやりそうなこと:

  • 月次運用で気付いた小さな調整(テンプレ・パーサ)
  • トムソン側 Excel フォーマット変更時の追従

詰まっていること: 特になし

ROADMAP(計画)

ロードマップ

今週

(今週中にやりたいこと)

今月

(今月中にやりたいこと)

今四半期

(今四半期の目標)

いつか

(いつかやりたいこと・アイデアストック)

DECISIONS(意思決定)

意思決定記録

このプロジェクトで下した重要な意思決定を記録する。 最新が上に来る。


2026-06-24: 月次請求書フローに「報告書メールの過去保存」を正式手順として組み込む

背景: これまで main.py での請求書発行が主目的で、報告書メールのアーカイブは明示手順になっていなかった。一方 過去のメール/ には過去159件が同一形式(meta.json/body.txt/添付)で蓄積されており、ユーザーから「次回も同じように過去のメールへ保存してほしい」との要望があった。

決定: 月次フローを 3 ステップに固定する — ①Gmail で最新報告書確認 → ②main.py で請求書 PDF 発行 → ③scripts/dump_thomson_mails.py --limit 1過去のメール/YYYY-MM_<件名>/ へ保存。手順と注意点(venv 絶対パス、token 失効時の再認証)はユーザーメモリ invoice-workflow に記録。

理由: dump スクリプトの --limit 1 が「最新1通を過去分と全く同じ形式で保存」してくれるため、手作業でフォルダ/meta を作るより確実で一貫性が保てる。発行と保存をワンセットにすることで取りこぼしを防ぐ。

2026-05-03: プロジェクトを ~/cdev/ 配下に移動し .devnotes/ 運用対象に組み込む

背景: プロジェクト本体は ~/トムソン売上報告/ 配下にあり、HIKITUGI.md にも「~/cdev/ 配下ではないので .devnotes/ 運用や auto-commit-push Skill の対象外」と明記されていた。一方、ユーザーレベルのルールでは ~/cdev/ 配下を「GitHub連携済みプロジェクトの正規置き場」としており、運用が分離していた。

決定: プロジェクトを ~/cdev/invoice-thomson/ に移動し、.devnotes/ 運用(DEVLOG/WIP/DECISIONS/ROADMAP)と auto-commit-push / session-wrap-up Skill の対象として扱う。HIKITUGI.md の該当記述も書き換えた。

理由: 個人プロジェクトの開発メモ運用を ~/cdev/ 配下に統一しているので、このプロジェクトだけ例外運用にする理由がない。Skill 群(auto-commit-push, session-wrap-up, dev-timer 等)の恩恵をそのまま受けられる。

DEVLOG(作業ログ)

開発日誌

このプロジェクトでの作業を時系列で記録する。 最新のエントリが上に来る。


2026-06-24

11:10 - 2026年4月度の請求書発行 + 月次フロー確定

やったこと:

  • トムソンから届いた「【THOMSON売上報告】(2026/4月度)」メールを Gmail から取得し、請求書 PDF を発行
    • 出力結果/請求書202604月分.pdf(御請求金額 ¥653,872 / 小計 ¥605,437・消費税 ¥60,544・管理手数料 -¥12,109)
    • 発行日=2026-06-24、支払期日=2026-06-30、先方希望到着 6/29(月)
  • main.py で添付自動取得 → 解析 → PDF 生成。scripts/dump_thomson_mails.py --limit 1 で報告書メールを 過去のメール/2026-04_.../ に過去分と同一形式(meta.json/body.txt/xls/zip)で保存
  • 月次フローをユーザーメモリ(project_invoice_workflow.md)に記録。「次回も同じ手順で」との要望を反映

詰まったこと / 気づき:

  • token.json のリフレッシュトークンが失効(invalid_grant)。コードは refresh 失敗時にフォールバックしないので、token を退避(token.json.bak-20260624)→ rmmain.py バックグラウンド実行でブラウザ承認フローを起動して再認証。以降は再生成済みで不要
  • python は .venv/bin/python を絶対パスで使う必要あり(python/python3 は system 側に解決され依存欠落で失敗)
  • Bash の cwd は呼び出し間で持続するので、途中 cd したらルートに戻す
  • メール本文の特記(勉強タイマーAndroid課金が3+4月合算報告)は請求額に影響せず、報告書の合計をそのまま請求

決めたこと:

  • 月次請求書フローに「報告書メールを 過去のメール/ へ保存」を正式手順として組み込む(DECISIONS.md に記載)

次回やること:

  • 5月度の報告書メールが届いたら同じ3ステップで発行(メモリ invoice-workflow 参照)

2026-05-03

16:10 - プロジェクト移動に伴う .devnotes/ 運用導入

やったこと:

  • HIKITUGI.md(引き継ぎ書)を読んで現状把握
  • HIKITUGI.md の作業ディレクトリ記述を ~/トムソン売上報告/~/cdev/invoice-thomson/ に更新
  • 同じく HIKITUGI.md の「~/cdev/ 配下ではないので .devnotes/ 運用対象外」の記述を「対象」に修正
  • init-devlog Skill 発動 → .devnotes/DEVLOG.md, .devnotes/WIP.md を雛形配置、WIP に初期下書き
  • dev-tracked topic を ichirokisanuki/thomsons-invoice に付与
  • HIKITUGI.md 追加 + .devnotes/ 導入分をまとめて 1 コミットで push(44475aa

決めたこと:

  • .gitignore.claude/ 系のローカル状態を追記しない(このプロジェクトに .claude/ は存在しないため不要)
  • プロジェクトが ~/cdev/ 配下にある以上、.devnotes/ 運用 + auto-commit-push / session-wrap-up Skill の対象として扱う

次回やること:

  • 月次の請求書発行運用を継続
  • トムソン側 Excel フォーマット変更があれば parser.py を追従

最近のコミット

README

トムソン売上報告 → 請求書発行ツール

株式会社トムソンから Gmail で届く月次売上報告(TMS(YYYYMM)_..._.xls)を元に、過去と同じフォーマットの請求書 PDF を半自動で発行するツール。

使い方(通常運用)

Claude Code で Gmail MCP を使って添付を取得し、下のコマンドに渡す想定:

source .venv/bin/activate
python main.py <ダウンロードした売上報告.xls>

例:

python main.py "attachments/202604/TMS(202604)_iOS向けアプリ_木佐貫一郎様.xls"

オプション:

フラグ 用途
--issue-date YYYY-MM-DD 発行日を明示指定(省略時は今日)
-y / --yes 確認プロンプトをスキップして即発行

実行すると、売上 Excel を解析して「小計・消費税・管理手数料・支払額・発行日・支払期日」を表示するので、内容を確認して y を押すと 出力結果/請求書YYYYMM月分.pdf が生成される。


毎月の Claude への頼み方(例)

「先月分のトムソンの売上報告から請求書を作って」

これだけで Claude が:

  1. Gmail MCP でトムソンからの最新メールを検索
  2. .xls 添付を attachments/YYYYMM/ に保存
  3. python main.py <保存パス> を実行
  4. プレビュー確認 → PDF 生成

初回セットアップ

1. LibreOffice(Excel → PDF 変換に必要)

brew install --cask libreoffice

2. Python 仮想環境

/opt/homebrew/bin/python3.13 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

3. Gmail MCP の認可(Claude 側で 1 回だけ)

Claude Code で最初に「トムソンの売上報告メールを検索して」などと頼むと、Claude が Gmail 認可 URL を返してくるので、ブラウザで承認する。以降は Claude セッション内で Gmail にアクセス可能。


プロジェクト構成

トムソン売上報告/
├── main.py                        CLI
├── config.yaml                    請求書発行ルール
├── requirements.txt / .gitignore / README.md
├── .venv/                         Python 3.13
├── 過去のデータ/                   参照用
├── templates/
│   └── invoice_template.xlsx      請求書 Excel テンプレート
├── attachments/YYYYMM/             Gmail からの DL 先(任意)
├── 出力結果/                      生成した請求書 PDF
└── src/
    ├── parser.py                  売上 .xls → 支払額・対象月
    ├── dates.py                   和暦変換・月末計算
    └── invoice.py                 テンプレ複製→セル更新→soffice で PDF

動作の仕組み(請求書生成)

  1. templates/invoice_template.xlsx を一時ディレクトリに複製
  2. openpyxl で 4 セルを更新:
    • I4 発行日(例 令和 8年3月26 日
    • J14 支払期日(月末)
    • C17 対象月(例 2026年1月度アプリ分
    • I17 単価 = 支払額(ここから数式で K17/I27/I29/D14 が自動計算)
  3. soffice --headless --convert-to pdf で PDF に変換
  4. 出力結果/請求書YYYYMM月分.pdf に保存

レイアウトはテンプレート側に完全に保持されているため、過去 PDF と同じ見た目になる。


トラブルシュート

  • soffice: command not found: brew install --cask libreoffice が未実施。
  • ModuleNotFoundError: openpyxl: .venv を activate し忘れている。
  • 金額が合わない: Parser は 支払額 ≒ 小計 + 消費税 − 管理手数料 の整合性を ±1 円で検証している。乖離があれば Excel のフォーマットが変わっている可能性。
  • テンプレートを差し替えたい: templates/invoice_template.xlsx を直接編集。更新セル (I4/J14/C17/I17) の位置が変わる場合は src/invoice.pyCELL_* 定数も合わせて変更。

スコープ外(今回やらない)

  • 生成 PDF のトムソンへの自動メール送信
  • freee / マネーフォワードへの自動登録
  • zip の解凍・中身の確認(アーカイブ保管のみ)
  • 複数取引先対応(トムソン専用)