チェーン発注ポータル30店舗・発送管理・本部一括請求 IMPLEMENTATION PLAN

WordPress実装設計

仕様書 v0.3 を、WordPress(さくらインターネット)でどう作るかの設計案です。「注文の保存を正本にして、外部連携を切り離す」という仕様書の方針を、そのまま構成に落としています。

ARCHITECTURE

全体構成

注文は必ず先にデータベースへ保存し、メール・スプレッドシート・PDFは後続の処理として分けて動かします。外部サービスが止まっても、注文は失われません。

店舗の担当者専用リンク /order/s/{token}スマホ・PC 本部・発送管理者管理画面(2要素認証)発送・請求・再送 WordPress + 専用プラグイン 店舗フォーム/管理画面/REST入力検証・冪等キー・権限期限計算・請求集計PDF生成(mPDF+日本語フォント) 先に保存 → 後で連携 MySQL(さくら)=正本注文・店舗・商品・発送日・請求 キュー/サーバーCron再試行(指数バックオフ) メール配信サービス宛先別に個別送信 Google スプレッドシート一方向コピー(upsert) Excel/CSV・PDF出力請求書・明細・領収証 Webhook保存後に登録delivered/bounce
WordPress本体(正本を持つ)非同期処理データベース
ORDER FLOW

注文が保存されるまでと、その後

店舗が「発注を確定」した瞬間

リンクのトークンを検証ハッシュ照合。休止・無効ならここで拒否。ブラウザから店舗IDは受け取りません。
入力をサーバー側で検証商品・箱数・発送日(公開中・締切前・上限内)・備考(HTML除去)を再チェック。
1つのDBトランザクションで保存冪等性キーが同じなら既存の発注書番号を返し、二重登録しません。店舗・商品・宛先・期限はスナップショットで保存。
完了画面を返す「保存成功」を先に表示。メール到達は別枠で、あとから更新します。

保存のあと(非同期)

メールをキューへ登録宛先ごとに1通ずつ。送信失敗でも注文は成立のまま。指数バックオフで自動再試行。
スプレッドシートへupsert注文番号をキーに反映。再送しても重複行は作りません。
Webhookで到達状態を更新署名を検証し、発注書番号・メッセージID・宛先を照合して delivered/bounce を記録。
滞留・失敗を監視未達・確認中30分超・連携滞留・Cron停止を、管理画面と通知で知らせます。
MODULES

仕様書の機能と、実装のしかた

機能(仕様書)WordPressでの実装ポイント
店舗専用リンク(第3章)rewrite ruleで /order/s/{token} を専用テンプレートに割り当てトークンはハッシュ保存・128bit以上・noindex・サイトマップ除外
注文・明細・請求データ(第10章)専用テーブルを dbDelta で作成(投稿タイプは使わない)集計・整合性・トランザクションを確実にするため
管理画面(第14章)WordPress管理メニュー配下に7画面。権限(capability)を分けて付与2要素認証・ログイン試行制限・操作ログ
期限計算(第4・7章)営業日カレンダー+契約書設定値(日数・時刻・営業日の定義)を管理値として保持注文時点の期限を保存し、設定変更の影響を受けない
メール・到達管理(第6章)配信サービスのAPI+Webhook受信用のRESTエンドポイントWordPress標準のwp_mailは到達イベントを返せないため使いません
スプレッドシート連携(第11章)Google Sheets API(サービスアカウント)。認証情報は公開領域の外へWordPress DBが正本、Sheetsは閲覧・集計用の複製
PDF(第9章)mPDF+日本語フォント埋め込み(請求書・明細・領収証)文字が選択・検索できる、印刷向けのPDF
Excel/CSV(第11章)PhpSpreadsheetで、注文一覧・発送一覧・請求明細・メール結果を出力Sheetsが止まっていても、手動出力で運用を継続
SAKURA

さくらインターネットで確認したいこと

サーバー環境

  • 対応するPHP・MySQLのバージョン
  • サーバーCronの利用可否(疑似Cronより優先)
  • 外向き通信(メールAPI・Google API)の可否
  • SSL・WAF・ディスク容量

メール配信の基盤

  • さくらの標準メールでは「到達(delivered)」の通知を受け取れません
  • Webhook対応の配信サービス(Amazon SES/SendGrid/Mailgun 等)が別途必要です
  • アカウント・送信ドメイン認証(SPF・DKIM)の準備が必要です

バックアップ・更新

  • DB・ファイルの日次バックアップ(同一サーバー外にも保管)
  • 本体・PHP・プラグイン更新は、検証環境で確認してから本番へ
  • 更新失敗時に、直前の状態へ戻せる手順書
PHASES

進め方(案)

止まってはいけない「受注〜発送」を先に固め、その上に連携と請求を載せる順番です。各フェーズの終わりに、受入試験の該当項目を一緒に確認します。

フェーズ1 受注と発送の土台

店舗専用リンク/店舗発注(入力・確認・完了)/商品・発送日・期限計算/発注書一覧・詳細・取消/発送状態の更新。受入 A-01〜A-03・A-08・A-09・A-11〜A-13

フェーズ2 メール到達とデータ連携

宛先別メール・到達状況・再送/Webhook/Sheets連携/Excel・CSV出力/監視・障害時の動作。受入 A-04〜A-07

フェーズ3 請求・帳票・運用

月次請求の集計と検証/請求書・明細・領収証PDF/バックアップ・復元/運用手順書・障害対応手順書。受入 A-10・A-14 + 公開判定

納品物(仕様書 16.1 に沿って)

  • WordPress実装(店舗発注・管理画面・DB・権限・帳票・連携・メール到達管理)
  • 環境設定書(さくら/PHP・MySQL/Cron/SSL/WAF/秘密情報)
  • 運用手順書(店舗・商品・発送日/取消/発送更新/再送/請求/領収証)
  • 障害対応手順書(メール・Sheets・DB・Cron・バックアップ異常の切り分けと復旧)
  • 試験結果(受入A-01〜A-14/復元試験/ブラウザー確認)

※ 費用・スケジュールは、下記の確認事項が固まってからご提案します。

QUESTIONS

実装前に、確認させてください

仕様書の「確定待ち」を中心に、動かし始める前にそろえておきたい点です。

1
変更・取消期限の正式な文言日数・「営業日」の定義(土日祝のみか、独自の休業日を含むか)・締切時刻・期限超過後の扱い(契約書の文言)。※ 仕様書 確定待ち No.1〜3
2
メール配信基盤到達(delivered/bounce)を受け取れる配信サービスの選定と、アカウント・費用の負担、送信元ドメイン。
3
請求書・領収証の様式既存の請求書のひな形、適格請求書の登録番号、振込先、端数処理(切捨て等)、消費税(軽減税率8%)の扱い。
4
発送済みの後の訂正返品・値引・請求訂正の運用(誰が、どの手順で)。デモは「訂正を申請する」で権限者へ回付する形にしています。
5
さくらインターネットの契約プランPHP・MySQLのバージョン、Cronの利用可否、外向き通信、WAF、メール送信の制限。
6
店舗・宛先・単価の初期データ30店舗の店舗名・住所・宛先メールアドレス一覧、商品の単価・税率、初期の発送日と受付上限。
7
管理者の役割と人数受注/発送管理/請求/システム管理の担当を分けるか。権限の切り分けと2要素認証の対象。
8
スプレッドシートの使い方誰が閲覧するか、集計用のシート構成、共有先。Excel運用を優先する場合は、出力機能を厚くします。
9
バックアップの保持期間日次30世代+月次12世代 など。別保管先の指定。※ 仕様書 確定待ち No.7
10
公開日と保守運用開始の希望日。公開後の保守(更新・障害対応)の範囲と連絡方法。