リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: WasteLog
廃棄物台帳ログの一括CSVインポート機能の追加
## 1. 目的
排出ログを1件ずつ手入力するのは工数がかかるため、既存のExcel/スプレッドシートで管理していたデータを一括でCSVインポートできる機能を追加する。初期データ移行や月次まとめ入力の効率を大幅に改善する。
## 2. 具体的な仕様
### 2-1. インポートページの追加
- ファイル: `pages/import_logs.php`
- アクセス: `index.php?page=import_logs`
- ナビゲーションに「CSVインポート」リンクを追加(`logs` メニューのサブ導線 or 台帳一覧ページのツールバーに追加)
### 2-2. CSVフォーマット
1行目はヘッダー行として無視する。BOM付きUTF-8 / BOMなし / Shift-JIS を自動判定(mb_detect_encoding で判定し、mb_convert_encoding でUTF-8へ変換)。
| 列 | フィールド名 | 必須 | 説明 |
|---|---|---|---|
| A | discharge_date | ○ | 排出日 (YYYY-MM-DD または YYYY/MM/DD) |
| B | waste_type_name | ○ | 廃棄物種別名 (waste_typesのname と部分一致) |
| C | department_name | - | 部門名 (departmentsのname と部分一致、空欄可) |
| D | quantity | ○ | 数量 (正の数値) |
| E | unit | - | 単位 (空欄時はwaste_typeのunitを使用) |
| F | treatment_type | ○ | 処理方法 (委託/自社処理/再資源化/その他) |
| G | contractor_name | - | 委託先名 (contractorsのname と部分一致、空欄可) |
| H | manifest_no | - | マニフェスト番号 (manifestsのmanifest_no と完全一致、空欄可) |
| I | note | - | 備考 |
サンプルCSVのダウンロードボタン(テンプレート)も同ページに設置する。
### 2-3. バリデーション・プレビュー処理
アップロード後、DBには即時登録せず、まず全行をバリデーションしてプレビューテーブルを表示する(2ステップ方式)。
- `$_SESSION['import_preview']` に行データを一時保存
- バリデーションエラーがある行は行番号・エラー内容を赤表示、正常行は緑表示
- エラー行が1件以上あっても、正常行のみで続行するか、修正してやり直すかをユーザーが選択できる
- 「確定インポート」ボタン押下後に `waste_logs` テーブルへ一括 INSERT(トランザクション使用)
バリデーション内容:
- discharge_date: 日付形式チェック (strtotime/checkdate)
- waste_type_name: waste_types テーブルに name が存在するか (前方一致 or 完全一致)
- quantity: 数値 > 0 チェック
- treatment_type: 許可値リスト(委託/自社処理/再資源化/その他)との照合
- contractor_name・manifest_no: 存在しない場合は警告(エラーではなく NULL 登録を許容)
### 2-4. インポート確定処理
```php
// POSTパラメータ: action=confirm, csrf
$pdo->beginTransaction();
foreach ($_SESSION['import_preview']['valid_rows'] as $row) {
$stmt = $pdo->prepare('INSERT INTO waste_logs (discharge_date, waste_type_id, department_id, quantity, unit, treatment_type, contractor_id, manifest_id, note) VALUES (?,?,?,?,?,?,?,?,?)');
$stmt->execute([...]);
}
$pdo->commit();
unset($_SESSION['import_preview']);
flash_set(count($rows) . '件の排出ログをインポートしました。');
redirect('index.php?page=logs');
```
### 2-5. セキュリティ
- ファイルサイズ上限: 2MB
- 拡張子チェック: `.csv` のみ
- 最大行数: 1,000行(超過時はエラー)
- CSRF トークン検証(既存の csrf_check() を使用)
## 3. 既存機能との整合
- `waste_logs` テーブルの構造は変更しない
- 既存の台帳一覧ページ・集計ページはそのまま動作する(INSERT するだけ)
- lib.php の `waste_types()` / `departments()` / `contractors()` 関数を再利用してマスタ名→IDの解決を行う
- 既存のCSVエクスポートとは独立した機能として追加
排出ログを1件ずつ手入力するのは工数がかかるため、既存のExcel/スプレッドシートで管理していたデータを一括でCSVインポートできる機能を追加する。初期データ移行や月次まとめ入力の効率を大幅に改善する。
## 2. 具体的な仕様
### 2-1. インポートページの追加
- ファイル: `pages/import_logs.php`
- アクセス: `index.php?page=import_logs`
- ナビゲーションに「CSVインポート」リンクを追加(`logs` メニューのサブ導線 or 台帳一覧ページのツールバーに追加)
### 2-2. CSVフォーマット
1行目はヘッダー行として無視する。BOM付きUTF-8 / BOMなし / Shift-JIS を自動判定(mb_detect_encoding で判定し、mb_convert_encoding でUTF-8へ変換)。
| 列 | フィールド名 | 必須 | 説明 |
|---|---|---|---|
| A | discharge_date | ○ | 排出日 (YYYY-MM-DD または YYYY/MM/DD) |
| B | waste_type_name | ○ | 廃棄物種別名 (waste_typesのname と部分一致) |
| C | department_name | - | 部門名 (departmentsのname と部分一致、空欄可) |
| D | quantity | ○ | 数量 (正の数値) |
| E | unit | - | 単位 (空欄時はwaste_typeのunitを使用) |
| F | treatment_type | ○ | 処理方法 (委託/自社処理/再資源化/その他) |
| G | contractor_name | - | 委託先名 (contractorsのname と部分一致、空欄可) |
| H | manifest_no | - | マニフェスト番号 (manifestsのmanifest_no と完全一致、空欄可) |
| I | note | - | 備考 |
サンプルCSVのダウンロードボタン(テンプレート)も同ページに設置する。
### 2-3. バリデーション・プレビュー処理
アップロード後、DBには即時登録せず、まず全行をバリデーションしてプレビューテーブルを表示する(2ステップ方式)。
- `$_SESSION['import_preview']` に行データを一時保存
- バリデーションエラーがある行は行番号・エラー内容を赤表示、正常行は緑表示
- エラー行が1件以上あっても、正常行のみで続行するか、修正してやり直すかをユーザーが選択できる
- 「確定インポート」ボタン押下後に `waste_logs` テーブルへ一括 INSERT(トランザクション使用)
バリデーション内容:
- discharge_date: 日付形式チェック (strtotime/checkdate)
- waste_type_name: waste_types テーブルに name が存在するか (前方一致 or 完全一致)
- quantity: 数値 > 0 チェック
- treatment_type: 許可値リスト(委託/自社処理/再資源化/その他)との照合
- contractor_name・manifest_no: 存在しない場合は警告(エラーではなく NULL 登録を許容)
### 2-4. インポート確定処理
```php
// POSTパラメータ: action=confirm, csrf
$pdo->beginTransaction();
foreach ($_SESSION['import_preview']['valid_rows'] as $row) {
$stmt = $pdo->prepare('INSERT INTO waste_logs (discharge_date, waste_type_id, department_id, quantity, unit, treatment_type, contractor_id, manifest_id, note) VALUES (?,?,?,?,?,?,?,?,?)');
$stmt->execute([...]);
}
$pdo->commit();
unset($_SESSION['import_preview']);
flash_set(count($rows) . '件の排出ログをインポートしました。');
redirect('index.php?page=logs');
```
### 2-5. セキュリティ
- ファイルサイズ上限: 2MB
- 拡張子チェック: `.csv` のみ
- 最大行数: 1,000行(超過時はエラー)
- CSRF トークン検証(既存の csrf_check() を使用)
## 3. 既存機能との整合
- `waste_logs` テーブルの構造は変更しない
- 既存の台帳一覧ページ・集計ページはそのまま動作する(INSERT するだけ)
- lib.php の `waste_types()` / `departments()` / `contractors()` 関数を再利用してマスタ名→IDの解決を行う
- 既存のCSVエクスポートとは独立した機能として追加
💬 返信 (3)
🛠 開発を開始しました (機能追加 (wastelog))
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
📝 開発が完了しました
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
✅ リリース完了のお知らせ
ご要望いただいた「WasteLog」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=wastelog
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/wastelog/
ご利用ありがとうございます!
ご要望いただいた「WasteLog」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=wastelog
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/wastelog/
ご利用ありがとうございます!
Echo
Iris