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,158 @@
|
|
|
1
|
+
{% extends 'base.html' %}
|
|
2
|
+
{% from 'macros.html' import render_messages %}
|
|
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>{{ _('Solicitud de Vacaciones') }}</h2>
|
|
10
|
+
<a href="{{ url_for('vacation.leave_request_index') }}" class="btn btn-secondary">
|
|
11
|
+
<i class="bi bi-arrow-left me-1"></i>{{ _('Volver') }}
|
|
12
|
+
</a>
|
|
13
|
+
</div>
|
|
14
|
+
|
|
15
|
+
<div class="row">
|
|
16
|
+
<div class="col-md-8">
|
|
17
|
+
<div class="card mb-4">
|
|
18
|
+
<div class="card-header">
|
|
19
|
+
<h5 class="mb-0">{{ _('Detalles de la Solicitud') }}</h5>
|
|
20
|
+
</div>
|
|
21
|
+
<div class="card-body">
|
|
22
|
+
<dl class="row">
|
|
23
|
+
<dt class="col-sm-4">{{ _('Empleado') }}</dt>
|
|
24
|
+
<dd class="col-sm-8">{{ leave_request.empleado.primer_nombre }} {{ leave_request.empleado.primer_apellido }}</dd>
|
|
25
|
+
|
|
26
|
+
<dt class="col-sm-4">{{ _('Código') }}</dt>
|
|
27
|
+
<dd class="col-sm-8"><strong>{{ leave_request.empleado.codigo_empleado }}</strong></dd>
|
|
28
|
+
|
|
29
|
+
<dt class="col-sm-4">{{ _('Fecha de Inicio') }}</dt>
|
|
30
|
+
<dd class="col-sm-8">{{ leave_request.start_date.strftime('%Y-%m-%d') }}</dd>
|
|
31
|
+
|
|
32
|
+
<dt class="col-sm-4">{{ _('Fecha de Fin') }}</dt>
|
|
33
|
+
<dd class="col-sm-8">{{ leave_request.end_date.strftime('%Y-%m-%d') }}</dd>
|
|
34
|
+
|
|
35
|
+
<dt class="col-sm-4">{{ _('Unidades') }}</dt>
|
|
36
|
+
<dd class="col-sm-8">{{ leave_request.units }} {{ leave_request.account.policy.unit_type }}</dd>
|
|
37
|
+
|
|
38
|
+
<dt class="col-sm-4">{{ _('Estado') }}</dt>
|
|
39
|
+
<dd class="col-sm-8">
|
|
40
|
+
{% if leave_request.estado == 'pendiente' %}
|
|
41
|
+
<span class="badge bg-warning">{{ _('Pendiente') }}</span>
|
|
42
|
+
{% elif leave_request.estado == 'aprobado' %}
|
|
43
|
+
<span class="badge bg-success">{{ _('Aprobado') }}</span>
|
|
44
|
+
{% elif leave_request.estado == 'rechazado' %}
|
|
45
|
+
<span class="badge bg-danger">{{ _('Rechazado') }}</span>
|
|
46
|
+
{% elif leave_request.estado == 'disfrutado' %}
|
|
47
|
+
<span class="badge bg-info">{{ _('Disfrutado') }}</span>
|
|
48
|
+
{% endif %}
|
|
49
|
+
</dd>
|
|
50
|
+
|
|
51
|
+
<dt class="col-sm-4">{{ _('Fecha de Solicitud') }}</dt>
|
|
52
|
+
<dd class="col-sm-8">{{ leave_request.creado.strftime('%Y-%m-%d') }}</dd>
|
|
53
|
+
|
|
54
|
+
<dt class="col-sm-4">{{ _('Solicitado por') }}</dt>
|
|
55
|
+
<dd class="col-sm-8">{{ leave_request.creado_por }}</dd>
|
|
56
|
+
|
|
57
|
+
{% if leave_request.fecha_aprobacion %}
|
|
58
|
+
<dt class="col-sm-4">{{ _('Fecha de Aprobación') }}</dt>
|
|
59
|
+
<dd class="col-sm-8">{{ leave_request.fecha_aprobacion.strftime('%Y-%m-%d') }}</dd>
|
|
60
|
+
|
|
61
|
+
<dt class="col-sm-4">{{ _('Aprobado por') }}</dt>
|
|
62
|
+
<dd class="col-sm-8">{{ leave_request.aprobado_por }}</dd>
|
|
63
|
+
{% endif %}
|
|
64
|
+
|
|
65
|
+
{% if leave_request.observaciones %}
|
|
66
|
+
<dt class="col-sm-4">{{ _('Observaciones') }}</dt>
|
|
67
|
+
<dd class="col-sm-8">{{ leave_request.observaciones }}</dd>
|
|
68
|
+
{% endif %}
|
|
69
|
+
|
|
70
|
+
{% if leave_request.motivo_rechazo %}
|
|
71
|
+
<dt class="col-sm-4">{{ _('Motivo de Rechazo') }}</dt>
|
|
72
|
+
<dd class="col-sm-8">
|
|
73
|
+
<div class="alert alert-danger mb-0">
|
|
74
|
+
{{ leave_request.motivo_rechazo }}
|
|
75
|
+
</div>
|
|
76
|
+
</dd>
|
|
77
|
+
{% endif %}
|
|
78
|
+
</dl>
|
|
79
|
+
</div>
|
|
80
|
+
</div>
|
|
81
|
+
|
|
82
|
+
{% if leave_request.estado == 'pendiente' %}
|
|
83
|
+
<div class="card">
|
|
84
|
+
<div class="card-header">
|
|
85
|
+
<h5 class="mb-0">{{ _('Acciones') }}</h5>
|
|
86
|
+
</div>
|
|
87
|
+
<div class="card-body">
|
|
88
|
+
<form method="POST" action="{{ url_for('vacation.leave_request_approve', request_id=leave_request.id) }}" class="d-inline">
|
|
89
|
+
<button type="submit" class="btn btn-success"
|
|
90
|
+
onclick="return confirm('{{ _('¿Está seguro de aprobar esta solicitud?') }}');">
|
|
91
|
+
<i class="bi bi-check-circle me-1"></i>{{ _('Aprobar') }}
|
|
92
|
+
</button>
|
|
93
|
+
</form>
|
|
94
|
+
|
|
95
|
+
<button type="button" class="btn btn-danger" data-bs-toggle="modal" data-bs-target="#rejectModal">
|
|
96
|
+
<i class="bi bi-x-circle me-1"></i>{{ _('Rechazar') }}
|
|
97
|
+
</button>
|
|
98
|
+
</div>
|
|
99
|
+
</div>
|
|
100
|
+
{% endif %}
|
|
101
|
+
</div>
|
|
102
|
+
|
|
103
|
+
<div class="col-md-4">
|
|
104
|
+
<div class="card mb-4">
|
|
105
|
+
<div class="card-header">
|
|
106
|
+
<h5 class="mb-0">{{ _('Balance de Cuenta') }}</h5>
|
|
107
|
+
</div>
|
|
108
|
+
<div class="card-body text-center">
|
|
109
|
+
<h2>{{ leave_request.account.current_balance }}</h2>
|
|
110
|
+
<p class="text-muted">{{ leave_request.account.policy.unit_type }} {{ _('disponibles') }}</p>
|
|
111
|
+
<a href="{{ url_for('vacation.account_detail', account_id=leave_request.account.id) }}"
|
|
112
|
+
class="btn btn-sm btn-outline-primary">
|
|
113
|
+
{{ _('Ver Cuenta') }}
|
|
114
|
+
</a>
|
|
115
|
+
</div>
|
|
116
|
+
</div>
|
|
117
|
+
|
|
118
|
+
<div class="card">
|
|
119
|
+
<div class="card-header">
|
|
120
|
+
<h5 class="mb-0">{{ _('Política Aplicable') }}</h5>
|
|
121
|
+
</div>
|
|
122
|
+
<div class="card-body">
|
|
123
|
+
<p><strong>{{ leave_request.account.policy.nombre }}</strong></p>
|
|
124
|
+
<p class="small text-muted">{{ leave_request.account.policy.descripcion }}</p>
|
|
125
|
+
<a href="{{ url_for('vacation.policy_detail', policy_id=leave_request.account.policy.id) }}"
|
|
126
|
+
class="btn btn-sm btn-outline-primary">
|
|
127
|
+
{{ _('Ver Política') }}
|
|
128
|
+
</a>
|
|
129
|
+
</div>
|
|
130
|
+
</div>
|
|
131
|
+
</div>
|
|
132
|
+
</div>
|
|
133
|
+
</div>
|
|
134
|
+
|
|
135
|
+
<!-- Reject Modal -->
|
|
136
|
+
<div class="modal fade" id="rejectModal" tabindex="-1" aria-labelledby="rejectModalLabel" aria-hidden="true">
|
|
137
|
+
<div class="modal-dialog">
|
|
138
|
+
<div class="modal-content">
|
|
139
|
+
<form method="POST" action="{{ url_for('vacation.leave_request_reject', request_id=leave_request.id) }}">
|
|
140
|
+
<div class="modal-header">
|
|
141
|
+
<h5 class="modal-title" id="rejectModalLabel">{{ _('Rechazar Solicitud') }}</h5>
|
|
142
|
+
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
143
|
+
</div>
|
|
144
|
+
<div class="modal-body">
|
|
145
|
+
<div class="mb-3">
|
|
146
|
+
<label for="motivo_rechazo" class="form-label">{{ _('Motivo del Rechazo') }}</label>
|
|
147
|
+
<textarea class="form-control" id="motivo_rechazo" name="motivo_rechazo" rows="3" required></textarea>
|
|
148
|
+
</div>
|
|
149
|
+
</div>
|
|
150
|
+
<div class="modal-footer">
|
|
151
|
+
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">{{ _('Cancelar') }}</button>
|
|
152
|
+
<button type="submit" class="btn btn-danger">{{ _('Rechazar Solicitud') }}</button>
|
|
153
|
+
</div>
|
|
154
|
+
</form>
|
|
155
|
+
</div>
|
|
156
|
+
</div>
|
|
157
|
+
</div>
|
|
158
|
+
{% endblock %}
|
|
@@ -0,0 +1,61 @@
|
|
|
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.leave_request_index') }}" 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-body">
|
|
18
|
+
<form method="POST" action="">
|
|
19
|
+
{{ form.hidden_tag() }}
|
|
20
|
+
|
|
21
|
+
<div class="row">
|
|
22
|
+
<div class="col-md-12">
|
|
23
|
+
{{ render_field(form.empleado_id) }}
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
26
|
+
|
|
27
|
+
<div class="row">
|
|
28
|
+
<div class="col-md-6">
|
|
29
|
+
{{ render_field(form.start_date) }}
|
|
30
|
+
</div>
|
|
31
|
+
<div class="col-md-6">
|
|
32
|
+
{{ render_field(form.end_date) }}
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
|
|
36
|
+
<div class="row">
|
|
37
|
+
<div class="col-md-12">
|
|
38
|
+
{{ render_field(form.units) }}
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|
|
41
|
+
|
|
42
|
+
<div class="row">
|
|
43
|
+
<div class="col-md-12">
|
|
44
|
+
{{ render_field(form.observaciones) }}
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
|
|
48
|
+
<div class="alert alert-info">
|
|
49
|
+
<i class="bi bi-info-circle me-2"></i>
|
|
50
|
+
{{ _('Asegúrese de que el empleado tenga suficiente balance de vacaciones antes de crear la solicitud.') }}
|
|
51
|
+
</div>
|
|
52
|
+
|
|
53
|
+
<div class="mt-4">
|
|
54
|
+
{{ form.submit(class="btn btn-primary") }}
|
|
55
|
+
<a href="{{ url_for('vacation.leave_request_index') }}" class="btn btn-secondary">{{ _('Cancelar') }}</a>
|
|
56
|
+
</div>
|
|
57
|
+
</form>
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
{% endblock %}
|
|
@@ -0,0 +1,98 @@
|
|
|
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>{{ _('Solicitudes de Vacaciones') }}</h2>
|
|
10
|
+
<a href="{{ url_for('vacation.leave_request_new') }}" class="btn btn-primary">
|
|
11
|
+
<i class="bi bi-plus-lg me-1"></i>{{ _('Nueva Solicitud') }}
|
|
12
|
+
</a>
|
|
13
|
+
</div>
|
|
14
|
+
|
|
15
|
+
<!-- Filter Tabs -->
|
|
16
|
+
<ul class="nav nav-tabs mb-3">
|
|
17
|
+
<li class="nav-item">
|
|
18
|
+
<a class="nav-link {% if not estado %}active{% endif %}"
|
|
19
|
+
href="{{ url_for('vacation.leave_request_index') }}">
|
|
20
|
+
{{ _('Todas') }}
|
|
21
|
+
</a>
|
|
22
|
+
</li>
|
|
23
|
+
<li class="nav-item">
|
|
24
|
+
<a class="nav-link {% if estado == 'pendiente' %}active{% endif %}"
|
|
25
|
+
href="{{ url_for('vacation.leave_request_index', estado='pendiente') }}">
|
|
26
|
+
{{ _('Pendientes') }}
|
|
27
|
+
</a>
|
|
28
|
+
</li>
|
|
29
|
+
<li class="nav-item">
|
|
30
|
+
<a class="nav-link {% if estado == 'aprobado' %}active{% endif %}"
|
|
31
|
+
href="{{ url_for('vacation.leave_request_index', estado='aprobado') }}">
|
|
32
|
+
{{ _('Aprobadas') }}
|
|
33
|
+
</a>
|
|
34
|
+
</li>
|
|
35
|
+
<li class="nav-item">
|
|
36
|
+
<a class="nav-link {% if estado == 'rechazado' %}active{% endif %}"
|
|
37
|
+
href="{{ url_for('vacation.leave_request_index', estado='rechazado') }}">
|
|
38
|
+
{{ _('Rechazadas') }}
|
|
39
|
+
</a>
|
|
40
|
+
</li>
|
|
41
|
+
</ul>
|
|
42
|
+
|
|
43
|
+
<div class="card">
|
|
44
|
+
<div class="card-body">
|
|
45
|
+
<div class="table-responsive">
|
|
46
|
+
<table class="table table-hover">
|
|
47
|
+
<thead>
|
|
48
|
+
<tr>
|
|
49
|
+
<th>{{ _('Empleado') }}</th>
|
|
50
|
+
<th>{{ _('Código') }}</th>
|
|
51
|
+
<th>{{ _('Fecha Inicio') }}</th>
|
|
52
|
+
<th>{{ _('Fecha Fin') }}</th>
|
|
53
|
+
<th>{{ _('Unidades') }}</th>
|
|
54
|
+
<th>{{ _('Estado') }}</th>
|
|
55
|
+
<th>{{ _('Fecha Solicitud') }}</th>
|
|
56
|
+
<th>{{ _('Acciones') }}</th>
|
|
57
|
+
</tr>
|
|
58
|
+
</thead>
|
|
59
|
+
<tbody>
|
|
60
|
+
{% for request in leave_requests %}
|
|
61
|
+
<tr>
|
|
62
|
+
<td>{{ request.empleado.primer_nombre }} {{ request.empleado.primer_apellido }}</td>
|
|
63
|
+
<td><strong>{{ request.empleado.codigo_empleado }}</strong></td>
|
|
64
|
+
<td>{{ request.start_date.strftime('%Y-%m-%d') }}</td>
|
|
65
|
+
<td>{{ request.end_date.strftime('%Y-%m-%d') }}</td>
|
|
66
|
+
<td>{{ request.units }}</td>
|
|
67
|
+
<td>
|
|
68
|
+
{% if request.estado == 'pendiente' %}
|
|
69
|
+
<span class="badge bg-warning">{{ _('Pendiente') }}</span>
|
|
70
|
+
{% elif request.estado == 'aprobado' %}
|
|
71
|
+
<span class="badge bg-success">{{ _('Aprobado') }}</span>
|
|
72
|
+
{% elif request.estado == 'rechazado' %}
|
|
73
|
+
<span class="badge bg-danger">{{ _('Rechazado') }}</span>
|
|
74
|
+
{% elif request.estado == 'disfrutado' %}
|
|
75
|
+
<span class="badge bg-info">{{ _('Disfrutado') }}</span>
|
|
76
|
+
{% endif %}
|
|
77
|
+
</td>
|
|
78
|
+
<td>{{ request.creado.strftime('%Y-%m-%d') }}</td>
|
|
79
|
+
<td>
|
|
80
|
+
<a href="{{ url_for('vacation.leave_request_detail', request_id=request.id) }}"
|
|
81
|
+
class="btn btn-sm btn-outline-info" title="{{ _('Ver Detalles') }}">
|
|
82
|
+
<i class="bi bi-eye"></i>
|
|
83
|
+
</a>
|
|
84
|
+
</td>
|
|
85
|
+
</tr>
|
|
86
|
+
{% else %}
|
|
87
|
+
<tr>
|
|
88
|
+
<td colspan="8" class="text-center text-muted">{{ _('No hay solicitudes registradas.') }}</td>
|
|
89
|
+
</tr>
|
|
90
|
+
{% endfor %}
|
|
91
|
+
</tbody>
|
|
92
|
+
</table>
|
|
93
|
+
</div>
|
|
94
|
+
{{ render_pagination(pagination, 'vacation.leave_request_index') }}
|
|
95
|
+
</div>
|
|
96
|
+
</div>
|
|
97
|
+
</div>
|
|
98
|
+
{% endblock %}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
{% extends 'base.html' %}
|
|
2
|
+
{% from 'macros.html' import render_messages %}
|
|
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>{{ policy.nombre }}</h2>
|
|
10
|
+
<div>
|
|
11
|
+
<a href="{{ url_for('vacation.policy_edit', policy_id=policy.id) }}" class="btn btn-primary">
|
|
12
|
+
<i class="bi bi-pencil me-1"></i>{{ _('Editar') }}
|
|
13
|
+
</a>
|
|
14
|
+
<a href="{{ url_for('vacation.policy_index') }}" class="btn btn-secondary">
|
|
15
|
+
<i class="bi bi-arrow-left me-1"></i>{{ _('Volver') }}
|
|
16
|
+
</a>
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
19
|
+
|
|
20
|
+
<div class="row">
|
|
21
|
+
<div class="col-md-8">
|
|
22
|
+
<div class="card mb-4">
|
|
23
|
+
<div class="card-header">
|
|
24
|
+
<h5 class="mb-0">{{ _('Información General') }}</h5>
|
|
25
|
+
</div>
|
|
26
|
+
<div class="card-body">
|
|
27
|
+
<dl class="row">
|
|
28
|
+
<dt class="col-sm-4">{{ _('Código') }}</dt>
|
|
29
|
+
<dd class="col-sm-8"><strong>{{ policy.codigo }}</strong></dd>
|
|
30
|
+
|
|
31
|
+
<dt class="col-sm-4">{{ _('Descripción') }}</dt>
|
|
32
|
+
<dd class="col-sm-8">{{ policy.descripcion or '-' }}</dd>
|
|
33
|
+
|
|
34
|
+
<dt class="col-sm-4">{{ _('Planilla') }}</dt>
|
|
35
|
+
<dd class="col-sm-8">
|
|
36
|
+
{% if policy.planilla %}
|
|
37
|
+
<a href="{{ url_for('planilla.view', planilla_id=policy.planilla.id) }}">
|
|
38
|
+
{{ policy.planilla.nombre }}
|
|
39
|
+
</a>
|
|
40
|
+
{% if policy.planilla.empresa %}
|
|
41
|
+
<br><small class="text-muted">{{ policy.planilla.empresa.razon_social }}</small>
|
|
42
|
+
{% endif %}
|
|
43
|
+
{% else %}
|
|
44
|
+
{{ _('Global (No asociada a planilla)') }}
|
|
45
|
+
{% endif %}
|
|
46
|
+
</dd>
|
|
47
|
+
|
|
48
|
+
<dt class="col-sm-4">{{ _('Empresa') }}</dt>
|
|
49
|
+
<dd class="col-sm-8">{{ policy.empresa.razon_social if policy.empresa else _('Todas') }}</dd>
|
|
50
|
+
|
|
51
|
+
<dt class="col-sm-4">{{ _('Estado') }}</dt>
|
|
52
|
+
<dd class="col-sm-8">
|
|
53
|
+
{% if policy.activo %}
|
|
54
|
+
<span class="badge bg-success">{{ _('Activa') }}</span>
|
|
55
|
+
{% else %}
|
|
56
|
+
<span class="badge bg-warning">{{ _('Inactiva') }}</span>
|
|
57
|
+
{% endif %}
|
|
58
|
+
</dd>
|
|
59
|
+
</dl>
|
|
60
|
+
</div>
|
|
61
|
+
</div>
|
|
62
|
+
|
|
63
|
+
<div class="card mb-4">
|
|
64
|
+
<div class="card-header">
|
|
65
|
+
<h5 class="mb-0">{{ _('Configuración de Acumulación') }}</h5>
|
|
66
|
+
</div>
|
|
67
|
+
<div class="card-body">
|
|
68
|
+
<dl class="row">
|
|
69
|
+
<dt class="col-sm-4">{{ _('Método') }}</dt>
|
|
70
|
+
<dd class="col-sm-8">{{ policy.accrual_method }}</dd>
|
|
71
|
+
|
|
72
|
+
<dt class="col-sm-4">{{ _('Tasa') }}</dt>
|
|
73
|
+
<dd class="col-sm-8">{{ policy.accrual_rate }} {{ policy.unit_type }} por período</dd>
|
|
74
|
+
|
|
75
|
+
<dt class="col-sm-4">{{ _('Frecuencia') }}</dt>
|
|
76
|
+
<dd class="col-sm-8">{{ policy.accrual_frequency }}</dd>
|
|
77
|
+
|
|
78
|
+
<dt class="col-sm-4">{{ _('Base') }}</dt>
|
|
79
|
+
<dd class="col-sm-8">{{ policy.accrual_basis or '-' }}</dd>
|
|
80
|
+
|
|
81
|
+
<dt class="col-sm-4">{{ _('Días Mínimos de Servicio') }}</dt>
|
|
82
|
+
<dd class="col-sm-8">{{ policy.min_service_days }}</dd>
|
|
83
|
+
</dl>
|
|
84
|
+
</div>
|
|
85
|
+
</div>
|
|
86
|
+
|
|
87
|
+
<div class="card mb-4">
|
|
88
|
+
<div class="card-header">
|
|
89
|
+
<h5 class="mb-0">{{ _('Límites y Vencimiento') }}</h5>
|
|
90
|
+
</div>
|
|
91
|
+
<div class="card-body">
|
|
92
|
+
<dl class="row">
|
|
93
|
+
<dt class="col-sm-4">{{ _('Balance Máximo') }}</dt>
|
|
94
|
+
<dd class="col-sm-8">{{ policy.max_balance if policy.max_balance else _('Sin límite') }}</dd>
|
|
95
|
+
|
|
96
|
+
<dt class="col-sm-4">{{ _('Límite de Traspaso') }}</dt>
|
|
97
|
+
<dd class="col-sm-8">{{ policy.carryover_limit if policy.carryover_limit else _('Sin límite') }}</dd>
|
|
98
|
+
|
|
99
|
+
<dt class="col-sm-4">{{ _('Permitir Balance Negativo') }}</dt>
|
|
100
|
+
<dd class="col-sm-8">
|
|
101
|
+
{% if policy.allow_negative %}
|
|
102
|
+
<i class="bi bi-check-circle text-success"></i> {{ _('Sí') }}
|
|
103
|
+
{% else %}
|
|
104
|
+
<i class="bi bi-x-circle text-danger"></i> {{ _('No') }}
|
|
105
|
+
{% endif %}
|
|
106
|
+
</dd>
|
|
107
|
+
|
|
108
|
+
<dt class="col-sm-4">{{ _('Regla de Vencimiento') }}</dt>
|
|
109
|
+
<dd class="col-sm-8">{{ policy.expiration_rule }}</dd>
|
|
110
|
+
</dl>
|
|
111
|
+
</div>
|
|
112
|
+
</div>
|
|
113
|
+
|
|
114
|
+
<div class="card mb-4">
|
|
115
|
+
<div class="card-header">
|
|
116
|
+
<h5 class="mb-0">{{ _('Configuración de Uso') }}</h5>
|
|
117
|
+
</div>
|
|
118
|
+
<div class="card-body">
|
|
119
|
+
<dl class="row">
|
|
120
|
+
<dt class="col-sm-4">{{ _('Tipo de Unidad') }}</dt>
|
|
121
|
+
<dd class="col-sm-8">{{ policy.unit_type }}</dd>
|
|
122
|
+
|
|
123
|
+
<dt class="col-sm-4">{{ _('Contar Fines de Semana') }}</dt>
|
|
124
|
+
<dd class="col-sm-8">
|
|
125
|
+
{% if policy.count_weekends %}
|
|
126
|
+
<i class="bi bi-check-circle text-success"></i> {{ _('Sí') }}
|
|
127
|
+
{% else %}
|
|
128
|
+
<i class="bi bi-x-circle text-danger"></i> {{ _('No') }}
|
|
129
|
+
{% endif %}
|
|
130
|
+
</dd>
|
|
131
|
+
|
|
132
|
+
<dt class="col-sm-4">{{ _('Contar Feriados') }}</dt>
|
|
133
|
+
<dd class="col-sm-8">
|
|
134
|
+
{% if policy.count_holidays %}
|
|
135
|
+
<i class="bi bi-check-circle text-success"></i> {{ _('Sí') }}
|
|
136
|
+
{% else %}
|
|
137
|
+
<i class="bi bi-x-circle text-danger"></i> {{ _('No') }}
|
|
138
|
+
{% endif %}
|
|
139
|
+
</dd>
|
|
140
|
+
|
|
141
|
+
<dt class="col-sm-4">{{ _('Pagar al Terminar') }}</dt>
|
|
142
|
+
<dd class="col-sm-8">
|
|
143
|
+
{% if policy.payout_on_termination %}
|
|
144
|
+
<i class="bi bi-check-circle text-success"></i> {{ _('Sí') }}
|
|
145
|
+
{% else %}
|
|
146
|
+
<i class="bi bi-x-circle text-danger"></i> {{ _('No') }}
|
|
147
|
+
{% endif %}
|
|
148
|
+
</dd>
|
|
149
|
+
|
|
150
|
+
<dt class="col-sm-4">{{ _('Acumular Durante Vacaciones') }}</dt>
|
|
151
|
+
<dd class="col-sm-8">
|
|
152
|
+
{% if policy.accrue_during_leave %}
|
|
153
|
+
<i class="bi bi-check-circle text-success"></i> {{ _('Sí') }}
|
|
154
|
+
{% else %}
|
|
155
|
+
<i class="bi bi-x-circle text-danger"></i> {{ _('No') }}
|
|
156
|
+
{% endif %}
|
|
157
|
+
</dd>
|
|
158
|
+
</dl>
|
|
159
|
+
</div>
|
|
160
|
+
</div>
|
|
161
|
+
</div>
|
|
162
|
+
|
|
163
|
+
<div class="col-md-4">
|
|
164
|
+
<div class="card">
|
|
165
|
+
<div class="card-header">
|
|
166
|
+
<h5 class="mb-0">{{ _('Estadísticas') }}</h5>
|
|
167
|
+
</div>
|
|
168
|
+
<div class="card-body text-center">
|
|
169
|
+
<h3>{{ total_accounts }}</h3>
|
|
170
|
+
<p class="text-muted">{{ _('Cuentas Activas') }}</p>
|
|
171
|
+
</div>
|
|
172
|
+
</div>
|
|
173
|
+
</div>
|
|
174
|
+
</div>
|
|
175
|
+
</div>
|
|
176
|
+
{% endblock %}
|
|
@@ -0,0 +1,152 @@
|
|
|
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.policy_index') }}" 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-body">
|
|
18
|
+
<form method="POST" action="">
|
|
19
|
+
{{ form.hidden_tag() }}
|
|
20
|
+
|
|
21
|
+
<h5 class="mb-3">{{ _('Información General') }}</h5>
|
|
22
|
+
<div class="row">
|
|
23
|
+
<div class="col-md-4">
|
|
24
|
+
{{ render_field(form.codigo) }}
|
|
25
|
+
</div>
|
|
26
|
+
<div class="col-md-8">
|
|
27
|
+
{{ render_field(form.nombre) }}
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
<div class="row">
|
|
32
|
+
<div class="col-md-12">
|
|
33
|
+
{{ render_field(form.descripcion) }}
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
|
|
37
|
+
<div class="alert alert-info">
|
|
38
|
+
<i class="bi bi-info-circle me-2"></i>
|
|
39
|
+
<strong>{{ _('Asociación de Política:') }}</strong> {{ _('Las políticas pueden asociarse a una Planilla específica (recomendado para multi-país) o a una Empresa completa. Una instalación puede tener varias planillas con distintas reglas de vacaciones.') }}
|
|
40
|
+
</div>
|
|
41
|
+
|
|
42
|
+
<div class="row">
|
|
43
|
+
<div class="col-md-6">
|
|
44
|
+
{{ render_field(form.planilla_id) }}
|
|
45
|
+
</div>
|
|
46
|
+
<div class="col-md-6">
|
|
47
|
+
{{ render_field(form.empresa_id) }}
|
|
48
|
+
</div>
|
|
49
|
+
</div>
|
|
50
|
+
|
|
51
|
+
<div class="row">
|
|
52
|
+
<div class="col-md-12">
|
|
53
|
+
{{ render_field(form.activo) }}
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
|
|
57
|
+
<hr class="my-4">
|
|
58
|
+
|
|
59
|
+
<h5 class="mb-3">{{ _('Configuración de Acumulación') }}</h5>
|
|
60
|
+
<div class="row">
|
|
61
|
+
<div class="col-md-4">
|
|
62
|
+
{{ render_field(form.accrual_method) }}
|
|
63
|
+
</div>
|
|
64
|
+
<div class="col-md-4">
|
|
65
|
+
{{ render_field(form.accrual_rate) }}
|
|
66
|
+
</div>
|
|
67
|
+
<div class="col-md-4">
|
|
68
|
+
{{ render_field(form.accrual_frequency) }}
|
|
69
|
+
</div>
|
|
70
|
+
</div>
|
|
71
|
+
|
|
72
|
+
<div class="row">
|
|
73
|
+
<div class="col-md-6">
|
|
74
|
+
{{ render_field(form.accrual_basis) }}
|
|
75
|
+
</div>
|
|
76
|
+
<div class="col-md-6">
|
|
77
|
+
{{ render_field(form.min_service_days) }}
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
|
|
81
|
+
<hr class="my-4">
|
|
82
|
+
|
|
83
|
+
<h5 class="mb-3">{{ _('Límites de Balance') }}</h5>
|
|
84
|
+
<div class="row">
|
|
85
|
+
<div class="col-md-4">
|
|
86
|
+
{{ render_field(form.max_balance) }}
|
|
87
|
+
</div>
|
|
88
|
+
<div class="col-md-4">
|
|
89
|
+
{{ render_field(form.carryover_limit) }}
|
|
90
|
+
</div>
|
|
91
|
+
<div class="col-md-4">
|
|
92
|
+
{{ render_field(form.allow_negative) }}
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
|
|
96
|
+
<hr class="my-4">
|
|
97
|
+
|
|
98
|
+
<h5 class="mb-3">{{ _('Reglas de Vencimiento') }}</h5>
|
|
99
|
+
<div class="row">
|
|
100
|
+
<div class="col-md-4">
|
|
101
|
+
{{ render_field(form.expiration_rule) }}
|
|
102
|
+
</div>
|
|
103
|
+
<div class="col-md-4">
|
|
104
|
+
{{ render_field(form.expiration_months) }}
|
|
105
|
+
</div>
|
|
106
|
+
<div class="col-md-4">
|
|
107
|
+
{{ render_field(form.expiration_date) }}
|
|
108
|
+
</div>
|
|
109
|
+
</div>
|
|
110
|
+
|
|
111
|
+
<hr class="my-4">
|
|
112
|
+
|
|
113
|
+
<h5 class="mb-3">{{ _('Configuración de Uso') }}</h5>
|
|
114
|
+
<div class="row">
|
|
115
|
+
<div class="col-md-4">
|
|
116
|
+
{{ render_field(form.unit_type) }}
|
|
117
|
+
</div>
|
|
118
|
+
<div class="col-md-4">
|
|
119
|
+
{{ render_field(form.payout_on_termination) }}
|
|
120
|
+
</div>
|
|
121
|
+
<div class="col-md-4">
|
|
122
|
+
{{ render_field(form.accrue_during_leave) }}
|
|
123
|
+
</div>
|
|
124
|
+
</div>
|
|
125
|
+
|
|
126
|
+
<div class="row">
|
|
127
|
+
<div class="col-md-4">
|
|
128
|
+
{{ render_field(form.count_weekends) }}
|
|
129
|
+
</div>
|
|
130
|
+
<div class="col-md-4">
|
|
131
|
+
{{ render_field(form.count_holidays) }}
|
|
132
|
+
</div>
|
|
133
|
+
<div class="col-md-4">
|
|
134
|
+
{{ render_field(form.partial_units_allowed) }}
|
|
135
|
+
</div>
|
|
136
|
+
</div>
|
|
137
|
+
|
|
138
|
+
<div class="row">
|
|
139
|
+
<div class="col-md-12">
|
|
140
|
+
{{ render_field(form.rounding_rule) }}
|
|
141
|
+
</div>
|
|
142
|
+
</div>
|
|
143
|
+
|
|
144
|
+
<div class="mt-4">
|
|
145
|
+
{{ form.submit(class="btn btn-primary") }}
|
|
146
|
+
<a href="{{ url_for('vacation.policy_index') }}" class="btn btn-secondary">{{ _('Cancelar') }}</a>
|
|
147
|
+
</div>
|
|
148
|
+
</form>
|
|
149
|
+
</div>
|
|
150
|
+
</div>
|
|
151
|
+
</div>
|
|
152
|
+
{% endblock %}
|