parseDataTableQuery($request); return Inertia::render('admin/manage/cuttings/Index', [ 'cuttings' => $this->cuttingService->paginateForIndex($tableQuery, $request->user()), 'inProgressCuttings' => $this->cuttingService->getInProgressCuttings($request->user()), 'filters' => $this->dataTableFilters($tableQuery), ]); } public function create(Request $request): Response { $user = $request->user(); return Inertia::render('admin/manage/cuttings/Create', [ 'rawMaterialCatalog' => $this->cuttingService->rawMaterialCatalog(user: $user), 'draftMaterials' => $this->cuttingService->draftMaterialsForUser($user), 'draftResults' => $this->cuttingService->draftResultsForUser($user), 'units' => collect(RawMaterialUnit::cases())->map(fn ($u) => ['value' => $u->value, 'label' => $u->label()])->all(), ]); } public function store(CuttingRequest $request): RedirectResponse { $this->cuttingService->create($request->validated(), $request->user()); $this->flashCreated('Proses cutting'); return redirect()->route('admin.manage.cuttings.index'); } public function edit(Cutting $cutting): Response|RedirectResponse { try { $cutting->ensureEditable(); } catch (ValidationException $exception) { $this->flashError($exception->validator->errors()->first('status')); return redirect()->route('admin.manage.cuttings.index'); } return Inertia::render('admin/manage/cuttings/Edit', [ 'cutting' => $this->cuttingService->findForEdit($cutting), 'rawMaterialCatalog' => $this->cuttingService->rawMaterialCatalog($cutting), 'units' => collect(RawMaterialUnit::cases())->map(fn ($u) => ['value' => $u->value, 'label' => $u->label()])->all(), ]); } public function update(CuttingRequest $request, Cutting $cutting): RedirectResponse { $this->cuttingService->update($cutting, $request->validated(), $request->user()); $this->flashUpdated('Proses cutting'); return redirect()->route('admin.manage.cuttings.index'); } public function destroy(Request $request, Cutting $cutting): RedirectResponse { $this->cuttingService->delete($cutting, $request->user()); $this->flashDeleted('Proses cutting'); return redirect()->route('admin.manage.cuttings.index'); } public function transitionStatus(CuttingStatusTransitionRequest $request, Cutting $cutting): RedirectResponse { $status = CuttingStatus::from($request->validated('status')); $this->cuttingService->transitionStatus( $cutting, $status, $request->user(), $request->validated('reason'), ); $this->flashSuccess($status->transitionStatusMessage()); return redirect()->route('admin.manage.cuttings.index'); } public function share(Cutting $cutting): Response { $data = $this->cuttingService->findForShare($cutting); $appName = app(SystemSettings::class)->app_name; return Inertia::render('admin/manage/cuttings/Share', [ 'cutting' => $data, 'ogTitle' => "Detail Cutting #{$cutting->id} - {$appName}", 'ogDescription' => $cutting->description ?: "Rincian data proses cutting #{$cutting->id}", 'ogImage' => $data->images[0]['url'] ?? asset('assets/logo.png'), ]); } }