coati-payroll 0.0.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of coati-payroll might be problematic. Click here for more details.
- coati_payroll/__init__.py +415 -0
- coati_payroll/app.py +95 -0
- coati_payroll/audit_helpers.py +904 -0
- coati_payroll/auth.py +123 -0
- coati_payroll/cli.py +1318 -0
- coati_payroll/config.py +219 -0
- coati_payroll/demo_data.py +813 -0
- coati_payroll/enums.py +278 -0
- coati_payroll/forms.py +1769 -0
- coati_payroll/formula_engine/__init__.py +81 -0
- coati_payroll/formula_engine/ast/__init__.py +110 -0
- coati_payroll/formula_engine/ast/ast_visitor.py +259 -0
- coati_payroll/formula_engine/ast/expression_evaluator.py +228 -0
- coati_payroll/formula_engine/ast/safe_operators.py +131 -0
- coati_payroll/formula_engine/ast/type_converter.py +172 -0
- coati_payroll/formula_engine/data_sources.py +752 -0
- coati_payroll/formula_engine/engine.py +247 -0
- coati_payroll/formula_engine/exceptions.py +52 -0
- coati_payroll/formula_engine/execution/__init__.py +24 -0
- coati_payroll/formula_engine/execution/execution_context.py +52 -0
- coati_payroll/formula_engine/execution/step_executor.py +62 -0
- coati_payroll/formula_engine/execution/variable_store.py +59 -0
- coati_payroll/formula_engine/novelty_codes.py +206 -0
- coati_payroll/formula_engine/results/__init__.py +20 -0
- coati_payroll/formula_engine/results/execution_result.py +59 -0
- coati_payroll/formula_engine/steps/__init__.py +30 -0
- coati_payroll/formula_engine/steps/assignment_step.py +71 -0
- coati_payroll/formula_engine/steps/base_step.py +48 -0
- coati_payroll/formula_engine/steps/calculation_step.py +42 -0
- coati_payroll/formula_engine/steps/conditional_step.py +122 -0
- coati_payroll/formula_engine/steps/step_factory.py +58 -0
- coati_payroll/formula_engine/steps/tax_lookup_step.py +45 -0
- coati_payroll/formula_engine/tables/__init__.py +24 -0
- coati_payroll/formula_engine/tables/bracket_calculator.py +51 -0
- coati_payroll/formula_engine/tables/table_lookup.py +161 -0
- coati_payroll/formula_engine/tables/tax_table.py +32 -0
- coati_payroll/formula_engine/validation/__init__.py +24 -0
- coati_payroll/formula_engine/validation/schema_validator.py +37 -0
- coati_payroll/formula_engine/validation/security_validator.py +52 -0
- coati_payroll/formula_engine/validation/tax_table_validator.py +205 -0
- coati_payroll/formula_engine_examples.py +153 -0
- coati_payroll/i18n.py +54 -0
- coati_payroll/initial_data.py +613 -0
- coati_payroll/interes_engine.py +450 -0
- coati_payroll/liquidacion_engine/__init__.py +25 -0
- coati_payroll/liquidacion_engine/engine.py +267 -0
- coati_payroll/locale_config.py +165 -0
- coati_payroll/log.py +138 -0
- coati_payroll/model.py +2410 -0
- coati_payroll/nomina_engine/__init__.py +87 -0
- coati_payroll/nomina_engine/calculators/__init__.py +30 -0
- coati_payroll/nomina_engine/calculators/benefit_calculator.py +79 -0
- coati_payroll/nomina_engine/calculators/concept_calculator.py +254 -0
- coati_payroll/nomina_engine/calculators/deduction_calculator.py +105 -0
- coati_payroll/nomina_engine/calculators/exchange_rate_calculator.py +51 -0
- coati_payroll/nomina_engine/calculators/perception_calculator.py +75 -0
- coati_payroll/nomina_engine/calculators/salary_calculator.py +86 -0
- coati_payroll/nomina_engine/domain/__init__.py +27 -0
- coati_payroll/nomina_engine/domain/calculation_items.py +52 -0
- coati_payroll/nomina_engine/domain/employee_calculation.py +53 -0
- coati_payroll/nomina_engine/domain/payroll_context.py +44 -0
- coati_payroll/nomina_engine/engine.py +188 -0
- coati_payroll/nomina_engine/processors/__init__.py +28 -0
- coati_payroll/nomina_engine/processors/accounting_processor.py +171 -0
- coati_payroll/nomina_engine/processors/accumulation_processor.py +90 -0
- coati_payroll/nomina_engine/processors/loan_processor.py +227 -0
- coati_payroll/nomina_engine/processors/novelty_processor.py +42 -0
- coati_payroll/nomina_engine/processors/vacation_processor.py +67 -0
- coati_payroll/nomina_engine/repositories/__init__.py +32 -0
- coati_payroll/nomina_engine/repositories/acumulado_repository.py +83 -0
- coati_payroll/nomina_engine/repositories/base_repository.py +40 -0
- coati_payroll/nomina_engine/repositories/config_repository.py +102 -0
- coati_payroll/nomina_engine/repositories/employee_repository.py +34 -0
- coati_payroll/nomina_engine/repositories/exchange_rate_repository.py +58 -0
- coati_payroll/nomina_engine/repositories/novelty_repository.py +54 -0
- coati_payroll/nomina_engine/repositories/planilla_repository.py +52 -0
- coati_payroll/nomina_engine/results/__init__.py +24 -0
- coati_payroll/nomina_engine/results/error_result.py +28 -0
- coati_payroll/nomina_engine/results/payroll_result.py +53 -0
- coati_payroll/nomina_engine/results/validation_result.py +39 -0
- coati_payroll/nomina_engine/services/__init__.py +22 -0
- coati_payroll/nomina_engine/services/accounting_voucher_service.py +708 -0
- coati_payroll/nomina_engine/services/employee_processing_service.py +173 -0
- coati_payroll/nomina_engine/services/payroll_execution_service.py +374 -0
- coati_payroll/nomina_engine/services/snapshot_service.py +295 -0
- coati_payroll/nomina_engine/validators/__init__.py +31 -0
- coati_payroll/nomina_engine/validators/base_validator.py +48 -0
- coati_payroll/nomina_engine/validators/currency_validator.py +50 -0
- coati_payroll/nomina_engine/validators/employee_validator.py +87 -0
- coati_payroll/nomina_engine/validators/period_validator.py +44 -0
- coati_payroll/nomina_engine/validators/planilla_validator.py +136 -0
- coati_payroll/plugin_manager.py +176 -0
- coati_payroll/queue/__init__.py +33 -0
- coati_payroll/queue/driver.py +127 -0
- coati_payroll/queue/drivers/__init__.py +22 -0
- coati_payroll/queue/drivers/dramatiq_driver.py +268 -0
- coati_payroll/queue/drivers/huey_driver.py +390 -0
- coati_payroll/queue/drivers/noop_driver.py +54 -0
- coati_payroll/queue/selector.py +121 -0
- coati_payroll/queue/tasks.py +764 -0
- coati_payroll/rate_limiting.py +83 -0
- coati_payroll/rbac.py +183 -0
- coati_payroll/report_engine.py +512 -0
- coati_payroll/report_export.py +208 -0
- coati_payroll/schema_validator.py +167 -0
- coati_payroll/security.py +77 -0
- coati_payroll/static/styles.css +1044 -0
- coati_payroll/system_reports.py +573 -0
- coati_payroll/templates/auth/login.html +189 -0
- coati_payroll/templates/base.html +283 -0
- coati_payroll/templates/index.html +227 -0
- coati_payroll/templates/macros.html +146 -0
- coati_payroll/templates/modules/calculation_rule/form.html +78 -0
- coati_payroll/templates/modules/calculation_rule/index.html +102 -0
- coati_payroll/templates/modules/calculation_rule/schema_editor.html +1159 -0
- coati_payroll/templates/modules/carga_inicial_prestacion/form.html +170 -0
- coati_payroll/templates/modules/carga_inicial_prestacion/index.html +170 -0
- coati_payroll/templates/modules/carga_inicial_prestacion/reporte.html +193 -0
- coati_payroll/templates/modules/config_calculos/index.html +44 -0
- coati_payroll/templates/modules/configuracion/index.html +90 -0
- coati_payroll/templates/modules/currency/form.html +47 -0
- coati_payroll/templates/modules/currency/index.html +64 -0
- coati_payroll/templates/modules/custom_field/form.html +62 -0
- coati_payroll/templates/modules/custom_field/index.html +78 -0
- coati_payroll/templates/modules/deduccion/form.html +1 -0
- coati_payroll/templates/modules/deduccion/index.html +1 -0
- coati_payroll/templates/modules/employee/form.html +254 -0
- coati_payroll/templates/modules/employee/index.html +76 -0
- coati_payroll/templates/modules/empresa/form.html +74 -0
- coati_payroll/templates/modules/empresa/index.html +71 -0
- coati_payroll/templates/modules/exchange_rate/form.html +47 -0
- coati_payroll/templates/modules/exchange_rate/import.html +93 -0
- coati_payroll/templates/modules/exchange_rate/index.html +114 -0
- coati_payroll/templates/modules/liquidacion/index.html +58 -0
- coati_payroll/templates/modules/liquidacion/nueva.html +51 -0
- coati_payroll/templates/modules/liquidacion/ver.html +91 -0
- coati_payroll/templates/modules/payroll_concepts/audit_log.html +146 -0
- coati_payroll/templates/modules/percepcion/form.html +1 -0
- coati_payroll/templates/modules/percepcion/index.html +1 -0
- coati_payroll/templates/modules/planilla/config.html +190 -0
- coati_payroll/templates/modules/planilla/config_deducciones.html +129 -0
- coati_payroll/templates/modules/planilla/config_empleados.html +116 -0
- coati_payroll/templates/modules/planilla/config_percepciones.html +113 -0
- coati_payroll/templates/modules/planilla/config_prestaciones.html +118 -0
- coati_payroll/templates/modules/planilla/config_reglas.html +120 -0
- coati_payroll/templates/modules/planilla/ejecutar_nomina.html +106 -0
- coati_payroll/templates/modules/planilla/form.html +197 -0
- coati_payroll/templates/modules/planilla/index.html +144 -0
- coati_payroll/templates/modules/planilla/listar_nominas.html +91 -0
- coati_payroll/templates/modules/planilla/log_nomina.html +135 -0
- coati_payroll/templates/modules/planilla/novedades/form.html +177 -0
- coati_payroll/templates/modules/planilla/novedades/index.html +170 -0
- coati_payroll/templates/modules/planilla/ver_nomina.html +477 -0
- coati_payroll/templates/modules/planilla/ver_nomina_empleado.html +231 -0
- coati_payroll/templates/modules/plugins/index.html +71 -0
- coati_payroll/templates/modules/prestacion/form.html +1 -0
- coati_payroll/templates/modules/prestacion/index.html +1 -0
- coati_payroll/templates/modules/prestacion_management/dashboard.html +150 -0
- coati_payroll/templates/modules/prestacion_management/initial_balance_bulk.html +195 -0
- coati_payroll/templates/modules/prestamo/approve.html +156 -0
- coati_payroll/templates/modules/prestamo/condonacion.html +249 -0
- coati_payroll/templates/modules/prestamo/detail.html +443 -0
- coati_payroll/templates/modules/prestamo/form.html +203 -0
- coati_payroll/templates/modules/prestamo/index.html +150 -0
- coati_payroll/templates/modules/prestamo/pago_extraordinario.html +211 -0
- coati_payroll/templates/modules/prestamo/tabla_pago_pdf.html +181 -0
- coati_payroll/templates/modules/report/admin_index.html +125 -0
- coati_payroll/templates/modules/report/detail.html +129 -0
- coati_payroll/templates/modules/report/execute.html +266 -0
- coati_payroll/templates/modules/report/index.html +95 -0
- coati_payroll/templates/modules/report/permissions.html +64 -0
- coati_payroll/templates/modules/settings/index.html +274 -0
- coati_payroll/templates/modules/shared/concept_form.html +201 -0
- coati_payroll/templates/modules/shared/concept_index.html +145 -0
- coati_payroll/templates/modules/tipo_planilla/form.html +70 -0
- coati_payroll/templates/modules/tipo_planilla/index.html +68 -0
- coati_payroll/templates/modules/user/form.html +65 -0
- coati_payroll/templates/modules/user/index.html +76 -0
- coati_payroll/templates/modules/user/profile.html +81 -0
- coati_payroll/templates/modules/vacation/account_detail.html +149 -0
- coati_payroll/templates/modules/vacation/account_form.html +52 -0
- coati_payroll/templates/modules/vacation/account_index.html +68 -0
- coati_payroll/templates/modules/vacation/dashboard.html +156 -0
- coati_payroll/templates/modules/vacation/initial_balance_bulk.html +149 -0
- coati_payroll/templates/modules/vacation/initial_balance_form.html +93 -0
- coati_payroll/templates/modules/vacation/leave_request_detail.html +158 -0
- coati_payroll/templates/modules/vacation/leave_request_form.html +61 -0
- coati_payroll/templates/modules/vacation/leave_request_index.html +98 -0
- coati_payroll/templates/modules/vacation/policy_detail.html +176 -0
- coati_payroll/templates/modules/vacation/policy_form.html +152 -0
- coati_payroll/templates/modules/vacation/policy_index.html +79 -0
- coati_payroll/templates/modules/vacation/register_taken_form.html +178 -0
- coati_payroll/translations/en/LC_MESSAGES/messages.mo +0 -0
- coati_payroll/translations/en/LC_MESSAGES/messages.po +7283 -0
- coati_payroll/translations/es/LC_MESSAGES/messages.mo +0 -0
- coati_payroll/translations/es/LC_MESSAGES/messages.po +7374 -0
- coati_payroll/vacation_service.py +451 -0
- coati_payroll/version.py +18 -0
- coati_payroll/vistas/__init__.py +64 -0
- coati_payroll/vistas/calculation_rule.py +307 -0
- coati_payroll/vistas/carga_inicial_prestacion.py +423 -0
- coati_payroll/vistas/config_calculos.py +72 -0
- coati_payroll/vistas/configuracion.py +87 -0
- coati_payroll/vistas/constants.py +17 -0
- coati_payroll/vistas/currency.py +112 -0
- coati_payroll/vistas/custom_field.py +120 -0
- coati_payroll/vistas/employee.py +305 -0
- coati_payroll/vistas/empresa.py +153 -0
- coati_payroll/vistas/exchange_rate.py +341 -0
- coati_payroll/vistas/liquidacion.py +205 -0
- coati_payroll/vistas/payroll_concepts.py +580 -0
- coati_payroll/vistas/planilla/__init__.py +38 -0
- coati_payroll/vistas/planilla/association_routes.py +238 -0
- coati_payroll/vistas/planilla/config_routes.py +158 -0
- coati_payroll/vistas/planilla/export_routes.py +175 -0
- coati_payroll/vistas/planilla/helpers/__init__.py +34 -0
- coati_payroll/vistas/planilla/helpers/association_helpers.py +161 -0
- coati_payroll/vistas/planilla/helpers/excel_helpers.py +29 -0
- coati_payroll/vistas/planilla/helpers/form_helpers.py +97 -0
- coati_payroll/vistas/planilla/nomina_routes.py +488 -0
- coati_payroll/vistas/planilla/novedad_routes.py +227 -0
- coati_payroll/vistas/planilla/routes.py +145 -0
- coati_payroll/vistas/planilla/services/__init__.py +26 -0
- coati_payroll/vistas/planilla/services/export_service.py +687 -0
- coati_payroll/vistas/planilla/services/nomina_service.py +233 -0
- coati_payroll/vistas/planilla/services/novedad_service.py +126 -0
- coati_payroll/vistas/planilla/services/planilla_service.py +34 -0
- coati_payroll/vistas/planilla/validators/__init__.py +18 -0
- coati_payroll/vistas/planilla/validators/planilla_validators.py +40 -0
- coati_payroll/vistas/plugins.py +45 -0
- coati_payroll/vistas/prestacion.py +272 -0
- coati_payroll/vistas/prestamo.py +808 -0
- coati_payroll/vistas/report.py +432 -0
- coati_payroll/vistas/settings.py +29 -0
- coati_payroll/vistas/tipo_planilla.py +134 -0
- coati_payroll/vistas/user.py +172 -0
- coati_payroll/vistas/vacation.py +1045 -0
- coati_payroll-0.0.2.dist-info/LICENSE +201 -0
- coati_payroll-0.0.2.dist-info/METADATA +581 -0
- coati_payroll-0.0.2.dist-info/RECORD +243 -0
- coati_payroll-0.0.2.dist-info/WHEEL +5 -0
- coati_payroll-0.0.2.dist-info/entry_points.txt +2 -0
- coati_payroll-0.0.2.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
{% extends "base.html" %}
|
|
2
|
+
|
|
3
|
+
{% block content %}
|
|
4
|
+
<div class="container-fluid">
|
|
5
|
+
<div class="row mb-4">
|
|
6
|
+
<div class="col">
|
|
7
|
+
<h2><i class="bi bi-upload me-2"></i>
|
|
8
|
+
{% if carga %}
|
|
9
|
+
{{ _('Editar Carga Inicial') }}
|
|
10
|
+
{% else %}
|
|
11
|
+
{{ _('Nueva Carga Inicial') }}
|
|
12
|
+
{% endif %}
|
|
13
|
+
</h2>
|
|
14
|
+
<p class="text-muted">{{ _('Complete la información del saldo inicial acumulado') }}</p>
|
|
15
|
+
</div>
|
|
16
|
+
</div>
|
|
17
|
+
|
|
18
|
+
<!-- Flash messages -->
|
|
19
|
+
{% with messages = get_flashed_messages(with_categories=true) %}
|
|
20
|
+
{% if messages %}
|
|
21
|
+
{% for category, message in messages %}
|
|
22
|
+
<div class="alert alert-{{ category }} alert-dismissible fade show" role="alert">
|
|
23
|
+
{{ message }}
|
|
24
|
+
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
|
|
25
|
+
</div>
|
|
26
|
+
{% endfor %}
|
|
27
|
+
{% endif %}
|
|
28
|
+
{% endwith %}
|
|
29
|
+
|
|
30
|
+
<div class="card">
|
|
31
|
+
<div class="card-body">
|
|
32
|
+
<form method="POST" novalidate>
|
|
33
|
+
{{ form.hidden_tag() }}
|
|
34
|
+
|
|
35
|
+
<div class="row">
|
|
36
|
+
<div class="col-md-6 mb-3">
|
|
37
|
+
{{ form.empleado_id.label(class="form-label") }}
|
|
38
|
+
{{ form.empleado_id(class="form-select" + (" is-invalid" if form.empleado_id.errors else "")) }}
|
|
39
|
+
{% if form.empleado_id.errors %}
|
|
40
|
+
<div class="invalid-feedback">
|
|
41
|
+
{% for error in form.empleado_id.errors %}{{ error }}{% endfor %}
|
|
42
|
+
</div>
|
|
43
|
+
{% endif %}
|
|
44
|
+
{% if form.empleado_id.description %}
|
|
45
|
+
<div class="form-text">{{ form.empleado_id.description }}</div>
|
|
46
|
+
{% endif %}
|
|
47
|
+
</div>
|
|
48
|
+
|
|
49
|
+
<div class="col-md-6 mb-3">
|
|
50
|
+
{{ form.prestacion_id.label(class="form-label") }}
|
|
51
|
+
{{ form.prestacion_id(class="form-select" + (" is-invalid" if form.prestacion_id.errors else "")) }}
|
|
52
|
+
{% if form.prestacion_id.errors %}
|
|
53
|
+
<div class="invalid-feedback">
|
|
54
|
+
{% for error in form.prestacion_id.errors %}{{ error }}{% endfor %}
|
|
55
|
+
</div>
|
|
56
|
+
{% endif %}
|
|
57
|
+
{% if form.prestacion_id.description %}
|
|
58
|
+
<div class="form-text">{{ form.prestacion_id.description }}</div>
|
|
59
|
+
{% endif %}
|
|
60
|
+
</div>
|
|
61
|
+
</div>
|
|
62
|
+
|
|
63
|
+
<div class="row">
|
|
64
|
+
<div class="col-md-6 mb-3">
|
|
65
|
+
{{ form.anio_corte.label(class="form-label") }}
|
|
66
|
+
{{ form.anio_corte(class="form-control" + (" is-invalid" if form.anio_corte.errors else "")) }}
|
|
67
|
+
{% if form.anio_corte.errors %}
|
|
68
|
+
<div class="invalid-feedback">
|
|
69
|
+
{% for error in form.anio_corte.errors %}{{ error }}{% endfor %}
|
|
70
|
+
</div>
|
|
71
|
+
{% endif %}
|
|
72
|
+
{% if form.anio_corte.description %}
|
|
73
|
+
<div class="form-text">{{ form.anio_corte.description }}</div>
|
|
74
|
+
{% endif %}
|
|
75
|
+
</div>
|
|
76
|
+
|
|
77
|
+
<div class="col-md-6 mb-3">
|
|
78
|
+
{{ form.mes_corte.label(class="form-label") }}
|
|
79
|
+
{{ form.mes_corte(class="form-select" + (" is-invalid" if form.mes_corte.errors else "")) }}
|
|
80
|
+
{% if form.mes_corte.errors %}
|
|
81
|
+
<div class="invalid-feedback">
|
|
82
|
+
{% for error in form.mes_corte.errors %}{{ error }}{% endfor %}
|
|
83
|
+
</div>
|
|
84
|
+
{% endif %}
|
|
85
|
+
{% if form.mes_corte.description %}
|
|
86
|
+
<div class="form-text">{{ form.mes_corte.description }}</div>
|
|
87
|
+
{% endif %}
|
|
88
|
+
</div>
|
|
89
|
+
</div>
|
|
90
|
+
|
|
91
|
+
<div class="row">
|
|
92
|
+
<div class="col-md-4 mb-3">
|
|
93
|
+
{{ form.moneda_id.label(class="form-label") }}
|
|
94
|
+
{{ form.moneda_id(class="form-select" + (" is-invalid" if form.moneda_id.errors else "")) }}
|
|
95
|
+
{% if form.moneda_id.errors %}
|
|
96
|
+
<div class="invalid-feedback">
|
|
97
|
+
{% for error in form.moneda_id.errors %}{{ error }}{% endfor %}
|
|
98
|
+
</div>
|
|
99
|
+
{% endif %}
|
|
100
|
+
{% if form.moneda_id.description %}
|
|
101
|
+
<div class="form-text">{{ form.moneda_id.description }}</div>
|
|
102
|
+
{% endif %}
|
|
103
|
+
</div>
|
|
104
|
+
|
|
105
|
+
<div class="col-md-4 mb-3">
|
|
106
|
+
{{ form.saldo_acumulado.label(class="form-label") }}
|
|
107
|
+
{{ form.saldo_acumulado(class="form-control" + (" is-invalid" if form.saldo_acumulado.errors else "")) }}
|
|
108
|
+
{% if form.saldo_acumulado.errors %}
|
|
109
|
+
<div class="invalid-feedback">
|
|
110
|
+
{% for error in form.saldo_acumulado.errors %}{{ error }}{% endfor %}
|
|
111
|
+
</div>
|
|
112
|
+
{% endif %}
|
|
113
|
+
{% if form.saldo_acumulado.description %}
|
|
114
|
+
<div class="form-text">{{ form.saldo_acumulado.description }}</div>
|
|
115
|
+
{% endif %}
|
|
116
|
+
</div>
|
|
117
|
+
|
|
118
|
+
<div class="col-md-4 mb-3">
|
|
119
|
+
{{ form.tipo_cambio.label(class="form-label") }}
|
|
120
|
+
{{ form.tipo_cambio(class="form-control" + (" is-invalid" if form.tipo_cambio.errors else "")) }}
|
|
121
|
+
{% if form.tipo_cambio.errors %}
|
|
122
|
+
<div class="invalid-feedback">
|
|
123
|
+
{% for error in form.tipo_cambio.errors %}{{ error }}{% endfor %}
|
|
124
|
+
</div>
|
|
125
|
+
{% endif %}
|
|
126
|
+
{% if form.tipo_cambio.description %}
|
|
127
|
+
<div class="form-text">{{ form.tipo_cambio.description }}</div>
|
|
128
|
+
{% endif %}
|
|
129
|
+
</div>
|
|
130
|
+
</div>
|
|
131
|
+
|
|
132
|
+
<div class="row">
|
|
133
|
+
<div class="col-md-6 mb-3">
|
|
134
|
+
{{ form.saldo_convertido.label(class="form-label") }}
|
|
135
|
+
{{ form.saldo_convertido(class="form-control" + (" is-invalid" if form.saldo_convertido.errors else "")) }}
|
|
136
|
+
{% if form.saldo_convertido.errors %}
|
|
137
|
+
<div class="invalid-feedback">
|
|
138
|
+
{% for error in form.saldo_convertido.errors %}{{ error }}{% endfor %}
|
|
139
|
+
</div>
|
|
140
|
+
{% endif %}
|
|
141
|
+
{% if form.saldo_convertido.description %}
|
|
142
|
+
<div class="form-text">{{ form.saldo_convertido.description }}</div>
|
|
143
|
+
{% endif %}
|
|
144
|
+
</div>
|
|
145
|
+
|
|
146
|
+
<div class="col-md-6 mb-3">
|
|
147
|
+
{{ form.observaciones.label(class="form-label") }}
|
|
148
|
+
{{ form.observaciones(class="form-control" + (" is-invalid" if form.observaciones.errors else "")) }}
|
|
149
|
+
{% if form.observaciones.errors %}
|
|
150
|
+
<div class="invalid-feedback">
|
|
151
|
+
{% for error in form.observaciones.errors %}{{ error }}{% endfor %}
|
|
152
|
+
</div>
|
|
153
|
+
{% endif %}
|
|
154
|
+
{% if form.observaciones.description %}
|
|
155
|
+
<div class="form-text">{{ form.observaciones.description }}</div>
|
|
156
|
+
{% endif %}
|
|
157
|
+
</div>
|
|
158
|
+
</div>
|
|
159
|
+
|
|
160
|
+
<div class="d-flex gap-2">
|
|
161
|
+
{{ form.submit(class="btn btn-primary") }}
|
|
162
|
+
<a href="{{ url_for('carga_inicial_prestacion.index') }}" class="btn btn-secondary">
|
|
163
|
+
<i class="bi bi-x-circle me-1"></i>{{ _('Cancelar') }}
|
|
164
|
+
</a>
|
|
165
|
+
</div>
|
|
166
|
+
</form>
|
|
167
|
+
</div>
|
|
168
|
+
</div>
|
|
169
|
+
</div>
|
|
170
|
+
{% endblock %}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
{% extends "base.html" %}
|
|
2
|
+
|
|
3
|
+
{% block content %}
|
|
4
|
+
<div class="container-fluid">
|
|
5
|
+
<div class="row mb-4">
|
|
6
|
+
<div class="col">
|
|
7
|
+
<h2><i class="bi bi-upload me-2"></i>{{ _('Carga Inicial de Prestaciones') }}</h2>
|
|
8
|
+
<p class="text-muted">{{ _('Gestione las cargas iniciales de saldos acumulados de prestaciones laborales') }}</p>
|
|
9
|
+
</div>
|
|
10
|
+
<div class="col-auto">
|
|
11
|
+
<a href="{{ url_for('carga_inicial_prestacion.nueva') }}" class="btn btn-primary">
|
|
12
|
+
<i class="bi bi-plus-circle me-1"></i>{{ _('Nueva Carga Inicial') }}
|
|
13
|
+
</a>
|
|
14
|
+
<a href="{{ url_for('carga_inicial_prestacion.reporte') }}" class="btn btn-info">
|
|
15
|
+
<i class="bi bi-file-earmark-bar-graph me-1"></i>{{ _('Reporte de Acumulados') }}
|
|
16
|
+
</a>
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
19
|
+
|
|
20
|
+
<!-- Flash messages -->
|
|
21
|
+
{% with messages = get_flashed_messages(with_categories=true) %}
|
|
22
|
+
{% if messages %}
|
|
23
|
+
{% for category, message in messages %}
|
|
24
|
+
<div class="alert alert-{{ category }} alert-dismissible fade show" role="alert">
|
|
25
|
+
{{ message }}
|
|
26
|
+
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
|
|
27
|
+
</div>
|
|
28
|
+
{% endfor %}
|
|
29
|
+
{% endif %}
|
|
30
|
+
{% endwith %}
|
|
31
|
+
|
|
32
|
+
<!-- Filters -->
|
|
33
|
+
<div class="card mb-3">
|
|
34
|
+
<div class="card-body">
|
|
35
|
+
<form method="GET" action="{{ url_for('carga_inicial_prestacion.index') }}" class="row g-3">
|
|
36
|
+
<div class="col-md-4">
|
|
37
|
+
<label for="estado" class="form-label">{{ _('Estado') }}</label>
|
|
38
|
+
<select class="form-select" id="estado" name="estado">
|
|
39
|
+
<option value="">{{ _('-- Todos --') }}</option>
|
|
40
|
+
<option value="borrador" {% if estado_filter == 'borrador' %}selected{% endif %}>{{ _('Borrador') }}</option>
|
|
41
|
+
<option value="aplicado" {% if estado_filter == 'aplicado' %}selected{% endif %}>{{ _('Aplicado') }}</option>
|
|
42
|
+
</select>
|
|
43
|
+
</div>
|
|
44
|
+
<div class="col-md-4 d-flex align-items-end">
|
|
45
|
+
<button type="submit" class="btn btn-primary me-2">
|
|
46
|
+
<i class="bi bi-search me-1"></i>{{ _('Filtrar') }}
|
|
47
|
+
</button>
|
|
48
|
+
<a href="{{ url_for('carga_inicial_prestacion.index') }}" class="btn btn-secondary">
|
|
49
|
+
<i class="bi bi-x-circle me-1"></i>{{ _('Limpiar') }}
|
|
50
|
+
</a>
|
|
51
|
+
</div>
|
|
52
|
+
</form>
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
|
|
56
|
+
<!-- List -->
|
|
57
|
+
<div class="card">
|
|
58
|
+
<div class="card-body">
|
|
59
|
+
{% if cargas %}
|
|
60
|
+
<div class="table-responsive">
|
|
61
|
+
<table class="table table-striped table-hover">
|
|
62
|
+
<thead>
|
|
63
|
+
<tr>
|
|
64
|
+
<th>{{ _('Empleado') }}</th>
|
|
65
|
+
<th>{{ _('Prestación') }}</th>
|
|
66
|
+
<th>{{ _('Periodo Corte') }}</th>
|
|
67
|
+
<th>{{ _('Moneda') }}</th>
|
|
68
|
+
<th>{{ _('Saldo Acumulado') }}</th>
|
|
69
|
+
<th>{{ _('Saldo Convertido') }}</th>
|
|
70
|
+
<th>{{ _('Estado') }}</th>
|
|
71
|
+
<th>{{ _('Acciones') }}</th>
|
|
72
|
+
</tr>
|
|
73
|
+
</thead>
|
|
74
|
+
<tbody>
|
|
75
|
+
{% for carga in cargas %}
|
|
76
|
+
<tr>
|
|
77
|
+
<td>{{ carga.empleado.codigo_empleado }} - {{ carga.empleado.primer_nombre }} {{ carga.empleado.primer_apellido }}</td>
|
|
78
|
+
<td>{{ carga.prestacion.codigo }} - {{ carga.prestacion.nombre }}</td>
|
|
79
|
+
<td>{{ carga.mes_corte }}/{{ carga.anio_corte }}</td>
|
|
80
|
+
<td>{{ carga.moneda.codigo }}</td>
|
|
81
|
+
<td class="text-end">{{ "%.2f"|format(carga.saldo_acumulado) }}</td>
|
|
82
|
+
<td class="text-end">{{ "%.2f"|format(carga.saldo_convertido) }}</td>
|
|
83
|
+
<td>
|
|
84
|
+
{% if carga.estado == 'borrador' %}
|
|
85
|
+
<span class="badge bg-warning">{{ _('Borrador') }}</span>
|
|
86
|
+
{% elif carga.estado == 'aplicado' %}
|
|
87
|
+
<span class="badge bg-success">{{ _('Aplicado') }}</span>
|
|
88
|
+
{% endif %}
|
|
89
|
+
</td>
|
|
90
|
+
<td>
|
|
91
|
+
<div class="btn-group" role="group">
|
|
92
|
+
{% if carga.estado == 'borrador' %}
|
|
93
|
+
<a href="{{ url_for('carga_inicial_prestacion.editar', carga_id=carga.id) }}"
|
|
94
|
+
class="btn btn-sm btn-outline-primary" title="{{ _('Editar') }}">
|
|
95
|
+
<i class="bi bi-pencil"></i>
|
|
96
|
+
</a>
|
|
97
|
+
<form method="POST" action="{{ url_for('carga_inicial_prestacion.aplicar', carga_id=carga.id) }}"
|
|
98
|
+
style="display: inline;" onsubmit="return confirm('{{ _('¿Está seguro de aplicar esta carga inicial?') }}');">
|
|
99
|
+
<button type="submit" class="btn btn-sm btn-outline-success" title="{{ _('Aplicar') }}">
|
|
100
|
+
<i class="bi bi-check-circle"></i>
|
|
101
|
+
</button>
|
|
102
|
+
</form>
|
|
103
|
+
<form method="POST" action="{{ url_for('carga_inicial_prestacion.eliminar', carga_id=carga.id) }}"
|
|
104
|
+
style="display: inline;" onsubmit="return confirm('{{ _('¿Está seguro de eliminar esta carga inicial?') }}');">
|
|
105
|
+
<button type="submit" class="btn btn-sm btn-outline-danger" title="{{ _('Eliminar') }}">
|
|
106
|
+
<i class="bi bi-trash"></i>
|
|
107
|
+
</button>
|
|
108
|
+
</form>
|
|
109
|
+
{% else %}
|
|
110
|
+
<span class="text-muted small">{{ _('Aplicado el') }} {{ carga.fecha_aplicacion.strftime('%Y-%m-%d') }}</span>
|
|
111
|
+
{% endif %}
|
|
112
|
+
</div>
|
|
113
|
+
</td>
|
|
114
|
+
</tr>
|
|
115
|
+
{% endfor %}
|
|
116
|
+
</tbody>
|
|
117
|
+
</table>
|
|
118
|
+
</div>
|
|
119
|
+
|
|
120
|
+
<!-- Pagination -->
|
|
121
|
+
{% if pagination.pages > 1 %}
|
|
122
|
+
<nav aria-label="{{ _('Navegación de páginas') }}">
|
|
123
|
+
<ul class="pagination justify-content-center">
|
|
124
|
+
{% if pagination.has_prev %}
|
|
125
|
+
<li class="page-item">
|
|
126
|
+
<a class="page-link" href="{{ url_for('carga_inicial_prestacion.index', page=pagination.prev_num, estado=estado_filter) }}">
|
|
127
|
+
{{ _('Anterior') }}
|
|
128
|
+
</a>
|
|
129
|
+
</li>
|
|
130
|
+
{% else %}
|
|
131
|
+
<li class="page-item disabled">
|
|
132
|
+
<span class="page-link">{{ _('Anterior') }}</span>
|
|
133
|
+
</li>
|
|
134
|
+
{% endif %}
|
|
135
|
+
|
|
136
|
+
{% for page_num in pagination.iter_pages() %}
|
|
137
|
+
{% if page_num %}
|
|
138
|
+
<li class="page-item {% if page_num == pagination.page %}active{% endif %}">
|
|
139
|
+
<a class="page-link" href="{{ url_for('carga_inicial_prestacion.index', page=page_num, estado=estado_filter) }}">
|
|
140
|
+
{{ page_num }}
|
|
141
|
+
</a>
|
|
142
|
+
</li>
|
|
143
|
+
{% else %}
|
|
144
|
+
<li class="page-item disabled"><span class="page-link">...</span></li>
|
|
145
|
+
{% endif %}
|
|
146
|
+
{% endfor %}
|
|
147
|
+
|
|
148
|
+
{% if pagination.has_next %}
|
|
149
|
+
<li class="page-item">
|
|
150
|
+
<a class="page-link" href="{{ url_for('carga_inicial_prestacion.index', page=pagination.next_num, estado=estado_filter) }}">
|
|
151
|
+
{{ _('Siguiente') }}
|
|
152
|
+
</a>
|
|
153
|
+
</li>
|
|
154
|
+
{% else %}
|
|
155
|
+
<li class="page-item disabled">
|
|
156
|
+
<span class="page-link">{{ _('Siguiente') }}</span>
|
|
157
|
+
</li>
|
|
158
|
+
{% endif %}
|
|
159
|
+
</ul>
|
|
160
|
+
</nav>
|
|
161
|
+
{% endif %}
|
|
162
|
+
{% else %}
|
|
163
|
+
<div class="alert alert-info">
|
|
164
|
+
<i class="bi bi-info-circle me-2"></i>{{ _('No hay cargas iniciales registradas.') }}
|
|
165
|
+
</div>
|
|
166
|
+
{% endif %}
|
|
167
|
+
</div>
|
|
168
|
+
</div>
|
|
169
|
+
</div>
|
|
170
|
+
{% endblock %}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
{% extends "base.html" %}
|
|
2
|
+
|
|
3
|
+
{% block content %}
|
|
4
|
+
<div class="container-fluid">
|
|
5
|
+
<div class="row mb-4">
|
|
6
|
+
<div class="col">
|
|
7
|
+
<h2><i class="bi bi-file-earmark-bar-graph me-2"></i>{{ _('Reporte de Prestaciones Acumuladas') }}</h2>
|
|
8
|
+
<p class="text-muted">{{ _('Consulte el historial transaccional de prestaciones acumuladas por empleado') }}</p>
|
|
9
|
+
</div>
|
|
10
|
+
<div class="col-auto">
|
|
11
|
+
<a href="{{ url_for('carga_inicial_prestacion.index') }}" class="btn btn-secondary">
|
|
12
|
+
<i class="bi bi-arrow-left me-1"></i>{{ _('Volver') }}
|
|
13
|
+
</a>
|
|
14
|
+
<a href="{{ url_for('carga_inicial_prestacion.reporte_excel', empleado_id=empleado_id, prestacion_id=prestacion_id, fecha_desde=fecha_desde, fecha_hasta=fecha_hasta) }}"
|
|
15
|
+
class="btn btn-success">
|
|
16
|
+
<i class="bi bi-file-earmark-excel me-1"></i>{{ _('Exportar a Excel') }}
|
|
17
|
+
</a>
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
|
|
21
|
+
<!-- Flash messages -->
|
|
22
|
+
{% with messages = get_flashed_messages(with_categories=true) %}
|
|
23
|
+
{% if messages %}
|
|
24
|
+
{% for category, message in messages %}
|
|
25
|
+
<div class="alert alert-{{ category }} alert-dismissible fade show" role="alert">
|
|
26
|
+
{{ message }}
|
|
27
|
+
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
|
|
28
|
+
</div>
|
|
29
|
+
{% endfor %}
|
|
30
|
+
{% endif %}
|
|
31
|
+
{% endwith %}
|
|
32
|
+
|
|
33
|
+
<!-- Filters -->
|
|
34
|
+
<div class="card mb-3">
|
|
35
|
+
<div class="card-header">
|
|
36
|
+
<h5 class="mb-0"><i class="bi bi-funnel me-2"></i>{{ _('Filtros de Auditoría') }}</h5>
|
|
37
|
+
</div>
|
|
38
|
+
<div class="card-body">
|
|
39
|
+
<form method="GET" action="{{ url_for('carga_inicial_prestacion.reporte') }}" class="row g-3">
|
|
40
|
+
<div class="col-md-3">
|
|
41
|
+
<label for="empleado_id" class="form-label">{{ _('Empleado') }}</label>
|
|
42
|
+
<select class="form-select" id="empleado_id" name="empleado_id">
|
|
43
|
+
<option value="">{{ _('-- Todos --') }}</option>
|
|
44
|
+
{% for emp in empleados %}
|
|
45
|
+
<option value="{{ emp.id }}" {% if empleado_id == emp.id %}selected{% endif %}>
|
|
46
|
+
{{ emp.codigo_empleado }} - {{ emp.primer_nombre }} {{ emp.primer_apellido }}
|
|
47
|
+
</option>
|
|
48
|
+
{% endfor %}
|
|
49
|
+
</select>
|
|
50
|
+
</div>
|
|
51
|
+
<div class="col-md-3">
|
|
52
|
+
<label for="prestacion_id" class="form-label">{{ _('Prestación') }}</label>
|
|
53
|
+
<select class="form-select" id="prestacion_id" name="prestacion_id">
|
|
54
|
+
<option value="">{{ _('-- Todas --') }}</option>
|
|
55
|
+
{% for prest in prestaciones %}
|
|
56
|
+
<option value="{{ prest.id }}" {% if prestacion_id == prest.id %}selected{% endif %}>
|
|
57
|
+
{{ prest.codigo }} - {{ prest.nombre }}
|
|
58
|
+
</option>
|
|
59
|
+
{% endfor %}
|
|
60
|
+
</select>
|
|
61
|
+
</div>
|
|
62
|
+
<div class="col-md-2">
|
|
63
|
+
<label for="fecha_desde" class="form-label">{{ _('Desde') }}</label>
|
|
64
|
+
<input type="date" class="form-control" id="fecha_desde" name="fecha_desde" value="{{ fecha_desde or '' }}">
|
|
65
|
+
</div>
|
|
66
|
+
<div class="col-md-2">
|
|
67
|
+
<label for="fecha_hasta" class="form-label">{{ _('Hasta') }}</label>
|
|
68
|
+
<input type="date" class="form-control" id="fecha_hasta" name="fecha_hasta" value="{{ fecha_hasta or '' }}">
|
|
69
|
+
</div>
|
|
70
|
+
<div class="col-md-2 d-flex align-items-end">
|
|
71
|
+
<button type="submit" class="btn btn-primary me-2">
|
|
72
|
+
<i class="bi bi-search me-1"></i>{{ _('Buscar') }}
|
|
73
|
+
</button>
|
|
74
|
+
<a href="{{ url_for('carga_inicial_prestacion.reporte') }}" class="btn btn-secondary">
|
|
75
|
+
<i class="bi bi-x-circle me-1"></i>{{ _('Limpiar') }}
|
|
76
|
+
</a>
|
|
77
|
+
</div>
|
|
78
|
+
</form>
|
|
79
|
+
</div>
|
|
80
|
+
</div>
|
|
81
|
+
|
|
82
|
+
<!-- Audit Report -->
|
|
83
|
+
<div class="card">
|
|
84
|
+
<div class="card-header">
|
|
85
|
+
<h5 class="mb-0"><i class="bi bi-table me-2"></i>{{ _('Historial Transaccional - Auditoría') }}</h5>
|
|
86
|
+
</div>
|
|
87
|
+
<div class="card-body">
|
|
88
|
+
{% if transacciones %}
|
|
89
|
+
<div class="alert alert-info">
|
|
90
|
+
<i class="bi bi-info-circle me-2"></i>
|
|
91
|
+
{{ _('Total de transacciones: %(count)s', count=transacciones|length) }}
|
|
92
|
+
</div>
|
|
93
|
+
<div class="table-responsive">
|
|
94
|
+
<table class="table table-striped table-hover table-sm">
|
|
95
|
+
<thead class="table-dark">
|
|
96
|
+
<tr>
|
|
97
|
+
<th>{{ _('ID Transacción') }}</th>
|
|
98
|
+
<th>{{ _('Fecha') }}</th>
|
|
99
|
+
<th>{{ _('Empleado') }}</th>
|
|
100
|
+
<th>{{ _('Prestación') }}</th>
|
|
101
|
+
<th>{{ _('Tipo') }}</th>
|
|
102
|
+
<th>{{ _('Periodo') }}</th>
|
|
103
|
+
<th class="text-end">{{ _('Monto') }}</th>
|
|
104
|
+
<th class="text-end">{{ _('Saldo Anterior') }}</th>
|
|
105
|
+
<th class="text-end">{{ _('Saldo Nuevo') }}</th>
|
|
106
|
+
<th>{{ _('Moneda') }}</th>
|
|
107
|
+
<th>{{ _('Nómina') }}</th>
|
|
108
|
+
<th>{{ _('Procesado Por') }}</th>
|
|
109
|
+
<th>{{ _('Fecha Creación') }}</th>
|
|
110
|
+
<th>{{ _('Observaciones') }}</th>
|
|
111
|
+
</tr>
|
|
112
|
+
</thead>
|
|
113
|
+
<tbody>
|
|
114
|
+
{% for trans in transacciones %}
|
|
115
|
+
<tr>
|
|
116
|
+
<td><small class="font-monospace">{{ trans.id[:8] }}...</small></td>
|
|
117
|
+
<td>{{ trans.fecha_transaccion.strftime('%Y-%m-%d') }}</td>
|
|
118
|
+
<td>
|
|
119
|
+
<strong>{{ trans.empleado.codigo_empleado }}</strong><br>
|
|
120
|
+
<small>{{ trans.empleado.primer_nombre }} {{ trans.empleado.primer_apellido }}</small>
|
|
121
|
+
</td>
|
|
122
|
+
<td>
|
|
123
|
+
<strong>{{ trans.prestacion.codigo }}</strong><br>
|
|
124
|
+
<small>{{ trans.prestacion.nombre }}</small>
|
|
125
|
+
</td>
|
|
126
|
+
<td>
|
|
127
|
+
{% if trans.tipo_transaccion == 'saldo_inicial' %}
|
|
128
|
+
<span class="badge bg-primary">{{ _('Saldo Inicial') }}</span>
|
|
129
|
+
{% elif trans.tipo_transaccion == 'adicion' %}
|
|
130
|
+
<span class="badge bg-success">{{ _('Adición') }}</span>
|
|
131
|
+
{% elif trans.tipo_transaccion == 'disminucion' %}
|
|
132
|
+
<span class="badge bg-warning">{{ _('Disminución') }}</span>
|
|
133
|
+
{% elif trans.tipo_transaccion == 'ajuste' %}
|
|
134
|
+
<span class="badge bg-info">{{ _('Ajuste') }}</span>
|
|
135
|
+
{% endif %}
|
|
136
|
+
</td>
|
|
137
|
+
<td>{{ trans.mes }}/{{ trans.anio }}</td>
|
|
138
|
+
<td class="text-end">
|
|
139
|
+
{% if trans.monto_transaccion >= 0 %}
|
|
140
|
+
<span class="text-success">+{{ "%.2f"|format(trans.monto_transaccion) }}</span>
|
|
141
|
+
{% else %}
|
|
142
|
+
<span class="text-danger">{{ "%.2f"|format(trans.monto_transaccion) }}</span>
|
|
143
|
+
{% endif %}
|
|
144
|
+
</td>
|
|
145
|
+
<td class="text-end">{{ "%.2f"|format(trans.saldo_anterior) }}</td>
|
|
146
|
+
<td class="text-end"><strong>{{ "%.2f"|format(trans.saldo_nuevo) }}</strong></td>
|
|
147
|
+
<td>{{ trans.moneda.codigo }}</td>
|
|
148
|
+
<td>
|
|
149
|
+
{% if trans.nomina %}
|
|
150
|
+
<small class="font-monospace">{{ trans.nomina.id[:8] }}...</small>
|
|
151
|
+
{% else %}
|
|
152
|
+
<span class="text-muted">-</span>
|
|
153
|
+
{% endif %}
|
|
154
|
+
</td>
|
|
155
|
+
<td>
|
|
156
|
+
{% if trans.procesado_por %}
|
|
157
|
+
<small>{{ trans.procesado_por }}</small>
|
|
158
|
+
{% else %}
|
|
159
|
+
<span class="text-muted">-</span>
|
|
160
|
+
{% endif %}
|
|
161
|
+
</td>
|
|
162
|
+
<td><small>{{ trans.creado.strftime('%Y-%m-%d') }}</small></td>
|
|
163
|
+
<td>
|
|
164
|
+
{% if trans.observaciones %}
|
|
165
|
+
<small>{{ trans.observaciones }}</small>
|
|
166
|
+
{% else %}
|
|
167
|
+
<span class="text-muted">-</span>
|
|
168
|
+
{% endif %}
|
|
169
|
+
</td>
|
|
170
|
+
</tr>
|
|
171
|
+
{% endfor %}
|
|
172
|
+
</tbody>
|
|
173
|
+
</table>
|
|
174
|
+
</div>
|
|
175
|
+
|
|
176
|
+
<div class="alert alert-warning mt-3">
|
|
177
|
+
<h6><i class="bi bi-shield-check me-2"></i>{{ _('Información de Auditoría') }}</h6>
|
|
178
|
+
<ul class="mb-0">
|
|
179
|
+
<li>{{ _('Este reporte muestra todas las transacciones que han modificado los saldos acumulados de prestaciones.') }}</li>
|
|
180
|
+
<li>{{ _('Cada transacción es inmutable y no puede ser modificada o eliminada (registro transaccional).') }}</li>
|
|
181
|
+
<li>{{ _('El saldo actual de una prestación es calculado sumando todas las transacciones hasta la fecha.') }}</li>
|
|
182
|
+
<li>{{ _('Utilice el botón "Exportar a Excel" para obtener una copia completa de los registros con fines de auditoría.') }}</li>
|
|
183
|
+
</ul>
|
|
184
|
+
</div>
|
|
185
|
+
{% else %}
|
|
186
|
+
<div class="alert alert-info">
|
|
187
|
+
<i class="bi bi-info-circle me-2"></i>{{ _('No se encontraron transacciones con los filtros seleccionados.') }}
|
|
188
|
+
</div>
|
|
189
|
+
{% endif %}
|
|
190
|
+
</div>
|
|
191
|
+
</div>
|
|
192
|
+
</div>
|
|
193
|
+
{% endblock %}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{% extends 'base.html' %}
|
|
2
|
+
{% from 'macros.html' import render_field, render_messages, render_form_errors %}
|
|
3
|
+
|
|
4
|
+
{% block content %}
|
|
5
|
+
<div class="container">
|
|
6
|
+
{{ render_messages() }}
|
|
7
|
+
{{ render_form_errors(form) }}
|
|
8
|
+
|
|
9
|
+
<div class="d-flex justify-content-between align-items-center mb-4">
|
|
10
|
+
<h2><i class="bi bi-sliders me-2"></i>{{ _('Parámetros de Cálculo') }}</h2>
|
|
11
|
+
<a href="{{ url_for('settings.index') }}" class="btn btn-outline-secondary">
|
|
12
|
+
<i class="bi bi-arrow-left me-1"></i>{{ _('Volver') }}
|
|
13
|
+
</a>
|
|
14
|
+
</div>
|
|
15
|
+
|
|
16
|
+
<div class="card">
|
|
17
|
+
<div class="card-header">
|
|
18
|
+
<h5 class="mb-0">{{ _('Liquidaciones - Cálculo de Días') }}</h5>
|
|
19
|
+
</div>
|
|
20
|
+
<div class="card-body">
|
|
21
|
+
<p class="text-muted mb-3">
|
|
22
|
+
{{ _('Defina cómo se calcula el factor de días usado para prorrateos en liquidaciones.') }}
|
|
23
|
+
</p>
|
|
24
|
+
|
|
25
|
+
<form method="POST">
|
|
26
|
+
{{ form.hidden_tag() }}
|
|
27
|
+
|
|
28
|
+
{{ render_field(form.liquidacion_modo_dias) }}
|
|
29
|
+
{{ render_field(form.liquidacion_factor_calendario) }}
|
|
30
|
+
{{ render_field(form.liquidacion_factor_laboral) }}
|
|
31
|
+
|
|
32
|
+
<div class="d-flex gap-2">
|
|
33
|
+
<button type="submit" class="btn btn-primary">
|
|
34
|
+
<i class="bi bi-check-circle me-1"></i>{{ _('Guardar') }}
|
|
35
|
+
</button>
|
|
36
|
+
<a href="{{ url_for('settings.index') }}" class="btn btn-secondary">
|
|
37
|
+
<i class="bi bi-x-circle me-1"></i>{{ _('Cancelar') }}
|
|
38
|
+
</a>
|
|
39
|
+
</div>
|
|
40
|
+
</form>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
</div>
|
|
44
|
+
{% endblock %}
|