{#- SPDX-License-Identifier: Apache-2.0 SPDX-FileCopyrightText: 2025 - 2026 BMO Soluciones, S.A. -#} {% extends "base.html" %} {% block content %}

Nómina: {{ nomina.periodo_inicio.strftime('%d/%m/%Y') }} - {{ nomina.periodo_fin.strftime('%d/%m/%Y') }}

Volver al Historial
{% if has_errors %}
Esta Nómina Tiene Errores de Procesamiento

No se puede aprobar ni aplicar esta nómina hasta que se corrijan los siguientes errores:

Acción requerida: Corrija los datos (tipo de cambio, configuración, etc.) y recalcule la nómina. Ver log completo

{% elif has_warnings %}
Esta Nómina Tiene Advertencias

La nómina se procesó pero hay situaciones que requieren su atención:

Ver log completo

{% endif %} {% if nomina.estado == 'cancelled' %}
{{ _('Nómina Anulada') }}

{{ _('Esta nómina fue marcada como no válida y no será pagada.') }}

{% if nomina.razon_anulacion %}

{{ _('Razón:') }} {{ nomina.razon_anulacion }}

{% endif %} {% if nomina.anulado_por or nomina.anulado_en %}

{% if nomina.anulado_por %}{{ _('Anulada por') }} {{ nomina.anulado_por }}{% endif %} {% if nomina.anulado_en %} {{ _('el') }} {{ nomina.anulado_en.strftime('%d/%m/%Y %H:%M') }}{% endif %}

{% endif %}
{% endif %} {% if nomina.estado == 'calculating' %}
Calculando Nómina en Segundo Plano

La nómina está siendo calculada en segundo plano. El sistema no se ha colgado, por favor espere mientras se procesan todos los empleados.

Procesando: {{ nomina.empleado_actual or 'Iniciando...' }}
{% if nomina.total_empleados and nomina.total_empleados > 0 %} {{ (nomina.empleados_procesados / nomina.total_empleados * 100)|int }}% {% else %} 0% {% endif %} ({{ nomina.empleados_procesados or 0 }}/{{ nomina.total_empleados or 0 }})
Total Empleados

{{ nomina.total_empleados or 0 }}

Procesados

{{ nomina.empleados_procesados or 0 }}

Con Errores

{{ nomina.empleados_con_error or 0 }}

Registro de Actividad
{% if nomina.log_procesamiento %} {% for entry in nomina.log_procesamiento %}
{% if entry.status == 'error' %} {% elif entry.status == 'warning' %} {% endif %}{{ entry.message }}
{% endfor %} {% else %}
{{ _('No hay mensajes en el log de procesamiento para esta nómina.') }}
{% endif %}
Esta página se actualiza automáticamente cada 3 segundos
{% elif nomina.estado == 'error' %}
Error en el Cálculo de la Nómina

Ocurrió un error durante el cálculo de la nómina. Detalles:

{% if nomina.errores_calculo %} {% endif %}

Empleados procesados: {{ nomina.empleados_procesados or 0 }} / {{ nomina.total_empleados or 0 }}
Empleados con error: {{ nomina.empleados_con_error or 0 }}

{% if nomina.errores_calculo and nomina.errores_calculo.get('is_recoverable') == False %} Este error no es recuperable automáticamente. Revise la configuración o los datos antes de reintentar. {% endif %}
{% endif %} {% if nomina.estado == 'generated' and nomina.empleados_con_error and nomina.empleados_con_error > 0 %}
Advertencia: Algunos Empleados No Se Procesaron Correctamente

La nómina se generó exitosamente, pero {{ nomina.empleados_con_error }} empleado(s) tuvieron errores durante el cálculo.

{% if nomina.errores_calculo %}
Ver errores
{% endif %}
{% endif %}
Resumen de la Nómina
{% if nomina.estado == 'generated' %}
{% if has_errors %} {% else %} {% endif %}
{% elif nomina.estado == 'approved' %}
{% endif %} {% if nomina.estado not in ['applied', 'paid', 'cancelled', 'calculating'] %}
{% endif %} {% if nomina.estado != 'applied' %}
{% endif %} {% if nomina.estado not in ['applied', 'paid'] %} Aplicar Vacaciones {% endif %} Novedades Log de Ejecución Comparar con otra nómina {% if nomina.estado in ['generated', 'approved', 'applied'] %} {% endif %}
Planilla:
{{ planilla.nombre }}
Estado:
{% if nomina.estado == 'calculating' %} Calculando {% elif nomina.estado == 'generated' %} Generado {% elif nomina.estado == 'approved' %} Aprobado {% elif nomina.estado == 'applied' %} Aplicado {% elif nomina.estado == 'paid' %} Pagado {% elif nomina.estado == 'cancelled' %} Anulado {% elif nomina.estado == 'error' %} Error {% else %} {{ nomina.estado }} {% endif %}
Moneda:
{{ planilla.moneda.codigo if planilla.moneda else 'N/A' }}
Empleados:
{{ nomina_empleados|length }}
Generado:
{{ nomina.fecha_generacion.strftime('%d/%m/%Y %H:%M') }} {% if nomina.generado_por %}por {{ nomina.generado_por }}{% endif %}

Total Bruto

{{ planilla.moneda.simbolo if planilla.moneda else '' }} {{ "{:,.2f}".format(nomina.total_bruto|float) }}

Total Deducciones

{{ planilla.moneda.simbolo if planilla.moneda else '' }} {{ "{:,.2f}".format(nomina.total_deducciones|float) }}

Total Neto

{{ planilla.moneda.simbolo if planilla.moneda else '' }} {{ "{:,.2f}".format(nomina.total_neto|float) }}

Detalle por Empleado
{% for ne in nomina_empleados %} {% set salario_base_visual = (ne.sueldo_base_historico or 0) - (ne.inasistencia_descuento or 0) %} {% endfor %}
Empleado Cargo Salario Base Ingresos Deducciones Neto T/C Acciones
{{ ne.empleado.primer_nombre }} {{ ne.empleado.primer_apellido }} {% if ne.empleado.segundo_apellido %}{{ ne.empleado.segundo_apellido }}{% endif %} {{ ne.cargo_snapshot or ne.empleado.cargo or 'N/A' }} {{ "{:,.2f}".format(salario_base_visual|float) }} +{{ "{:,.2f}".format(ne.total_ingresos|float) }} -{{ "{:,.2f}".format(ne.total_deducciones|float) }} {{ "{:,.2f}".format(ne.salario_neto|float) }} {{ "{:.4f}".format(ne.tipo_cambio_aplicado|float) if ne.tipo_cambio_aplicado else '1.0' }}
TOTALES - {{ "{:,.2f}".format(nomina.total_bruto|float) }} {{ "{:,.2f}".format(nomina.total_deducciones|float) }} {{ "{:,.2f}".format(nomina.total_neto|float) }}
{% if nomina.estado == 'calculating' %} {% endif %} {% endblock %}