Feat: Implementado cálculo de ISR en nóminas
- Agregado campo isr_table_id en tabla months para seleccionar tabla ISR por mes - Creado servicio IsrCalculator para calcular ISR mensual y quincenal - Modificado CommissionCalculator para descontar ISR del total a pagar - Agregado selector de tabla ISR en formulario de crear/editar mes - Actualizada vista de meses para mostrar tabla ISR asignada - Actualizados reportes mensual y quincenal para mostrar ISR descontado
This commit is contained in:
@@ -4,6 +4,7 @@ namespace App\Services;
|
||||
|
||||
use App\Models\DailySale;
|
||||
use App\Models\Expense;
|
||||
use App\Models\IsrTable;
|
||||
use App\Models\Month;
|
||||
use App\Models\User;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
@@ -38,8 +39,15 @@ class CommissionCalculator
|
||||
// Calcular comisión basada en ventas del sistema (ventas consolidadas)
|
||||
$commission = ($totalSystemSales * $commissionPercentage) / 100;
|
||||
|
||||
// Calcular percepción total (salario + comisión - gastos)
|
||||
$totalEarning = $monthlySalary + $commission - $totalExpenses;
|
||||
// Calcular ISR sobre (salario + comisión)
|
||||
// Los gastos personales NO son deducibles del ISR
|
||||
$incomeForIsr = $monthlySalary + $commission;
|
||||
$isrTable = $month->isrTable;
|
||||
$isrResult = IsrCalculator::calculateMonthly($incomeForIsr, $isrTable);
|
||||
$isrAmount = $isrResult['isr'];
|
||||
|
||||
// Calcular percepción total con ISR (salario + comisión - gastos - ISR)
|
||||
$totalEarning = $monthlySalary + $commission - $totalExpenses - $isrAmount;
|
||||
|
||||
return [
|
||||
'user_id' => $user->id,
|
||||
@@ -51,6 +59,8 @@ class CommissionCalculator
|
||||
'monthly_salary' => round($monthlySalary, 2),
|
||||
'commission_percentage' => round($commissionPercentage, 2),
|
||||
'commission_amount' => round($commission, 2),
|
||||
'isr_amount' => round($isrAmount, 2),
|
||||
'isr_details' => $isrResult,
|
||||
'total_earning' => round($totalEarning, 2),
|
||||
'has_difference' => ($totalUserSales !== $totalSystemSales),
|
||||
'sales_difference' => round($totalUserSales - $totalSystemSales, 2),
|
||||
@@ -60,8 +70,8 @@ class CommissionCalculator
|
||||
/**
|
||||
* Calcular quincena (primera o segunda)
|
||||
*
|
||||
* QUINCENA 1 (ANTICIPO): mitad salary + comisiones del MES completo
|
||||
* QUINCENA 2 (LIQUIDACIÓN): mitad salary - gastos de la segunda quincena
|
||||
* QUINCENA 1 (ANTICIPO): mitad salary + comisiones del MES completo - ISR quincenal
|
||||
* QUINCENA 2 (LIQUIDACIÓN): mitad salary - gastos de la segunda quincena - ISR quincenal
|
||||
*/
|
||||
public static function calculateBiweekly(User $user, Month $month, int $biweekly): array
|
||||
{
|
||||
@@ -78,13 +88,20 @@ class CommissionCalculator
|
||||
$year = $month->year;
|
||||
$lastDay = self::getLastDayOfMonth($month->name, $year);
|
||||
|
||||
// Calcular ISR mensual completo (salario + comisión)
|
||||
$totalSystemSales = $month->dailySales()->sum('system_sales');
|
||||
$commission = ($totalSystemSales * $commissionPercentage) / 100;
|
||||
$incomeForIsr = $monthlySalary + $commission;
|
||||
$isrTable = $month->isrTable;
|
||||
$isrResult = IsrCalculator::calculateMonthly($incomeForIsr, $isrTable);
|
||||
$isrMonthlyAmount = $isrResult['isr'];
|
||||
$isrBiweekly = IsrCalculator::calculateBiweekly($isrMonthlyAmount);
|
||||
|
||||
if ($biweekly === 1) {
|
||||
// =====================
|
||||
// QUINCENA 1 - ANTICIPO
|
||||
// =====================
|
||||
// Anticipo = mitad del sueldo + comisiones del MES completo
|
||||
$totalSystemSales = $month->dailySales()->sum('system_sales');
|
||||
$commission = ($totalSystemSales * $commissionPercentage) / 100;
|
||||
// Anticipo = mitad del sueldo + comisiones del MES completo - ISR quincenal
|
||||
|
||||
// Gastos: q1 completo + mensual/2
|
||||
$expensesQ1Amount = $month->expenses()
|
||||
@@ -97,7 +114,7 @@ class CommissionCalculator
|
||||
return $e->expense_type === 'mensual' ? $e->amount / 2 : $e->amount;
|
||||
});
|
||||
|
||||
$totalEarning = $biweeklySalary + $commission - $expensesQ1Amount;
|
||||
$totalEarning = $biweeklySalary + $commission - $expensesQ1Amount - $isrBiweekly;
|
||||
|
||||
return [
|
||||
'user_id' => $user->id,
|
||||
@@ -105,11 +122,12 @@ class CommissionCalculator
|
||||
'month_name' => $month->name . ' ' . $year,
|
||||
'biweekly' => $biweekly,
|
||||
'period' => '1ra Quincena (1-15) - ANTICIPO',
|
||||
'description' => 'Mitad del sueldo + comisiones del mes completo',
|
||||
'description' => 'Mitad del sueldo + comisiones del mes completo - ISR',
|
||||
'biweekly_salary' => round($biweeklySalary, 2),
|
||||
'total_system_sales' => round($totalSystemSales, 2),
|
||||
'commission_percentage' => round($commissionPercentage, 2),
|
||||
'commission_amount' => round($commission, 2),
|
||||
'isr_amount' => round($isrBiweekly, 2),
|
||||
'total_expenses_month' => 0,
|
||||
'expenses_q1' => round($expensesQ1Amount, 2),
|
||||
'expenses_q2' => 0,
|
||||
@@ -120,7 +138,7 @@ class CommissionCalculator
|
||||
// =====================
|
||||
// QUINCENA 2 - LIQUIDACIÓN
|
||||
// =====================
|
||||
// Liquidación = mitad del sueldo - gastos de Q2
|
||||
// Liquidación = mitad del sueldo - gastos de Q2 - ISR quincenal
|
||||
|
||||
// Gastos: q2 completo + mensual/2
|
||||
$expensesQ2Amount = $month->expenses()
|
||||
@@ -134,7 +152,7 @@ class CommissionCalculator
|
||||
});
|
||||
|
||||
// Total a pagar en liquidacion
|
||||
$totalEarning = $biweeklySalary - $expensesQ2Amount;
|
||||
$totalEarning = $biweeklySalary - $expensesQ2Amount - $isrBiweekly;
|
||||
|
||||
return [
|
||||
'user_id' => $user->id,
|
||||
@@ -142,9 +160,10 @@ class CommissionCalculator
|
||||
'month_name' => $month->name . ' ' . $year,
|
||||
'biweekly' => $biweekly,
|
||||
'period' => "2da Quincena (16-$lastDay) - LIQUIDACIÓN",
|
||||
'description' => 'Mitad del sueldo - mitad de gastos del mes',
|
||||
'description' => 'Mitad del sueldo - mitad de gastos del mes - ISR',
|
||||
'biweekly_salary' => round($biweeklySalary, 2),
|
||||
'total_system_sales' => 0,
|
||||
'isr_amount' => round($isrBiweekly, 2),
|
||||
'expenses_q2' => round($expensesQ2Amount, 2),
|
||||
'total_earning' => round($totalEarning, 2),
|
||||
'type' => 'liquidacion',
|
||||
|
||||
Reference in New Issue
Block a user