diff --git a/app/Http/Requests/Admin/Manage/CuttingDraftResultRequest.php b/app/Http/Requests/Admin/Manage/CuttingDraftResultRequest.php
index f27a826..f95614b 100644
--- a/app/Http/Requests/Admin/Manage/CuttingDraftResultRequest.php
+++ b/app/Http/Requests/Admin/Manage/CuttingDraftResultRequest.php
@@ -24,9 +24,9 @@ public function rules(): array
'integer',
Rule::exists('product_variants', 'id')->whereNull('deleted_at'),
],
- 'cutting_result' => ['required', 'integer', 'min:1'],
- 'sample' => ['required', 'integer', 'min:0'],
- 'original_outside_sample' => ['required', 'integer', 'min:0'],
+ 'cutting_result' => ['nullable', 'integer', 'min:1'],
+ 'sample' => ['nullable', 'integer', 'min:0'],
+ 'original_outside_sample' => ['nullable', 'integer', 'min:0'],
];
}
}
diff --git a/app/Services/Manage/CuttingService.php b/app/Services/Manage/CuttingService.php
index 3fd3612..6c4b5c6 100644
--- a/app/Services/Manage/CuttingService.php
+++ b/app/Services/Manage/CuttingService.php
@@ -311,32 +311,40 @@ public function syncDraftResult(array $validated, User $user): array
->with('product:id,name')
->findOrFail($validated['product_variant_id']);
- $cuttingResult = (int) $validated['cutting_result'];
- $sample = (int) $validated['sample'];
- $originalOutsideSample = (int) ($validated['original_outside_sample'] ?? 0);
+ $cuttingResult = array_key_exists('cutting_result', $validated) && $validated['cutting_result'] !== null
+ ? (int) $validated['cutting_result']
+ : null;
+ $sample = array_key_exists('sample', $validated) && $validated['sample'] !== null
+ ? (int) $validated['sample']
+ : null;
+ $originalOutsideSample = array_key_exists('original_outside_sample', $validated) && $validated['original_outside_sample'] !== null
+ ? (int) $validated['original_outside_sample']
+ : null;
- if ($cuttingResult < 1) {
- throw ValidationException::withMessages([
- 'cutting_result' => 'Hasil cutting minimal 1 pcs.',
- ]);
- }
+ if ($cuttingResult !== null) {
+ if ($cuttingResult < 1) {
+ throw ValidationException::withMessages([
+ 'cutting_result' => 'Hasil cutting minimal 1 pcs.',
+ ]);
+ }
- if ($sample < 0) {
- throw ValidationException::withMessages([
- 'sample' => 'sample tidak boleh negatif.',
- ]);
- }
+ if ($sample !== null && $sample < 0) {
+ throw ValidationException::withMessages([
+ 'sample' => 'sample tidak boleh negatif.',
+ ]);
+ }
- if ($originalOutsideSample < 0) {
- throw ValidationException::withMessages([
- 'original_outside_sample' => 'Hasil cutting diluar sample tidak boleh negatif.',
- ]);
- }
+ if ($originalOutsideSample !== null && $originalOutsideSample < 0) {
+ throw ValidationException::withMessages([
+ 'original_outside_sample' => 'Hasil cutting diluar sample tidak boleh negatif.',
+ ]);
+ }
- if (($sample + $originalOutsideSample) !== $cuttingResult) {
- throw ValidationException::withMessages([
- 'cutting_result' => 'Hasil cutting harus sama dengan sample ditambah hasil cutting diluar sample.',
- ]);
+ if ($sample !== null && $originalOutsideSample !== null && ($sample + $originalOutsideSample) !== $cuttingResult) {
+ throw ValidationException::withMessages([
+ 'cutting_result' => 'Hasil cutting harus sama dengan sample ditambah hasil cutting diluar sample.',
+ ]);
+ }
}
$item = CuttingResult::query()->updateOrCreate(
@@ -909,9 +917,9 @@ private function presentDraftResult(CuttingResult $item): array
'product_name' => $variant?->product?->name ?? '',
'variant_name' => $variant?->name ?? '',
'stock' => $variant?->stock ?? 0,
- 'cutting_result' => (string) $item->cutting_result,
- 'sample' => (string) $item->sample,
- 'original_outside_sample' => (string) $item->original_outside_sample,
+ 'cutting_result' => $item->cutting_result !== null ? (string) $item->cutting_result : null,
+ 'sample' => $item->sample !== null ? (string) $item->sample : null,
+ 'original_outside_sample' => $item->original_outside_sample !== null ? (string) $item->original_outside_sample : null,
'images' => $variant ? MediaPresenter::collection($variant, 'images') : [],
];
}
diff --git a/database/migrations/2026_06_30_213126_make_cutting_results_columns_nullable.php b/database/migrations/2026_06_30_213126_make_cutting_results_columns_nullable.php
new file mode 100644
index 0000000..ddbcb0e
--- /dev/null
+++ b/database/migrations/2026_06_30_213126_make_cutting_results_columns_nullable.php
@@ -0,0 +1,32 @@
+unsignedInteger('cutting_result')->nullable()->change();
+ $table->unsignedInteger('sample')->nullable()->change();
+ $table->unsignedInteger('original_outside_sample')->nullable()->default(null)->change();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('cutting_results', function (Blueprint $table) {
+ $table->unsignedInteger('cutting_result')->nullable(false)->change();
+ $table->unsignedInteger('sample')->nullable(false)->change();
+ $table->unsignedInteger('original_outside_sample')->nullable(false)->default(0)->change();
+ });
+ }
+};
diff --git a/resources/js/pages/admin/manage/cuttings/Edit.vue b/resources/js/pages/admin/manage/cuttings/Edit.vue
index d8545c5..a643b63 100644
--- a/resources/js/pages/admin/manage/cuttings/Edit.vue
+++ b/resources/js/pages/admin/manage/cuttings/Edit.vue
@@ -36,9 +36,9 @@ const initialData = computed(() => ({
product_name: item.product_variant?.product?.name ?? '',
variant_name: item.product_variant?.name ?? '',
stock: item.product_variant?.stock ?? 0,
- cutting_result: String(item.cutting_result),
- sample: String(item.sample),
- original_outside_sample: String(item.original_outside_sample),
+ cutting_result: String(item.cutting_result ?? 0),
+ sample: String(item.sample ?? 0),
+ original_outside_sample: String(item.original_outside_sample ?? 0),
images: item.product_variant?.images ?? [],
})),
}));
diff --git a/resources/js/pages/admin/manage/cuttings/Share.vue b/resources/js/pages/admin/manage/cuttings/Share.vue
index b961a5c..7b97c67 100644
--- a/resources/js/pages/admin/manage/cuttings/Share.vue
+++ b/resources/js/pages/admin/manage/cuttings/Share.vue
@@ -140,7 +140,7 @@ const groupedResults = computed