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:
parent
061edbc568
commit
e76a117abb
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
});
|
||||
|
||||
|
||||
@ -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;
|
||||
});
|
||||
|
||||
|
||||
@ -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;
|
||||
});
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user