自動化向けの仕様(Playwright / HTTP)
画面の流れ
/loginを開き、#usernameと#passwordに入力して#login-buttonを押す。成功すると/へ移る。失敗は#login-errorが出る/の#new-report-buttonを押すと/reports/newへ移る#report-name(必須)・#report-cost-center・#report-purposeを入れて#create-report-buttonを押すと/reports/{id}に移る(レポートは下書き)- 明細フォーム
#expense-form:#expense-date(YYYY-MM-DD)・#expense-category・#expense-amount(整数)・#expense-vendor・#expense-payment・#expense-attendees・#expense-memo・#expense-receipt(任意)を入れて#add-expense-buttonを押す。同じページに戻り、#flashに「明細を追加しました」・tr[data-testid=expense-row]が増える - 作ったレポート番号は
#report-number、ステータスは#report-status[data-status](draft / submitted / approved)、合計は#report-total[data-total]から読める - 申請まで進めるなら
#submit-report-button(confirm ダイアログあり)。下書きで止めるなら押さない
すべてサーバー描画・通常のフォーム送信(303 リダイレクト)です。一覧は #report-table tr[data-testid=report-row][data-report-number]。
待ち合わせと判定のコツ(Playwright)
- 作成:
#create-report-buttonのクリック後にpage.wait_for_url("**/reports/*")。番号は#report-numberから読む - 明細追加: 成功も入力エラーも同じ詳細 URL に戻るので URL だけでは判定できない。クリック前に
tr[data-testid=expense-row]の件数を控え、クリック後に件数が増えたことで判定する。失敗時は#flash.flash-errorに「明細を追加できませんでした」と理由が出る(成功時は#flash.flash-okに「明細を追加しました」) - 申請・レポート削除・明細削除・リセットのボタンは confirm ダイアログを出す。クリック前に
page.once("dialog", lambda d: d.accept())を登録しないと送信されない - 同じ送信を2回流すと明細・レポートは2件できる(重複判定なし)。やり直すときは一覧の「デモデータをリセット」から
選択肢の値
| 費目 | 接待交際費 交通費 宿泊費 会議費 消耗品費 通信費 その他 |
|---|---|
| 支払方法 | 個人立替 法人カード 請求書払い |
| 部門 | 営業部 開発部 管理部 マーケティング部 |
JSON API(Playwright を使わない経路)
ヘッダー X-API-Key が必要です(キーは管理者から受け取ってください)。
POST /api/reports
Content-Type: application/json
X-API-Key: <key>
{
"name": "10月 取引先との会食",
"purpose": "B社との情報交換",
"cost_center": "営業部",
"expenses": [
{"expense_date": "2026-10-08", "category": "接待交際費", "amount": 24200,
"vendor": "炭火焼 まる田 六本木店", "payment": "個人立替", "attendees": "B社 佐藤様", "memo": "4名"}
]
}
応答: 201 {"id": 4, "number": "EXP-2026-0004", "status": "draft", "url": "/reports/4", ...}
GET /api/reports 一覧(?status=draft で絞り込み)
GET /api/reports/{id} 1件
再試行で二重に作らないときは POST に Idempotency-Key ヘッダー(任意の文字列)を付ける。同じキーの2回目は作らずに同じレポートを 200 で返す。
デモデータ
一覧ページの「デモデータをリセット」(confirm あり)で初期状態(レポート3件)に戻ります。ログイン情報・API キーは管理者から受け取ってください。