86 lines
2.3 KiB
PHP
86 lines
2.3 KiB
PHP
<?php
|
|
|
|
namespace App\DataFixes;
|
|
|
|
use App\Models\Cutting;
|
|
|
|
class FixCuttingsCost extends BaseDataFix
|
|
{
|
|
public function key(): string
|
|
{
|
|
return 'cuttings-cost';
|
|
}
|
|
|
|
public function description(): string
|
|
{
|
|
return 'Recalculate total_material_cost and cost_per_unit for cuttings';
|
|
}
|
|
|
|
public function fix(): array
|
|
{
|
|
$cuttings = Cutting::with([
|
|
'cuttingMaterials.rawMaterialPrice',
|
|
'cuttingResults',
|
|
])->get();
|
|
|
|
$fixed = 0;
|
|
$skipped = 0;
|
|
$details = [];
|
|
|
|
foreach ($cuttings as $cutting) {
|
|
$oldTotal = $cutting->total_material_cost;
|
|
$oldPerUnit = $cutting->cost_per_unit;
|
|
|
|
$totalMaterialCost = 0;
|
|
foreach ($cutting->cuttingMaterials as $material) {
|
|
$price = $material->rawMaterialPrice;
|
|
if ($price) {
|
|
$totalMaterialCost += $price->price * ($material->material_usage ?? 0);
|
|
}
|
|
}
|
|
|
|
$cuttingResult = $cutting->cuttingResults->sum('cutting_result');
|
|
$costPerUnit = 0;
|
|
if ($cuttingResult > 0) {
|
|
$costPerUnit = (int) ($totalMaterialCost / $cuttingResult);
|
|
}
|
|
|
|
if ($oldTotal === $totalMaterialCost && $oldPerUnit === $costPerUnit) {
|
|
$skipped++;
|
|
|
|
continue;
|
|
}
|
|
|
|
$cutting->update([
|
|
'total_material_cost' => $totalMaterialCost,
|
|
'cost_per_unit' => $costPerUnit,
|
|
]);
|
|
|
|
$details[] = [
|
|
'ID' => $cutting->id,
|
|
'Description' => $cutting->description ?? '-',
|
|
'Old Total' => number_format($oldTotal ?? 0),
|
|
'New Total' => number_format($totalMaterialCost),
|
|
'Old/Unit' => number_format($oldPerUnit ?? 0),
|
|
'New/Unit' => number_format($costPerUnit),
|
|
];
|
|
|
|
$fixed++;
|
|
}
|
|
|
|
if (! empty($details)) {
|
|
$this->command->newLine();
|
|
$this->command->table(
|
|
['ID', 'Description', 'Old Total', 'New Total', 'Old/Unit', 'New/Unit'],
|
|
$details
|
|
);
|
|
}
|
|
|
|
return [
|
|
'fixed' => $fixed,
|
|
'skipped' => $skipped,
|
|
'total' => $cuttings->count(),
|
|
];
|
|
}
|
|
}
|