From ba5f402cd84357d3066c8e104291f08774bd64cb Mon Sep 17 00:00:00 2001 From: kent Date: Tue, 13 Jan 2026 19:49:00 +0900 Subject: [PATCH] =?UTF-8?q?fix(API):=20Controller=20=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EB=B0=8F=20=EC=BD=94=EB=93=9C=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - FcmController, EstimateController, ItemsController 개선 - LoanController, PositionController 수정 - ReceivablesController, SalaryController 수정 - StructureReviewController 수정 Co-Authored-By: Claude --- .../Api/V1/Admin/FcmController.php | 2 +- .../Construction/HandoverReportController.php | 89 ++++++++++++++ .../StructureReviewController.php | 2 +- .../Controllers/Api/V1/EstimateController.php | 9 ++ .../Controllers/Api/V1/ItemsController.php | 17 +++ .../Controllers/Api/V1/LoanController.php | 2 +- .../Controllers/Api/V1/PositionController.php | 2 +- .../Api/V1/ReceivablesController.php | 2 +- .../Controllers/Api/V1/SalaryController.php | 2 +- .../Api/V1/SiteBriefingController.php | 113 ++++++++++++++++++ 10 files changed, 234 insertions(+), 6 deletions(-) create mode 100644 app/Http/Controllers/Api/V1/Construction/HandoverReportController.php create mode 100644 app/Http/Controllers/Api/V1/SiteBriefingController.php diff --git a/app/Http/Controllers/Api/V1/Admin/FcmController.php b/app/Http/Controllers/Api/V1/Admin/FcmController.php index c7c0505..ef95a53 100644 --- a/app/Http/Controllers/Api/V1/Admin/FcmController.php +++ b/app/Http/Controllers/Api/V1/Admin/FcmController.php @@ -114,4 +114,4 @@ public function history(FcmHistoryRequest $request): JsonResponse ); }); } -} \ No newline at end of file +} diff --git a/app/Http/Controllers/Api/V1/Construction/HandoverReportController.php b/app/Http/Controllers/Api/V1/Construction/HandoverReportController.php new file mode 100644 index 0000000..89800bf --- /dev/null +++ b/app/Http/Controllers/Api/V1/Construction/HandoverReportController.php @@ -0,0 +1,89 @@ +service->index($request->all()); + }, __('message.handover_report.fetched')); + } + + /** + * 인수인계보고서 상세 조회 + */ + public function show(int $id) + { + return ApiResponse::handle(function () use ($id) { + return $this->service->show($id); + }, __('message.handover_report.fetched')); + } + + /** + * 인수인계보고서 등록 + */ + public function store(HandoverReportStoreRequest $request) + { + return ApiResponse::handle(function () use ($request) { + return $this->service->store($request->validated()); + }, __('message.handover_report.created')); + } + + /** + * 인수인계보고서 수정 + */ + public function update(HandoverReportUpdateRequest $request, int $id) + { + return ApiResponse::handle(function () use ($request, $id) { + return $this->service->update($id, $request->validated()); + }, __('message.handover_report.updated')); + } + + /** + * 인수인계보고서 삭제 + */ + public function destroy(int $id) + { + return ApiResponse::handle(function () use ($id) { + $this->service->destroy($id); + + return 'success'; + }, __('message.handover_report.deleted')); + } + + /** + * 인수인계보고서 일괄 삭제 + */ + public function bulkDestroy(Request $request) + { + return ApiResponse::handle(function () use ($request) { + $this->service->bulkDestroy($request->input('ids', [])); + + return 'success'; + }, __('message.handover_report.deleted')); + } + + /** + * 인수인계보고서 통계 조회 + */ + public function stats(Request $request) + { + return ApiResponse::handle(function () use ($request) { + return $this->service->stats($request->all()); + }, __('message.handover_report.fetched')); + } +} diff --git a/app/Http/Controllers/Api/V1/Construction/StructureReviewController.php b/app/Http/Controllers/Api/V1/Construction/StructureReviewController.php index 470291c..36fda7d 100644 --- a/app/Http/Controllers/Api/V1/Construction/StructureReviewController.php +++ b/app/Http/Controllers/Api/V1/Construction/StructureReviewController.php @@ -86,4 +86,4 @@ public function stats(Request $request) return $this->service->stats($request->all()); }, __('message.structure_review.fetched')); } -} \ No newline at end of file +} diff --git a/app/Http/Controllers/Api/V1/EstimateController.php b/app/Http/Controllers/Api/V1/EstimateController.php index 2589a9f..454885e 100644 --- a/app/Http/Controllers/Api/V1/EstimateController.php +++ b/app/Http/Controllers/Api/V1/EstimateController.php @@ -27,6 +27,15 @@ public function index(Request $request) ], __('message.fetched')); } + public function stats() + { + $stats = $this->estimateService->stats(); + + return ApiResponse::success([ + 'stats' => $stats, + ], __('message.fetched')); + } + public function show($id) { $estimate = $this->estimateService->getEstimateDetail($id); diff --git a/app/Http/Controllers/Api/V1/ItemsController.php b/app/Http/Controllers/Api/V1/ItemsController.php index 604d013..5f75bb2 100644 --- a/app/Http/Controllers/Api/V1/ItemsController.php +++ b/app/Http/Controllers/Api/V1/ItemsController.php @@ -103,6 +103,23 @@ public function update(int $id, ItemUpdateRequest $request) }, __('message.item.updated')); } + /** + * 품목 통계 조회 + * + * GET /api/v1/items/stats + */ + public function stats(Request $request) + { + return ApiResponse::handle(function () use ($request) { + $params = [ + 'item_type' => $request->input('type') ?? $request->input('item_type'), + 'group_id' => $request->input('group_id'), + ]; + + return $this->service->stats($params); + }, __('message.fetched')); + } + /** * 품목 삭제 (동적 테이블 라우팅, Soft Delete) * diff --git a/app/Http/Controllers/Api/V1/LoanController.php b/app/Http/Controllers/Api/V1/LoanController.php index fb9d173..9ef4889 100644 --- a/app/Http/Controllers/Api/V1/LoanController.php +++ b/app/Http/Controllers/Api/V1/LoanController.php @@ -2,13 +2,13 @@ namespace App\Http\Controllers\Api\V1; +use App\Helpers\ApiResponse; use App\Http\Controllers\Controller; use App\Http\Requests\Loan\LoanCalculateInterestRequest; use App\Http\Requests\Loan\LoanIndexRequest; use App\Http\Requests\Loan\LoanSettleRequest; use App\Http\Requests\Loan\LoanStoreRequest; use App\Http\Requests\Loan\LoanUpdateRequest; -use App\Helpers\ApiResponse; use App\Services\LoanService; use Illuminate\Http\JsonResponse; diff --git a/app/Http/Controllers/Api/V1/PositionController.php b/app/Http/Controllers/Api/V1/PositionController.php index 78cdd52..7be8afe 100644 --- a/app/Http/Controllers/Api/V1/PositionController.php +++ b/app/Http/Controllers/Api/V1/PositionController.php @@ -71,4 +71,4 @@ public function reorder(PositionReorderRequest $request) return $this->service->reorder($request->validated()['items']); }, __('message.reordered')); } -} \ No newline at end of file +} diff --git a/app/Http/Controllers/Api/V1/ReceivablesController.php b/app/Http/Controllers/Api/V1/ReceivablesController.php index bc6c941..e1c8045 100644 --- a/app/Http/Controllers/Api/V1/ReceivablesController.php +++ b/app/Http/Controllers/Api/V1/ReceivablesController.php @@ -100,4 +100,4 @@ public function updateMemos(Request $request): JsonResponse return ['updated_count' => $updatedCount]; }, __('message.updated')); } -} \ No newline at end of file +} diff --git a/app/Http/Controllers/Api/V1/SalaryController.php b/app/Http/Controllers/Api/V1/SalaryController.php index 12946c2..ff0ea93 100644 --- a/app/Http/Controllers/Api/V1/SalaryController.php +++ b/app/Http/Controllers/Api/V1/SalaryController.php @@ -123,4 +123,4 @@ public function statistics(Request $request) return ApiResponse::success($stats, __('message.fetched')); } -} \ No newline at end of file +} diff --git a/app/Http/Controllers/Api/V1/SiteBriefingController.php b/app/Http/Controllers/Api/V1/SiteBriefingController.php new file mode 100644 index 0000000..5c93308 --- /dev/null +++ b/app/Http/Controllers/Api/V1/SiteBriefingController.php @@ -0,0 +1,113 @@ +only([ + 'search', + 'status', + 'bid_status', + 'partner_id', + 'site_id', + 'start_date', + 'end_date', + 'sort_by', + 'sort_dir', + 'page', + 'per_page', + ]); + + $result = $this->service->index($params); + + return ApiResponse::success($result, __('message.fetched')); + } + + /** + * 현장설명회 상세 조회 + */ + public function show(int $id): JsonResponse + { + $siteBriefing = $this->service->show($id); + + return ApiResponse::success($siteBriefing, __('message.fetched')); + } + + /** + * 현장설명회 등록 + */ + public function store(StoreSiteBriefingRequest $request): JsonResponse + { + $siteBriefing = $this->service->store($request->validated()); + + return ApiResponse::success($siteBriefing, __('message.created'), [], 201); + } + + /** + * 현장설명회 수정 + */ + public function update(UpdateSiteBriefingRequest $request, int $id): JsonResponse + { + $siteBriefing = $this->service->update($id, $request->validated()); + + return ApiResponse::success($siteBriefing, __('message.updated')); + } + + /** + * 현장설명회 삭제 + */ + public function destroy(int $id): JsonResponse + { + $this->service->destroy($id); + + return ApiResponse::success(null, __('message.deleted')); + } + + /** + * 현장설명회 일괄 삭제 + */ + public function bulkDestroy(Request $request): JsonResponse + { + $request->validate([ + 'ids' => 'required|array|min:1', + 'ids.*' => 'integer', + ]); + + $deletedCount = $this->service->bulkDestroy($request->input('ids')); + + return ApiResponse::success( + ['deleted_count' => $deletedCount], + __('message.bulk_deleted') + ); + } + + /** + * 현장설명회 통계 조회 + */ + public function stats(): JsonResponse + { + $stats = $this->service->stats(); + + return ApiResponse::success($stats, __('message.fetched')); + } +}