refactor: adjust material usage calculations to account for remaining material across Cutting components for improved accuracy in cost and usage representation

This commit is contained in:
Yoga Pangestu 2026-06-21 13:25:51 +07:00
parent 061edbc568
commit e76a117abb
5 changed files with 9 additions and 32 deletions

View File

@ -89,7 +89,7 @@ public function materialCost(): int
return 0; 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 private function formatQuantity(float|string|null $value): string

View File

@ -559,13 +559,11 @@ public function transitionStatus(
$cutting->load(['materials.rawMaterialPrice', 'results']); $cutting->load(['materials.rawMaterialPrice', 'results']);
if ($status === CuttingStatus::COMPLETED) { if ($status === CuttingStatus::COMPLETED) {
$this->applyRemainingMaterialStock($cutting);
$cutting->total_material_cost = $this->calculateTotalMaterialCost($cutting); $cutting->total_material_cost = $this->calculateTotalMaterialCost($cutting);
$cutting->cost_per_unit = $this->calculateCostPerUnit($cutting); $cutting->cost_per_unit = $this->calculateCostPerUnit($cutting);
} }
if ($status === CuttingStatus::IN_PROGRESS) { if ($status === CuttingStatus::IN_PROGRESS) {
$this->deductRemainingMaterialStock($cutting);
$cutting->rejection()?->delete(); $cutting->rejection()?->delete();
} }
@ -724,7 +722,7 @@ private function buildResults(array $results): array
private function deductMaterialStock(Cutting $cutting): void private function deductMaterialStock(Cutting $cutting): void
{ {
foreach ($cutting->materials as $material) { 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); $price = RawMaterialPrice::query()->lockForUpdate()->find($material->raw_material_price_id);
if ($price === null) { if ($price === null) {
@ -746,41 +744,20 @@ private function deductMaterialStock(Cutting $cutting): void
private function reverseTotalMaterialStock(Cutting $cutting): void private function reverseTotalMaterialStock(Cutting $cutting): void
{ {
foreach ($cutting->materials as $material) { 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() RawMaterialPrice::query()
->whereKey($material->raw_material_price_id) ->whereKey($material->raw_material_price_id)
->increment('stock', $totalTaken); ->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 private function reverseMaterialStock(Cutting $cutting): void
{ {
foreach ($cutting->materials as $material) { foreach ($cutting->materials as $material) {
$totalTaken = (float) $material->material_usage - (float) $material->remaining_material;
RawMaterialPrice::query() RawMaterialPrice::query()
->whereKey($material->raw_material_price_id) ->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 private function appendCostPreview(Cutting $cutting): void
{ {
$cutting->setAttribute('total_result_pieces', (int) $cutting->results->sum('cutting_result')); $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); $totalMaterialCost = $cutting->total_material_cost ?? $this->calculateTotalMaterialCost($cutting);
$sewingCost = (int) ($cutting->sewing_cost ?? 0); $sewingCost = (int) ($cutting->sewing_cost ?? 0);

View File

@ -30,7 +30,7 @@ function getGroupedMaterialUsage(materials: any[]): MaterialUsageGroup[] {
materials.forEach((mat) => { materials.forEach((mat) => {
const unit = mat.raw_material_price?.raw_material?.unit_abbreviation ?? ''; 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; groups[unit] = (groups[unit] ?? 0) + usage;
}); });

View File

@ -147,7 +147,7 @@ function getGroupedMaterialUsage(materials: any[]): MaterialUsageGroup[] {
materials.forEach((mat) => { materials.forEach((mat) => {
const unit = mat.raw_material_price?.raw_material?.unit_abbreviation ?? ''; 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; groups[unit] = (groups[unit] ?? 0) + usage;
}); });

View File

@ -21,7 +21,7 @@ function getGroupedMaterialUsage(materials: any[]): MaterialUsageGroup[] {
materials.forEach((mat) => { materials.forEach((mat) => {
const unit = mat.raw_material_price?.raw_material?.unit_abbreviation ?? ''; 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; groups[unit] = (groups[unit] ?? 0) + usage;
}); });