From e76a117abbbade50c6f64a3d63acf5748acd2191 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Sun, 21 Jun 2026 13:25:51 +0700 Subject: [PATCH] refactor: adjust material usage calculations to account for remaining material across Cutting components for improved accuracy in cost and usage representation --- app/Models/CuttingMaterial.php | 2 +- app/Services/Manage/CuttingService.php | 33 +++---------------- .../table/CuttingCompletedSection.vue | 2 +- .../cuttings/table/CuttingGroupedTable.vue | 2 +- .../table/CuttingInProgressSection.vue | 2 +- 5 files changed, 9 insertions(+), 32 deletions(-) diff --git a/app/Models/CuttingMaterial.php b/app/Models/CuttingMaterial.php index cfda907..9531357 100644 --- a/app/Models/CuttingMaterial.php +++ b/app/Models/CuttingMaterial.php @@ -89,7 +89,7 @@ public function materialCost(): int return 0; } - return (int) round((float) $this->material_usage * (int) $price->price); + return (int) round(((float) $this->material_usage - (float) $this->remaining_material) * (int) $price->price); } private function formatQuantity(float|string|null $value): string diff --git a/app/Services/Manage/CuttingService.php b/app/Services/Manage/CuttingService.php index 3df7f3d..2d01d36 100644 --- a/app/Services/Manage/CuttingService.php +++ b/app/Services/Manage/CuttingService.php @@ -559,13 +559,11 @@ public function transitionStatus( $cutting->load(['materials.rawMaterialPrice', 'results']); if ($status === CuttingStatus::COMPLETED) { - $this->applyRemainingMaterialStock($cutting); $cutting->total_material_cost = $this->calculateTotalMaterialCost($cutting); $cutting->cost_per_unit = $this->calculateCostPerUnit($cutting); } if ($status === CuttingStatus::IN_PROGRESS) { - $this->deductRemainingMaterialStock($cutting); $cutting->rejection()?->delete(); } @@ -724,7 +722,7 @@ private function buildResults(array $results): array private function deductMaterialStock(Cutting $cutting): void { foreach ($cutting->materials as $material) { - $totalTaken = (float) $material->material_usage + (float) $material->remaining_material; + $totalTaken = (float) $material->material_usage - (float) $material->remaining_material; $price = RawMaterialPrice::query()->lockForUpdate()->find($material->raw_material_price_id); if ($price === null) { @@ -746,41 +744,20 @@ private function deductMaterialStock(Cutting $cutting): void private function reverseTotalMaterialStock(Cutting $cutting): void { foreach ($cutting->materials as $material) { - $totalTaken = (float) $material->material_usage + (float) $material->remaining_material; + $totalTaken = (float) $material->material_usage - (float) $material->remaining_material; RawMaterialPrice::query() ->whereKey($material->raw_material_price_id) ->increment('stock', $totalTaken); } } - private function applyRemainingMaterialStock(Cutting $cutting): void - { - foreach ($cutting->materials as $material) { - if ((float) $material->remaining_material > 0) { - RawMaterialPrice::query() - ->whereKey($material->raw_material_price_id) - ->increment('stock', $material->remaining_material); - } - } - } - - private function deductRemainingMaterialStock(Cutting $cutting): void - { - foreach ($cutting->materials as $material) { - if ((float) $material->remaining_material > 0) { - RawMaterialPrice::query() - ->whereKey($material->raw_material_price_id) - ->decrement('stock', $material->remaining_material); - } - } - } - private function reverseMaterialStock(Cutting $cutting): void { foreach ($cutting->materials as $material) { + $totalTaken = (float) $material->material_usage - (float) $material->remaining_material; RawMaterialPrice::query() ->whereKey($material->raw_material_price_id) - ->increment('stock', $material->material_usage); + ->increment('stock', $totalTaken); } } @@ -913,7 +890,7 @@ private function formatQuantityInput(float $value): string private function appendCostPreview(Cutting $cutting): void { $cutting->setAttribute('total_result_pieces', (int) $cutting->results->sum('cutting_result')); - $cutting->setAttribute('total_material_usage', (float) $cutting->materials->sum('material_usage')); + $cutting->setAttribute('total_material_usage', (float) $cutting->materials->sum(fn (CuttingMaterial $m) => (float) $m->material_usage - (float) $m->remaining_material)); $totalMaterialCost = $cutting->total_material_cost ?? $this->calculateTotalMaterialCost($cutting); $sewingCost = (int) ($cutting->sewing_cost ?? 0); diff --git a/resources/js/pages/admin/manage/cuttings/table/CuttingCompletedSection.vue b/resources/js/pages/admin/manage/cuttings/table/CuttingCompletedSection.vue index a2aa1e3..3a9e229 100644 --- a/resources/js/pages/admin/manage/cuttings/table/CuttingCompletedSection.vue +++ b/resources/js/pages/admin/manage/cuttings/table/CuttingCompletedSection.vue @@ -30,7 +30,7 @@ function getGroupedMaterialUsage(materials: any[]): MaterialUsageGroup[] { materials.forEach((mat) => { const unit = mat.raw_material_price?.raw_material?.unit_abbreviation ?? ''; - const usage = Number(mat.material_usage ?? 0); + const usage = Number(mat.material_usage ?? 0) - Number(mat.remaining_material ?? 0); groups[unit] = (groups[unit] ?? 0) + usage; }); diff --git a/resources/js/pages/admin/manage/cuttings/table/CuttingGroupedTable.vue b/resources/js/pages/admin/manage/cuttings/table/CuttingGroupedTable.vue index fb28e31..69b44ea 100644 --- a/resources/js/pages/admin/manage/cuttings/table/CuttingGroupedTable.vue +++ b/resources/js/pages/admin/manage/cuttings/table/CuttingGroupedTable.vue @@ -147,7 +147,7 @@ function getGroupedMaterialUsage(materials: any[]): MaterialUsageGroup[] { materials.forEach((mat) => { const unit = mat.raw_material_price?.raw_material?.unit_abbreviation ?? ''; - const usage = Number(mat.material_usage ?? 0); + const usage = Number(mat.material_usage ?? 0) - Number(mat.remaining_material ?? 0); groups[unit] = (groups[unit] ?? 0) + usage; }); diff --git a/resources/js/pages/admin/manage/cuttings/table/CuttingInProgressSection.vue b/resources/js/pages/admin/manage/cuttings/table/CuttingInProgressSection.vue index 5f7a63d..0e916f0 100644 --- a/resources/js/pages/admin/manage/cuttings/table/CuttingInProgressSection.vue +++ b/resources/js/pages/admin/manage/cuttings/table/CuttingInProgressSection.vue @@ -21,7 +21,7 @@ function getGroupedMaterialUsage(materials: any[]): MaterialUsageGroup[] { materials.forEach((mat) => { const unit = mat.raw_material_price?.raw_material?.unit_abbreviation ?? ''; - const usage = Number(mat.material_usage ?? 0); + const usage = Number(mat.material_usage ?? 0) - Number(mat.remaining_material ?? 0); groups[unit] = (groups[unit] ?? 0) + usage; });