Files
sam-api/app/Http/Controllers/Api/V1/NonconformingReportController.php
김보곤 6e50fbd1fa feat: [material] 부적합관리 결재 연동 구현
- Migration: approval_id FK 추가
- Model: approval() BelongsTo 관계
- Service: submitForApproval() 결재상신 (결재문서+결재선 생성)
- ApprovalService: 승인→CLOSED, 반려/회수→approval_id 해제
- Controller: POST /{id}/submit-approval 엔드포인트
- Route: submit-approval 라우트 등록
2026-03-19 09:03:12 +09:00

85 lines
2.8 KiB
PHP

<?php
namespace App\Http\Controllers\Api\V1;
use App\Helpers\ApiResponse;
use App\Http\Controllers\Controller;
use App\Http\Requests\Material\StoreNonconformingReportRequest;
use App\Http\Requests\Material\UpdateNonconformingReportRequest;
use App\Services\NonconformingReportService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class NonconformingReportController extends Controller
{
public function __construct(private NonconformingReportService $service) {}
public function index(Request $request): JsonResponse
{
return ApiResponse::handle(function () use ($request) {
return $this->service->index($request->all());
}, __('message.fetched'));
}
public function stats(Request $request): JsonResponse
{
return ApiResponse::handle(function () use ($request) {
return $this->service->stats($request->all());
}, __('message.fetched'));
}
public function show(int $id): JsonResponse
{
return ApiResponse::handle(function () use ($id) {
return $this->service->show($id);
}, __('message.fetched'));
}
public function store(StoreNonconformingReportRequest $request): JsonResponse
{
return ApiResponse::handle(function () use ($request) {
return $this->service->store($request->validated());
}, __('message.created'));
}
public function update(UpdateNonconformingReportRequest $request, int $id): JsonResponse
{
return ApiResponse::handle(function () use ($request, $id) {
return $this->service->update($id, $request->validated());
}, __('message.updated'));
}
public function destroy(int $id): JsonResponse
{
return ApiResponse::handle(function () use ($id) {
$this->service->destroy($id);
return 'success';
}, __('message.deleted'));
}
public function changeStatus(Request $request, int $id): JsonResponse
{
$request->validate(['status' => 'required|string|in:RECEIVED,ANALYZING,RESOLVED,CLOSED']);
return ApiResponse::handle(function () use ($request, $id) {
return $this->service->changeStatus($id, $request->input('status'));
}, __('message.updated'));
}
public function submitApproval(Request $request, int $id): JsonResponse
{
$request->validate([
'title' => 'nullable|string|max:200',
'form_id' => 'nullable|integer',
'steps' => 'required|array|min:1',
'steps.*.approver_id' => 'required|integer',
'steps.*.step_type' => 'nullable|string|in:approval,agreement,reference',
]);
return ApiResponse::handle(function () use ($request, $id) {
return $this->service->submitForApproval($id, $request->all());
}, __('message.created'));
}
}