稟議の記録を残すで、記録は残したけれど管理画面からは見られない、と書きました。B2Bの棚卸しでも同じことを断っています。

店舗側から見えると何が変わるか。「この受注、なんで取消しになってるんですか」と客先から電話が来たときに、答えられます。いまは答えられません。片付けます。

作るもの

受注編集画面の、ショップ用メモ欄とメール送信履歴のあいだに、カードを1枚足します。

受注編集画面。「稟議の履歴」というカードに、2026/08/07 15:17:19 佐藤 健「上長へ回した」、2026/08/11 0:43:41 山田 太郎「承認」の2行が並んでいる。その下に本体のメール送信履歴のカードが続く

課長が限度額を超えて上長へ回し、部長が承認した。マイページの承認画面に出していたものと同じ記録です。テーブルはすでにあるので、前回作った cst_order_approval をそのまま読みます。作るのは出し方だけです。

本体のテンプレートはコピーしない

EC-CUBE の管理画面のテンプレートは、app/template/admin/ に同じ名前で置けば上書きできます。受注編集画面なら app/template/admin/Order/edit.twig です。

やめました。1,106行あります。 カード1枚のために1,106行を自分の持ち物にすると、バージョンが上がるたびに本体との差分を当て直すことになります。割に合いません。

代わりに TemplateEvent を使います。EC-CUBE はテンプレートを描画する直前に、テンプレート名をそのままイベント名にしてイベントを投げます。受け取れるのは、そのテンプレートのソースと、コントローラが渡したパラメータです。ソースを書き換えて返すと、書き換えたほうが描画されます。

差し込む処理は app/Customize/EventListener にサブスクライバとして1つ置きます。購読するイベント名は、受注編集画面のテンプレート名そのままです。

やることは、順に3つ見て、どれかに当たったら何もせずに帰るだけです。

見るもの帰る条件
描画される受注新規受注登録で、受注がまだ保存されていない
その受注の稟議の記録記録が1行もない
テンプレートのソース目印のコメントが見つからない

3つとも素通りしたときだけ、引いてきた記録をテンプレートの変数として渡し、ソースの目印の手前に、自分のテンプレートを読み込む行を1行足します。本体から持ってくるものはゼロです。

新規受注登録でも同じテンプレートが動く

/admin/order/new は受注編集と同じ edit.twig を使います。このとき Order に入っているのはまだ保存されていない受注で、IDがありません。履歴の引きようがないので、IDを見て抜けています。

目印にコメントを選んだ理由

差し込む位置は文字列の一致で決めます。カードの外側の div を目印にしようとすると、同じ書き出しのタグが受注編集画面の中に5回出てきます。どれに当たるか分かりません。

本体のテンプレートには <!-- メール送信履歴 --> のような日本語のコメントが節ごとに置いてあります。 これは1回しか出てこないので、目印になります。EC-CUBE のテンプレートを書き換えるカスタマイズでは、このコメントがだいたい役に立ちます。

ただし全部が一意ではありません。同じ受注編集画面でも <!-- 小計 --> は2回出てきます。目印にする前に、その文字列が何回あるかを数えてください。

見つからなかったときは書き換えずに帰ります。バージョンが上がってコメントの文言が変わったら、カードが黙って消えます。画面が真っ白になるよりはましだ、という判断です。 上げたあとに一度は確かめてください。

カードの中身

app/template/admin/Order/approval_history.twig に置きます。@admin の名前空間は app/template/admin が先に読まれるので、本体と同じ名前空間のまま自分のファイルを足せます。本体に同じ名前のファイルがなければ、上書きにはなりません。

カードの中身は表です。持っている列をそのまま並べました。

中身
日時記録した日時
承認者記録した時点の氏名
操作承認・上長へ回した・差し戻しを、色の違うバッジで出す
差し戻しの理由差し戻しのときだけ入る

カードの外側は、隣のメール送信履歴からそのまま持ってきました。ヘッダと折りたたみ用のクラスを同じ組み合わせで書けば、右上の折りたたみが効きます。管理画面の見た目を自分で組む必要はありません。

これで、差し戻された受注の理由も店舗側から読めます。

受注編集画面の稟議の履歴。2026/08/07 15:17:23 佐藤 健「差し戻し」の行に、差し戻しの理由として「今期の備品予算を使い切っているため。来期あらためて申請してください。」が入っている

理由はテキスト型なので改行が入ります。改行をそのまま出すなら変換が要りますが、理由の列は差し戻し以外では空です。空のまま変換に渡すと PHP 8 で非推奨の警告が出るので、入っているときだけ通してください。

稟議を通っていない受注では書き換えない

記録が1行もない受注では、ソースに触らずに帰ります。最初はコンパイルのコストを避けるつもりでした。 ソースを書き換えると、本体のコンパイル済みテンプレートは使われず、Twig が書き換え後のソースからテンプレートを作り直します。1,106行を毎回コンパイルするなら、B2Cの受注のほうが多い店では無駄です。

調べたら、そうはなっていませんでした。Twig は書き換え後のソースのハッシュでキャッシュを引くので、同じ書き換えなら1回コンパイルされて、あとは使い回されます。 実際にキャッシュを見ると、226KBのクラスが1つできて、2回目以降は更新されていません。理由としては弱かった。

それでも早期に帰る作りは残しました。空のカードが出るのを避けるためです。 稟議と関係ない受注の編集画面に「稟議の履歴」という見出しだけが出ていたら、邪魔でしかありません。

増える負荷は、受注編集画面を開くたびに履歴を引く問い合わせが1回です。order_id にインデックスを張ってあるので、気にしていません。

承認待ちの受注を探すほうは、何もしていない

店舗側から追いたいことは、もう1つあります。いま何件の発注が承認待ちで止まっているか。

これは作りませんでした。承認待ちは mtb_order_status に足した行なので、受注一覧の検索条件に最初から出ています。 対応状況のチェックボックスに「承認待ち」が並び、一覧の対応状況の列にもそのまま表示されます。ステータスをマスタに足しておくと、こういうところが勝手についてきます。

承認フローの記事でステータスをマスタに足したときは、購入フローを通すためでした。副産物のほうが大きかったかもしれません。

割り切ったところ

管理画面から承認できません。 読むだけです。店舗が代理で承認できると、誰の稟議だったのか分からなくなります。作らないほうが正しいと思っています。

権限で隠せません。 受注編集画面を見られるメンバーには全員見えます。承認者の氏名が入っているので、社外のスタッフに受注管理を任せている店では気になるかもしれません。隠すなら、テンプレートの中で権限を見ることになります。

受注CSVには出ません。 出力項目は本体の設定を見ているので、履歴を混ぜるなら別の口が要ります。件数が読めない列をCSVに足すのは、そもそも無理があります。

文言を直に書いています。 「承認」「上長へ回した」「差し戻し」は翻訳ファイルを通していません。日本語だけで使う前提です。

メール送信履歴の下には行けません。 目印にしたコメントの手前に差し込んでいるので、位置を変えたければ別のコメントを探すことになります。

EC-CUBE 4.2 / 4.3 での違い

TemplateEvent でソースを書き換える仕組みは 4.2 から変わっていません。イベント名がテンプレート名になるところも同じです。

変わるのは差し込む先です。受注編集画面の中身はバージョンごとに違うので、目印にするコメントと、カードのクラス名は本体のテンプレートを開いて合わせてください。 見た目が崩れたら、たいていは隣のカードから写せば直ります。

エンティティのマッピングやプラグインの動かなくなる変更点はEC-CUBE 4.4 でプラグインが動かなくなる変更点にまとめています。

会員グループ管理を入れている場合

稟議の履歴は会員グループを見ていません。会員グループ管理プラグインの有無で挙動は変わりません。

B2B サイト全体で、どこまでが標準とプラグインで、どこからが作るものになるのかはB2Bサイト全体の線引きにまとめました。