## 02_journal_spec.md # 仕訳帳(journal.html)詳細仕様書 ## 1. 画面概要 ### 1.1 目的 - 日々の取引(収入・経費)を仕訳形式で入力・管理する - 未申告データの一括操作・修正機能を提供する ### 1.2 基本フロー 1. 会社・期間を選択 2. 新規仕訳入力(またはCSV取込) 3. 一覧で確認・修正 4. 必要に応じて一括操作(移動・入れ替えなど) 5. 申告時にデータをロック ## 2. 入力フォーム仕様 ### 2.1 フィールド一覧 | 項目 | 必須 | デフォルト | 説明 | |------|------|------------|------| | 日付 | ✅ | 当日 | 3/15のように入力。年は入力時の年が自動設定(年変更機能で対応) | | 借方科目 | ✅ | 前回選択 | 勘定科目一覧から選択 | | 貸方科目 | ✅ | 前回選択 | 勘定科目一覧から選択 | | 借方補助科目 | - | - | 借方科目が補助科目を持つ場合のみ表示 | | 貸方補助科目 | - | - | 貸方科目が補助科目を持つ場合のみ表示 | | 金額 | ✅ | - | 税込金額を1つだけ入力 | | 税区分 | ✅ | **10%** | 10% / 8% / 非課税 | | 適用(摘要) | ✅ | - | 取引内容 | | 案件番号 | - | - | 案件連動時に任意入力 | ※ 借方金額・貸方金額を別々に入力する方式は採用しない ### 2.2 案件IDと摘要の表示ルール - 入力フォームでは案件IDと摘要を横並びで配置 - 仕訳帳一覧では以下の形式で表示: - 案件IDがある場合:[案件ID] 摘要 - 案件IDがない場合:摘要のみ左詰めで表示 - 案件IDは案件管理画面から連携時、自動入力される ### 2.3 日付入力について - 3/15のように月/日形式で入力可能 - 年は入力時の西暦が自動設定される - 年度跨ぎの修正は年変更機能で一括対応 ### 2.4 税区分の優先順位 - デフォルト:10%(ほとんど全ての取引) - たまに使う:非課税(郵便切手、印紙、預金など) - まれに使う:8%(飲食料品・パーティー用食材) ### 2.5 消費税処理(自動分解) - 入力は総額(税込) - システムが自動で本体価格と消費税に分解 - 税区分に応じて分解ロジックを変更 - 仕訳は複数行で保存(例:借方:現金、貸方:売上高+仮受消費税) **仮受/仮払の振り分け判定:** 科目名の文字列判定は禁止。科目マスタの `type` フィールドで判定する。 - 貸方科目の `type === "income"` → 仮受消費税等を貸方に追加 - それ以外(expense / asset 等) → 仮払消費税等を借方に追加 例:10,000円(税込)を売上高に入力 - 借方:現金 10,000円 - 貸方:売上高 9,091円(本体) - 貸方:仮受消費税 909円 ### 2.6 入力チェック - 借方科目と貸方科目は必須 - 金額は必須(0円不可) - 摘要は必須 - 案件IDは任意 - 借方合計と貸方合計が一致すること(自動分解後 ### 2.7 会社・期間選択の表示形式 - 個人事業(SPS):和暦年表示(例:令和6年、令和7年、令和8年…) - 期間:1月1日〜12月31日 - 選択肢は現在の年まで自動生成(今年が令和7年なら令和7年まで表示、以降も同様) - 法人(SCSPS):期表示(例:第3期、第4期、第5期…) - 期間:7月1日〜翌年6月30日 - 選択肢は現在の期まで自動生成 ### 2.8 仕訳データの修正機能 - 一覧の各行をクリックすると、入力フォームに該当データがセットされる - 「登録」ボタンが「更新」に変わる - 修正後、元のデータを上書き保存する - 修正時も借方合計と貸方合計の一致チェックを行う ### 2.9 補助科目・摘要反映ルール 補助科目の反映先は科目マスタの `sub_display` フィールドで科目ごとに決まる。 | sub_display | 反映先 | 動作 | |-------------|--------|------| | `"account"` | 元帳の相手科目欄(2行目) | 摘要は変更しない。仕訳の `sub_account` フィールドに補助科目名を保持。元帳表示時に科目名1行目・補助科目名2行目で表示する | | `"description"` | 摘要欄先頭 | 摘要の先頭に補助科目名を付加して保存。`sub_account` フィールドにも補助科目名を保持 | **sub_display: "description" の例(旅費交通費・補助科目「駐車料金」):** - 入力摘要:「○○パーキング」 - 保存される摘要:「駐車料金 ○○パーキング」 - sub_account:「駐車料金」 **sub_display: "account" の例(その他の預金・補助科目「GMO(SPS)」):** - 摘要:変更なし - sub_account:「GMO(SPS)」 - 元帳の相手科目欄:1行目「その他の預金」・2行目「GMO(SPS)」 **編集時の注意:** 既存仕訳を編集フォームに読み込む際、摘要フィールドにはすでに補助科目名が付加された状態の文字列が入る(`sub_display: "description"` の場合)。 再保存時に補助科目名が二重付加されないよう、編集フォームへのセット時は `sub_account` フィールドから補助科目を復元し、摘要から補助科目名プレフィックスを除去した上でフォームにセットすること。 ## 3. 一覧表示仕様 ### 3.1 表示形式 ``` 日付 | 借方科目 | 借方金額 | 貸方科目 | 貸方金額 | 摘要 ``` ### 3.2 表示項目 - チェックボックス(一括操作用) - 日付 - 借方科目(複数ある場合は改行表示) - 借方金額(複数ある場合は合計表示) - 貸方科目(複数ある場合は改行表示) - 貸方金額(複数ある場合は合計表示) - 税区分 - 摘要(案件番号を含む) - 削除ボタン ### 3.3 案件ID表示例 | 案件ID | 摘要 | 一覧表示 | |-------|------|---------| | あり | 事務用品購入 | [PJ123] 事務用品購入 | | なし | 事務用品購入 | 事務用品購入 | ### 3.4 複合仕訳対応 - 借方:現金(税込金額) - 貸方:売上高(本体)+仮受消費税(消費税額) → 貸方科目欄に売上高 + 仮受消費税と表示 → ツールチップで内訳金額を確認可能 ### 3.5 税込金額表示 - 金額欄には税込金額を表示 - 内訳はツールチップまたは下部に小さく表示 ### 3.6 並べ替え - 日付列のヘッダーをクリックで昇順/降順を切り替える - 切替状態は列ヘッダーに `▲`(昇順・古い順)または `▼`(降順・新しい順)で表示 - **初期表示は降順(新しい順・▼)**:入力・確認作業時に最新データをすぐ確認できる - **帳簿確認・印刷時は昇順(古い順・▲)**に切り替える - ▲▼はテキスト文字を使用(アイコン不使用ルールの例外ではない) - 日付以外の列(科目・金額等)もクリックで昇順/降順切替可能 ### 3.7 絞り込み - 会社別(SPS / SCSPS) - 年別 - 科目別 - 税区分別 - 申告済/未申告 #### 3.8 科目マスタ連携 仕訳入力画面(journal.html)の借方科目・貸方科目プルダウンは、科目マスタ(`/master/accounts.json`)から動的に生成する。 - 表示対象:`active: true` の科目のみ - 会社(SPS/SCSPS)によるフィルタリング:`available_for` に該当会社が含まれる科目のみ表示 - ソート順:`name` の五十音順 また、損益計算書や確定申告画面での集計ロジックも科目マスタの `type` に依存するため、科目マスタのメンテナンスが全ての画面に影響することを明記する。 ## 4. 一括操作機能 ### 4.1 基本ルール - チェックボックスで複数選択 - 選択件数を表示 - 申告済みデータは選択できない(グレー表示) ### 4.2 操作内容 | 操作 | 説明 | |------|------| | 削除 | 選択したデータを完全に削除(確認ダイアログ表示) | | 借方/貸方入れ替え | 借方と貸方を入れ替え(確認ダイアログ表示) | | 会社変更 | プルダウンで選択後、実行ボタンで適用(確認ダイアログ表示) | | 年変更 | プルダウンで選択後、実行ボタンで適用(確認ダイアログ表示) | | 期間移動 | 選択データを指定した期間に移動(コピーではなく移動) | | 科目変更 | 勘定科目を一括で変更 | ※ 各ボタンはアイコンなし、テキストのみで表示 ※ 年変更プルダウンは和暦(西暦)形式で表示し、選択肢は現在の年まで自動生成する ※ 実行ボタンは会社変更・年変更のプルダウン選択後に有効になる ### 4.3 会社間転送 - コピーではなく「移動」(転送元からデータ削除) - 確認モーダルで「移動元から削除されます」と明示 - 転送先の期間は同じ(年は維持) ## 5. CSV取込機能 ### 5.1 取込ファイル形式 - CSVファイル(カンマ区切り) - 1行目は項目名(ヘッダー) - 2行目以降がデータ - 文字コード:UTF-8(BOM付き推奨) **必要な項目(固定):** | 列番 | 項目名 | 例 | 備考 | |------|--------|-----|------| | 1 | 日付 | 2024-01-31 | YYYY-MM-DD形式 | | 2 | 借方勘定科目 | その他の預金 | - | | 3 | 金  額(借方) | 10000 | 数値(カンマ不可) | | 4 | 貸方勘定科目 | 売上(収入) | - | | 5 | 金  額(貸方) | 10000 | 数値(カンマ不可) | | 6 | 摘要 | UcarPAC㈱ 12月分 | - | ※ 列名の空白(「金  額」など)は許容する ### 5.2 取込データの構造 R06.csvのように、以下の特徴を持つデータに対応する: 1. **1取引=2行構成(本体+消費税)** - 1行目:本体(借方:預金/現金、貸方:売上/経費科目) - 2行目:消費税(借方:預金/現金、貸方:仮受消費税等 / 借方:仮払消費税等、貸方:事業主借) 2. **非課税データの扱い** - 摘要に「非課税」を含む行は税区分0%として扱う - 税額計算を行わず、本体のみの仕訳とする ### 5.3 取込ロジック(自動統合ルール) 同一取引の判定基準: - 同じ日付 - 同じ借方勘定科目 - 同じ摘要(完全一致) 上記が一致する行を**同一取引**とみなし、以下のルールで統合する: | パターン | 統合方法 | |---------|---------| | 売上系(貸方:売上/収入 + 仮受消費税等) | 貸方科目を「売上(収入) + 仮受消費税等」と表示。税込金額は借方金額を保持 | | 経費系(借方:経費科目 + 仮払消費税等、貸方:事業主借/現金) | 借方科目を「経費科目 + 仮払消費税等」と表示。税込金額は借方の合計(経費+消費税) | | 非課税(摘要に「非課税」) | 単独行として取込、税区分0%を設定 | ### 5.4 取込手順 1. ファイル選択 2. プレビュー表示(内容確認)- オプション 3. 取込実行 4. 結果表示(取込件数/エラー件数) ### 5.5 エラー処理 | エラー種別 | 対応 | |-----------|------| | 日付が不正(空欄/形式違い) | 該当行をスキップ | | 金額が数字でない | 該当行をスキップ | | 借方/貸方科目が空欄 | 該当行をスキップ | | 税区分の自動判定不能 | 10%をデフォルト設定(警告表示) | エラー行は無視して続行可能。取込完了時にエラー件数を表示する。 ### 5.6 取込後のデータ構造 取込後は以下の形式で保存: ```json { "id": "ランダムID", "date": "2024-01-31", "tax_included": 11000, "entries": [ { "account": "その他の預金", "sub_account": "GMO(SPS)", "debit": 11000, "credit": 0, "tax_type": "10%" }, { "account": "売上(収入)", "sub_account": null, "debit": 0, "credit": 10000, "tax_type": "10%" }, { "account": "仮受消費税等", "sub_account": null, "debit": 0, "credit": 1000, "tax_type": "10%" } ], "description": "UcarPAC㈱ 12月分", "project_id": "", "locked": false, "status": "confirmed", "receipt_path": "" } ``` `sub_account` フィールドは補助科目名(文字列)を保持する。コードは使用しない。補助科目なしの場合は `null`。 ### 5.7 案件IDの扱い - CSVに案件ID列は存在しない - 取り込み時は案件IDは空欄で登録 - 後日、一括操作または個別編集で案件IDを付与可能 ## 6. 申告済みデータの扱い ### 6.1 ロック機能 - 確定申告(private/accounting/tax.html)または法人税申告(corporate/accounting/corporate.html)で「申告済」にしたデータは自動ロック - ロックされたデータは: - 編集できない - 削除できない - 一括操作の対象外 ### 6.2 修正申告 - 修正申告ボタンでパスワード入力 - 認証後、ロックを一時解除 - 修正後、再度「申告済」に設定 ## 7. UIデザイン要件 ### 7.1 基本カラー - ヘッダー背景: #000080(ネイビー) - ボタン背景: #000080(ネイビー) - ボタンテキスト: 白 ### 7.2 ボタンホバー | ボタン種別 | ホバー色 | 備考 | |-----------|---------|------| | 通常ボタン | #0000a0 | 明るいネイビー | | 警告ボタン(移動) | #ffaa00 | オレンジ | | 削除ボタン | #ff4444 | 赤 | ※ すべてのボタンは通常時ネイビー、ホバー時のみ上記色に変化 ### 7.3 ボタンサイズ | ボタン | サイズ | 備考 | |--------|-------|------| | 削除ボタン(一括操作) | 横幅120px、高さ38px | 「選択を削除」表示 | | 入替えボタン(一括操作) | 横幅140px、高さ38px | 「借方⇔貸方入替え」表示 | | 会社変更プルダウン | 横幅130px、高さ38px | 「→個人事業」表示 | | 年変更プルダウン | 横幅160px、高さ38px | 「→令和7年(2025)」表示 | | 標準ボタン(登録・取込実行など) | 横幅120px、高さ38px | | | 実行ボタン(一括操作用) | 横幅80px、高さ38px | 「実行」表示 | | テーブル内削除ボタン | 横幅100px、高さ38px | | ### 7.4 入力フィールド - 日付・借方科目・貸方科目・金額の各フィールドは全て同じ幅とする - 税区分は狭くする(80px) - 案件IDと摘要は横並びで、案件IDは150px(11桁対応)、摘要は残りの幅を全て使用(全角20文字以上確保) - 入力フィールドの高さは38px(padding: 0.5rem) ### 7.5 ファイル選択ボタン - 周囲の入力フィールドと高さを揃え、上下中央に配置する - テキストのみ表示(アイコン不使用) ## 8. 案件管理連携仕様(経費自動振り分け) ### 8.1 経過書入力からの連携フロー 案件管理メニューの経過書入力欄で以下の情報を入力すると、仕訳帳に自動転記される: | 入力項目 | 転記先 | 補足 | |---------|--------|------| | 日付 | 仕訳帳の日付 | 入力された日付をそのまま使用 | | 名目(ETC、面談時喫茶料金、駐車料金など) | 摘要 | 案件IDと共に表示 | | 金額 | 仕訳帳の金額 | 税込金額として転記 | | 案件ID | 仕訳帳の案件ID | 自動入力(連携キーとして使用) | ### 8.2 勘定科目自動振り分けルール 経費の名目に応じて、勘定科目を自動判定する: | 名目(キーワード) | 借方科目 | 貸方科目 | 備考 | |------------------|---------|---------|------| | ETC、高速道路、有料道路 | 旅費交通費 | 現金/普通預金 | - | | 駐車場、パーキング | 旅費交通費 | 現金/普通預金 | - | | 喫茶、喫茶代、飲食(面談) | 会議費 | 現金/普通預金 | 面談時は会議費扱い | | タクシー、電車賃 | 旅費交通費 | 現金/普通預金 | - | | 消耗品、文房具 | 消耗品費 | 現金/普通預金 | - | | ガソリン、燃料 | 車両費 | 現金/普通預金 | - | | 該当なし(デフォルト) | 旅費交通費 | 現金/普通預金 | 経費の基本 | ### 8.3 自動振り分けの優先順位 1. 名目に含まれるキーワードで判定 2. 複数キーワード該当時は最初にマッチしたものを採用 3. キーワード未該当の場合はデフォルト科目(旅費交通費)を適用 ### 8.4 税区分の自動設定 - 原則として10%(課税)を適用 - 非課税対象(郵便切手等)は別途対応(将来的な拡張) ### 8.5 実装イメージ 案件管理画面での入力: - 日付: 2026-03-16 - 名目: ETC(東京〜大阪間) - 金額: 8,500円 - 案件ID: PJ123 → 仕訳帳に自動転記: - 日付: 2026-03-16 - 借方科目: 旅費交通費 - 貸方科目: 現金 - 金額: 8,500円 - 案件ID: PJ123 - 摘要: [PJ123] ETC(東京〜大阪間) ## 9. データ保存場所 ### 9.1 保存先フォルダ /backoffice/data/accounting/private/[年]/journals.json # 個人事業 /backoffice/data/accounting/corporate/[期]/journals.json # 法人 ### 9.2 保存内容 - 日付 - 会社 - 借方科目・金額 - 貸方科目・金額 - 税区分 - 案件ID(任意) - 摘要 - 作成者 - ロック状態 - 作成日時・更新日時 ### 9.3 申告時のデータ保存 - 申告処理(tax.html / corporate.html)実行時に、該当年/期の仕訳データが自動的に以下のパスに保存される: - 個人事業:`/data/accounting/private/[年]/journals.json` - 法人:`/data/accounting/corporate/[期]/journals.json` - 同時に全データに `locked: true` が設定される ## 追記内容(02_journal_spec.md) --- ### 4.4節 会社間移動時の画像ファイル移動(4.2節の補足) 会社変更(SPS⇔SCSPS)を実行した際、仕訳データに `receipt_path` が存在する場合は画像ファイルも同時に移動する。コピーは禁止(仕訳データと同様)。 **移動処理の流れ:** 1. 選択した仕訳の中に `receipt_path` があるものを抽出 2. `move_receipt.php` を呼び出し、サーバー上の画像ファイルを旧パスから新パスへ移動(`rename()`) 3. 成功したら仕訳データの `receipt_path` を新パスに書き換え 4. 失敗したら仕訳データの移動もロールバックし、エラーを表示 **移動前後のパス例(SPS→SCSPS):** ``` 移動前: /data/receipts/private/2025/01/[仕訳ID].jpg 移動後: /data/receipts/corporate/2025/01/[仕訳ID].jpg ``` **案件番号ありの仕訳が含まれる場合:** - 移動を禁止せず、警告ダイアログを表示して続行確認を求める - 続行した場合は通常の移動処理を実行 - この操作のみログを記録する(後述 4.5節) --- ### 4.5節 会社間移動ログ(案件番号あり仕訳を含む場合) 案件番号ありの仕訳を含む会社間移動を実行した場合のみ、以下の内容をログに記録する。 **記録内容:** | 項目 | 内容 | |------|------| | 日時 | 操作日時(ISO 8601形式) | | 操作者 | ログインユーザーID | | 移動元会社 | SPS または SCSPS | | 移動先会社 | SPS または SCSPS | | 対象仕訳ID | 移動した仕訳のIDリスト | | 案件番号 | 含まれていた案件番号リスト | **保存先:** `/backoffice/data/logs/case_transfer.json` **データ構造:** ```json [ { "timestamp": "2026-03-22T14:30:00+09:00", "user_id": "SPS01-00001", "from_company": "SPS", "to_company": "SCSPS", "journal_ids": ["1773360600232.405", "1773360600233.112"], "case_ids": ["S01R0203001A"] } ] ``` **実装ファイル:** `master/api/move_receipt.php`(画像移動とログ記録を同一PHPで処理) --- ### 9.4節 領収書画像の保存先 ``` /backoffice/data/receipts/ ├── private/ # 個人事業(SPS) │ └── [年]/[月]/[仕訳ID].jpg └── corporate/ # 法人(SCSPS) └── [年]/[月]/[仕訳ID].jpg ``` - 保存APIは `master/api/save_receipt.php` - 移動APIは `master/api/move_receipt.php`(会社変更時のみ使用) - 仕訳データの `receipt_path` フィールドに絶対パスで記録 --- ## 10. 今後の拡張予定 - よく使う仕訳のテンプレート登録 - 銀行口座の明細CSV自動取込 - レシート写真からのOCR入力 - 案件管理との完全連携(案件ID自動反映) - 経費の名目による勘定科目自動振り分け(ver1.0で実装) ## 11. 出力仕様 ### 11.1 出力ボタンの共通仕様 全会計画面の出力ボタンは以下の3つを配置する。`window.print()` の直接呼び出しは禁止。`/common/js/print.js` を読み込み、以下の関数を使用する。 | ボタン | 関数 | 用途 | |--------|------|------| | PDF出力 | `printPDF()` | データ納品・画面閲覧用 | | 片面印刷 | `printSingle()` | 紙納品(片面) | | 両面印刷 | `printDuplex()` | 紙納品(両面) | 詳細は `02_print_spec.md` を参照。 ### 11.2 印刷CSS共通ルール `@media print` ブロック内のCSSはmPDFに渡されるため、mPDFで動作しない記述は使用しないこと。 **非表示にするもの:** - ヘッダー(`.header`) - セレクター・フィルターバー - アクションボタン類 **使用禁止CSS(mPDF非対応):** - `display: flex` / `display: grid` - `position: fixed` / `position: absolute` - `:first-of-type` / `:last-of-type` / `:first-child` / `:last-child` 詳細は `02_print_spec.md` 8.2節を参照。 ### 11.3 仕訳帳出力(将来実装) 仕訳帳(journal.html)への印刷ボタン追加は未実装。設計確定後に実装する。 ## 改訂履歴 | 日付 | 版 | 内容 | |------|----|------| | 2026-03-12 | 1.0 | 初版作成 | | 2026-03-15 | 1.1 | 保存先パスを private/ / corporate/ に修正 | | 2026-03-16 | 1.2 | 総額入力方式、複合仕訳表示、会社間転送、申告済ロック、UI要件追記 | | 2026-03-16 | 1.3 | 案件IDフィールド追加、摘要表示ルール明記、アイコン不使用を追記、日付入力仕様修正、ファイル選択ボタン配置修正 | | 2026-03-16 | 1.4 | 案件管理連携による経費自動振り分け機能を追加(8節) | | 2026-03-16 | 1.5 | CSV取込機能の詳細仕様を追記(R06.csv形式に対応する自動統合ルール、非課税処理、エラー処理を明記) | | 2026-03-16 | 1.6 | 会社・期間選択の和暦表示と自動生成を明記(2.7節新設)、年変更プルダウンの和暦表示と自動生成を追記(4.2節)、フィールド幅の原則を明確化(01_design_guideline.md 8.2節) | 2026-03-16 1.3 標準ボタンのサイズを明記(横幅120px、高さ38px)、一括操作UI変更に伴うボタンサイズ調整|  |------|----|------| | 2026-03-16 | 1.7 | 一括操作ボタンの文字表記とサイズを調整(削除120px、入替え140px、会社変更130px、年変更160px、実行80px) | | 2026-03-16 1.8 仕訳データ修正機能の仕様を追記(2.8節新設) | | 2026-03-16 1.9 9.3節「申告時のデータ保存」を追記 | | 2026-03-17 | 1.10 | 3.8節「科目マスタ連携」を新設 | | 2026-03-22 | 1.11 | 会計担当 | 4.4節「会社間移動時の画像ファイル移動」新設 | 会社変更時に画像パスが切れる問題の仕様化 | | 2026-03-22 | 1.11 | 会計担当 | 4.5節「会社間移動ログ」新設 | 案件番号あり仕訳の移動操作の追跡のため | | 2026-03-22 | 1.11 | 会計担当 | 9.4節「領収書画像の保存先」新設 | move_receipt.php追加に伴い保存構造を明記 | | 2026-03-22 | 1.12 | 会計担当 | 11節「出力仕様」を全面更新。「PDFで保存」「印刷」2ボタン方式・印刷CSS共通ルール・フォントサイズ(本文10pt・見出し12〜14pt)・余白(@page 1.5cm 1cm)を明記 | | 2026-03-24 | 1.13 | 会計担当 | 補助科目選択機能を追加。摘要への自動反映ルールを追記 | 補助科目機能追加に伴う仕訳入力UIの変更 | | 2026-04-04 | 1.14 | 会計担当12代目 | 2.5節に消費税type判定基準を追記。2.9節を全面改訂(sub_displayによる反映先振り分け・編集時の二重付加防止を明記)。5.6節のデータ構造にsub_accountフィールド追加(名称で保持・コード廃止)。11節をmPDF方針に修正(window.print()禁止・print.js使用・仕訳帳印刷は将来実装) | 07_accounts_master.md v1.5の補助科目コード廃止に連動。影響範囲:journal.html・accounts.json・journals.json |