Files
njts-accounting-core/docs/voucher-export-quickstart.md
2026-02-01 20:13:52 +09:00

283 lines
7.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 📄 账票出力機能 - クイックスタートガイド
## 概要
給与・賞与の账票出力機能を実装しました。ユーザーは期間、従業員、支払タイプを選択してプレビューまたはCSV出力ができます。
## 実装内容
### 1. 新しいTab追加
`payroll-calculation.html` の「給与計算」「賞与計算」タブ横に「📄 账票出力」タブを追加しました。
### 2. フロントエンド実装 (payroll-calculation.html)
#### UI要素
- **期間選択**: 開始年月(必須)、終了年月(任意)
- **従業員選択**: チェックボックス一覧、全選択/全解除ボタン、選択数表示
- **支払タイプ**: ラジオボタン(給与・賞与両方/給与のみ/賞与のみ)
- **操作ボタン**: プレビュー、CSV出力
- **結果表示**: 摘要と詳細データ(隠れた状態で用意)
- **無データアラート**: モーダルダイアログ
#### JavaScript関数
```javascript
// 従業員リスト読み込み&表示
loadVoucherEmployees();
// 従業員選択数更新
updateVoucherEmployeeCount();
// 全選択
selectAllVoucherEmployees();
// 全解除
clearAllVoucherEmployees();
// 選択中の従業員IDを取得
getSelectedVoucherEmployees();
// 条件検証API呼び出し
previewVouchers();
// 結果表示
displayVoucherResults(result);
// 無データアラート表示
showNoDataAlert(message);
// CSV出力
exportVouchersCSV();
```
### 3. バックエンド実装 (backend/app/payroll/vouchers/)
#### 新規ファイル
- **router.py** (165行): 5つのAPI端点
- **schemas.py** (113行): Pydanticデータモデル
- **service.py** (445行): ビジネスロジック、DB クエリ
#### API端点
##### 1. 従業員リスト取得
```
GET /payroll/vouchers/employees
レスポンス:
{
"total": 5,
"employees": [
{"id": 1, "code": "E001", "name": "田中太郎"},
{"id": 2, "code": "E002", "name": "山田花子"},
...
]
}
```
##### 2. 账票エクスポート(メイン)
```
POST /payroll/vouchers/export
リクエスト:
{
"start_year": 2026,
"start_month": 1,
"end_year": 2026,
"end_month": 1,
"employee_ids": [1, 2],
"voucher_type": "all", // or "salary" or "bonus"
"format": "preview" // or "csv"
}
レスポンス (成功):
{
"status": "success",
"has_data": true,
"message": "✓ 成功查詢: 2位従業員有數據",
"summary": [
{
"employee_id": 1,
"employee_code": "E001",
"employee_name": "田中太郎",
"has_salary_data": true,
"has_bonus_data": false,
"salary_count": 12,
"bonus_count": 0,
"salary_months": ["2026-01", "2026-02", ...],
"bonus_months": []
}
],
"data": {
"salary": [...],
"bonus": [...]
}
}
レスポンス (無データ):
{
"status": "no_data",
"has_data": false,
"message": "選定條件下、沒有找到任何數據。請檢查日期範圍和従業員選擇。"
}
```
## 使用手順
### テスト環境での実行
#### 1. バックエンドサーバー起動
```bash
cd backend
python -m uvicorn app.main:app --reload --port 8000
```
#### 2. ブラウザでアクセス
```
http://localhost/payroll-calculation.html
```
#### 3. 使用フロー
1. 「📄 账票出力」タブをクリック
2. 従業員リストが自動読み込み
3. **開始年月** を選択 (必須)
4. **終了年月** を選択 (任意 - 単月の場合は開始年月のみ)
5. 従業員を選択 (複数選択可、全選択/全解除機能あり)
6. 支払タイプを選択 (デフォルト: 給与・賞与両方)
7. 「プレビュー」ボタンをクリック
8. 結果確認後「CSV出力」でダウンロード
### エラーシナリオ
#### 無データの場合
- モーダルダイアログが表示
- メッセージ: 「選定條件下、沒有找到任何數據。請檢查日期範圍和従業員選擇。」
- OK ボタンで閉じる
#### 部分的なデータの場合
- データがある従業員のみ結果表示
- 摘要で「部分成功」と表示
- 給与/賞与の有無が明記
## データベース クエリ構造
### 給与データ取得
```sql
SELECT
e.id, e.code, e.name,
mp.payroll_year, mp.payroll_month,
mp.gross_salary, mp.total_deductions, mp.net_salary
FROM employees e
JOIN monthly_payroll mp ON e.id = mp.employee_id
WHERE e.id IN (employee_ids)
AND (mp.payroll_year * 100 + mp.payroll_month) >= start_ym
AND (mp.payroll_year * 100 + mp.payroll_month) <= end_ym
ORDER BY mp.payroll_year, mp.payroll_month
```
### 賞与データ取得
```sql
SELECT
e.id, e.code, e.name,
bp.bonus_year, bp.bonus_month,
bp.bonus_amount, bp.tax_amount, bp.net_bonus
FROM employees e
JOIN bonus_payments bp ON e.id = bp.employee_id
WHERE e.id IN (employee_ids)
AND (bp.bonus_year * 100 + bp.bonus_month) >= start_ym
AND (bp.bonus_year * 100 + bp.bonus_month) <= end_ym
ORDER BY bp.bonus_year, bp.bonus_month
```
## CSV出力フォーマット
```
データ,従業員コード,従業員名,年月,支給額,控除額,差引支給額
给与,E001,田中太郎,2026-01,250000,50000,200000
给与,E001,田中太郎,2026-02,250000,50000,200000
賞与,E001,田中太郎,2025-12,500000,100000,400000
```
## テストケース
### ✓ テスト完了
- 従業員リスト取得: 成功
- 給与データ取得: 成功(複数月、複数従業員)
- 賞与データ取得: 成功
- 混合データ取得: 成功(給与+賞与)
- 無データ検出: 成功(適切なエラーメッセージ)
- 年跨ぎ対応: 成功(例: 2025-12 2026-03
## トラブルシューティング
### 「従業員リストが表示されない」
- → タブをクリック時に `loadVoucherEmployees()` が実行されることを確認
- → ブラウザのコンソールF12 → Consoleでエラーを確認
- → バックエンド `/payroll/vouchers/employees` が返すかテスト
### 「プレビューをクリック後、何も表示されない」
- → 開始年月が選択されているか確認
- → 従業員が選択されているか確認
- → ネットワークタブF12 → Network`/payroll/vouchers/export` へのリクエストを確認
- → バックエンドのログを確認(ターミナル出力)
### 「CSVが正しく出力されない」
- → ブラウザコンソールで `exportVouchersCSV()` 実行結果を確認
- → CSV形式とエンコーディングUTF-8を確認
- → Excelで開く際、ファイル形式を自動判定に任せず明示的に「UTF-8 CSV」を選択
## 次の実装予定
### Phase 2: PDF生成
- reportlab による帳票PDF生成
- 複数ページ処理
- 日本語フォント対応
### Phase 3: 高度な機能
- メール配信
- 一括ダウンロード
- アーカイブ管理
## ファイル一覧
### バックエンド
- `backend/app/payroll/vouchers/router.py` - API定義
- `backend/app/payroll/vouchers/schemas.py` - データモデル
- `backend/app/payroll/vouchers/service.py` - ビジネスロジック
- `backend/app/payroll/vouchers/__init__.py` - パッケージ初期化
### フロントエンド
- `frontend/payroll-calculation.html` - UI実装新Tab追加
- `frontend/voucher-export-test.html` - テストページ
### ドキュメント
- `docs/voucher-export-quickstart.md` - このファイル
## 質問・サポート
不明な点がある場合は、以下を確認してください:
1. ブラウザコンソールF12でのエラーメッセージ
2. バックエンドターミナルのログ出力
3. ネットワークタブでのAPI通信状況