diff --git a/app/Http/Requests/Concerns/HasProductVariantRules.php b/app/Http/Requests/Concerns/HasProductVariantRules.php index 0c69933..3d96cac 100644 --- a/app/Http/Requests/Concerns/HasProductVariantRules.php +++ b/app/Http/Requests/Concerns/HasProductVariantRules.php @@ -24,6 +24,7 @@ protected function productVariantRules(string $variantsKey = 'variants', ?int $p "{$variantsKey}" => ['required', 'array', 'min:1'], "{$variantsKey}.*.name" => ['required', 'string', 'max:200'], "{$variantsKey}.*.stock" => ['required', 'integer', 'min:0'], + "{$variantsKey}.*.reject_stock" => ['required', 'integer', 'min:0'], "{$variantsKey}.*.retail_stock" => ['required', 'integer', 'min:0'], ...$this->variantImageRules($variantsKey, required: $imagesRequired), ]; @@ -61,7 +62,8 @@ protected function productVariantAttributes(string $variantsKey = 'variants'): a return [ $variantsKey => 'varian', "{$variantsKey}.*.name" => 'nama varian', - "{$variantsKey}.*.stock" => 'stok', + "{$variantsKey}.*.stock" => 'stok bagus', + "{$variantsKey}.*.reject_stock" => 'stok reject', "{$variantsKey}.*.retail_stock" => 'stok ecer', "{$variantsKey}.*.prices" => 'harga', "{$variantsKey}.*.prices.distributor" => 'distributor', diff --git a/app/Services/Master/ProductService.php b/app/Services/Master/ProductService.php index 74c1357..c9be7bf 100644 --- a/app/Services/Master/ProductService.php +++ b/app/Services/Master/ProductService.php @@ -141,6 +141,7 @@ function () use ($validated, $user, $isOwner, $isDraft): Product { $variant = $product->variants()->create([ 'name' => $variantData['name'], 'stock' => $variantData['stock'], + 'reject_stock' => $variantData['reject_stock'], 'retail_stock' => $variantData['retail_stock'], ]); @@ -574,6 +575,7 @@ private function applyPayloadToProduct( $variant->update([ 'name' => $variantData['name'], 'stock' => $variantData['stock'], + 'reject_stock' => $variantData['reject_stock'], 'retail_stock' => $variantData['retail_stock'], ]); @@ -596,6 +598,7 @@ private function applyPayloadToProduct( $variant = $product->variants()->create([ 'name' => $variantData['name'], 'stock' => $variantData['stock'], + 'reject_stock' => $variantData['reject_stock'], 'retail_stock' => $variantData['retail_stock'], ]); @@ -763,6 +766,7 @@ private function snapshotProduct(Product $product): array 'id' => $variant->id, 'name' => $variant->name, 'stock' => $variant->stock, + 'reject_stock' => $variant->reject_stock, 'retail_stock' => $variant->retail_stock, 'prices' => $variant->prices ->mapWithKeys(fn ($price) => [$price->type->value => $price->price]) @@ -795,6 +799,7 @@ private function buildPayloadFromValidated(array $validated): array 'id' => $variantData['id'] ?? null, 'name' => $variantData['name'], 'stock' => $variantData['stock'], + 'reject_stock' => $variantData['reject_stock'], 'retail_stock' => $variantData['retail_stock'], 'prices' => $variantData['prices'] ?? [], 'remove_media_ids' => $variantData['remove_media_ids'] ?? [], diff --git a/resources/js/pages/admin/master/products/Edit.vue b/resources/js/pages/admin/master/products/Edit.vue index 8e4f73d..7ffd970 100644 --- a/resources/js/pages/admin/master/products/Edit.vue +++ b/resources/js/pages/admin/master/products/Edit.vue @@ -22,6 +22,7 @@ const initialData = computed(() => ({ id: variant.id, name: variant.name, stock: variant.stock, + reject_stock: variant.reject_stock, retail_stock: variant.retail_stock, prices: variant.prices ?? [], images: variant.images ?? [], diff --git a/resources/js/pages/admin/master/products/form/ProductForm.vue b/resources/js/pages/admin/master/products/form/ProductForm.vue index ae041d0..2081e0c 100644 --- a/resources/js/pages/admin/master/products/form/ProductForm.vue +++ b/resources/js/pages/admin/master/products/form/ProductForm.vue @@ -55,6 +55,7 @@ const { client_id: createClientId(), name: '', stock: '0', + reject_stock: '0', retail_stock: '0', prices: { distributor: '0', @@ -74,6 +75,7 @@ const { client_id: createClientId(), name: '', stock: '0', + reject_stock: '0', retail_stock: '0', prices: { distributor: '0', @@ -111,6 +113,7 @@ const { id: variant.id, name: variant.name ?? '', stock: variant.stock != null ? String(variant.stock) : '0', + reject_stock: variant.reject_stock != null ? String(variant.reject_stock) : '0', retail_stock: variant.retail_stock != null ? String(variant.retail_stock) : '0', prices, media: createMediaUploadState(variant.images ?? []), @@ -225,6 +228,7 @@ function buildFormData(): FormData { appendToFormData(formData, (formData, index, variant) => { formData.append(`variants[${index}][name]`, variant.name.trim()); formData.append(`variants[${index}][stock]`, String(Number.parseInt(String(variant.stock), 10) || 0)); + formData.append(`variants[${index}][reject_stock]`, String(Number.parseInt(String(variant.reject_stock), 10) || 0)); formData.append(`variants[${index}][retail_stock]`, String(Number.parseInt(String(variant.retail_stock), 10) || 0)); if (variant.prices && showPrices.value) { @@ -291,6 +295,7 @@ function submit() { @remove="confirmRemoveVariant(variant.client_id)" @update:name="setVariantField(variant.client_id, 'name', $event)" @update:stock="setVariantField(variant.client_id, 'stock', $event)" + @update:reject-stock="setVariantField(variant.client_id, 'reject_stock', $event)" @update:retail-stock="setVariantField(variant.client_id, 'retail_stock', $event)" @update:prices="setVariantField(variant.client_id, 'prices', $event)" @update:media="setVariantField(variant.client_id, 'media', $event)" diff --git a/resources/js/pages/admin/master/products/form/ProductVariantEditModal.vue b/resources/js/pages/admin/master/products/form/ProductVariantEditModal.vue index f707716..7468d35 100644 --- a/resources/js/pages/admin/master/products/form/ProductVariantEditModal.vue +++ b/resources/js/pages/admin/master/products/form/ProductVariantEditModal.vue @@ -76,6 +76,7 @@ function populateForm(variant: Variant | null) { id: v.id, name: v.name, stock: String(v.stock), + reject_stock: String(v.reject_stock), retail_stock: String(v.retail_stock), prices, media: createMediaUploadState(v.images ?? []), @@ -133,6 +134,7 @@ function submit() { formData.append(`variants[${index}][name]`, v.name.trim()); formData.append(`variants[${index}][stock]`, String(Number.parseInt(v.stock, 10) || 0)); + formData.append(`variants[${index}][reject_stock]`, String(Number.parseInt(v.reject_stock, 10) || 0)); formData.append(`variants[${index}][retail_stock]`, String(Number.parseInt(v.retail_stock, 10) || 0)); if (v.prices) { @@ -178,13 +180,19 @@ function submit() { -
+
- Stok + Stok Bagus + + Stok Reject + + + + Stok Ecer diff --git a/resources/js/pages/admin/master/products/form/ProductVariantSection.vue b/resources/js/pages/admin/master/products/form/ProductVariantSection.vue index e473972..a023b5f 100644 --- a/resources/js/pages/admin/master/products/form/ProductVariantSection.vue +++ b/resources/js/pages/admin/master/products/form/ProductVariantSection.vue @@ -39,6 +39,7 @@ const emit = defineEmits<{ remove: []; 'update:name': [value: string]; 'update:stock': [value: string]; + 'update:reject-stock': [value: string]; 'update:retail-stock': [value: string]; 'update:prices': [value: Record]; 'update:media': [value: MediaUploadState]; @@ -95,7 +96,7 @@ function updatePrice(type: string, value: string) { -
+
Nama Varian @@ -107,12 +108,21 @@ function updatePrice(type: string, value: string) { - Stok + Stok Bagus + + + Stok Reject + + + + Stok Ecer diff --git a/resources/js/types/product.ts b/resources/js/types/product.ts index f112e6f..cdd7825 100644 --- a/resources/js/types/product.ts +++ b/resources/js/types/product.ts @@ -92,6 +92,7 @@ export interface ProductVariantFormItem { id?: number; name: string; stock: string | number; + reject_stock: string | number; retail_stock: string | number; prices?: Record; media: MediaUploadState; @@ -107,6 +108,7 @@ export type ProductFormInitialData = { id?: number; name?: string; stock?: number | string; + reject_stock?: number | string; retail_stock?: number | string; prices?: Price[]; images?: MediaItem[];