feat: add updateCombinationResult method to CuttingDraftItemController and corresponding route

This commit is contained in:
Yoga Pangestu 2026-07-19 20:05:08 +07:00
parent 6cbb6f7cbb
commit 0070d0c49e
5 changed files with 68 additions and 0 deletions

View File

@ -61,6 +61,15 @@ public function destroyCombination(Request $request, int $combinationId): JsonRe
return response()->json(['ok' => true]);
}
public function updateCombinationResult(Request $request, int $combinationId): JsonResponse
{
$result = $request->input('material_result');
$this->cuttingService->updateDraftCombinationResult($request->user(), $combinationId, $result);
return response()->json(['ok' => true]);
}
public function quickCreateProduct(CuttingQuickCreateProductRequest $request): JsonResponse
{
$product = $this->cuttingService->quickCreateProduct($request->validated());

View File

@ -411,6 +411,23 @@ public function removeDraftCombination(User $user, int $combinationId): void
$combination->forceDelete();
}
public function updateDraftCombinationResult(User $user, int $combinationId, mixed $result): void
{
$combination = CuttingMaterialCombination::query()
->whereNull('cutting_id')
->where('user_id', $user->id)
->where('id', $combinationId)
->first();
if ($combination === null) {
return;
}
$materialResult = $result !== null ? (int) $result : null;
$combination->update(['material_result' => $materialResult]);
}
public function create(array $validated, User $user): Cutting
{
$cutting = $this->runInTransaction(

View File

@ -65,6 +65,7 @@ const {
resultCart,
filteredRawMaterials,
totalMaterialCost,
totalMaterialResult,
totalResultPieces,
materialLineCost,
setCarts,
@ -150,6 +151,13 @@ if (isCreateMode.value && resultCart.value.length === 0) {
});
}
watch(totalMaterialResult, (newVal) => {
const val = newVal > 0 ? String(newVal) : null;
resultCart.value.forEach((item) => {
item.cutting_result = val;
});
}, { immediate: true });
function buildFormData(): FormData {
const formData = new FormData();

View File

@ -84,6 +84,24 @@ export function useCuttingPosCart(options: {
materialCart.value.reduce((sum, item) => sum + materialLineCost(item), 0),
);
const totalMaterialResult = computed(() => {
const seenCombinations = new Set<number>();
let total = 0;
materialCart.value.forEach((item) => {
if (item.combination_id) {
if (!seenCombinations.has(item.combination_id)) {
seenCombinations.add(item.combination_id);
total += Number(item.combination_material_result) || 0;
}
} else {
total += Number(item.material_result) || 0;
}
});
return total;
});
const totalResultPieces = computed(() =>
resultCart.value.reduce(
(sum, item) => sum + (Number(item.cutting_result) || 0),
@ -195,6 +213,17 @@ export function useCuttingPosCart(options: {
item.combination_material_result = result;
}
});
if (toValue(options.isCreateMode)) {
try {
await apiFetch(draft_combinations.update_result.url(combinationId), {
method: 'PUT',
body: JSON.stringify({ material_result: result }),
});
} catch (error) {
toast.error(error instanceof Error ? error.message : 'Gagal menyimpan hasil kombinasi.');
}
}
}
function getMaterialCartItem(priceId: number): CuttingMaterialCartItem | undefined {
@ -310,6 +339,7 @@ export function useCuttingPosCart(options: {
resultCart,
filteredRawMaterials,
totalMaterialCost,
totalMaterialResult,
totalResultPieces,
estimatedCostPerUnit,
materialLineCost,

View File

@ -404,6 +404,10 @@
->middleware('permission:'.Permission::CUTTINGS_CREATE->value)
->name('draft_combinations.destroy');
Route::put('draft-combinations/{combinationId}/result', [CuttingDraftItemController::class, 'updateCombinationResult'])
->middleware('permission:'.Permission::CUTTINGS_CREATE->value)
->name('draft_combinations.update_result');
Route::post('quick-create-product', [CuttingDraftItemController::class, 'quickCreateProduct'])
->middleware('permission:'.Permission::CUTTINGS_CREATE->value)
->name('quick_create_product');