Тема: Проблема с динамическим валовым расчетом в приложении управления агентами Laravel
Контекст:
Я работаю над управлением агентами на основе Laravel и платежное приложение, в котором особое внимание уделяется расчету окончательной чистой зарплаты агента. После расчета первоначальной чистой зарплаты мне необходимо учесть дополнительные чистые суммы, которые необходимо включить в расчет зарплаты.
Пример сценария:
Допустим, я решил дать агенту дополнительно 4800 долларов США (сумма нетто). К этой сумме не применялись никакие вычеты, поэтому она представляет собой totalMustBeTaxableAmount. Мне нужно включить эту чистую сумму в перерасчет зарплаты, но я хочу определить соответствующую брутто-сумму для этой чистой суммы, так как к ней еще нужно применить вычеты.
Расчет Подход:
Расчет целевой зарплаты:
После расчета чистой зарплаты я корректирую зарплату, включив в нее дополнительную сумму TotalMustBeTaxableAmount (которая составляет 4800 долларов США). в этом случае). Я использую следующую формулу:
php
$targetValue = $grossDeductibleBase + $childIndemnitiesAmount - $totalDeductionsAmountRt - $totalDeductionsAmountCaiMut - $finalNetIr + $totalMustBeTaxableAmount;
Начальная валовая сумма Расчет:
Следующий шаг включает в себя перерасчет зарплаты с предположением, что totalIndemnitiesBrutAmount изначально равен 0. Это значение будет представлять собой валовой эквивалент totalMustBeTaxableAmount:
php
$totalIndemnitiesBrutAmount = 0; // Первоначально установлено значение 0
$finalGrossDeductibleBase = $grossDeductibleBase + $totalIndemnitiesBrutAmount;
Расчет недостающей суммы:
После перерасчета недостающая сумма вычисляется как:
php
$missingAmount = round($finalNetSalary - $targetValue, 2);
В этом примере недостающая сумма равна -4800 долларов США, что указывает на то, что чистую зарплату необходимо скорректировать на эту сумму.
Корректировка валовой суммы Сумма:
Я вручную корректирую totalIndemnitiesBrutAmount, чтобы она соответствовала целевой чистой зарплате. В данном случае я начинаю с:
php
$totalIndemnitiesBrutAmount = 4800;
После пересчета наблюдаю следующие изменения:
Чистая зарплата: окончательная чистая зарплата равна 10196,26 долларов США, но недостающая сумма теперь равна -1060,56 долларов США.
Продолжаем это корректируя вручную, я в конечном итоге нахожу значение, при котором недостающая сумма равна 0, что соответствует валовой сумме, необходимой для достижения целевого значения.
Окончательные результаты после ручной корректировки:Когда я вручную корректирую totalIndemnitiesBrutAmount до 6324,73 долларов США, пересчитанные результаты соответствуют целевому:
json
{
"total_deductions_amount_rt": 373,71,
"total_deductions_amount_cai_mut": 298,
"total_deductions_amount_ir": 87,68,
"net_ir": -2,32,
"final_net_ir": 0,"net_salary": 6456,82,
"target_value": 11256,82,
"total_deductions_amount_final_dir": 90,
"net_new_ir": 1524,73,
"final_new_net_ir": 1524,73,
"final_net_salary": 11256,82,
"total_indemnities_brut_amount": 6324,73,
"used_f_ir": 34,
"missing_amount": 0
Как видите , окончательная чистая зарплата соответствует целевому значению 11256,82 долларов США, а MissingAmount имеет значение 0, а соответствующая валовая сумма составляет 6324,73 долларов США.
Проблема:
В настоящее время процесс корректировки totalIndemnitiesBrutAmount вручную является утомительным и приводит к ошибкам. -склонный. Цель состоит в том, чтобы динамически вычислить правильное значение totalIndemnitiesBrutAmount без ручной корректировки значений на каждой итерации, сохраняя при этом общую структуру кода.
Ожидаемый результат:
Ожидаемый результат заключается в том, что система будет динамически корректировать totalIndemnitiesBrutAmount для достижения целевого значения, как и при ручной настройке. Однако мне нужен способ сделать это динамически в рамках существующей структуры, без ручной настройки значений на каждой итерации. Я пробовал использовать цикл, но этот процесс кажется неэффективным и иногда дает неправильные результаты.
Требуемое решение:
Мне нужно решение, которое позволит динамическая регулировка общей суммы IndemnitiesBrutAmount без ручного вмешательства. Логика должна содержаться в существующей структуре вычислений кода с использованием более автоматизированного подхода для получения правильного валового значения totalMustBeTaxableAmount.
Любая помощь будет оценена where('use_parameter_for', 'TYPE_DEDUCTION')->where('main_parameter', 'TYPE_DEDUCTION_FP')->first();
// Check if we found the Drparameter for RETRAITE
if (!$fFpDrparameter) {
return response()->json(['error' => 'No RETRAITE Drparameter found.'], 400);
}
$fFpDeductions = Deduction::with([
'typeDeduction',
])
->where('type_deduction_id', $fFpDrparameter->id)
->get();
$fFpDeductionsDetails = [];
foreach ($fFpDeductions as $deduction) {
$deductionAmount = 0;
if ($deduction->type === 'fixed') {
$deductionAmount = $deduction->value;
} elseif ($deduction->type === 'percentage') {
$inRange = (
$finalGrossDeductibleBase >= $deduction->start_range &&
($deduction->end_range === null || $finalGrossDeductibleBase end_range)
);
if ($inRange) {
$calculatedDeduction = round(($deduction->base_percentage / 100) * $finalGrossDeductibleBase, 2);
$deductionAmount = min($calculatedDeduction, $deduction->ceiling);
}
}
$totalDeductionsAmountFinalFp += $deductionAmount;
// Add detailed information for each deduction
$fFpDeductionsDetails[] = [
'deduction_name' => $deduction->name_ar, // or any relevant identifier for the deduction
'type' => $deduction->type,
'value' => $deduction->value,
'base_percentage' => $deduction->base_percentage,
'ceiling' => $deduction->ceiling,
'calculated_value' => $deductionAmount, // Calculated deduction value for this entry
];
}
$finalNetDeductibleBase = $finalGrossDeductibleBase - $totalDeductionsAmountFinalFp - $totalDeductionsAmountRt - $totalDeductionsAmountCaiMut;
$fIrDrparameter = Drparameter::select(['id', 'main_parameter', 'use_parameter_for','name_ar','name_fr','created_at'])
->where('use_parameter_for', 'TYPE_DEDUCTION')->where('main_parameter', 'TYPE_DEDUCTION_IR')->first();
$fIrTypePeriodDrparameter = Drparameter::select(['id', 'main_parameter', 'use_parameter_for','name_ar','name_fr','created_at'])
->where('use_parameter_for', 'TYPE_DEDUCTION_PERIOD')->where('main_parameter', 'TYPE_DEDUCTION_PERIOD_1')->first();
if (!$fIrDrparameter) {
return response()->json(['error' => 'No IR Drparameter found.'], 400);
}
$fIrDeductions = Deduction::with([
'typeDeduction',
])
->where('type_deduction_id', $fIrDrparameter->id)
->where('type_deduction_period_id', $fIrTypePeriodDrparameter->id)
->get();
$fIrDeductionsDetails = [];
foreach ($fIrDeductions as $deduction) {
$deductionAmount = 0;
if ($deduction->type === 'fixed') {
$deductionAmount = $deduction->value;
} elseif ($deduction->type === 'percentage') {
$inRange = (
$finalNetDeductibleBase >= $deduction->start_range &&
($deduction->end_range === null || $finalNetDeductibleBase end_range)
);
if ($inRange) {
$calculatedDeduction = round(($deduction->base_percentage / 100) * $finalNetDeductibleBase, 2);
$deductionAmount = $calculatedDeduction - $deduction->deduction;
$usedFIr = $deduction->base_percentage;
$lastUsedFIr = $usedFIr;
}
}
$totalDeductionsAmountFinalIr += $deductionAmount;
$fIrDeductionsDetails[] = [
'deduction_name' => $deduction->name_ar,
'type' => $deduction->type,
'value' => $deduction->value,
'base_percentage' => $deduction->base_percentage,
'ceiling' => $deduction->ceiling,
'calculated_value' => $deductionAmount,
];
}
$fDirDrparameter = Drparameter::select(['id', 'main_parameter', 'use_parameter_for','name_ar','name_fr','created_at'])
->where('use_parameter_for', 'TYPE_DEDUCTION')->where('main_parameter', 'TYPE_DEDUCTION_RIR')->first();
$fDirTypePeriodDrparameter = Drparameter::select(['id', 'main_parameter', 'use_parameter_for','name_ar','name_fr','created_at'])
->where('use_parameter_for', 'TYPE_DEDUCTION_PERIOD')->where('main_parameter', 'TYPE_DEDUCTION_PERIOD_1')->first();
if (!$fDirDrparameter) {
return response()->json(['error' => 'No IR Drparameter found.'], 400);
}
$fDirDeductions = Deduction::with([
'typeDeduction',
])
->where('type_deduction_id', $fDirDrparameter->id)
->where('type_deduction_period_id', $fDirTypePeriodDrparameter->id)
->get();
$fDirDeductionsDetails = [];
$deductionCount = 0;
// Add the agent themselves if they are deductible
if ($agent->deductible_partner === true) {
$deductionCount++; // The agent counts as 1 instance
}
// Add eligible children determined by your existing logic
$eligibleChildrenCount = 0;
$children = $agent->children()->whereNull('agent_children_history.removed_at')->get();
$primaryAgentGender = 'GENRE_M';
foreach ($children as $child) {
$childAgents = $child->agents()->whereNull('agent_children_history.removed_at')->get();
$isPrimaryAgent = $childAgents->count() > 1
&& $childAgents->contains(fn($a) => $a->gender->main_parameter === $primaryAgentGender)
? $agent->gender->main_parameter === $primaryAgentGender
: true;
if ($isPrimaryAgent) {
$eligibleChildrenCount++;
}
}
// Add children to the deduction count, respecting the 6-instance limit
$deductionCount += $eligibleChildrenCount;
// Cap the deduction count at 6 instances
$deductionCount = min($deductionCount, 6);
foreach ($fDirDeductions as $deduction) {
$deductionAmount = 0;
if ($deduction->type === 'fixed') {
$deductionAmount = $deduction->value * $deductionCount;
} elseif ($deduction->type === 'percentage') {
$deductionAmount = round(($deduction->base_percentage / 100) * $finalNetDeductibleBase, 2) * $deductionCount;
}
$totalDeductionsAmountFinalDir += $deductionAmount;
// Add detailed information for each deduction
$fDirDeductionsDetails[] = [
'deduction_name' => $deduction->name_ar, // or any relevant identifier for the deduction
'type' => $deduction->type,
'value' => $deduction->value,
'base_percentage' => $deduction->base_percentage,
'ceiling' => $deduction->ceiling,
'calculated_value' => $deductionAmount, // Calculated deduction value for this entry
];
}
$netNewIr = $totalDeductionsAmountFinalIr - $totalDeductionsAmountFinalDir;
$finalNewNetIr = $totalDeductionsAmountFinalIr - $totalDeductionsAmountFinalDir;
if ($finalNewNetIr < 0) {
$finalNewNetIr = 0;
}
// Recalculate the missing amount
$missingAmount = round($finalNetSalary - $targetValue, 2);
return response()->json([
'agent_id' => $agent->id,
'must_be_taxable_indemnities' => $mustBeTaxableIndemnities,
'must_be_taxable_amount' => round($totalMustBeTaxableAmount, 2),
'gross_deductible_base' =>round($grossDeductibleBase, 2),
'fp_deductible' => $fpDeductionsDetails,
'net_deductible_base' =>round($netDeductibleBase, 2),
'retraite_deductions_details' => $retraiteDeductionsDetails,
'caisse_mutuelle_deductions_details' => $caiMutDeductionsDetails,
'ir_deductions_details' => $irDeductionsDetails,
'total_deductions_amount_rt' => round($totalDeductionsAmountRt, 2),
'total_deductions_amount_cai_mut' => round($totalDeductionsAmountCaiMut, 2),
'total_deductions_amount_ir' => round($totalDeductionsAmountIr, 2),
'deducted_ir_amount_dir' => round($totalDeductionsAmountDir, 2),
'net_ir' => round($netIr, 2),
'final_net_ir' => round($finalNetIr, 2),
'net_salary' => round($netSalary, 2),
'target_value' => round($targetValue, 2),
'main_missing_amount' => round($firstMissingAmount, 2),
'final_gross_deductible_base' => round($finalGrossDeductibleBase, 2),
'final_fp_deductions_details' => $fFpDeductionsDetails,
'total_deductions_amount_final_fp' => round($totalDeductionsAmountFinalFp, 2),
'final_fp_deductible_amount' => round($totalDeductionsAmountFinalFp, 2),
'final_net_deductible_base' => round($finalNetDeductibleBase, 2),
'final_ir_deductions_details' => $fIrDeductionsDetails,
'final_total_deductions_amount_ir' => round($totalDeductionsAmountFinalIr, 2),
'final_dir_deductions_details' => $fDirDeductionsDetails,
'total_deductions_amount_final_dir' => round($totalDeductionsAmountFinalDir, 2),
'net_new_ir' => round($netNewIr, 2),
'final_new_net_ir' => round($finalNewNetIr, 2),
'final_net_salary' => round($finalNetSalary, 2),
'total_indemnities_brut_amount' => round($totalIndemnitiesBrutAmount, 2),
'used_f_ir' => round($usedFIr, 2),
'missing_amount' => round($missingAmount, 2),
], 200, [], JSON_UNESCAPED_UNICODE);
}
Подробнее здесь: https://stackoverflow.com/questions/792 ... t-totalind
Проблема с валовым расчетом в моем приложении управления Laravel «Автоматически получить TotalIndemnitiesBrutAmount» ⇐ Php
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение