From 42443349dcd889a1c7c26ac254e9cb89c7e385c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A0=EB=B3=91=EC=B2=A0?= Date: Tue, 3 Mar 2026 21:53:30 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20[stock,client,status-board]=20=EB=82=A0?= =?UTF-8?q?=EC=A7=9C=20=ED=95=84=ED=84=B0=20=EB=B0=8F=20=EC=A1=B0=EA=B1=B4?= =?UTF-8?q?=20=EB=B3=B4=EC=99=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - StockController/StockService: 입출고 이력 기반 날짜 범위 필터 추가 - ClientService: 등록일 기간 필터(start_date/end_date) 추가 - StatusBoardService: 부실채권 현황에 is_active 조건 추가 (목록 페이지 일치) Co-Authored-By: Claude Opus 4.6 --- app/Http/Controllers/Api/V1/StockController.php | 2 ++ app/Services/ClientService.php | 10 ++++++++++ app/Services/StatusBoardService.php | 1 + app/Services/StockService.php | 14 ++++++++++++++ 4 files changed, 27 insertions(+) diff --git a/app/Http/Controllers/Api/V1/StockController.php b/app/Http/Controllers/Api/V1/StockController.php index fe9e03e..d2aebc8 100644 --- a/app/Http/Controllers/Api/V1/StockController.php +++ b/app/Http/Controllers/Api/V1/StockController.php @@ -29,6 +29,8 @@ public function index(Request $request): JsonResponse 'sort_dir', 'per_page', 'page', + 'start_date', + 'end_date', ]); $stocks = $this->service->index($params); diff --git a/app/Services/ClientService.php b/app/Services/ClientService.php index b3af238..197ee8a 100644 --- a/app/Services/ClientService.php +++ b/app/Services/ClientService.php @@ -22,6 +22,8 @@ public function index(array $params) $q = trim((string) ($params['q'] ?? '')); $onlyActive = $params['only_active'] ?? null; $clientType = $params['client_type'] ?? null; + $startDate = $params['start_date'] ?? null; + $endDate = $params['end_date'] ?? null; $query = Client::query()->where('tenant_id', $tenantId); @@ -43,6 +45,14 @@ public function index(array $params) $query->whereIn('client_type', $types); } + // 등록일 기간 필터 + if ($startDate) { + $query->whereDate('created_at', '>=', $startDate); + } + if ($endDate) { + $query->whereDate('created_at', '<=', $endDate); + } + $query->orderBy('client_code')->orderBy('id'); $paginator = $query->paginate($size, ['*'], 'page', $page); diff --git a/app/Services/StatusBoardService.php b/app/Services/StatusBoardService.php index a924e34..b38dca5 100644 --- a/app/Services/StatusBoardService.php +++ b/app/Services/StatusBoardService.php @@ -70,6 +70,7 @@ private function getBadDebtStatus(int $tenantId): array $count = BadDebt::query() ->where('tenant_id', $tenantId) ->where('status', BadDebt::STATUS_COLLECTING) // 추심 진행 중 + ->where('is_active', true) // 활성 채권만 (목록 페이지와 일치) ->count(); return [ diff --git a/app/Services/StockService.php b/app/Services/StockService.php index d980a30..9cd1475 100644 --- a/app/Services/StockService.php +++ b/app/Services/StockService.php @@ -88,6 +88,20 @@ public function index(array $params): LengthAwarePaginator }); } + // 날짜 범위 필터 (해당 기간에 입출고 이력이 있는 품목만) + if (! empty($params['start_date']) || ! empty($params['end_date'])) { + $query->whereHas('stock', function ($stockQuery) use ($params) { + $stockQuery->whereHas('transactions', function ($txQuery) use ($params) { + if (! empty($params['start_date'])) { + $txQuery->whereDate('created_at', '>=', $params['start_date']); + } + if (! empty($params['end_date'])) { + $txQuery->whereDate('created_at', '<=', $params['end_date']); + } + }); + }); + } + // 정렬 $sortBy = $params['sort_by'] ?? 'code'; $sortDir = $params['sort_dir'] ?? 'asc';