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 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
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user