リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: DeliveryNote Pro - 納品書・受領確認クラウド台帳
納品書一覧画面への絞り込み検索フィルター追加
## 1. 目的
納品書の件数が増えるにつれて、一覧から目的の納品書を見つけにくくなる。得意先・ステータス・納品日範囲・納品書番号キーワードで絞り込めるフィルターを一覧画面(pages/list.php)上部に追加し、業務効率を向上させる。
## 2. 具体的な仕様
### 2-1. フィルターUI(一覧上部にカード形式で配置)
- **得意先** : `<select>` — 「すべて」+ customers テーブルの全件(code + name 表示)
- **ステータス** : `<select>` — 「すべて」+ draft/issued/confirmed/discrepancy(statuses() を利用)
- **納品日(開始)** : `<input type="date">`
- **納品日(終了)** : `<input type="date">`
- **納品書番号・備考キーワード** : `<input type="text">` — note_number と remarks を LIKE 検索
- **検索ボタン**(GETでself送信)・**リセットリンク**(フィルターなし一覧へ)
### 2-2. PHPサーバー側処理(list.php内)
GETパラメータ `customer_id`, `status`, `date_from`, `date_to`, `keyword` を受け取り、動的にWHERE句を構築してPDOプリペアドステートメントで安全に検索する。
```php
$where = ['1=1'];
$params = [];
if (!empty($_GET['customer_id'])) {
$where[] = 'n.customer_id = ?';
$params[] = (int)$_GET['customer_id'];
}
if (!empty($_GET['status']) && array_key_exists($_GET['status'], statuses())) {
$where[] = 'n.status = ?';
$params[] = $_GET['status'];
}
if (!empty($_GET['date_from'])) {
$where[] = 'n.delivery_date >= ?';
$params[] = $_GET['date_from'];
}
if (!empty($_GET['date_to'])) {
$where[] = 'n.delivery_date <= ?';
$params[] = $_GET['date_to'];
}
if (!empty($_GET['keyword'])) {
$where[] = '(n.note_number LIKE ? OR n.remarks LIKE ?)';
$kw = '%' . $_GET['keyword'] . '%';
$params[] = $kw;
$params[] = $kw;
}
$sql = 'SELECT n.*, c.name AS customer_name FROM delivery_notes n INNER JOIN customers c ON c.id = n.customer_id WHERE ' . implode(' AND ', $where) . ' ORDER BY n.delivery_date DESC, n.id DESC';
```
### 2-3. フィルター状態の保持
- フォームの各フィールドには `$_GET` の値を `value` / `selected` で再セットし、検索後も入力内容が残るようにする。
- リセットリンクは `href="index.php?page=list"` とするだけでよい。
### 2-4. 件数表示
- 絞り込み結果の件数を「N件見つかりました」と一覧テーブルヘッダー付近に表示する。
### 2-5. スマホ対応
- フィルターカードは既存の `.form-row` クラスを流用し、`flex-wrap: wrap` で自動折り返しする(既存CSSで対応済みのため追加CSS最小限)。
## 3. 既存機能との整合
- list.php のみ変更し、他ファイルには手を加えない。
- 既存のページネーションがある場合は、フィルターパラメータをページリンクのクエリに引き継ぐ(`http_build_query` で現在の `$_GET` をベースにページ番号だけ上書き)。
- GETメソッド送信のためCSRFトークン不要(参照系のみ)。
- 既存のCSV出力機能がある場合は、同じフィルターパラメータをCSVエクスポートURLにも付与して絞り込み後のデータをCSV出力できるようにする(出力ボタンのhrefにクエリストリングを追加するだけ)。
納品書の件数が増えるにつれて、一覧から目的の納品書を見つけにくくなる。得意先・ステータス・納品日範囲・納品書番号キーワードで絞り込めるフィルターを一覧画面(pages/list.php)上部に追加し、業務効率を向上させる。
## 2. 具体的な仕様
### 2-1. フィルターUI(一覧上部にカード形式で配置)
- **得意先** : `<select>` — 「すべて」+ customers テーブルの全件(code + name 表示)
- **ステータス** : `<select>` — 「すべて」+ draft/issued/confirmed/discrepancy(statuses() を利用)
- **納品日(開始)** : `<input type="date">`
- **納品日(終了)** : `<input type="date">`
- **納品書番号・備考キーワード** : `<input type="text">` — note_number と remarks を LIKE 検索
- **検索ボタン**(GETでself送信)・**リセットリンク**(フィルターなし一覧へ)
### 2-2. PHPサーバー側処理(list.php内)
GETパラメータ `customer_id`, `status`, `date_from`, `date_to`, `keyword` を受け取り、動的にWHERE句を構築してPDOプリペアドステートメントで安全に検索する。
```php
$where = ['1=1'];
$params = [];
if (!empty($_GET['customer_id'])) {
$where[] = 'n.customer_id = ?';
$params[] = (int)$_GET['customer_id'];
}
if (!empty($_GET['status']) && array_key_exists($_GET['status'], statuses())) {
$where[] = 'n.status = ?';
$params[] = $_GET['status'];
}
if (!empty($_GET['date_from'])) {
$where[] = 'n.delivery_date >= ?';
$params[] = $_GET['date_from'];
}
if (!empty($_GET['date_to'])) {
$where[] = 'n.delivery_date <= ?';
$params[] = $_GET['date_to'];
}
if (!empty($_GET['keyword'])) {
$where[] = '(n.note_number LIKE ? OR n.remarks LIKE ?)';
$kw = '%' . $_GET['keyword'] . '%';
$params[] = $kw;
$params[] = $kw;
}
$sql = 'SELECT n.*, c.name AS customer_name FROM delivery_notes n INNER JOIN customers c ON c.id = n.customer_id WHERE ' . implode(' AND ', $where) . ' ORDER BY n.delivery_date DESC, n.id DESC';
```
### 2-3. フィルター状態の保持
- フォームの各フィールドには `$_GET` の値を `value` / `selected` で再セットし、検索後も入力内容が残るようにする。
- リセットリンクは `href="index.php?page=list"` とするだけでよい。
### 2-4. 件数表示
- 絞り込み結果の件数を「N件見つかりました」と一覧テーブルヘッダー付近に表示する。
### 2-5. スマホ対応
- フィルターカードは既存の `.form-row` クラスを流用し、`flex-wrap: wrap` で自動折り返しする(既存CSSで対応済みのため追加CSS最小限)。
## 3. 既存機能との整合
- list.php のみ変更し、他ファイルには手を加えない。
- 既存のページネーションがある場合は、フィルターパラメータをページリンクのクエリに引き継ぐ(`http_build_query` で現在の `$_GET` をベースにページ番号だけ上書き)。
- GETメソッド送信のためCSRFトークン不要(参照系のみ)。
- 既存のCSV出力機能がある場合は、同じフィルターパラメータをCSVエクスポートURLにも付与して絞り込み後のデータをCSV出力できるようにする(出力ボタンのhrefにクエリストリングを追加するだけ)。
💬 返信 (3)
🛠 開発を開始しました (機能追加 (deliverynote-pro))
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
📝 開発が完了しました
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
✅ リリース完了のお知らせ
ご要望いただいた「DeliveryNote Pro - 納品書・受領確認クラウド台帳」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=deliverynote-pro
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/deliverynote-pro/
ご利用ありがとうございます!
ご要望いただいた「DeliveryNote Pro - 納品書・受領確認クラウド台帳」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=deliverynote-pro
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/deliverynote-pro/
ご利用ありがとうございます!
Echo
Iris