From b93a20028405cc0138476047b9f2eeed2611786d Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Thu, 9 Jul 2026 15:22:12 +0700 Subject: [PATCH] refactor: remove quick-create raw material functionality and associated request, streamlining the CuttingDraftItemController and related components --- .../Cutting/CuttingDraftItemController.php | 8 - .../CuttingQuickCreateRawMaterialRequest.php | 44 ---- app/Services/Manage/CuttingService.php | 59 ----- app/Services/Manage/PurchaseService.php | 6 +- .../manage/cuttings/form/CuttingPosForm.vue | 12 +- .../form/CuttingPosMaterialCatalogPanel.vue | 14 +- .../form/QuickCreateRawMaterialModal.vue | 228 ------------------ routes/web.php | 4 - tests/Feature/Admin/Manage/PurchaseTest.php | 34 +-- 9 files changed, 26 insertions(+), 383 deletions(-) delete mode 100644 app/Http/Requests/Admin/Manage/CuttingQuickCreateRawMaterialRequest.php delete mode 100644 resources/js/pages/admin/manage/cuttings/form/QuickCreateRawMaterialModal.vue diff --git a/app/Http/Controllers/Admin/Manage/Cutting/CuttingDraftItemController.php b/app/Http/Controllers/Admin/Manage/Cutting/CuttingDraftItemController.php index 084cf05..7b48024 100644 --- a/app/Http/Controllers/Admin/Manage/Cutting/CuttingDraftItemController.php +++ b/app/Http/Controllers/Admin/Manage/Cutting/CuttingDraftItemController.php @@ -7,7 +7,6 @@ use App\Http\Requests\Admin\Manage\CuttingDraftMaterialRequest; use App\Http\Requests\Admin\Manage\CuttingDraftResultRequest; use App\Http\Requests\Admin\Manage\CuttingQuickCreateProductRequest; -use App\Http\Requests\Admin\Manage\CuttingQuickCreateRawMaterialRequest; use App\Models\ProductVariant; use App\Models\RawMaterialPrice; use App\Services\Manage\CuttingService; @@ -62,13 +61,6 @@ public function destroyCombination(Request $request, int $combinationId): JsonRe return response()->json(['ok' => true]); } - public function quickCreateRawMaterial(CuttingQuickCreateRawMaterialRequest $request): JsonResponse - { - $rawMaterial = $this->cuttingService->quickCreateRawMaterial($request->validated()); - - return response()->json(['raw_material' => $rawMaterial]); - } - public function quickCreateProduct(CuttingQuickCreateProductRequest $request): JsonResponse { $product = $this->cuttingService->quickCreateProduct($request->validated()); diff --git a/app/Http/Requests/Admin/Manage/CuttingQuickCreateRawMaterialRequest.php b/app/Http/Requests/Admin/Manage/CuttingQuickCreateRawMaterialRequest.php deleted file mode 100644 index 989a039..0000000 --- a/app/Http/Requests/Admin/Manage/CuttingQuickCreateRawMaterialRequest.php +++ /dev/null @@ -1,44 +0,0 @@ -user()?->can(Permission::CUTTINGS_CREATE->value) ?? false; - } - - /** - * @return array - */ - public function rules(): array - { - return [ - 'name' => ['required', 'string', 'max:200'], - 'unit' => ['required', Rule::enum(RawMaterialUnit::class)], - - ...$this->rawMaterialPriceRules(), - ]; - } - - /** - * @return array - */ - public function attributes(): array - { - return [ - 'name' => 'Nama Bahan Baku', - 'unit' => 'Satuan', - ...$this->rawMaterialPriceAttributes(), - ]; - } -} diff --git a/app/Services/Manage/CuttingService.php b/app/Services/Manage/CuttingService.php index b13418a..bcb81b2 100644 --- a/app/Services/Manage/CuttingService.php +++ b/app/Services/Manage/CuttingService.php @@ -1182,65 +1182,6 @@ private function storeResultPrices(Cutting $cutting, array $resultPrices): void } } - /** - * Quick-create a raw material with variants, bypassing owner verification. - */ - public function quickCreateRawMaterial(array $validated): array - { - $rawMaterial = RawMaterial::create([ - 'name' => $validated['name'], - 'unit' => $validated['unit'], - 'is_active' => true, - ]); - - $createdPrices = []; - $maxVariantImages = 5; - - foreach ($validated['prices'] as $index => $priceData) { - $price = $rawMaterial->prices()->create([ - 'variant' => $priceData['variant'], - 'price' => $priceData['price'], - 'stock' => $priceData['stock'], - ]); - - $this->mediaService->syncCollection( - $price, - 'images', - $priceData['images'] ?? null, - null, - $maxVariantImages, - required: true, - errorKey: "prices.{$index}.images", - s3Keys: $priceData['s3_keys'] ?? null, - ); - - $price->refresh(); - - $createdPrices[] = [ - 'id' => $price->id, - 'variant' => $price->variant, - 'price' => $price->price, - 'price_formatted' => 'Rp '.number_format($price->price, 0, ',', '.'), - 'stock' => $price->stock, - 'stock_formatted' => $this->formatStockForUnit((float) $price->stock, $rawMaterial->unit), - 'stock_input' => $this->formatQuantityInput((float) $price->stock), - 'images' => MediaPresenter::collection($price, 'images'), - ]; - } - - $this->cacheForgetByPattern('manage:cuttings:*'); - - return [ - 'id' => $rawMaterial->id, - 'name' => $rawMaterial->name, - 'unit' => $rawMaterial->unit->value, - 'unit_label' => $rawMaterial->unit->label(), - 'unit_abbreviation' => $rawMaterial->unit->abbreviation(), - 'is_active' => true, - 'prices' => $createdPrices, - ]; - } - /** * Quick-create a product with variants and prices, bypassing owner verification. */ diff --git a/app/Services/Manage/PurchaseService.php b/app/Services/Manage/PurchaseService.php index 3ea0134..b9f62fa 100644 --- a/app/Services/Manage/PurchaseService.php +++ b/app/Services/Manage/PurchaseService.php @@ -263,7 +263,7 @@ function () use ($validated, $user): array { if ($rawMaterial->trashed()) { $rawMaterial->restore(); } - if ($isOwner && !$rawMaterial->is_active) { + if ($isOwner && ! $rawMaterial->is_active) { $rawMaterial->update(['is_active' => true]); } } else { @@ -847,7 +847,7 @@ private function processRequestItems(array $items, bool $isOwner): array if ($rawMaterial->trashed()) { $rawMaterial->restore(); } - if ($isOwner && !$rawMaterial->is_active) { + if ($isOwner && ! $rawMaterial->is_active) { $rawMaterial->update(['is_active' => true]); } } else { @@ -881,7 +881,7 @@ private function processRequestItems(array $items, bool $isOwner): array } // Sync variant photo if provided - if (!empty($itemData['photos']) || !empty($itemData['s3_keys']) || !empty($itemData['remove_media_ids'])) { + if (! empty($itemData['photos']) || ! empty($itemData['s3_keys']) || ! empty($itemData['remove_media_ids'])) { $this->mediaService->syncCollection( $price, 'images', diff --git a/resources/js/pages/admin/manage/cuttings/form/CuttingPosForm.vue b/resources/js/pages/admin/manage/cuttings/form/CuttingPosForm.vue index 48bca6f..15912b3 100644 --- a/resources/js/pages/admin/manage/cuttings/form/CuttingPosForm.vue +++ b/resources/js/pages/admin/manage/cuttings/form/CuttingPosForm.vue @@ -292,17 +292,7 @@ function submit() { }); } -function onRawMaterialCreated(rawMaterial: CuttingRawMaterialCatalogItem) { - // Add to catalog - rawMaterialCatalogState.value.push(rawMaterial); - // Auto-add the first price variant to cart - const firstPrice = rawMaterial.prices[0]; - - if (firstPrice) { - addMaterial(rawMaterial, firstPrice); - } -} function onCombinationCreated(items: CuttingMaterialCartItem[]) { for (const item of items) { @@ -333,7 +323,7 @@ function onProductCreated(product: CuttingProductCatalogItem) { :filtered-raw-materials="filteredRawMaterials" :raw-material-catalog="rawMaterialCatalogState" :material-cart="materialCart" :get-material-cart-item="getMaterialCartItem" :units="units" @add-material="addMaterial" @decrease-material-qty="decreaseMaterialQty" - @raw-material-created="onRawMaterialCreated" @combination-created="onCombinationCreated" /> + @combination-created="onCombinationCreated" /> ('selectedRawMaterialId', { req const emit = defineEmits<{ 'add-material': [rawMaterial: CuttingRawMaterialCatalogItem, price: CuttingCatalogPrice]; 'decrease-material-qty': [priceId: number]; - 'raw-material-created': [rawMaterial: CuttingRawMaterialCatalogItem]; 'combination-created': [items: CuttingMaterialCartItem[]]; }>(); -const quickCreateOpen = ref(false); const combinationOpen = ref(false); const combinationInitialVariant = ref<{ rawMaterial: CuttingRawMaterialCatalogItem; @@ -104,10 +101,6 @@ function openCombination(rawMaterial: CuttingRawMaterialCatalogItem, price: Cutt Pilih Bahan Baku -
@@ -119,10 +112,10 @@ function openCombination(rawMaterial: CuttingRawMaterialCatalogItem, price: Cutt