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:
2026-04-21 13:45:39 -06:00
parent 4abf89c57f
commit e8aac6eaa5
10 changed files with 213 additions and 21 deletions

View File

@@ -41,6 +41,19 @@
value="{{ old('year', now()->year) }}" min="2020" max="2100" required>
</div>
<div class="mb-3">
<label for="isr_table_id" class="form-label">Tabla ISR</label>
<select class="form-select" id="isr_table_id" name="isr_table_id">
<option value="">-- Sin ISR --</option>
@foreach($isrTables as $table)
<option value="{{ $table->id }}">
{{ $table->year }} ({{ $table->brackets->count() }} rangos)
</option>
@endforeach
</select>
<small class="text-muted">Selecciona la tabla ISR a aplicar en este mes</small>
</div>
<div class="d-flex gap-2">
<button type="submit" class="btn btn-success">Crear Mes</button>
<a href="{{ route('months.index') }}" class="btn btn-secondary">Cancelar</a>

View File

@@ -41,6 +41,19 @@
</select>
</div>
<div class="mb-3">
<label for="isr_table_id" class="form-label">Tabla ISR</label>
<select class="form-select" id="isr_table_id" name="isr_table_id">
<option value="">-- Sin ISR --</option>
@foreach($isrTables as $table)
<option value="{{ $table->id }}" {{ $month->isr_table_id == $table->id ? 'selected' : '' }}>
{{ $table->year }} ({{ $table->brackets->count() }} rangos)
</option>
@endforeach
</select>
<small class="text-muted">Selecciona la tabla ISR a aplicar en este mes</small>
</div>
<div class="d-flex gap-2">
<button type="submit" class="btn btn-primary">Actualizar</button>
<a href="{{ route('months.show', $month->id) }}" class="btn btn-secondary">Cancelar</a>

View File

@@ -36,11 +36,20 @@
<span class="badge bg-info">Pagado</span>
@endif
</p>
<p class="mb-1">
<small class="text-muted">ISR: </small>
@if($month->isrTable)
<span class="badge bg-primary">{{ $month->isrTable->year }}</span>
@else
<span class="badge bg-secondary">Sin ISR</span>
@endif
</p>
<p class="mb-1"><small class="text-muted">Ventas: ${{ number_format($month->dailySales()->sum('user_sales'), 2) }}</small></p>
<p class="mb-0"><small class="text-muted">Gastos: ${{ number_format($month->expenses()->sum('amount'), 2) }}</small></p>
</div>
<div class="card-footer bg-transparent">
<a href="{{ route('months.show', $month->id) }}" class="btn btn-sm btn-primary">Ver Detalles</a>
<a href="{{ route('months.edit', $month->id) }}" class="btn btn-sm btn-secondary">Editar</a>
</div>
</div>
</div>

View File

@@ -48,31 +48,53 @@
<div class="card-body">
<div class="row text-center">
@if($report['type'] === 'anticipo')
<div class="col-md-4">
<div class="col-md-3">
<h6 class="text-muted">Mitad Sueldo</h6>
<h3>${{ number_format($report['biweekly_salary'], 2) }}</h3>
</div>
<div class="col-md-4">
<div class="col-md-3">
<h6 class="text-muted">Comisiones del Mes</h6>
<h3 class="text-success">+${{ number_format($report['commission_amount'], 2) }}</h3>
</div>
<div class="col-md-4">
@if(isset($report['isr_amount']) && $report['isr_amount'] > 0)
<div class="col-md-3">
<h6 class="text-muted">ISR Quincenal</h6>
<h3 class="text-danger">-${{ number_format($report['isr_amount'], 2) }}</h3>
</div>
<div class="col-md-3">
<h6 class="text-muted">Total ANTICIPO</h6>
<h2 class="text-success">${{ number_format($report['total_earning'], 2) }}</h2>
</div>
@else
<div class="col-md-3">
<h6 class="text-muted">Total ANTICIPO</h6>
<h2 class="text-success">${{ number_format($report['total_earning'], 2) }}</h2>
</div>
@endif
@else
<div class="col-md-4">
<div class="col-md-3">
<h6 class="text-muted">Mitad Sueldo</h6>
<h3>${{ number_format($report['biweekly_salary'], 2) }}</h3>
</div>
<div class="col-md-4">
<div class="col-md-3">
<h6 class="text-muted">Gastos Q{{ $biweekly }}</h6>
<h3 class="text-danger">-${{ number_format($report['expenses_q2'], 2) }}</h3>
</div>
<div class="col-md-4">
@if(isset($report['isr_amount']) && $report['isr_amount'] > 0)
<div class="col-md-3">
<h6 class="text-muted">ISR Quincenal</h6>
<h3 class="text-danger">-${{ number_format($report['isr_amount'], 2) }}</h3>
</div>
<div class="col-md-3">
<h6 class="text-muted">Total LIQUIDACIÓN</h6>
<h2 class="{{ $report['total_earning'] >= 0 ? 'text-success' : 'text-danger' }}">${{ number_format($report['total_earning'], 2) }}</h2>
</div>
@else
<div class="col-md-3">
<h6 class="text-muted">Total LIQUIDACIÓN</h6>
<h2 class="{{ $report['total_earning'] >= 0 ? 'text-success' : 'text-danger' }}">${{ number_format($report['total_earning'], 2) }}</h2>
</div>
@endif
@endif
</div>
</div>

View File

@@ -78,6 +78,12 @@
<td>Gastos del Mes</td>
<td class="text-end text-danger">-${{ number_format($report['total_expenses'], 2) }}</td>
</tr>
@if(isset($report['isr_amount']) && $report['isr_amount'] > 0)
<tr>
<td>ISR ({{ $report['isr_details']['effective_rate'] ?? 0 }}%)</td>
<td class="text-end text-danger">-${{ number_format($report['isr_amount'], 2) }}</td>
</tr>
@endif
<tr class="table-light">
<td><strong>Total a Recibir</strong></td>
<td class="text-end"><strong>${{ number_format($report['total_earning'], 2) }}</strong></td>