This commit is contained in:
arifal
2025-07-03 15:28:54 +07:00
parent a7f578ca3d
commit a1e302a56d
4 changed files with 134 additions and 15 deletions

View File

@@ -26,7 +26,7 @@ class AssignSpatialPlanningsToCalculation extends Command
*
* @var string
*/
protected $description = 'Assign retribution calculations to spatial plannings (supports recalculate for existing calculations)';
protected $description = 'Assign retribution calculations to spatial plannings (recalculate mode applies 30% area adjustment)';
protected $calculatorService;
@@ -57,6 +57,7 @@ class AssignSpatialPlanningsToCalculation extends Command
$q->where('is_active', true);
});
$this->info('🔄 Recalculate mode: Processing spatial plannings with existing calculations');
$this->warn('⚠️ NOTE: Recalculate mode will apply 30% area adjustment to all calculations');
} elseif (!$force) {
// Normal mode: only process those without active calculations
$query->whereDoesntHave('retributionCalculations', function ($q) {
@@ -140,6 +141,7 @@ class AssignSpatialPlanningsToCalculation extends Command
['Errors', $errors],
]
);
$this->info('📊 Recalculate mode applied 30% area adjustment to all calculations');
} else {
$this->table(
['Metric', 'Count'],
@@ -189,7 +191,7 @@ class AssignSpatialPlanningsToCalculation extends Command
if ($recalculate) {
// Recalculate mode: Always create new calculation
$calculationResult = $this->performCalculation($spatialPlanning, $buildingType);
$calculationResult = $this->performCalculation($spatialPlanning, $buildingType, true);
// Check if spatial planning has existing active calculation
$currentActiveCalculation = $spatialPlanning->activeRetributionCalculation;
@@ -211,9 +213,10 @@ class AssignSpatialPlanningsToCalculation extends Command
]);
// Assign new calculation
$adjustedArea = round($buildingArea * 0.3, 2);
$spatialPlanning->assignRetributionCalculation(
$calculation,
"Recalculated: Area {$oldArea}{$buildingArea}, Amount {$oldAmount}{$newAmount}"
"Recalculated (30% area): Original area {$oldArea}m² → Adjusted area {$adjustedArea}, Amount {$oldAmount}{$newAmount}"
);
$isRecalculated = true;
@@ -234,7 +237,7 @@ class AssignSpatialPlanningsToCalculation extends Command
$spatialPlanning->assignRetributionCalculation(
$calculation,
'Recalculated (new calculation)'
'Recalculated (new calculation with 30% area adjustment)'
);
}
} else {
@@ -255,7 +258,7 @@ class AssignSpatialPlanningsToCalculation extends Command
$reused = true;
} else {
// Create new calculation
$calculationResult = $this->performCalculation($spatialPlanning, $buildingType);
$calculationResult = $this->performCalculation($spatialPlanning, $buildingType, false);
$calculation = RetributionCalculation::create([
'building_type_id' => $buildingType->id,
@@ -401,10 +404,18 @@ class AssignSpatialPlanningsToCalculation extends Command
/**
* Perform calculation using RetributionCalculatorService
*/
private function performCalculation(SpatialPlanning $spatialPlanning, BuildingType $buildingType): array
private function performCalculation(SpatialPlanning $spatialPlanning, BuildingType $buildingType, bool $recalculate = false): array
{
// Round area to 2 decimal places to match database storage format
$buildingArea = round($spatialPlanning->getCalculationArea(), 2);
// Apply 30% multiplication for recalculate mode
if ($recalculate) {
$originalArea = $buildingArea;
$buildingArea = round($buildingArea * 0.3, 2); // 30% of original area
$this->info("Recalculate mode: Original area {$originalArea}m² → Adjusted area {$buildingArea}m² (30%)");
}
$floorNumber = $spatialPlanning->number_of_floors ?: 1;
try {
@@ -429,6 +440,8 @@ class AssignSpatialPlanningsToCalculation extends Command
'height_index' => $result['input_parameters']['height_index'],
'infrastructure_factor' => $result['indices']['infrastructure_factor'],
'building_area' => $buildingArea,
'original_building_area' => $recalculate ? round($spatialPlanning->getCalculationArea(), 2) : null,
'area_adjustment_factor' => $recalculate ? 0.3 : null,
'floor_number' => $floorNumber,
'building_function' => $spatialPlanning->building_function,
'calculation_steps' => $result['calculation_detail'],
@@ -436,6 +449,7 @@ class AssignSpatialPlanningsToCalculation extends Command
'is_free' => $buildingType->is_free,
'calculation_date' => now()->toDateTimeString(),
'total' => $result['total_retribution'],
'is_recalculated' => $recalculate,
]
];
@@ -446,6 +460,13 @@ class AssignSpatialPlanningsToCalculation extends Command
// Basic fallback calculation
$totalAmount = $buildingType->is_free ? 0 : ($buildingArea * 50000);
// Apply 30% multiplication for recalculate mode in fallback too
if ($recalculate) {
$originalAmount = $totalAmount;
$totalAmount = round($totalAmount * 0.3, 2);
$this->warn("Fallback recalculate: Original amount Rp{$originalAmount} → Adjusted amount Rp{$totalAmount} (30%)");
}
return [
'amount' => $totalAmount,
'detail' => [
@@ -453,6 +474,8 @@ class AssignSpatialPlanningsToCalculation extends Command
'building_type_name' => $buildingType->name,
'building_type_code' => $buildingType->code,
'building_area' => $buildingArea,
'original_building_area' => $recalculate ? round($spatialPlanning->getCalculationArea(), 2) : null,
'area_adjustment_factor' => $recalculate ? 0.3 : null,
'floor_number' => $floorNumber,
'building_function' => $spatialPlanning->building_function,
'calculation_method' => 'fallback',
@@ -460,6 +483,7 @@ class AssignSpatialPlanningsToCalculation extends Command
'is_free' => $buildingType->is_free,
'calculation_date' => now()->toDateTimeString(),
'total' => $totalAmount,
'is_recalculated' => $recalculate,
]
];
}