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 (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

View File

@ -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);

View File

@ -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;
});

View File

@ -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;
});

View File

@ -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;
});