coati-payroll 0.0.11__py3-none-any.whl → 0.0.13__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.

Files changed (244) hide show
  1. coati_payroll/__init__.py +7 -17
  2. coati_payroll/app.py +2 -13
  3. coati_payroll/audit_helpers.py +2 -13
  4. coati_payroll/auth.py +2 -13
  5. coati_payroll/cli.py +17 -14
  6. coati_payroll/config.py +2 -13
  7. coati_payroll/demo_data.py +2 -13
  8. coati_payroll/enums.py +2 -13
  9. coati_payroll/forms.py +7 -13
  10. coati_payroll/formula_engine/__init__.py +14 -13
  11. coati_payroll/formula_engine/ast/__init__.py +16 -1
  12. coati_payroll/formula_engine/ast/ast_visitor.py +15 -17
  13. coati_payroll/formula_engine/ast/expression_evaluator.py +12 -14
  14. coati_payroll/formula_engine/ast/safe_operators.py +16 -15
  15. coati_payroll/formula_engine/ast/type_converter.py +17 -17
  16. coati_payroll/formula_engine/data_sources.py +3 -13
  17. coati_payroll/formula_engine/engine.py +12 -13
  18. coati_payroll/formula_engine/exceptions.py +13 -13
  19. coati_payroll/formula_engine/execution/__init__.py +15 -13
  20. coati_payroll/formula_engine/execution/execution_context.py +12 -13
  21. coati_payroll/formula_engine/execution/step_executor.py +12 -14
  22. coati_payroll/formula_engine/execution/variable_store.py +13 -13
  23. coati_payroll/formula_engine/novelty_codes.py +3 -13
  24. coati_payroll/formula_engine/results/__init__.py +14 -13
  25. coati_payroll/formula_engine/results/execution_result.py +47 -35
  26. coati_payroll/formula_engine/steps/__init__.py +14 -14
  27. coati_payroll/formula_engine/steps/assignment_step.py +12 -13
  28. coati_payroll/formula_engine/steps/base_step.py +13 -13
  29. coati_payroll/formula_engine/steps/calculation_step.py +12 -13
  30. coati_payroll/formula_engine/steps/conditional_step.py +12 -13
  31. coati_payroll/formula_engine/steps/step_factory.py +11 -13
  32. coati_payroll/formula_engine/steps/tax_lookup_step.py +12 -13
  33. coati_payroll/formula_engine/tables/__init__.py +14 -13
  34. coati_payroll/formula_engine/tables/bracket_calculator.py +12 -13
  35. coati_payroll/formula_engine/tables/table_lookup.py +12 -14
  36. coati_payroll/formula_engine/tables/tax_table.py +13 -13
  37. coati_payroll/formula_engine/validation/__init__.py +14 -13
  38. coati_payroll/formula_engine/validation/schema_validator.py +12 -14
  39. coati_payroll/formula_engine/validation/security_validator.py +12 -13
  40. coati_payroll/formula_engine/validation/tax_table_validator.py +12 -13
  41. coati_payroll/formula_engine_examples.py +2 -13
  42. coati_payroll/i18n.py +2 -13
  43. coati_payroll/initial_data.py +2 -13
  44. coati_payroll/interes_engine.py +2 -13
  45. coati_payroll/liquidacion_engine/__init__.py +2 -13
  46. coati_payroll/liquidacion_engine/engine.py +2 -13
  47. coati_payroll/locale_config.py +2 -13
  48. coati_payroll/migrations/20260125_032900_initial_migration.py +2 -14
  49. coati_payroll/migrations/__init__.py +2 -13
  50. coati_payroll/model.py +83 -82
  51. coati_payroll/nomina_engine/__init__.py +2 -13
  52. coati_payroll/nomina_engine/calculators/__init__.py +2 -13
  53. coati_payroll/nomina_engine/calculators/benefit_calculator.py +2 -13
  54. coati_payroll/nomina_engine/calculators/concept_calculator.py +2 -1
  55. coati_payroll/nomina_engine/calculators/deduction_calculator.py +2 -13
  56. coati_payroll/nomina_engine/calculators/exchange_rate_calculator.py +2 -13
  57. coati_payroll/nomina_engine/calculators/perception_calculator.py +2 -13
  58. coati_payroll/nomina_engine/calculators/salary_calculator.py +2 -13
  59. coati_payroll/nomina_engine/domain/__init__.py +2 -13
  60. coati_payroll/nomina_engine/domain/calculation_items.py +2 -13
  61. coati_payroll/nomina_engine/domain/employee_calculation.py +2 -13
  62. coati_payroll/nomina_engine/domain/payroll_context.py +2 -13
  63. coati_payroll/nomina_engine/engine.py +2 -13
  64. coati_payroll/nomina_engine/processors/__init__.py +2 -13
  65. coati_payroll/nomina_engine/processors/accounting_processor.py +2 -13
  66. coati_payroll/nomina_engine/processors/accumulation_processor.py +2 -13
  67. coati_payroll/nomina_engine/processors/loan_processor.py +2 -13
  68. coati_payroll/nomina_engine/processors/novelty_processor.py +2 -13
  69. coati_payroll/nomina_engine/processors/vacation_processor.py +2 -13
  70. coati_payroll/nomina_engine/repositories/__init__.py +2 -13
  71. coati_payroll/nomina_engine/repositories/acumulado_repository.py +2 -13
  72. coati_payroll/nomina_engine/repositories/base_repository.py +2 -13
  73. coati_payroll/nomina_engine/repositories/config_repository.py +2 -13
  74. coati_payroll/nomina_engine/repositories/employee_repository.py +2 -13
  75. coati_payroll/nomina_engine/repositories/exchange_rate_repository.py +2 -13
  76. coati_payroll/nomina_engine/repositories/novelty_repository.py +2 -13
  77. coati_payroll/nomina_engine/repositories/planilla_repository.py +2 -13
  78. coati_payroll/nomina_engine/results/__init__.py +2 -13
  79. coati_payroll/nomina_engine/results/error_result.py +2 -13
  80. coati_payroll/nomina_engine/results/payroll_result.py +2 -13
  81. coati_payroll/nomina_engine/results/validation_result.py +2 -13
  82. coati_payroll/nomina_engine/services/__init__.py +2 -13
  83. coati_payroll/nomina_engine/services/accounting_voucher_service.py +2 -13
  84. coati_payroll/nomina_engine/services/employee_processing_service.py +2 -13
  85. coati_payroll/nomina_engine/services/payroll_execution_service.py +2 -13
  86. coati_payroll/nomina_engine/validators/__init__.py +2 -13
  87. coati_payroll/nomina_engine/validators/base_validator.py +2 -13
  88. coati_payroll/nomina_engine/validators/currency_validator.py +2 -13
  89. coati_payroll/nomina_engine/validators/employee_validator.py +2 -13
  90. coati_payroll/nomina_engine/validators/period_validator.py +2 -13
  91. coati_payroll/nomina_engine/validators/planilla_validator.py +2 -13
  92. coati_payroll/queue/__init__.py +2 -13
  93. coati_payroll/queue/driver.py +2 -13
  94. coati_payroll/queue/drivers/__init__.py +2 -13
  95. coati_payroll/queue/drivers/dramatiq_driver.py +9 -16
  96. coati_payroll/queue/drivers/huey_driver.py +2 -13
  97. coati_payroll/queue/drivers/noop_driver.py +2 -13
  98. coati_payroll/queue/selector.py +2 -13
  99. coati_payroll/queue/tasks.py +13 -20
  100. coati_payroll/rate_limiting.py +2 -13
  101. coati_payroll/rbac.py +12 -19
  102. coati_payroll/report_engine.py +2 -13
  103. coati_payroll/report_export.py +2 -13
  104. coati_payroll/schema_validator.py +2 -13
  105. coati_payroll/security.py +2 -13
  106. coati_payroll/static/schema_editor.js +862 -0
  107. coati_payroll/static/styles.css +5 -0
  108. coati_payroll/system_reports.py +2 -13
  109. coati_payroll/templates/auth/login.html +5 -0
  110. coati_payroll/templates/base.html +5 -1
  111. coati_payroll/templates/index.html +5 -0
  112. coati_payroll/templates/macros.html +5 -0
  113. coati_payroll/templates/modules/calculation_rule/form.html +5 -0
  114. coati_payroll/templates/modules/calculation_rule/index.html +5 -0
  115. coati_payroll/templates/modules/calculation_rule/schema_editor.html +292 -974
  116. coati_payroll/templates/modules/carga_inicial_prestacion/form.html +5 -0
  117. coati_payroll/templates/modules/carga_inicial_prestacion/index.html +5 -0
  118. coati_payroll/templates/modules/carga_inicial_prestacion/reporte.html +5 -0
  119. coati_payroll/templates/modules/config_calculos/index.html +5 -0
  120. coati_payroll/templates/modules/configuracion/index.html +24 -27
  121. coati_payroll/templates/modules/currency/form.html +5 -0
  122. coati_payroll/templates/modules/currency/index.html +5 -0
  123. coati_payroll/templates/modules/custom_field/form.html +5 -0
  124. coati_payroll/templates/modules/custom_field/index.html +5 -0
  125. coati_payroll/templates/modules/deduccion/form.html +5 -0
  126. coati_payroll/templates/modules/deduccion/index.html +5 -0
  127. coati_payroll/templates/modules/employee/form.html +5 -0
  128. coati_payroll/templates/modules/employee/index.html +5 -0
  129. coati_payroll/templates/modules/empresa/form.html +5 -0
  130. coati_payroll/templates/modules/empresa/index.html +5 -0
  131. coati_payroll/templates/modules/exchange_rate/form.html +5 -0
  132. coati_payroll/templates/modules/exchange_rate/import.html +5 -0
  133. coati_payroll/templates/modules/exchange_rate/index.html +5 -0
  134. coati_payroll/templates/modules/liquidacion/index.html +5 -0
  135. coati_payroll/templates/modules/liquidacion/nueva.html +5 -0
  136. coati_payroll/templates/modules/liquidacion/ver.html +5 -0
  137. coati_payroll/templates/modules/payroll_concepts/audit_log.html +5 -0
  138. coati_payroll/templates/modules/percepcion/form.html +5 -0
  139. coati_payroll/templates/modules/percepcion/index.html +5 -0
  140. coati_payroll/templates/modules/planilla/config.html +5 -0
  141. coati_payroll/templates/modules/planilla/config_deducciones.html +5 -0
  142. coati_payroll/templates/modules/planilla/config_empleados.html +5 -0
  143. coati_payroll/templates/modules/planilla/config_percepciones.html +5 -0
  144. coati_payroll/templates/modules/planilla/config_prestaciones.html +5 -0
  145. coati_payroll/templates/modules/planilla/config_reglas.html +5 -0
  146. coati_payroll/templates/modules/planilla/ejecutar_nomina.html +5 -0
  147. coati_payroll/templates/modules/planilla/form.html +5 -0
  148. coati_payroll/templates/modules/planilla/index.html +5 -0
  149. coati_payroll/templates/modules/planilla/listar_nominas.html +5 -0
  150. coati_payroll/templates/modules/planilla/log_nomina.html +5 -0
  151. coati_payroll/templates/modules/planilla/novedades/form.html +5 -0
  152. coati_payroll/templates/modules/planilla/novedades/index.html +5 -0
  153. coati_payroll/templates/modules/planilla/ver_nomina.html +5 -0
  154. coati_payroll/templates/modules/planilla/ver_nomina_empleado.html +5 -0
  155. coati_payroll/templates/modules/plugins/index.html +5 -0
  156. coati_payroll/templates/modules/prestacion/form.html +5 -0
  157. coati_payroll/templates/modules/prestacion/index.html +5 -0
  158. coati_payroll/templates/modules/prestacion_management/dashboard.html +5 -0
  159. coati_payroll/templates/modules/prestacion_management/initial_balance_bulk.html +5 -0
  160. coati_payroll/templates/modules/prestamo/approve.html +5 -0
  161. coati_payroll/templates/modules/prestamo/condonacion.html +5 -0
  162. coati_payroll/templates/modules/prestamo/detail.html +5 -0
  163. coati_payroll/templates/modules/prestamo/form.html +5 -0
  164. coati_payroll/templates/modules/prestamo/index.html +5 -0
  165. coati_payroll/templates/modules/prestamo/pago_extraordinario.html +5 -0
  166. coati_payroll/templates/modules/prestamo/tabla_pago_pdf.html +5 -0
  167. coati_payroll/templates/modules/report/admin_index.html +5 -0
  168. coati_payroll/templates/modules/report/detail.html +5 -0
  169. coati_payroll/templates/modules/report/execute.html +5 -0
  170. coati_payroll/templates/modules/report/index.html +5 -0
  171. coati_payroll/templates/modules/report/permissions.html +5 -0
  172. coati_payroll/templates/modules/settings/index.html +5 -0
  173. coati_payroll/templates/modules/shared/concept_form.html +19 -12
  174. coati_payroll/templates/modules/shared/concept_index.html +39 -27
  175. coati_payroll/templates/modules/tipo_planilla/form.html +5 -0
  176. coati_payroll/templates/modules/tipo_planilla/index.html +5 -0
  177. coati_payroll/templates/modules/user/form.html +5 -0
  178. coati_payroll/templates/modules/user/index.html +5 -0
  179. coati_payroll/templates/modules/user/profile.html +5 -0
  180. coati_payroll/templates/modules/vacation/account_detail.html +5 -0
  181. coati_payroll/templates/modules/vacation/account_form.html +5 -0
  182. coati_payroll/templates/modules/vacation/account_index.html +5 -0
  183. coati_payroll/templates/modules/vacation/dashboard.html +5 -0
  184. coati_payroll/templates/modules/vacation/initial_balance_bulk.html +5 -0
  185. coati_payroll/templates/modules/vacation/initial_balance_form.html +5 -0
  186. coati_payroll/templates/modules/vacation/leave_request_detail.html +5 -0
  187. coati_payroll/templates/modules/vacation/leave_request_form.html +5 -0
  188. coati_payroll/templates/modules/vacation/leave_request_index.html +5 -0
  189. coati_payroll/templates/modules/vacation/policy_detail.html +5 -0
  190. coati_payroll/templates/modules/vacation/policy_form.html +5 -0
  191. coati_payroll/templates/modules/vacation/policy_index.html +5 -0
  192. coati_payroll/templates/modules/vacation/register_taken_form.html +5 -0
  193. coati_payroll/translations/en/LC_MESSAGES/messages.mo +0 -0
  194. coati_payroll/translations/en/LC_MESSAGES/messages.po +2963 -3561
  195. coati_payroll/vacation_service.py +2 -13
  196. coati_payroll/version.py +3 -14
  197. coati_payroll/vistas/__init__.py +2 -13
  198. coati_payroll/vistas/calculation_rule.py +14 -24
  199. coati_payroll/vistas/carga_inicial_prestacion.py +2 -13
  200. coati_payroll/vistas/config_calculos.py +2 -13
  201. coati_payroll/vistas/configuracion.py +29 -39
  202. coati_payroll/vistas/constants.py +2 -13
  203. coati_payroll/vistas/currency.py +2 -13
  204. coati_payroll/vistas/custom_field.py +2 -13
  205. coati_payroll/vistas/employee.py +2 -13
  206. coati_payroll/vistas/empresa.py +2 -13
  207. coati_payroll/vistas/exchange_rate.py +2 -13
  208. coati_payroll/vistas/liquidacion.py +2 -13
  209. coati_payroll/vistas/payroll_concepts.py +2 -13
  210. coati_payroll/vistas/planilla/__init__.py +2 -13
  211. coati_payroll/vistas/planilla/association_routes.py +8 -17
  212. coati_payroll/vistas/planilla/config_routes.py +2 -13
  213. coati_payroll/vistas/planilla/export_routes.py +28 -35
  214. coati_payroll/vistas/planilla/helpers/__init__.py +2 -13
  215. coati_payroll/vistas/planilla/helpers/association_helpers.py +2 -13
  216. coati_payroll/vistas/planilla/helpers/excel_helpers.py +2 -13
  217. coati_payroll/vistas/planilla/helpers/form_helpers.py +2 -13
  218. coati_payroll/vistas/planilla/nomina_routes.py +2 -13
  219. coati_payroll/vistas/planilla/novedad_routes.py +2 -13
  220. coati_payroll/vistas/planilla/routes.py +2 -13
  221. coati_payroll/vistas/planilla/services/__init__.py +2 -13
  222. coati_payroll/vistas/planilla/services/export_service.py +4 -15
  223. coati_payroll/vistas/planilla/services/nomina_service.py +2 -13
  224. coati_payroll/vistas/planilla/services/novedad_service.py +3 -16
  225. coati_payroll/vistas/planilla/services/planilla_service.py +2 -13
  226. coati_payroll/vistas/planilla/validators/__init__.py +2 -13
  227. coati_payroll/vistas/planilla/validators/planilla_validators.py +2 -13
  228. coati_payroll/vistas/prestacion.py +2 -13
  229. coati_payroll/vistas/prestamo.py +2 -13
  230. coati_payroll/vistas/report.py +2 -13
  231. coati_payroll/vistas/settings.py +2 -13
  232. coati_payroll/vistas/tipo_planilla.py +2 -13
  233. coati_payroll/vistas/user.py +2 -13
  234. coati_payroll/vistas/vacation.py +15 -13
  235. coati_payroll/wsgi_server.py +37 -0
  236. {coati_payroll-0.0.11.dist-info → coati_payroll-0.0.13.dist-info}/METADATA +11 -4
  237. coati_payroll-0.0.13.dist-info/RECORD +248 -0
  238. coati_payroll/translations/es/LC_MESSAGES/messages.mo +0 -0
  239. coati_payroll/translations/es/LC_MESSAGES/messages.po +0 -7374
  240. coati_payroll-0.0.11.dist-info/RECORD +0 -248
  241. {coati_payroll-0.0.11.dist-info → coati_payroll-0.0.13.dist-info}/LICENSE +0 -0
  242. {coati_payroll-0.0.11.dist-info → coati_payroll-0.0.13.dist-info}/WHEEL +0 -0
  243. {coati_payroll-0.0.11.dist-info → coati_payroll-0.0.13.dist-info}/entry_points.txt +0 -0
  244. {coati_payroll-0.0.11.dist-info → coati_payroll-0.0.13.dist-info}/top_level.txt +0 -0
@@ -1,3 +1,8 @@
1
+ {#-
2
+ SPDX-License-Identifier: Apache-2.0
3
+ SPDX-FileCopyrightText: 2025 - 2026 BMO Soluciones, S.A.
4
+ -#}
5
+
1
6
  {% extends "base.html" %}
2
7
  {% from "macros.html" import render_field %}
3
8
 
@@ -8,7 +13,8 @@
8
13
  <nav aria-label="breadcrumb">
9
14
  <ol class="breadcrumb">
10
15
  <li class="breadcrumb-item">
11
- <a href="{{ url_for(config.blueprint + '.' + config.route_prefix + 'index') }}">{{ config.plural }}</a>
16
+ <a
17
+ href="{{ url_for(config.blueprint + '.' + config.route_prefix + 'index') }}">{{ config.plural }}</a>
12
18
  </li>
13
19
  <li class="breadcrumb-item active" aria-current="page">{{ title }}</li>
14
20
  </ol>
@@ -28,12 +34,12 @@
28
34
  <div class="card-body">
29
35
  <form method="POST" novalidate>
30
36
  {{ form.hidden_tag() }}
31
-
37
+
32
38
  <!-- Basic Information -->
33
39
  <h5 class="border-bottom pb-2 mb-3">
34
40
  <i class="bi bi-info-circle me-2"></i>{{ _('Información Básica') }}
35
41
  </h5>
36
-
42
+
37
43
  <div class="row">
38
44
  <div class="col-md-4">
39
45
  {{ render_field(form.codigo) }}
@@ -42,7 +48,7 @@
42
48
  {{ render_field(form.nombre) }}
43
49
  </div>
44
50
  </div>
45
-
51
+
46
52
  <div class="row">
47
53
  <div class="col-12">
48
54
  {{ render_field(form.descripcion) }}
@@ -69,7 +75,7 @@
69
75
  <h5 class="border-bottom pb-2 mb-3 mt-4">
70
76
  <i class="bi bi-calculator me-2"></i>{{ _('Configuración de Cálculo') }}
71
77
  </h5>
72
-
78
+
73
79
  <div class="row">
74
80
  <div class="col-md-4">
75
81
  {{ render_field(form.formula_tipo) }}
@@ -81,7 +87,7 @@
81
87
  {{ render_field(form.porcentaje) }}
82
88
  </div>
83
89
  </div>
84
-
90
+
85
91
  <div class="row">
86
92
  <div class="col-md-6">
87
93
  {{ render_field(form.base_calculo) }}
@@ -105,7 +111,7 @@
105
111
  <h5 class="border-bottom pb-2 mb-3 mt-4">
106
112
  <i class="bi bi-toggles me-2"></i>{{ _('Opciones') }}
107
113
  </h5>
108
-
114
+
109
115
  <div class="row">
110
116
  {% if form.gravable is defined %}
111
117
  <div class="col-md-3">
@@ -132,7 +138,7 @@
132
138
  </div>
133
139
  </div>
134
140
  </div>
135
-
141
+
136
142
  {% if form.editable_en_nomina is defined %}
137
143
  <div class="row">
138
144
  <div class="col-md-6">
@@ -147,7 +153,7 @@
147
153
  <h5 class="border-bottom pb-2 mb-3 mt-4">
148
154
  <i class="bi bi-calendar-range me-2"></i>{{ _('Vigencia') }}
149
155
  </h5>
150
-
156
+
151
157
  <div class="row">
152
158
  {% if form.vigente_desde is defined %}
153
159
  <div class="col-md-6">
@@ -165,7 +171,7 @@
165
171
  <h5 class="border-bottom pb-2 mb-3 mt-4">
166
172
  <i class="bi bi-journal-text me-2"></i>{{ _('Configuración Contable') }}
167
173
  </h5>
168
-
174
+
169
175
  <div class="row">
170
176
  <div class="col-md-4">
171
177
  <div class="mb-3">
@@ -173,7 +179,7 @@
173
179
  </div>
174
180
  </div>
175
181
  </div>
176
-
182
+
177
183
  <div class="row">
178
184
  <div class="col-md-6">
179
185
  {{ render_field(form.codigo_cuenta_debe) }}
@@ -185,7 +191,8 @@
185
191
 
186
192
  <!-- Actions -->
187
193
  <div class="d-flex justify-content-between mt-4 pt-3 border-top">
188
- <a href="{{ url_for(config.blueprint + '.' + config.route_prefix + 'index') }}" class="btn btn-outline-secondary">
194
+ <a href="{{ url_for(config.blueprint + '.' + config.route_prefix + 'index') }}"
195
+ class="btn btn-outline-secondary">
189
196
  <i class="bi bi-arrow-left me-1"></i> {{ _('Cancelar') }}
190
197
  </a>
191
198
  <button type="submit" class="btn btn-primary">
@@ -1,7 +1,13 @@
1
+ {#-
2
+ SPDX-License-Identifier: Apache-2.0
3
+ SPDX-FileCopyrightText: 2025 - 2026 BMO Soluciones, S.A.
4
+ -#}
5
+
1
6
  {% extends "base.html" %}
2
- {% from "macros.html" import render_field %}
7
+ {% from "macros.html" import render_field, render_messages%}
3
8
 
4
9
  {% block content %}
10
+ {{ render_messages() }}
5
11
  <div class="container-fluid py-4">
6
12
  <div class="row">
7
13
  <div class="col-12">
@@ -69,15 +75,16 @@
69
75
  {% endif %}
70
76
  </td>
71
77
  <td class="text-end">
72
- <a href="{{ url_for(config.blueprint + '.' + config.route_prefix + 'edit', concept_id=item.id) }}"
73
- class="btn btn-sm btn-outline-primary"
74
- title="{{ _('Editar') }}">
78
+ <a href="{{ url_for(config.blueprint + '.' + config.route_prefix + 'edit', concept_id=item.id) }}"
79
+ class="btn btn-sm btn-outline-primary" title="{{ _('Editar') }}">
75
80
  <i class="bi bi-pencil"></i>
76
81
  </a>
77
- <form action="{{ url_for(config.blueprint + '.' + config.route_prefix + 'delete', concept_id=item.id) }}"
78
- method="post" class="d-inline"
79
- onsubmit="return confirm('{{ _('¿Está seguro de eliminar esta %(type)s?', type=config.singular) }}');">
80
- <button type="submit" class="btn btn-sm btn-outline-danger" title="{{ _('Eliminar') }}">
82
+ <form
83
+ action="{{ url_for(config.blueprint + '.' + config.route_prefix + 'delete', concept_id=item.id) }}"
84
+ method="post" class="d-inline"
85
+ onsubmit="return confirm('{{ _('¿Está seguro de eliminar esta %(type)s?', type=config.singular) }}');">
86
+ <button type="submit" class="btn btn-sm btn-outline-danger"
87
+ title="{{ _('Eliminar') }}">
81
88
  <i class="bi bi-trash"></i>
82
89
  </button>
83
90
  </form>
@@ -94,31 +101,34 @@
94
101
  <ul class="pagination justify-content-center mb-0">
95
102
  {% if pagination.has_prev %}
96
103
  <li class="page-item">
97
- <a class="page-link" href="{{ url_for(config.blueprint + '.' + config.route_prefix + 'index', page=pagination.prev_num) }}">
104
+ <a class="page-link"
105
+ href="{{ url_for(config.blueprint + '.' + config.route_prefix + 'index', page=pagination.prev_num) }}">
98
106
  <i class="bi bi-chevron-left"></i>
99
107
  </a>
100
108
  </li>
101
109
  {% endif %}
102
-
110
+
103
111
  {% for page_num in pagination.iter_pages(left_edge=1, right_edge=1, left_current=2, right_current=2) %}
104
- {% if page_num %}
105
- {% if page_num == pagination.page %}
106
- <li class="page-item active">
107
- <span class="page-link">{{ page_num }}</span>
108
- </li>
109
- {% else %}
110
- <li class="page-item">
111
- <a class="page-link" href="{{ url_for(config.blueprint + '.' + config.route_prefix + 'index', page=page_num) }}">{{ page_num }}</a>
112
- </li>
113
- {% endif %}
114
- {% else %}
115
- <li class="page-item disabled"><span class="page-link">...</span></li>
116
- {% endif %}
112
+ {% if page_num %}
113
+ {% if page_num == pagination.page %}
114
+ <li class="page-item active">
115
+ <span class="page-link">{{ page_num }}</span>
116
+ </li>
117
+ {% else %}
118
+ <li class="page-item">
119
+ <a class="page-link"
120
+ href="{{ url_for(config.blueprint + '.' + config.route_prefix + 'index', page=page_num) }}">{{ page_num }}</a>
121
+ </li>
122
+ {% endif %}
123
+ {% else %}
124
+ <li class="page-item disabled"><span class="page-link">...</span></li>
125
+ {% endif %}
117
126
  {% endfor %}
118
-
127
+
119
128
  {% if pagination.has_next %}
120
129
  <li class="page-item">
121
- <a class="page-link" href="{{ url_for(config.blueprint + '.' + config.route_prefix + 'index', page=pagination.next_num) }}">
130
+ <a class="page-link"
131
+ href="{{ url_for(config.blueprint + '.' + config.route_prefix + 'index', page=pagination.next_num) }}">
122
132
  <i class="bi bi-chevron-right"></i>
123
133
  </a>
124
134
  </li>
@@ -131,8 +141,10 @@
131
141
  <div class="text-center py-5">
132
142
  <i class="bi {{ config.icon }} display-1 text-muted"></i>
133
143
  <h4 class="mt-3">{{ _('No hay %(type)s registradas', type=config.plural|lower) }}</h4>
134
- <p class="text-muted">{{ _('Comience creando una nueva %(type)s', type=config.singular|lower) }}</p>
135
- <a href="{{ url_for(config.blueprint + '.' + config.route_prefix + 'new') }}" class="btn btn-primary">
144
+ <p class="text-muted">{{ _('Comience creando una nueva %(type)s', type=config.singular|lower) }}
145
+ </p>
146
+ <a href="{{ url_for(config.blueprint + '.' + config.route_prefix + 'new') }}"
147
+ class="btn btn-primary">
136
148
  <i class="bi bi-plus-lg me-1"></i> {{ _('Nueva %(type)s', type=config.singular) }}
137
149
  </a>
138
150
  </div>
@@ -1,3 +1,8 @@
1
+ {#-
2
+ SPDX-License-Identifier: Apache-2.0
3
+ SPDX-FileCopyrightText: 2025 - 2026 BMO Soluciones, S.A.
4
+ -#}
5
+
1
6
  {% extends 'base.html' %}
2
7
  {% from 'macros.html' import render_field, render_messages, render_form_errors %}
3
8
 
@@ -1,3 +1,8 @@
1
+ {#-
2
+ SPDX-License-Identifier: Apache-2.0
3
+ SPDX-FileCopyrightText: 2025 - 2026 BMO Soluciones, S.A.
4
+ -#}
5
+
1
6
  {% extends 'base.html' %}
2
7
  {% from 'macros.html' import render_messages, render_pagination %}
3
8
 
@@ -1,3 +1,8 @@
1
+ {#-
2
+ SPDX-License-Identifier: Apache-2.0
3
+ SPDX-FileCopyrightText: 2025 - 2026 BMO Soluciones, S.A.
4
+ -#}
5
+
1
6
  {% extends 'base.html' %}
2
7
  {% from 'macros.html' import render_field, render_messages, render_form_errors %}
3
8
 
@@ -1,3 +1,8 @@
1
+ {#-
2
+ SPDX-License-Identifier: Apache-2.0
3
+ SPDX-FileCopyrightText: 2025 - 2026 BMO Soluciones, S.A.
4
+ -#}
5
+
1
6
  {% extends 'base.html' %}
2
7
  {% from 'macros.html' import render_messages, render_pagination %}
3
8
 
@@ -1,3 +1,8 @@
1
+ {#-
2
+ SPDX-License-Identifier: Apache-2.0
3
+ SPDX-FileCopyrightText: 2025 - 2026 BMO Soluciones, S.A.
4
+ -#}
5
+
1
6
  {% extends 'base.html' %}
2
7
  {% from 'macros.html' import render_field, render_messages, render_form_errors %}
3
8
 
@@ -1,3 +1,8 @@
1
+ {#-
2
+ SPDX-License-Identifier: Apache-2.0
3
+ SPDX-FileCopyrightText: 2025 - 2026 BMO Soluciones, S.A.
4
+ -#}
5
+
1
6
  {% extends 'base.html' %}
2
7
  {% from 'macros.html' import render_messages %}
3
8
 
@@ -1,3 +1,8 @@
1
+ {#-
2
+ SPDX-License-Identifier: Apache-2.0
3
+ SPDX-FileCopyrightText: 2025 - 2026 BMO Soluciones, S.A.
4
+ -#}
5
+
1
6
  {% extends 'base.html' %}
2
7
  {% from 'macros.html' import render_field, render_messages, render_form_errors %}
3
8
 
@@ -1,3 +1,8 @@
1
+ {#-
2
+ SPDX-License-Identifier: Apache-2.0
3
+ SPDX-FileCopyrightText: 2025 - 2026 BMO Soluciones, S.A.
4
+ -#}
5
+
1
6
  {% extends 'base.html' %}
2
7
  {% from 'macros.html' import render_messages, render_pagination %}
3
8
 
@@ -1,3 +1,8 @@
1
+ {#-
2
+ SPDX-License-Identifier: Apache-2.0
3
+ SPDX-FileCopyrightText: 2025 - 2026 BMO Soluciones, S.A.
4
+ -#}
5
+
1
6
  {% extends 'base.html' %}
2
7
  {% from 'macros.html' import render_messages %}
3
8
 
@@ -1,3 +1,8 @@
1
+ {#-
2
+ SPDX-License-Identifier: Apache-2.0
3
+ SPDX-FileCopyrightText: 2025 - 2026 BMO Soluciones, S.A.
4
+ -#}
5
+
1
6
  {% extends "base.html" %}
2
7
  {% block title %}{{ _('Carga Masiva de Saldos Iniciales de Vacaciones') }}{% endblock %}
3
8
 
@@ -1,3 +1,8 @@
1
+ {#-
2
+ SPDX-License-Identifier: Apache-2.0
3
+ SPDX-FileCopyrightText: 2025 - 2026 BMO Soluciones, S.A.
4
+ -#}
5
+
1
6
  {% extends "base.html" %}
2
7
  {% block title %}{{ _('Cargar Saldo Inicial de Vacaciones') }}{% endblock %}
3
8
 
@@ -1,3 +1,8 @@
1
+ {#-
2
+ SPDX-License-Identifier: Apache-2.0
3
+ SPDX-FileCopyrightText: 2025 - 2026 BMO Soluciones, S.A.
4
+ -#}
5
+
1
6
  {% extends 'base.html' %}
2
7
  {% from 'macros.html' import render_messages %}
3
8
 
@@ -1,3 +1,8 @@
1
+ {#-
2
+ SPDX-License-Identifier: Apache-2.0
3
+ SPDX-FileCopyrightText: 2025 - 2026 BMO Soluciones, S.A.
4
+ -#}
5
+
1
6
  {% extends 'base.html' %}
2
7
  {% from 'macros.html' import render_field, render_messages, render_form_errors %}
3
8
 
@@ -1,3 +1,8 @@
1
+ {#-
2
+ SPDX-License-Identifier: Apache-2.0
3
+ SPDX-FileCopyrightText: 2025 - 2026 BMO Soluciones, S.A.
4
+ -#}
5
+
1
6
  {% extends 'base.html' %}
2
7
  {% from 'macros.html' import render_messages, render_pagination %}
3
8
 
@@ -1,3 +1,8 @@
1
+ {#-
2
+ SPDX-License-Identifier: Apache-2.0
3
+ SPDX-FileCopyrightText: 2025 - 2026 BMO Soluciones, S.A.
4
+ -#}
5
+
1
6
  {% extends 'base.html' %}
2
7
  {% from 'macros.html' import render_messages %}
3
8
 
@@ -1,3 +1,8 @@
1
+ {#-
2
+ SPDX-License-Identifier: Apache-2.0
3
+ SPDX-FileCopyrightText: 2025 - 2026 BMO Soluciones, S.A.
4
+ -#}
5
+
1
6
  {% extends 'base.html' %}
2
7
  {% from 'macros.html' import render_field, render_messages, render_form_errors %}
3
8
 
@@ -1,3 +1,8 @@
1
+ {#-
2
+ SPDX-License-Identifier: Apache-2.0
3
+ SPDX-FileCopyrightText: 2025 - 2026 BMO Soluciones, S.A.
4
+ -#}
5
+
1
6
  {% extends 'base.html' %}
2
7
  {% from 'macros.html' import render_messages, render_pagination %}
3
8
 
@@ -1,3 +1,8 @@
1
+ {#-
2
+ SPDX-License-Identifier: Apache-2.0
3
+ SPDX-FileCopyrightText: 2025 - 2026 BMO Soluciones, S.A.
4
+ -#}
5
+
1
6
  {% extends 'base.html' %}
2
7
  {% from 'macros.html' import render_field, render_messages, render_form_errors %}
3
8