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,79 @@
|
|
|
1
|
+
{% extends 'base.html' %}
|
|
2
|
+
{% from 'macros.html' import render_messages, render_pagination %}
|
|
3
|
+
|
|
4
|
+
{% block content %}
|
|
5
|
+
<div class="container">
|
|
6
|
+
{{ render_messages() }}
|
|
7
|
+
|
|
8
|
+
<div class="d-flex justify-content-between align-items-center mb-4">
|
|
9
|
+
<h2>{{ _('Políticas de Vacaciones') }}</h2>
|
|
10
|
+
<a href="{{ url_for('vacation.policy_new') }}" class="btn btn-primary">
|
|
11
|
+
<i class="bi bi-plus-lg me-1"></i>{{ _('Nueva Política') }}
|
|
12
|
+
</a>
|
|
13
|
+
</div>
|
|
14
|
+
|
|
15
|
+
<div class="card">
|
|
16
|
+
<div class="card-body">
|
|
17
|
+
<div class="table-responsive">
|
|
18
|
+
<table class="table table-hover">
|
|
19
|
+
<thead>
|
|
20
|
+
<tr>
|
|
21
|
+
<th>{{ _('Código') }}</th>
|
|
22
|
+
<th>{{ _('Nombre') }}</th>
|
|
23
|
+
<th>{{ _('Planilla') }}</th>
|
|
24
|
+
<th>{{ _('Método') }}</th>
|
|
25
|
+
<th>{{ _('Frecuencia') }}</th>
|
|
26
|
+
<th>{{ _('Unidad') }}</th>
|
|
27
|
+
<th>{{ _('Estado') }}</th>
|
|
28
|
+
<th>{{ _('Acciones') }}</th>
|
|
29
|
+
</tr>
|
|
30
|
+
</thead>
|
|
31
|
+
<tbody>
|
|
32
|
+
{% for policy in policies %}
|
|
33
|
+
<tr>
|
|
34
|
+
<td><strong>{{ policy.codigo }}</strong></td>
|
|
35
|
+
<td>{{ policy.nombre }}</td>
|
|
36
|
+
<td>
|
|
37
|
+
{% if policy.planilla %}
|
|
38
|
+
{{ policy.planilla.nombre }}
|
|
39
|
+
{% if policy.planilla.empresa %}
|
|
40
|
+
<br><small class="text-muted">{{ policy.planilla.empresa.razon_social }}</small>
|
|
41
|
+
{% endif %}
|
|
42
|
+
{% else %}
|
|
43
|
+
<span class="text-muted">{{ _('Global') }}</span>
|
|
44
|
+
{% endif %}
|
|
45
|
+
</td>
|
|
46
|
+
<td>{{ policy.accrual_method }}</td>
|
|
47
|
+
<td>{{ policy.accrual_frequency }}</td>
|
|
48
|
+
<td>{{ policy.unit_type }}</td>
|
|
49
|
+
<td>
|
|
50
|
+
{% if policy.activo %}
|
|
51
|
+
<span class="badge bg-success">{{ _('Activa') }}</span>
|
|
52
|
+
{% else %}
|
|
53
|
+
<span class="badge bg-warning">{{ _('Inactiva') }}</span>
|
|
54
|
+
{% endif %}
|
|
55
|
+
</td>
|
|
56
|
+
<td>
|
|
57
|
+
<a href="{{ url_for('vacation.policy_detail', policy_id=policy.id) }}"
|
|
58
|
+
class="btn btn-sm btn-outline-info" title="{{ _('Ver') }}">
|
|
59
|
+
<i class="bi bi-eye"></i>
|
|
60
|
+
</a>
|
|
61
|
+
<a href="{{ url_for('vacation.policy_edit', policy_id=policy.id) }}"
|
|
62
|
+
class="btn btn-sm btn-outline-primary" title="{{ _('Editar') }}">
|
|
63
|
+
<i class="bi bi-pencil"></i>
|
|
64
|
+
</a>
|
|
65
|
+
</td>
|
|
66
|
+
</tr>
|
|
67
|
+
{% else %}
|
|
68
|
+
<tr>
|
|
69
|
+
<td colspan="8" class="text-center text-muted">{{ _('No hay políticas registradas.') }}</td>
|
|
70
|
+
</tr>
|
|
71
|
+
{% endfor %}
|
|
72
|
+
</tbody>
|
|
73
|
+
</table>
|
|
74
|
+
</div>
|
|
75
|
+
{{ render_pagination(pagination, 'vacation.policy_index') }}
|
|
76
|
+
</div>
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
{% endblock %}
|
|
@@ -0,0 +1,178 @@
|
|
|
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>{{ titulo }}</h2>
|
|
11
|
+
<a href="{{ url_for('vacation.dashboard') }}" class="btn btn-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 bg-info text-white">
|
|
18
|
+
<h5 class="mb-0">
|
|
19
|
+
<i class="bi bi-calendar-check me-2"></i>{{ _('Registro Directo de Vacaciones Tomadas') }}
|
|
20
|
+
</h5>
|
|
21
|
+
</div>
|
|
22
|
+
<div class="card-body">
|
|
23
|
+
<div class="alert alert-info">
|
|
24
|
+
<h6><i class="bi bi-info-circle me-2"></i>{{ _('Importante: Distinción entre Días Calendario y Días de Vacaciones') }}</h6>
|
|
25
|
+
<p class="mb-0">
|
|
26
|
+
<strong>{{ _('Este formulario permite especificar:') }}</strong>
|
|
27
|
+
</p>
|
|
28
|
+
<ul class="mb-0">
|
|
29
|
+
<li><strong>{{ _('Período de descanso:') }}</strong> {{ _('Fechas calendario del descanso (ej: viernes a lunes = 4 días calendario)') }}</li>
|
|
30
|
+
<li><strong>{{ _('Días a descontar:') }}</strong> {{ _('Días reales de vacaciones según política de empresa (ej: solo 2 días de vacaciones)') }}</li>
|
|
31
|
+
</ul>
|
|
32
|
+
<p class="mt-2 mb-0">
|
|
33
|
+
<em>{{ _('Ejemplo: Un empleado toma viernes y lunes (4 días calendario), pero según política de la empresa solo se descuentan 2 días de su saldo de vacaciones.') }}</em>
|
|
34
|
+
</p>
|
|
35
|
+
</div>
|
|
36
|
+
|
|
37
|
+
<form method="POST" action="">
|
|
38
|
+
{{ form.hidden_tag() }}
|
|
39
|
+
|
|
40
|
+
<div class="row">
|
|
41
|
+
<div class="col-md-12">
|
|
42
|
+
{{ render_field(form.empleado_id) }}
|
|
43
|
+
</div>
|
|
44
|
+
</div>
|
|
45
|
+
|
|
46
|
+
<hr>
|
|
47
|
+
<h6>{{ _('Período de Descanso (Calendario)') }}</h6>
|
|
48
|
+
|
|
49
|
+
<div class="row">
|
|
50
|
+
<div class="col-md-6">
|
|
51
|
+
{{ render_field(form.fecha_inicio) }}
|
|
52
|
+
</div>
|
|
53
|
+
<div class="col-md-6">
|
|
54
|
+
{{ render_field(form.fecha_fin) }}
|
|
55
|
+
</div>
|
|
56
|
+
</div>
|
|
57
|
+
|
|
58
|
+
<hr>
|
|
59
|
+
<h6>{{ _('Días de Vacaciones a Descontar') }}</h6>
|
|
60
|
+
|
|
61
|
+
<div class="row">
|
|
62
|
+
<div class="col-md-12">
|
|
63
|
+
{{ render_field(form.dias_descontados) }}
|
|
64
|
+
<div class="alert alert-warning mt-2">
|
|
65
|
+
<small>
|
|
66
|
+
<i class="bi bi-exclamation-triangle me-1"></i>
|
|
67
|
+
{{ _('Este valor se descontará del saldo de vacaciones del empleado y puede ser diferente de los días calendario del período de descanso.') }}
|
|
68
|
+
</small>
|
|
69
|
+
</div>
|
|
70
|
+
</div>
|
|
71
|
+
</div>
|
|
72
|
+
|
|
73
|
+
<hr>
|
|
74
|
+
<h6>{{ _('Asociación con Nómina (REQUERIDO)') }}</h6>
|
|
75
|
+
|
|
76
|
+
<div class="alert alert-info">
|
|
77
|
+
<i class="bi bi-info-circle me-2"></i>
|
|
78
|
+
<strong>{{ _('La novedad debe asociarse a una Percepción o Deducción') }}</strong>
|
|
79
|
+
<p class="mb-0 mt-2">
|
|
80
|
+
{{ _('Esto asegura que al calcular la nómina del empleado, las vacaciones se procesen correctamente.') }}
|
|
81
|
+
</p>
|
|
82
|
+
<ul class="mb-0 mt-2">
|
|
83
|
+
<li><strong>{{ _('Deducción:') }}</strong> {{ _('Si las vacaciones se descuentan del salario (ausencias)') }}</li>
|
|
84
|
+
<li><strong>{{ _('Percepción:') }}</strong> {{ _('Si las vacaciones se pagan como ingreso adicional') }}</li>
|
|
85
|
+
</ul>
|
|
86
|
+
</div>
|
|
87
|
+
|
|
88
|
+
<div class="row">
|
|
89
|
+
<div class="col-md-4">
|
|
90
|
+
{{ render_field(form.tipo_concepto) }}
|
|
91
|
+
</div>
|
|
92
|
+
<div class="col-md-4" id="percepcion-field">
|
|
93
|
+
{{ render_field(form.percepcion_id) }}
|
|
94
|
+
</div>
|
|
95
|
+
<div class="col-md-4" id="deduccion-field">
|
|
96
|
+
{{ render_field(form.deduccion_id) }}
|
|
97
|
+
</div>
|
|
98
|
+
</div>
|
|
99
|
+
|
|
100
|
+
<div class="row">
|
|
101
|
+
<div class="col-md-12">
|
|
102
|
+
{{ render_field(form.observaciones) }}
|
|
103
|
+
</div>
|
|
104
|
+
</div>
|
|
105
|
+
|
|
106
|
+
<hr>
|
|
107
|
+
|
|
108
|
+
<div class="alert alert-success">
|
|
109
|
+
<h6><i class="bi bi-check-circle me-2"></i>{{ _('¿Qué sucede al registrar?') }}</h6>
|
|
110
|
+
<ol class="mb-0">
|
|
111
|
+
<li>{{ _('Se crea un registro de vacaciones (VacationNovelty)') }}</li>
|
|
112
|
+
<li>{{ _('Se descuenta el saldo de la cuenta de vacaciones del empleado') }}</li>
|
|
113
|
+
<li>{{ _('Se crea una entrada en el libro mayor de vacaciones (auditoría)') }}</li>
|
|
114
|
+
<li>{{ _('Se crea una novedad de nómina asociada para los cálculos de pago') }}</li>
|
|
115
|
+
<li>{{ _('El registro queda marcado como "aprobado" y "disfrutado" automáticamente') }}</li>
|
|
116
|
+
</ol>
|
|
117
|
+
</div>
|
|
118
|
+
|
|
119
|
+
<div class="mt-4">
|
|
120
|
+
{{ form.submit(class="btn btn-primary btn-lg") }}
|
|
121
|
+
<a href="{{ url_for('vacation.dashboard') }}" class="btn btn-secondary">{{ _('Cancelar') }}</a>
|
|
122
|
+
</div>
|
|
123
|
+
</form>
|
|
124
|
+
</div>
|
|
125
|
+
</div>
|
|
126
|
+
</div>
|
|
127
|
+
|
|
128
|
+
<script>
|
|
129
|
+
document.addEventListener('DOMContentLoaded', function() {
|
|
130
|
+
// Auto-calculate suggestion based on date range (optional helper)
|
|
131
|
+
const fechaInicio = document.getElementById('fecha_inicio');
|
|
132
|
+
const fechaFin = document.getElementById('fecha_fin');
|
|
133
|
+
const diasDescontados = document.getElementById('dias_descontados');
|
|
134
|
+
|
|
135
|
+
function calculateDays() {
|
|
136
|
+
if (fechaInicio.value && fechaFin.value) {
|
|
137
|
+
const inicio = new Date(fechaInicio.value);
|
|
138
|
+
const fin = new Date(fechaFin.value);
|
|
139
|
+
const diffTime = Math.abs(fin - inicio);
|
|
140
|
+
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)) + 1;
|
|
141
|
+
|
|
142
|
+
// Only suggest if field is empty
|
|
143
|
+
if (!diasDescontados.value || diasDescontados.value === '0') {
|
|
144
|
+
// This is just a suggestion - user should adjust based on policy
|
|
145
|
+
diasDescontados.value = diffDays;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (fechaInicio && fechaFin && diasDescontados) {
|
|
151
|
+
fechaInicio.addEventListener('change', calculateDays);
|
|
152
|
+
fechaFin.addEventListener('change', calculateDays);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Show/hide percepcion/deduccion fields based on tipo_concepto
|
|
156
|
+
const tipoConcepto = document.getElementById('tipo_concepto');
|
|
157
|
+
const percepcionField = document.getElementById('percepcion-field');
|
|
158
|
+
const deduccionField = document.getElementById('deduccion-field');
|
|
159
|
+
|
|
160
|
+
function toggleConceptoFields() {
|
|
161
|
+
if (tipoConcepto.value === 'percepcion') {
|
|
162
|
+
percepcionField.style.display = 'block';
|
|
163
|
+
deduccionField.style.display = 'none';
|
|
164
|
+
document.getElementById('deduccion_id').value = '';
|
|
165
|
+
} else if (tipoConcepto.value === 'deduccion') {
|
|
166
|
+
percepcionField.style.display = 'none';
|
|
167
|
+
deduccionField.style.display = 'block';
|
|
168
|
+
document.getElementById('percepcion_id').value = '';
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
if (tipoConcepto && percepcionField && deduccionField) {
|
|
173
|
+
tipoConcepto.addEventListener('change', toggleConceptoFields);
|
|
174
|
+
toggleConceptoFields(); // Initial state
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
</script>
|
|
178
|
+
{% endblock %}
|
|
Binary file
|