クラウド会計の帳簿を点検するChrome拡張を自作し、総勘定元帳まで広げた

開発misc-dev

会計ソフトAの推移表(月次)を開くと、列見出しが2段に見えた。同じ月が上下に重なって並んでいて、どちらが本物の行なのか分からない。自分でも触ってみたが、うまく直せなかった。

この画面には前から自作の拡張を1本かぶせている。だから自分の拡張が原因だろうとは思った。ただ、会計ソフト側の画面更新で崩れた線もある。どちらか決めないまま消しにかかると、直したつもりで別のものを壊す。

見出しが2段になっていた理由

調べさせたら、犯人は自分の拡張だった。

表をコピーする機能のために、見出し用のテーブルの thead を本体のテーブルへ複製していた。複製した行はコピーのときにしか要らないのに、画面にも残り続ける。だから同じ月が2段に見えていた。複製をやめさせ、コピーを押した瞬間だけ2枚の行を結合する形に変えさせた。

同じ拡張には、他にも直すところがあった。コピーのボタンは会計ソフトA標準のボタンと見た目が違って浮いていたので、標準に揃えたうえで「補助科目をすべて開く」の行の右端へ寄せた。右クリックメニューからコピーを実行すると初期化処理が走り直し、ボタンが二重に挿入されていた。動いていないループも1つ残っていた。

崩れは推移表だけではなかった。ホーム画面ではメニューの枠が増えていく。URLが変わるたびに枠を作り直す作りなのに、前の枠を消していないからだ。仕訳帳では枠が2つ重なって、100pxの空白ができていた。表示するリンクが1つもないページでは、空の枠だけが入って余白を作っていた。どちらもその場で直させた。

自分で入れたものが自分の画面を汚していた。ただ、この手の崩れは放っておくと、会計ソフトAはそういう表示なのだとこちらが慣れてしまう。

他社の拡張を読んで、仕様だけ写す

会計ソフトB向けに、帳簿を点検する拡張が公開されている。マイナスの残高や科目の変動を色で教えてくれるやつだ。これを会計ソフトA側に取り込めないかと聞いてみた。

ローカルに落として読ませたら、JavaScriptが7,346行あった。中身を見て面白かったのは、判定を担う部分が画面の構造に一切依存していなかったことだ。数値の配列を渡すと指摘が返る、それだけの関数の集まりになっている。だとすれば、会計ソフトAの表を読んで数値の配列にする部分さえ書けば、機能の大半は移せる。

ただしライセンス表記がない。第三者の著作物なので、コードは1行も流用しない。何を、どの閾値で、どう指摘するか。その仕様だけを写して自作する、という線を引いた。閾値や科目名の並びは会計の一般知識なので、同じ値を使ってかまわない。

決めることは4つあった

移植計画を書かせたら、判断が要る点が4つ出てきた。決裁フォームで一度に答えた。

  • 置き場所:既存の拡張に足すか、独立した拡張にするか。独立させた
  • Phase 1の範囲:推移表だけにするか、試算表まで含めるか。推移表(月次)だけにした
  • 判定の作り:中央値と中央絶対偏差で外れ値を見るか、前月比の単純な割合で済ませるか。前者にして、感度を3段階にした
  • 「確認済み」メモの保存先:ブラウザ内か、スプレッドシートか。ブラウザ内にした

計画書はCodexに3回レビューさせた。1回目は「確認済みのキーに科目、年月、金額、集計条件を含めて、どういうときに失効するかを定義せよ」。2回目は「比較元の月の仕訳を直しても指摘の根拠は変わるのだから、系列そのもののハッシュもキーに入れよ」。3回目で承認が出た。

一度見たセルに「確認済み」の印を付けたら、あとで数字が動いたときには印が外れてほしい。その「動いた」の定義を先に決めておけ、という指摘だった。言われるまで、印は押すことだけ考えていた。

推移表から総勘定元帳まで

セッションを切って実装に入った。コミット前にクイズを出す学習ゲートは、このリポジトリでは全部スキップでいいと決めた。

Phase 1は推移表(月次)を読む。拾うのは、マイナスの金額、新しく発生した科目、前は動いていたのに計上のなくなった科目、貸借対照表の増減パターンの崩れ、地代家賃のブレ、損益の大きな変動、役員報酬の定期同額、役員賞与だ。締め途中の当月と、まだ来ていない月は見ない。指摘はセルの色とツールチップで出させ、右下のパネルに一覧を並べて前後へ飛べるようにした。

途中で「前年と比べて異常値を出すやつ、あれはPhase 2でしたっけ」と聞いた。前期比較がそれだった。

Phase 2は残高試算表と前期比較に広げた。期末残高と前期残高のマイナス、諸口に残っている残高、債権や債務の科目で補助科目の付いていない残高を指摘させる。前期比較では、増減額の列に前期との差分を出させた。率20%と額50万円の両方を見て、どちらもポップアップから変えられる。ただし当期の途中で開くとほとんどの科目が「減少」で鳴るので、年次の締めで使う前提にした。

Phase 3は総勘定元帳と補助元帳。ここは画面がReactで、クラス名にハッシュが付く。DOMを読む作りにすると次の更新で壊れる。だから行の中身は GET /api/v1/ledger_entries から取らせ、DOMは色を付けるためだけに使わせた。拾うのは消費税区分の取り違え(費用に課税売上、収益に課税仕入、区分が「不明」)と旧税率、それに消耗品費10万円以上と修繕費20万円以上だ。検索やページ送りで画面が描き直されるので、MutationObserverで追従させている。

少額特例の判定は見送った。1万円未満かどうかは取引全体の税込額で決まるのに、元帳の1行からはそれを確定できない。

テストはPhase 3の時点で100件が緑になり、その日の最後は106件になった。コードはテスト込みで3,700行ほどだ。

10万円では、何も鳴らなかった

移植元は「10万円未満の変動は無視する」を既定にしていた。同じ値のまま手元の個人事業者の推移表に当てたら、損益計算書側の指摘が1件も出なかった。規模が違う。既定を1万円に下げ、ポップアップから変えられるようにした。

月の見分け方も、実物に当ててから書き直した。見出しの文字列は「4月」としか書いていないので、それが何年の4月かは決まらない。セルに埋まっている元帳へのリンクには期間のパラメータが入っているから、そちらを月のキーにした。決算整理の列はフラグで判別でき、合計列はパラメータ自体が無い。

ツールチップが出ないので調べさせたら、セルから上へマウスのイベントが伝わっていなかった。捕捉の段階で拾う形に変えて解決した。

右下のパネルは、画面の右下にすでに別のボタンが居座っていたので、その上へ逃がした。それでも幅が340pxあるので、推移表の右端の列には重なる。ヘッダーをクリックすれば畳める。

紙の上で決めた閾値は、実物に当てるとだいたい動く。

フォルダーを選ぶところだけ、人の手が要る

拡張を書き換えても、ブラウザに読み込み直さないと画面には出ない。「この読み込み、あなたができるはずなのでやってくださいね」と言ってみた。

言った直後に自分で気づいた。新規の読み込みは「パッケージ化されていない拡張機能を読み込む」からフォルダーを選ぶ操作で、選択ダイアログはOSのものだ。ブラウザの中は触れても、そこには手が届かない。どのフォルダーを指せばいいかだけ出してもらって、自分でクリックした。一度入れてしまえば、以後のリロードは拡張の管理画面のボタンなので任せられる。

どこまで任せられるかは、こういうときにはっきりする。

課税方式を上に出す

最後に、その事業者が原則課税か簡易課税か、税抜経理か税込経理か、青色か白色かを画面の上に出させた。帳簿を見ながら毎回どこかへ確かめに行っていた情報だ。上に出ているだけで、指摘の読み方が変わる。免税事業者なら、消費税区分の判定そのものを止める。

簡易課税のときに設定APIがどんな値を返すかは、手元に事業者がいないので実測できていない。値が想定と違ったら事業者の設定ページを読みに行く作りにしてある。

残したもの

進捗のドキュメントを1本書かせて、明日のタスクに積んだ。「拡張のどの機能が会計ソフトAのどの表示に効いているか」をスクリーンショット付きの対応表にする作業で、今日は3枚だけ撮った。科目名、金額、ツールチップの本文にぼかしを当ててから撮っている。リポジトリは非公開でも、実データはそのまま置かない。

未検証も残っている。簡易課税の事業者で表示が正しく出るか。確認済みメモが失効する4つのケース(実機で試すには仕訳を直さないといけない)。総勘定元帳の指摘は、手元の帳簿では1件も出なかったので、判定を差し替えた表示テストでしか色を見ていない。

鳴らないことが、帳簿が正しいからなのか、こちらが拾えていないからなのか。それが分かるのは実運用に載せてからだ。

#Chrome拡張#クラウド会計#帳簿チェック#消費税区分#異常値検知#開発日記