[{"data":1,"prerenderedAt":448},["ShallowReactive",2],{"content-/mf-auto-registration-investigation":3,"all-pages-for-dir":446,"og-image-/mf-auto-registration-investigation":447},{"id":4,"title":5,"body":6,"category":427,"description":428,"extension":429,"meta":430,"navigation":366,"ogImage":431,"path":432,"project_name":433,"published":434,"publishedAt":435,"seo":436,"stem":437,"tags":438,"todo":444,"unpublished":434,"updatedAt":431,"__hash__":445},"pages/2026-03/2026-03-29/mf-auto-registration-investigation.md","クラウド会計 未登録明細の一括自動登録 調査記録 - API解析・ステータス遷移・勘定科目マスタ",{"type":7,"value":8,"toc":405},"minimark",[9,14,18,21,26,38,41,46,91,94,96,100,103,113,116,119,125,128,219,230,233,240,242,246,253,256,258,261,264,270,273,296,299,302,305,316,319,321,324,328,335,339,342,346,349,351,354,393,395,398,401],[10,11,13],"h1",{"id":12},"クラウド会計-未登録明細の一括自動登録-調査記録","クラウド会計 未登録明細の一括自動登録 調査記録",[15,16,17],"p",{},"Chrome DevTools MCPでクラウド会計の「連携サービスから入力」画面を開き、DOM構造・APIリクエスト・ステータス遷移を一つずつ掘り下げた。確認ダイアログを誤ってAcceptして本番データを触ってしまう場面もあったが、そのおかげでリカバリ手順まで含めた全体像を掴めた。",[19,20],"hr",{},[22,23,25],"h2",{"id":24},"画面構造の把握-react-cssモジュール","画面構造の把握: React + CSSモジュール",[15,27,28,29,33,34,37],{},"DevToolsでDOMツリーを開くと、",[30,31,32],"code",{},"/transaction_journals"," 画面はReactコンポーネントとCSSモジュールで構成されていた。クラス名にハッシュが付く ",[30,35,36],{},"styles_xxx__yyy"," 形式で、セレクタでの要素特定にはdata属性やARIAロールを併用する必要がある。",[15,39,40],{},"テーブルの各行は「未登録明細」を表し、行をクリックすると展開フォームが開く。ここで2種類の「登録」ボタンが存在することに気づいた。",[42,43,45],"h3",{"id":44},"_2つの登録ボタン","2つの「登録」ボタン",[47,48,49,65],"table",{},[50,51,52],"thead",{},[53,54,55,59,62],"tr",{},[56,57,58],"th",{},"ボタン",[56,60,61],{},"場所",[56,63,64],{},"挙動",[66,67,68,80],"tbody",{},[53,69,70,74,77],{},[71,72,73],"td",{},"通常行の「登録」",[71,75,76],{},"テーブル行の右端",[71,78,79],{},"推定された勘定科目でそのまま即時登録",[53,81,82,85,88],{},[71,83,84],{},"展開フォームの「登録」",[71,86,87],{},"行展開後のフォーム内",[71,89,90],{},"勘定科目・補助科目・税区分を編集してから登録",[15,92,93],{},"一括登録のチェックボックスを選択して「一括登録」を押すと、確認ダイアログが出現する。この後の挙動をNetworkタブで追った。",[19,95],{},[22,97,99],{"id":98},"apiキャプチャ-個別登録api","APIキャプチャ: 個別登録API",[15,101,102],{},"Networkタブでリクエストを捕捉すると、個別登録は以下のエンドポイントを叩いていた。",[104,105,110],"pre",{"className":106,"code":108,"language":109},[107],"language-text","POST /api/v1/account_transactions/{transactionId}/journalize\nContent-Type: application/json\n","text",[30,111,108],{"__ignoreMap":112},"",[42,114,115],{"id":115},"ヘッダー",[15,117,118],{},"CSRFトークンとバージョン情報が必須:",[104,120,123],{"className":121,"code":122,"language":109},[107],"X-CSRF-Token: {token}\nX-MF-Version: {version}\n",[30,124,122],{"__ignoreMap":112},[42,126,127],{"id":127},"リクエストボディ",[104,129,133],{"className":130,"code":131,"language":132,"meta":112,"style":112},"language-json shiki shiki-themes vitesse-light vitesse-light","{\n  \"journal_candidate_id\": \"...\",\n  \"sub_account_item_id\": \"...\",\n  \"tax_category_code\": \"...\"\n}\n","json",[30,134,135,144,174,194,213],{"__ignoreMap":112},[136,137,140],"span",{"class":138,"line":139},"line",1,[136,141,143],{"class":142},"shFtX","{\n",[136,145,147,151,155,158,161,165,169,171],{"class":138,"line":146},2,[136,148,150],{"class":149},"sqvqQ","  \"",[136,152,154],{"class":153},"sz8Xr","journal_candidate_id",[136,156,157],{"class":149},"\"",[136,159,160],{"class":142},":",[136,162,164],{"class":163},"sMJiu"," \"",[136,166,168],{"class":167},"sdGka","...",[136,170,157],{"class":163},[136,172,173],{"class":142},",\n",[136,175,177,179,182,184,186,188,190,192],{"class":138,"line":176},3,[136,178,150],{"class":149},[136,180,181],{"class":153},"sub_account_item_id",[136,183,157],{"class":149},[136,185,160],{"class":142},[136,187,164],{"class":163},[136,189,168],{"class":167},[136,191,157],{"class":163},[136,193,173],{"class":142},[136,195,197,199,202,204,206,208,210],{"class":138,"line":196},4,[136,198,150],{"class":149},[136,200,201],{"class":153},"tax_category_code",[136,203,157],{"class":149},[136,205,160],{"class":142},[136,207,164],{"class":163},[136,209,168],{"class":167},[136,211,212],{"class":163},"\"\n",[136,214,216],{"class":138,"line":215},5,[136,217,218],{"class":142},"}\n",[15,220,221,223,224,226,227,229],{},[30,222,154],{}," はサーバー側が推定した仕訳候補のIDで、展開フォームで勘定科目を変更すると別のIDに差し替わる。",[30,225,181],{}," は補助科目、",[30,228,201],{}," は消費税区分を指す。",[42,231,232],{"id":232},"一括登録の実体",[15,234,235,236,239],{},"一括登録ボタンを押しても、裏側では個別APIを順次呼び出しているだけだった。Networkタブに ",[30,237,238],{},"journalize"," リクエストが選択件数分並ぶのが見えた。バッチAPIは存在しない。",[19,241],{},[22,243,245],{"id":244},"確認ダイアログの誤accept","確認ダイアログの誤Accept",[15,247,248,249,252],{},"一括登録の確認ダイアログ構造を調べようとして、DevTools MCPの ",[30,250,251],{},"dialog_action"," でAcceptを送ってしまった。テスト用に選択していた5件の明細がそのまま登録された。手が止まった。",[15,254,255],{},"ここからリカバリ手順の調査に切り替えた。結果として、明細のステータス遷移サイクルを実地で確認できた。",[19,257],{},[22,259,260],{"id":260},"明細ステータスの遷移サイクル",[15,262,263],{},"調査の結果、明細は以下のサイクルで遷移することが分かった。",[104,265,268],{"className":266,"code":267,"language":109},[107],"未入力 → 取引完了 → 対象外 → 未入力\n",[30,269,267],{"__ignoreMap":112},[42,271,272],{"id":272},"遷移の詳細",[274,275,276,284,290],"ol",{},[277,278,279,283],"li",{},[280,281,282],"strong",{},"未入力 → 取引完了",": 登録APIを呼ぶと遷移",[277,285,286,289],{},[280,287,288],{},"取引完了 → 対象外",": 登録済み仕訳を削除すると「対象外」に移動（「未入力」には戻らない）",[277,291,292,295],{},[280,293,294],{},"対象外 → 未入力",": 「未入力に戻す」操作で復元",[15,297,298],{},"誤登録した5件は、仕訳を削除して「対象外」にした後、「未入力に戻す」で元の状態に復元できた。データは消えていなかった。",[42,300,301],{"id":301},"テスト時のリカバリフロー",[15,303,304],{},"自動登録の開発中、テストデータを元に戻す手順:",[274,306,307,310,313],{},[277,308,309],{},"登録済み仕訳を削除（対象外に遷移）",[277,311,312],{},"対象外タブで該当明細を選択",[277,314,315],{},"「未入力に戻す」を実行",[15,317,318],{},"この3ステップで元に戻せるため、テスト→リセットのサイクルを回せる。",[19,320],{},[22,322,323],{"id":323},"勘定科目マスタ",[42,325,327],{"id":326},"api経由の取得","API経由の取得",[15,329,330,331,334],{},"勘定科目のID解決には ",[30,332,333],{},"fetchJournalMasters()"," を使う。このAPIは勘定科目・補助科目・税区分のマスタデータを一括で返す。Chrome拡張側では既に実装済みで、登録APIのボディに渡すIDをこのマスタから引く。",[42,336,338],{"id":337},"csv経由のエクスポートインポート","CSV経由のエクスポート/インポート",[15,340,341],{},"勘定科目の一覧は、会計ソフト標準機能でCSVエクスポート・インポートできる。勘定科目体系のバックアップや、別事業者への横展開に使える。",[42,343,345],{"id":344},"未調査-補助科目の作成api","未調査: 補助科目の作成API",[15,347,348],{},"補助科目をAPIで新規作成する方法はまだ調べていない。画面上では手動追加できるが、自動登録フローに組み込むなら作成APIが必要になる。次回の調査対象。",[19,350],{},[22,352,353],{"id":353},"次回セッション向けの実装計画",[355,356,359,369,375,381,387],"ul",{"className":357},[358],"contains-task-list",[277,360,363,368],{"className":361},[362],"task-list-item",[364,365],"input",{"disabled":366,"type":367},true,"checkbox"," 一括登録フローの実装: 未登録明細の取得 → 勘定科目マッピング → 順次journalize API呼び出し",[277,370,372,374],{"className":371},[362],[364,373],{"disabled":366,"type":367}," CSRFトークンの取得方法を確立（ページDOM or cookieから抽出）",[277,376,378,380],{"className":377},[362],[364,379],{"disabled":366,"type":367}," エラーハンドリング: 途中で失敗した場合のリトライ・ロールバック戦略",[277,382,384,386],{"className":383},[362],[364,385],{"disabled":366,"type":367}," 補助科目の作成API調査",[277,388,390,392],{"className":389},[362],[364,391],{"disabled":366,"type":367}," 勘定科目マッピングルールの設定UI（どの明細パターンにどの科目を割り当てるか）",[19,394],{},[22,396,397],{"id":397},"振り返り",[15,399,400],{},"DevTools MCPで画面を操作しながらNetworkタブを監視する方法で、ドキュメントのないAPIの構造を一通り抜き出せた。確認ダイアログの誤Acceptで一瞬背筋が冷えたが、仕訳削除→対象外→未入力に戻すという3ステップで復元できることを身をもって確認した。APIエンドポイント、必須ヘッダー、ステータス遷移、リカバリ手順が揃ったので、次回は実装に手を付けられる。",[402,403,404],"style",{},"html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .sqvqQ, html code.shiki .sqvqQ{--shiki-default:#99841877;--shiki-dark:#99841877}html pre.shiki code .sz8Xr, html code.shiki .sz8Xr{--shiki-default:#998418;--shiki-dark:#998418}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":112,"searchDepth":146,"depth":146,"links":406},[407,410,415,416,420,425,426],{"id":24,"depth":146,"text":25,"children":408},[409],{"id":44,"depth":176,"text":45},{"id":98,"depth":146,"text":99,"children":411},[412,413,414],{"id":115,"depth":176,"text":115},{"id":127,"depth":176,"text":127},{"id":232,"depth":176,"text":232},{"id":244,"depth":146,"text":245},{"id":260,"depth":146,"text":260,"children":417},[418,419],{"id":272,"depth":176,"text":272},{"id":301,"depth":176,"text":301},{"id":323,"depth":146,"text":323,"children":421},[422,423,424],{"id":326,"depth":176,"text":327},{"id":337,"depth":176,"text":338},{"id":344,"depth":176,"text":345},{"id":353,"depth":146,"text":353},{"id":397,"depth":146,"text":397},"dev","Chrome DevTools MCPを使い、クラウド会計ソフトの連携明細画面を調査。個別登録APIの構造、明細ステータスの遷移サイクル、勘定科目マスタの取得方法を解明した記録","md",{},null,"/mf-auto-registration-investigation","misc-dev",false,"2026-03-29T00:00:00.000Z",{"title":5,"description":428},"2026-03/2026-03-29/mf-auto-registration-investigation",[439,440,441,442,443],"Chrome DevTools MCP","クラウド会計","API解析","自動化","React","active","EZPITwOItTj5cD9t7gVETqWPnhjWv0Wdg4MG9W3CD4Q",[],"https://log.eurekapu.com/og/blog/mf-auto-registration-investigation.png?v=2026-03-29T00%3A00%3A00.000Z&title=%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E4%BC%9A%E8%A8%88%20%E6%9C%AA%E7%99%BB%E9%8C%B2%E6%98%8E%E7%B4%B0%E3%81%AE%E4%B8%80%E6%8B%AC%E8%87%AA%E5%8B%95%E7%99%BB%E9%8C%B2%20%E8%AA%BF%E6%9F%BB%E8%A8%98%E9%8C%B2%20-%20API%E8%A7%A3%E6%9E%90%E3%83%BB%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E9%81%B7%E7%A7%BB%E3%83%BB%E5%8B%98%E5%AE%9A%E7%A7%91%E7%9B%AE%E3%83%9E%E3%82%B9%E3%82%BF&author=Kei%20Komatsu&sig=d65d9ddd272286dd",1782528821925]