thomsons-invoice
トムソンからの月次売上報告を受けて請求書PDFを発行するツール
WIP(現在進行中)
Work In Progress
このプロジェクトで現在進行中の作業と、過去のスナップショットを記録する。
現在の状況
トムソン売上報告 → 請求書 PDF 発行ツール。月次運用フェーズ。
今セッションで 2026年4月度の請求書を発行完了(出力結果/請求書202604月分.pdf、御請求 ¥653,872)。報告書メールも 過去のメール/2026-04_.../ に保存済み。月次フローを 3 ステップで確定し、ユーザーメモリ invoice-workflow に記録した。
毎月の手順(メモリ参照):
- Gmail で最新報告書メールを確認
.venv/bin/python main.py -y→ 添付取得 +出力結果/請求書YYYYMM月分.pdf生成.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-trackedtopic 付与
次に動くタイミング:
- 月初〜上旬にトムソンから売上報告メールが届いたら
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)→rm→main.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-devlogSkill 発動 →.devnotes/DEVLOG.md,.devnotes/WIP.mdを雛形配置、WIP に初期下書きdev-trackedtopic をichirokisanuki/thomsons-invoiceに付与- HIKITUGI.md 追加 + .devnotes/ 導入分をまとめて 1 コミットで push(
44475aa)
決めたこと:
.gitignoreに.claude/系のローカル状態を追記しない(このプロジェクトに.claude/は存在しないため不要)- プロジェクトが
~/cdev/配下にある以上、.devnotes/運用 +auto-commit-push/session-wrap-upSkill の対象として扱う
次回やること:
- 月次の請求書発行運用を継続
- トムソン側 Excel フォーマット変更があれば
parser.pyを追従
最近のコミット
- 65780cb 2026年4月度の請求書発行フローを記録し報告書メールを過去保存 2026/6/24
- 0dd02dc 過去のトムソン売上報告メール 159 件をダンプして取り込み 2026/5/3
- 3cacf65 .devnotes 更新: 引き継ぎセッションの記録と DECISIONS/ROADMAP 雛形配置 2026/5/3
- 44475aa HIKITUGI.md を追加し .devnotes/ 運用を導入 2026/5/3
- 91f100c --attachments-dir / --output-dir CLI オプションを追加 2026/4/22
- 62e46d3 Dropbox パス変更に追従: 重要/ → thomsons-invoice/ 2026/4/22
- b53e6f7 RECOVERY.md を 復旧.md にリネーム 2026/4/22
- 1a5a7b8 Update RECOVERY.md: Dropbox path を実際の場所に合わせる 2026/4/22
- 5f2f24b Initial commit: トムソン売上報告 → 請求書発行ツール 2026/4/22
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 が:
- Gmail MCP でトムソンからの最新メールを検索
.xls添付をattachments/YYYYMM/に保存python main.py <保存パス>を実行- プレビュー確認 → 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
動作の仕組み(請求書生成)
templates/invoice_template.xlsxを一時ディレクトリに複製- openpyxl で 4 セルを更新:
I4発行日(例令和 8年3月26 日)J14支払期日(月末)C17対象月(例2026年1月度アプリ分)I17単価 = 支払額(ここから数式でK17/I27/I29/D14が自動計算)
soffice --headless --convert-to pdfで PDF に変換出力結果/請求書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.py のCELL_*定数も合わせて変更。
スコープ外(今回やらない)
- 生成 PDF のトムソンへの自動メール送信
- freee / マネーフォワードへの自動登録
- zip の解凍・中身の確認(アーカイブ保管のみ)
- 複数取引先対応(トムソン専用)