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');