From d730c2d91a6811dccbd77445d0ee4c4bf4be6449 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=ED=98=81=EC=84=B1?= Date: Fri, 13 Feb 2026 03:41:27 +0900 Subject: [PATCH] =?UTF-8?q?feat:FQC=20=EC=A0=9C=ED=92=88=EA=B2=80=EC=82=AC?= =?UTF-8?q?=20=EB=AC=B8=EC=84=9C=20=EC=9D=BC=EA=B4=84=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?API=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - POST /v1/documents/bulk-create-fqc: 수주 개소별 제품검사 문서 일괄생성 - GET /v1/documents/fqc-status: 수주별 FQC 진행현황 조회 - BulkCreateFqcRequest FormRequest 추가 - error.php에 no_order_items, already_created 메시지 추가 Co-Authored-By: Claude Opus 4.6 --- .../Api/V1/Documents/DocumentController.php | 36 +++++++++++++++++++ .../Document/BulkCreateFqcRequest.php | 31 ++++++++++++++++ lang/ko/error.php | 2 ++ routes/api/v1/documents.php | 4 +++ 4 files changed, 73 insertions(+) create mode 100644 app/Http/Requests/Document/BulkCreateFqcRequest.php diff --git a/app/Http/Controllers/Api/V1/Documents/DocumentController.php b/app/Http/Controllers/Api/V1/Documents/DocumentController.php index 169d7f4..729ed46 100644 --- a/app/Http/Controllers/Api/V1/Documents/DocumentController.php +++ b/app/Http/Controllers/Api/V1/Documents/DocumentController.php @@ -5,6 +5,7 @@ use App\Helpers\ApiResponse; use App\Http\Controllers\Controller; use App\Http\Requests\Document\ApproveRequest; +use App\Http\Requests\Document\BulkCreateFqcRequest; use App\Http\Requests\Document\IndexRequest; use App\Http\Requests\Document\RejectRequest; use App\Http\Requests\Document\ResolveRequest; @@ -73,6 +74,41 @@ public function destroy(int $id): JsonResponse }, __('message.deleted')); } + // ========================================================================= + // FQC 일괄생성 (제품검사) + // ========================================================================= + + /** + * 수주 개소별 제품검사 문서 일괄생성 + * POST /v1/documents/bulk-create-fqc + */ + public function bulkCreateFqc(BulkCreateFqcRequest $request): JsonResponse + { + return ApiResponse::handle(function () use ($request) { + return $this->service->bulkCreateFqc($request->validated()); + }, __('message.created')); + } + + /** + * 수주 FQC 진행현황 조회 + * GET /v1/documents/fqc-status?order_id=1&template_id=65 + */ + public function fqcStatus(): JsonResponse + { + return ApiResponse::handle(function () { + $orderId = (int) request('order_id'); + $templateId = (int) request('template_id'); + + if (! $orderId || ! $templateId) { + throw new \Symfony\Component\HttpKernel\Exception\BadRequestHttpException( + __('validation.required', ['attribute' => 'order_id, template_id']) + ); + } + + return $this->service->fqcStatus($orderId, $templateId); + }, __('message.fetched')); + } + // ========================================================================= // Resolve/Upsert (React 연동용) // ========================================================================= diff --git a/app/Http/Requests/Document/BulkCreateFqcRequest.php b/app/Http/Requests/Document/BulkCreateFqcRequest.php new file mode 100644 index 0000000..1f25281 --- /dev/null +++ b/app/Http/Requests/Document/BulkCreateFqcRequest.php @@ -0,0 +1,31 @@ + 'required|integer|exists:document_templates,id', + 'order_id' => 'required|integer|exists:orders,id', + ]; + } + + public function messages(): array + { + return [ + 'template_id.required' => __('validation.required', ['attribute' => '템플릿']), + 'template_id.exists' => __('validation.exists', ['attribute' => '템플릿']), + 'order_id.required' => __('validation.required', ['attribute' => '수주']), + 'order_id.exists' => __('validation.exists', ['attribute' => '수주']), + ]; + } +} diff --git a/lang/ko/error.php b/lang/ko/error.php index 5d3503a..66d27f3 100644 --- a/lang/ko/error.php +++ b/lang/ko/error.php @@ -214,6 +214,8 @@ 'not_your_turn' => '현재 결재 순서가 아닙니다.', 'only_creator_can_cancel' => '작성자만 취소할 수 있습니다.', 'approvers_required' => '결재선이 필요합니다.', + 'no_order_items' => '수주에 개소(품목)가 없습니다.', + 'already_created' => '이미 모든 개소에 대해 문서가 생성되었습니다.', ], // 전자결재 관련 diff --git a/routes/api/v1/documents.php b/routes/api/v1/documents.php index 2460d43..ae56c70 100644 --- a/routes/api/v1/documents.php +++ b/routes/api/v1/documents.php @@ -20,6 +20,10 @@ // 문서 CRUD + 결재 Route::prefix('documents')->group(function () { + // FQC 일괄생성 (제품검사) + Route::post('/bulk-create-fqc', [DocumentController::class, 'bulkCreateFqc'])->name('v1.documents.bulk-create-fqc'); + Route::get('/fqc-status', [DocumentController::class, 'fqcStatus'])->name('v1.documents.fqc-status'); + // Resolve/Upsert (React 연동용) Route::get('/resolve', [DocumentController::class, 'resolve'])->name('v1.documents.resolve'); Route::post('/upsert', [DocumentController::class, 'upsert'])->name('v1.documents.upsert');