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.

Files changed (243) hide show
  1. coati_payroll/__init__.py +415 -0
  2. coati_payroll/app.py +95 -0
  3. coati_payroll/audit_helpers.py +904 -0
  4. coati_payroll/auth.py +123 -0
  5. coati_payroll/cli.py +1318 -0
  6. coati_payroll/config.py +219 -0
  7. coati_payroll/demo_data.py +813 -0
  8. coati_payroll/enums.py +278 -0
  9. coati_payroll/forms.py +1769 -0
  10. coati_payroll/formula_engine/__init__.py +81 -0
  11. coati_payroll/formula_engine/ast/__init__.py +110 -0
  12. coati_payroll/formula_engine/ast/ast_visitor.py +259 -0
  13. coati_payroll/formula_engine/ast/expression_evaluator.py +228 -0
  14. coati_payroll/formula_engine/ast/safe_operators.py +131 -0
  15. coati_payroll/formula_engine/ast/type_converter.py +172 -0
  16. coati_payroll/formula_engine/data_sources.py +752 -0
  17. coati_payroll/formula_engine/engine.py +247 -0
  18. coati_payroll/formula_engine/exceptions.py +52 -0
  19. coati_payroll/formula_engine/execution/__init__.py +24 -0
  20. coati_payroll/formula_engine/execution/execution_context.py +52 -0
  21. coati_payroll/formula_engine/execution/step_executor.py +62 -0
  22. coati_payroll/formula_engine/execution/variable_store.py +59 -0
  23. coati_payroll/formula_engine/novelty_codes.py +206 -0
  24. coati_payroll/formula_engine/results/__init__.py +20 -0
  25. coati_payroll/formula_engine/results/execution_result.py +59 -0
  26. coati_payroll/formula_engine/steps/__init__.py +30 -0
  27. coati_payroll/formula_engine/steps/assignment_step.py +71 -0
  28. coati_payroll/formula_engine/steps/base_step.py +48 -0
  29. coati_payroll/formula_engine/steps/calculation_step.py +42 -0
  30. coati_payroll/formula_engine/steps/conditional_step.py +122 -0
  31. coati_payroll/formula_engine/steps/step_factory.py +58 -0
  32. coati_payroll/formula_engine/steps/tax_lookup_step.py +45 -0
  33. coati_payroll/formula_engine/tables/__init__.py +24 -0
  34. coati_payroll/formula_engine/tables/bracket_calculator.py +51 -0
  35. coati_payroll/formula_engine/tables/table_lookup.py +161 -0
  36. coati_payroll/formula_engine/tables/tax_table.py +32 -0
  37. coati_payroll/formula_engine/validation/__init__.py +24 -0
  38. coati_payroll/formula_engine/validation/schema_validator.py +37 -0
  39. coati_payroll/formula_engine/validation/security_validator.py +52 -0
  40. coati_payroll/formula_engine/validation/tax_table_validator.py +205 -0
  41. coati_payroll/formula_engine_examples.py +153 -0
  42. coati_payroll/i18n.py +54 -0
  43. coati_payroll/initial_data.py +613 -0
  44. coati_payroll/interes_engine.py +450 -0
  45. coati_payroll/liquidacion_engine/__init__.py +25 -0
  46. coati_payroll/liquidacion_engine/engine.py +267 -0
  47. coati_payroll/locale_config.py +165 -0
  48. coati_payroll/log.py +138 -0
  49. coati_payroll/model.py +2410 -0
  50. coati_payroll/nomina_engine/__init__.py +87 -0
  51. coati_payroll/nomina_engine/calculators/__init__.py +30 -0
  52. coati_payroll/nomina_engine/calculators/benefit_calculator.py +79 -0
  53. coati_payroll/nomina_engine/calculators/concept_calculator.py +254 -0
  54. coati_payroll/nomina_engine/calculators/deduction_calculator.py +105 -0
  55. coati_payroll/nomina_engine/calculators/exchange_rate_calculator.py +51 -0
  56. coati_payroll/nomina_engine/calculators/perception_calculator.py +75 -0
  57. coati_payroll/nomina_engine/calculators/salary_calculator.py +86 -0
  58. coati_payroll/nomina_engine/domain/__init__.py +27 -0
  59. coati_payroll/nomina_engine/domain/calculation_items.py +52 -0
  60. coati_payroll/nomina_engine/domain/employee_calculation.py +53 -0
  61. coati_payroll/nomina_engine/domain/payroll_context.py +44 -0
  62. coati_payroll/nomina_engine/engine.py +188 -0
  63. coati_payroll/nomina_engine/processors/__init__.py +28 -0
  64. coati_payroll/nomina_engine/processors/accounting_processor.py +171 -0
  65. coati_payroll/nomina_engine/processors/accumulation_processor.py +90 -0
  66. coati_payroll/nomina_engine/processors/loan_processor.py +227 -0
  67. coati_payroll/nomina_engine/processors/novelty_processor.py +42 -0
  68. coati_payroll/nomina_engine/processors/vacation_processor.py +67 -0
  69. coati_payroll/nomina_engine/repositories/__init__.py +32 -0
  70. coati_payroll/nomina_engine/repositories/acumulado_repository.py +83 -0
  71. coati_payroll/nomina_engine/repositories/base_repository.py +40 -0
  72. coati_payroll/nomina_engine/repositories/config_repository.py +102 -0
  73. coati_payroll/nomina_engine/repositories/employee_repository.py +34 -0
  74. coati_payroll/nomina_engine/repositories/exchange_rate_repository.py +58 -0
  75. coati_payroll/nomina_engine/repositories/novelty_repository.py +54 -0
  76. coati_payroll/nomina_engine/repositories/planilla_repository.py +52 -0
  77. coati_payroll/nomina_engine/results/__init__.py +24 -0
  78. coati_payroll/nomina_engine/results/error_result.py +28 -0
  79. coati_payroll/nomina_engine/results/payroll_result.py +53 -0
  80. coati_payroll/nomina_engine/results/validation_result.py +39 -0
  81. coati_payroll/nomina_engine/services/__init__.py +22 -0
  82. coati_payroll/nomina_engine/services/accounting_voucher_service.py +708 -0
  83. coati_payroll/nomina_engine/services/employee_processing_service.py +173 -0
  84. coati_payroll/nomina_engine/services/payroll_execution_service.py +374 -0
  85. coati_payroll/nomina_engine/services/snapshot_service.py +295 -0
  86. coati_payroll/nomina_engine/validators/__init__.py +31 -0
  87. coati_payroll/nomina_engine/validators/base_validator.py +48 -0
  88. coati_payroll/nomina_engine/validators/currency_validator.py +50 -0
  89. coati_payroll/nomina_engine/validators/employee_validator.py +87 -0
  90. coati_payroll/nomina_engine/validators/period_validator.py +44 -0
  91. coati_payroll/nomina_engine/validators/planilla_validator.py +136 -0
  92. coati_payroll/plugin_manager.py +176 -0
  93. coati_payroll/queue/__init__.py +33 -0
  94. coati_payroll/queue/driver.py +127 -0
  95. coati_payroll/queue/drivers/__init__.py +22 -0
  96. coati_payroll/queue/drivers/dramatiq_driver.py +268 -0
  97. coati_payroll/queue/drivers/huey_driver.py +390 -0
  98. coati_payroll/queue/drivers/noop_driver.py +54 -0
  99. coati_payroll/queue/selector.py +121 -0
  100. coati_payroll/queue/tasks.py +764 -0
  101. coati_payroll/rate_limiting.py +83 -0
  102. coati_payroll/rbac.py +183 -0
  103. coati_payroll/report_engine.py +512 -0
  104. coati_payroll/report_export.py +208 -0
  105. coati_payroll/schema_validator.py +167 -0
  106. coati_payroll/security.py +77 -0
  107. coati_payroll/static/styles.css +1044 -0
  108. coati_payroll/system_reports.py +573 -0
  109. coati_payroll/templates/auth/login.html +189 -0
  110. coati_payroll/templates/base.html +283 -0
  111. coati_payroll/templates/index.html +227 -0
  112. coati_payroll/templates/macros.html +146 -0
  113. coati_payroll/templates/modules/calculation_rule/form.html +78 -0
  114. coati_payroll/templates/modules/calculation_rule/index.html +102 -0
  115. coati_payroll/templates/modules/calculation_rule/schema_editor.html +1159 -0
  116. coati_payroll/templates/modules/carga_inicial_prestacion/form.html +170 -0
  117. coati_payroll/templates/modules/carga_inicial_prestacion/index.html +170 -0
  118. coati_payroll/templates/modules/carga_inicial_prestacion/reporte.html +193 -0
  119. coati_payroll/templates/modules/config_calculos/index.html +44 -0
  120. coati_payroll/templates/modules/configuracion/index.html +90 -0
  121. coati_payroll/templates/modules/currency/form.html +47 -0
  122. coati_payroll/templates/modules/currency/index.html +64 -0
  123. coati_payroll/templates/modules/custom_field/form.html +62 -0
  124. coati_payroll/templates/modules/custom_field/index.html +78 -0
  125. coati_payroll/templates/modules/deduccion/form.html +1 -0
  126. coati_payroll/templates/modules/deduccion/index.html +1 -0
  127. coati_payroll/templates/modules/employee/form.html +254 -0
  128. coati_payroll/templates/modules/employee/index.html +76 -0
  129. coati_payroll/templates/modules/empresa/form.html +74 -0
  130. coati_payroll/templates/modules/empresa/index.html +71 -0
  131. coati_payroll/templates/modules/exchange_rate/form.html +47 -0
  132. coati_payroll/templates/modules/exchange_rate/import.html +93 -0
  133. coati_payroll/templates/modules/exchange_rate/index.html +114 -0
  134. coati_payroll/templates/modules/liquidacion/index.html +58 -0
  135. coati_payroll/templates/modules/liquidacion/nueva.html +51 -0
  136. coati_payroll/templates/modules/liquidacion/ver.html +91 -0
  137. coati_payroll/templates/modules/payroll_concepts/audit_log.html +146 -0
  138. coati_payroll/templates/modules/percepcion/form.html +1 -0
  139. coati_payroll/templates/modules/percepcion/index.html +1 -0
  140. coati_payroll/templates/modules/planilla/config.html +190 -0
  141. coati_payroll/templates/modules/planilla/config_deducciones.html +129 -0
  142. coati_payroll/templates/modules/planilla/config_empleados.html +116 -0
  143. coati_payroll/templates/modules/planilla/config_percepciones.html +113 -0
  144. coati_payroll/templates/modules/planilla/config_prestaciones.html +118 -0
  145. coati_payroll/templates/modules/planilla/config_reglas.html +120 -0
  146. coati_payroll/templates/modules/planilla/ejecutar_nomina.html +106 -0
  147. coati_payroll/templates/modules/planilla/form.html +197 -0
  148. coati_payroll/templates/modules/planilla/index.html +144 -0
  149. coati_payroll/templates/modules/planilla/listar_nominas.html +91 -0
  150. coati_payroll/templates/modules/planilla/log_nomina.html +135 -0
  151. coati_payroll/templates/modules/planilla/novedades/form.html +177 -0
  152. coati_payroll/templates/modules/planilla/novedades/index.html +170 -0
  153. coati_payroll/templates/modules/planilla/ver_nomina.html +477 -0
  154. coati_payroll/templates/modules/planilla/ver_nomina_empleado.html +231 -0
  155. coati_payroll/templates/modules/plugins/index.html +71 -0
  156. coati_payroll/templates/modules/prestacion/form.html +1 -0
  157. coati_payroll/templates/modules/prestacion/index.html +1 -0
  158. coati_payroll/templates/modules/prestacion_management/dashboard.html +150 -0
  159. coati_payroll/templates/modules/prestacion_management/initial_balance_bulk.html +195 -0
  160. coati_payroll/templates/modules/prestamo/approve.html +156 -0
  161. coati_payroll/templates/modules/prestamo/condonacion.html +249 -0
  162. coati_payroll/templates/modules/prestamo/detail.html +443 -0
  163. coati_payroll/templates/modules/prestamo/form.html +203 -0
  164. coati_payroll/templates/modules/prestamo/index.html +150 -0
  165. coati_payroll/templates/modules/prestamo/pago_extraordinario.html +211 -0
  166. coati_payroll/templates/modules/prestamo/tabla_pago_pdf.html +181 -0
  167. coati_payroll/templates/modules/report/admin_index.html +125 -0
  168. coati_payroll/templates/modules/report/detail.html +129 -0
  169. coati_payroll/templates/modules/report/execute.html +266 -0
  170. coati_payroll/templates/modules/report/index.html +95 -0
  171. coati_payroll/templates/modules/report/permissions.html +64 -0
  172. coati_payroll/templates/modules/settings/index.html +274 -0
  173. coati_payroll/templates/modules/shared/concept_form.html +201 -0
  174. coati_payroll/templates/modules/shared/concept_index.html +145 -0
  175. coati_payroll/templates/modules/tipo_planilla/form.html +70 -0
  176. coati_payroll/templates/modules/tipo_planilla/index.html +68 -0
  177. coati_payroll/templates/modules/user/form.html +65 -0
  178. coati_payroll/templates/modules/user/index.html +76 -0
  179. coati_payroll/templates/modules/user/profile.html +81 -0
  180. coati_payroll/templates/modules/vacation/account_detail.html +149 -0
  181. coati_payroll/templates/modules/vacation/account_form.html +52 -0
  182. coati_payroll/templates/modules/vacation/account_index.html +68 -0
  183. coati_payroll/templates/modules/vacation/dashboard.html +156 -0
  184. coati_payroll/templates/modules/vacation/initial_balance_bulk.html +149 -0
  185. coati_payroll/templates/modules/vacation/initial_balance_form.html +93 -0
  186. coati_payroll/templates/modules/vacation/leave_request_detail.html +158 -0
  187. coati_payroll/templates/modules/vacation/leave_request_form.html +61 -0
  188. coati_payroll/templates/modules/vacation/leave_request_index.html +98 -0
  189. coati_payroll/templates/modules/vacation/policy_detail.html +176 -0
  190. coati_payroll/templates/modules/vacation/policy_form.html +152 -0
  191. coati_payroll/templates/modules/vacation/policy_index.html +79 -0
  192. coati_payroll/templates/modules/vacation/register_taken_form.html +178 -0
  193. coati_payroll/translations/en/LC_MESSAGES/messages.mo +0 -0
  194. coati_payroll/translations/en/LC_MESSAGES/messages.po +7283 -0
  195. coati_payroll/translations/es/LC_MESSAGES/messages.mo +0 -0
  196. coati_payroll/translations/es/LC_MESSAGES/messages.po +7374 -0
  197. coati_payroll/vacation_service.py +451 -0
  198. coati_payroll/version.py +18 -0
  199. coati_payroll/vistas/__init__.py +64 -0
  200. coati_payroll/vistas/calculation_rule.py +307 -0
  201. coati_payroll/vistas/carga_inicial_prestacion.py +423 -0
  202. coati_payroll/vistas/config_calculos.py +72 -0
  203. coati_payroll/vistas/configuracion.py +87 -0
  204. coati_payroll/vistas/constants.py +17 -0
  205. coati_payroll/vistas/currency.py +112 -0
  206. coati_payroll/vistas/custom_field.py +120 -0
  207. coati_payroll/vistas/employee.py +305 -0
  208. coati_payroll/vistas/empresa.py +153 -0
  209. coati_payroll/vistas/exchange_rate.py +341 -0
  210. coati_payroll/vistas/liquidacion.py +205 -0
  211. coati_payroll/vistas/payroll_concepts.py +580 -0
  212. coati_payroll/vistas/planilla/__init__.py +38 -0
  213. coati_payroll/vistas/planilla/association_routes.py +238 -0
  214. coati_payroll/vistas/planilla/config_routes.py +158 -0
  215. coati_payroll/vistas/planilla/export_routes.py +175 -0
  216. coati_payroll/vistas/planilla/helpers/__init__.py +34 -0
  217. coati_payroll/vistas/planilla/helpers/association_helpers.py +161 -0
  218. coati_payroll/vistas/planilla/helpers/excel_helpers.py +29 -0
  219. coati_payroll/vistas/planilla/helpers/form_helpers.py +97 -0
  220. coati_payroll/vistas/planilla/nomina_routes.py +488 -0
  221. coati_payroll/vistas/planilla/novedad_routes.py +227 -0
  222. coati_payroll/vistas/planilla/routes.py +145 -0
  223. coati_payroll/vistas/planilla/services/__init__.py +26 -0
  224. coati_payroll/vistas/planilla/services/export_service.py +687 -0
  225. coati_payroll/vistas/planilla/services/nomina_service.py +233 -0
  226. coati_payroll/vistas/planilla/services/novedad_service.py +126 -0
  227. coati_payroll/vistas/planilla/services/planilla_service.py +34 -0
  228. coati_payroll/vistas/planilla/validators/__init__.py +18 -0
  229. coati_payroll/vistas/planilla/validators/planilla_validators.py +40 -0
  230. coati_payroll/vistas/plugins.py +45 -0
  231. coati_payroll/vistas/prestacion.py +272 -0
  232. coati_payroll/vistas/prestamo.py +808 -0
  233. coati_payroll/vistas/report.py +432 -0
  234. coati_payroll/vistas/settings.py +29 -0
  235. coati_payroll/vistas/tipo_planilla.py +134 -0
  236. coati_payroll/vistas/user.py +172 -0
  237. coati_payroll/vistas/vacation.py +1045 -0
  238. coati_payroll-0.0.2.dist-info/LICENSE +201 -0
  239. coati_payroll-0.0.2.dist-info/METADATA +581 -0
  240. coati_payroll-0.0.2.dist-info/RECORD +243 -0
  241. coati_payroll-0.0.2.dist-info/WHEEL +5 -0
  242. coati_payroll-0.0.2.dist-info/entry_points.txt +2 -0
  243. coati_payroll-0.0.2.dist-info/top_level.txt +1 -0
@@ -0,0 +1,64 @@
1
+ {% extends "base.html" %}
2
+
3
+ {% block title %}{{ _('Permisos') }} - {{ report.name }}{% endblock %}
4
+
5
+ {% block content %}
6
+ <div class="container-fluid">
7
+ <div class="d-flex justify-content-between align-items-center mb-4">
8
+ <h1 class="h2">
9
+ <i class="bi bi-shield-lock me-2"></i>{{ _('Permisos del Reporte') }}: {{ report.name }}
10
+ </h1>
11
+ <a href="{{ url_for('report.admin_index') }}" class="btn btn-outline-secondary">
12
+ <i class="bi bi-arrow-left me-1"></i>{{ _('Volver') }}
13
+ </a>
14
+ </div>
15
+
16
+ <div class="card">
17
+ <div class="card-body">
18
+ <form method="post">
19
+ <table class="table">
20
+ <thead>
21
+ <tr>
22
+ <th>{{ _('Rol') }}</th>
23
+ <th class="text-center">{{ _('Ver') }}</th>
24
+ <th class="text-center">{{ _('Ejecutar') }}</th>
25
+ <th class="text-center">{{ _('Exportar') }}</th>
26
+ </tr>
27
+ </thead>
28
+ <tbody>
29
+ {% for role in roles %}
30
+ {% set perm = existing_permissions.get(role) %}
31
+ <tr>
32
+ <td>
33
+ <strong>{{ role|capitalize }}</strong>
34
+ </td>
35
+ <td class="text-center">
36
+ <input type="checkbox" class="form-check-input" name="{{ role }}_can_view"
37
+ {% if perm and perm.can_view %}checked{% endif %}>
38
+ </td>
39
+ <td class="text-center">
40
+ <input type="checkbox" class="form-check-input" name="{{ role }}_can_execute"
41
+ {% if perm and perm.can_execute %}checked{% endif %}>
42
+ </td>
43
+ <td class="text-center">
44
+ <input type="checkbox" class="form-check-input" name="{{ role }}_can_export"
45
+ {% if perm and perm.can_export %}checked{% endif %}>
46
+ </td>
47
+ </tr>
48
+ {% endfor %}
49
+ </tbody>
50
+ </table>
51
+
52
+ <div class="d-grid gap-2 d-md-flex justify-content-md-end">
53
+ <button type="submit" class="btn btn-primary">
54
+ <i class="bi bi-check-circle me-1"></i>{{ _('Guardar Permisos') }}
55
+ </button>
56
+ <a href="{{ url_for('report.admin_index') }}" class="btn btn-secondary">
57
+ {{ _('Cancelar') }}
58
+ </a>
59
+ </div>
60
+ </form>
61
+ </div>
62
+ </div>
63
+ </div>
64
+ {% endblock %}
@@ -0,0 +1,274 @@
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>{{ _('Configuración') }}</h2>
10
+ </div>
11
+
12
+ <div class="row">
13
+ <!-- Empresas -->
14
+ <div class="col-md-6 col-lg-4 mb-4">
15
+ <div class="card h-100">
16
+ <div class="card-body d-flex flex-column">
17
+ <div class="d-flex align-items-center mb-3">
18
+ <div class="bg-primary bg-opacity-10 rounded p-3 me-3">
19
+ <i class="bi bi-building text-primary fs-3"></i>
20
+ </div>
21
+ <h5 class="card-title mb-0">{{ _('Empresas') }}</h5>
22
+ </div>
23
+ <p class="card-text text-muted">{{ _('Gestionar empresas del sistema') }}</p>
24
+ <div class="mt-auto">
25
+ <a href="{{ url_for('empresa.index') }}" class="btn btn-outline-primary w-100">
26
+ <i class="bi bi-arrow-right-circle me-1"></i>{{ _('Acceder') }}
27
+ </a>
28
+ </div>
29
+ </div>
30
+ </div>
31
+ </div>
32
+
33
+ <!-- Monedas -->
34
+ <div class="col-md-6 col-lg-4 mb-4">
35
+ <div class="card h-100">
36
+ <div class="card-body d-flex flex-column">
37
+ <div class="d-flex align-items-center mb-3">
38
+ <div class="bg-success bg-opacity-10 rounded p-3 me-3">
39
+ <i class="bi bi-currency-exchange text-success fs-3"></i>
40
+ </div>
41
+ <h5 class="card-title mb-0">{{ _('Monedas') }}</h5>
42
+ </div>
43
+ <p class="card-text text-muted">{{ _('Configurar monedas del sistema') }}</p>
44
+ <div class="mt-auto">
45
+ <a href="{{ url_for('currency.index') }}" class="btn btn-outline-success w-100">
46
+ <i class="bi bi-arrow-right-circle me-1"></i>{{ _('Acceder') }}
47
+ </a>
48
+ </div>
49
+ </div>
50
+ </div>
51
+ </div>
52
+
53
+ <!-- Tipos de Cambio -->
54
+ <div class="col-md-6 col-lg-4 mb-4">
55
+ <div class="card h-100">
56
+ <div class="card-body d-flex flex-column">
57
+ <div class="d-flex align-items-center mb-3">
58
+ <div class="bg-info bg-opacity-10 rounded p-3 me-3">
59
+ <i class="bi bi-graph-up text-info fs-3"></i>
60
+ </div>
61
+ <h5 class="card-title mb-0">{{ _('Tipos de Cambio') }}</h5>
62
+ </div>
63
+ <p class="card-text text-muted">{{ _('Administrar tipos de cambio') }}</p>
64
+ <div class="mt-auto">
65
+ <a href="{{ url_for('exchange_rate.index') }}" class="btn btn-outline-info w-100">
66
+ <i class="bi bi-arrow-right-circle me-1"></i>{{ _('Acceder') }}
67
+ </a>
68
+ </div>
69
+ </div>
70
+ </div>
71
+ </div>
72
+
73
+ <!-- Tipo de Planilla -->
74
+ <div class="col-md-6 col-lg-4 mb-4">
75
+ <div class="card h-100">
76
+ <div class="card-body d-flex flex-column">
77
+ <div class="d-flex align-items-center mb-3">
78
+ <div class="bg-warning bg-opacity-10 rounded p-3 me-3">
79
+ <i class="bi bi-card-list text-warning fs-3"></i>
80
+ </div>
81
+ <h5 class="card-title mb-0">{{ _('Tipo de Planilla') }}</h5>
82
+ </div>
83
+ <p class="card-text text-muted">{{ _('Configurar tipos de planilla') }}</p>
84
+ <div class="mt-auto">
85
+ <a href="{{ url_for('tipo_planilla.index') }}" class="btn btn-outline-warning w-100">
86
+ <i class="bi bi-arrow-right-circle me-1"></i>{{ _('Acceder') }}
87
+ </a>
88
+ </div>
89
+ </div>
90
+ </div>
91
+ </div>
92
+
93
+ <!-- Percepciones -->
94
+ <div class="col-md-6 col-lg-4 mb-4">
95
+ <div class="card h-100">
96
+ <div class="card-body d-flex flex-column">
97
+ <div class="d-flex align-items-center mb-3">
98
+ <div class="bg-success bg-opacity-10 rounded p-3 me-3">
99
+ <i class="bi bi-plus-circle text-success fs-3"></i>
100
+ </div>
101
+ <h5 class="card-title mb-0">{{ _('Percepciones') }}</h5>
102
+ </div>
103
+ <p class="card-text text-muted">{{ _('Administrar percepciones de nómina') }}</p>
104
+ <div class="mt-auto">
105
+ <a href="{{ url_for('percepcion.percepcion_index') }}" class="btn btn-outline-success w-100">
106
+ <i class="bi bi-arrow-right-circle me-1"></i>{{ _('Acceder') }}
107
+ </a>
108
+ </div>
109
+ </div>
110
+ </div>
111
+ </div>
112
+
113
+ <!-- Deducciones -->
114
+ <div class="col-md-6 col-lg-4 mb-4">
115
+ <div class="card h-100">
116
+ <div class="card-body d-flex flex-column">
117
+ <div class="d-flex align-items-center mb-3">
118
+ <div class="bg-danger bg-opacity-10 rounded p-3 me-3">
119
+ <i class="bi bi-dash-circle text-danger fs-3"></i>
120
+ </div>
121
+ <h5 class="card-title mb-0">{{ _('Deducciones') }}</h5>
122
+ </div>
123
+ <p class="card-text text-muted">{{ _('Administrar deducciones de nómina') }}</p>
124
+ <div class="mt-auto">
125
+ <a href="{{ url_for('deduccion.deduccion_index') }}" class="btn btn-outline-danger w-100">
126
+ <i class="bi bi-arrow-right-circle me-1"></i>{{ _('Acceder') }}
127
+ </a>
128
+ </div>
129
+ </div>
130
+ </div>
131
+ </div>
132
+
133
+ <!-- Prestaciones -->
134
+ <div class="col-md-6 col-lg-4 mb-4">
135
+ <div class="card h-100">
136
+ <div class="card-body d-flex flex-column">
137
+ <div class="d-flex align-items-center mb-3">
138
+ <div class="bg-primary bg-opacity-10 rounded p-3 me-3">
139
+ <i class="bi bi-gift text-primary fs-3"></i>
140
+ </div>
141
+ <h5 class="card-title mb-0">{{ _('Prestaciones') }}</h5>
142
+ </div>
143
+ <p class="card-text text-muted">{{ _('Configurar prestaciones patronales') }}</p>
144
+ <div class="mt-auto">
145
+ <a href="{{ url_for('prestacion.prestacion_index') }}" class="btn btn-outline-primary w-100">
146
+ <i class="bi bi-arrow-right-circle me-1"></i>{{ _('Acceder') }}
147
+ </a>
148
+ </div>
149
+ </div>
150
+ </div>
151
+ </div>
152
+
153
+ <!-- Reglas de Cálculo -->
154
+ <div class="col-md-6 col-lg-4 mb-4">
155
+ <div class="card h-100">
156
+ <div class="card-body d-flex flex-column">
157
+ <div class="d-flex align-items-center mb-3">
158
+ <div class="bg-secondary bg-opacity-10 rounded p-3 me-3">
159
+ <i class="bi bi-code-square text-secondary fs-3"></i>
160
+ </div>
161
+ <h5 class="card-title mb-0">{{ _('Reglas de Cálculo') }}</h5>
162
+ </div>
163
+ <p class="card-text text-muted">{{ _('Definir reglas de cálculo') }}</p>
164
+ <div class="mt-auto">
165
+ <a href="{{ url_for('calculation_rule.index') }}" class="btn btn-outline-secondary w-100">
166
+ <i class="bi bi-arrow-right-circle me-1"></i>{{ _('Acceder') }}
167
+ </a>
168
+ </div>
169
+ </div>
170
+ </div>
171
+ </div>
172
+
173
+ <!-- Campos Personalizados -->
174
+ <div class="col-md-6 col-lg-4 mb-4">
175
+ <div class="card h-100">
176
+ <div class="card-body d-flex flex-column">
177
+ <div class="d-flex align-items-center mb-3">
178
+ <div class="bg-info bg-opacity-10 rounded p-3 me-3">
179
+ <i class="bi bi-input-cursor-text text-info fs-3"></i>
180
+ </div>
181
+ <h5 class="card-title mb-0">{{ _('Campos Personalizados') }}</h5>
182
+ </div>
183
+ <p class="card-text text-muted">{{ _('Gestionar campos personalizados') }}</p>
184
+ <div class="mt-auto">
185
+ <a href="{{ url_for('custom_field.index') }}" class="btn btn-outline-info w-100">
186
+ <i class="bi bi-arrow-right-circle me-1"></i>{{ _('Acceder') }}
187
+ </a>
188
+ </div>
189
+ </div>
190
+ </div>
191
+ </div>
192
+
193
+ <!-- Carga Inicial de Prestaciones -->
194
+ <div class="col-md-6 col-lg-4 mb-4">
195
+ <div class="card h-100">
196
+ <div class="card-body d-flex flex-column">
197
+ <div class="d-flex align-items-center mb-3">
198
+ <div class="bg-warning bg-opacity-10 rounded p-3 me-3">
199
+ <i class="bi bi-upload text-warning fs-3"></i>
200
+ </div>
201
+ <h5 class="card-title mb-0">{{ _('Carga Inicial de Prestaciones') }}</h5>
202
+ </div>
203
+ <p class="card-text text-muted">{{ _('Cargar prestaciones iniciales') }}</p>
204
+ <div class="mt-auto">
205
+ <a href="{{ url_for('carga_inicial_prestacion.index') }}" class="btn btn-outline-warning w-100">
206
+ <i class="bi bi-arrow-right-circle me-1"></i>{{ _('Acceder') }}
207
+ </a>
208
+ </div>
209
+ </div>
210
+ </div>
211
+ </div>
212
+
213
+ <!-- Parámetros de Cálculo -->
214
+ <div class="col-md-6 col-lg-4 mb-4">
215
+ <div class="card h-100">
216
+ <div class="card-body d-flex flex-column">
217
+ <div class="d-flex align-items-center mb-3">
218
+ <div class="bg-secondary bg-opacity-10 rounded p-3 me-3">
219
+ <i class="bi bi-sliders text-secondary fs-3"></i>
220
+ </div>
221
+ <h5 class="card-title mb-0">{{ _('Parámetros de Cálculo') }}</h5>
222
+ </div>
223
+ <p class="card-text text-muted">{{ _('Configurar factores base para prorrateos y cálculos') }}</p>
224
+ <div class="mt-auto">
225
+ <a href="{{ url_for('config_calculos.index') }}" class="btn btn-outline-secondary w-100">
226
+ <i class="bi bi-arrow-right-circle me-1"></i>{{ _('Acceder') }}
227
+ </a>
228
+ </div>
229
+ </div>
230
+ </div>
231
+ </div>
232
+
233
+ <!-- Configuración Global -->
234
+ <div class="col-md-6 col-lg-4 mb-4">
235
+ <div class="card h-100">
236
+ <div class="card-body d-flex flex-column">
237
+ <div class="d-flex align-items-center mb-3">
238
+ <div class="bg-dark bg-opacity-10 rounded p-3 me-3">
239
+ <i class="bi bi-globe text-dark fs-3"></i>
240
+ </div>
241
+ <h5 class="card-title mb-0">{{ _('Configuración Global') }}</h5>
242
+ </div>
243
+ <p class="card-text text-muted">{{ _('Configuración general del sistema') }}</p>
244
+ <div class="mt-auto">
245
+ <a href="{{ url_for('configuracion.index') }}" class="btn btn-outline-dark w-100">
246
+ <i class="bi bi-arrow-right-circle me-1"></i>{{ _('Acceder') }}
247
+ </a>
248
+ </div>
249
+ </div>
250
+ </div>
251
+ </div>
252
+
253
+ <!-- Plugins -->
254
+ <div class="col-md-6 col-lg-4 mb-4">
255
+ <div class="card h-100">
256
+ <div class="card-body d-flex flex-column">
257
+ <div class="d-flex align-items-center mb-3">
258
+ <div class="bg-secondary bg-opacity-10 rounded p-3 me-3">
259
+ <i class="bi bi-plug text-secondary fs-3"></i>
260
+ </div>
261
+ <h5 class="card-title mb-0">{{ _('Plugins') }}</h5>
262
+ </div>
263
+ <p class="card-text text-muted">{{ _('Administrar plugins instalados') }}</p>
264
+ <div class="mt-auto">
265
+ <a href="{{ url_for('plugins.index') }}" class="btn btn-outline-secondary w-100">
266
+ <i class="bi bi-arrow-right-circle me-1"></i>{{ _('Acceder') }}
267
+ </a>
268
+ </div>
269
+ </div>
270
+ </div>
271
+ </div>
272
+ </div>
273
+ </div>
274
+ {% endblock %}
@@ -0,0 +1,201 @@
1
+ {% extends "base.html" %}
2
+ {% from "macros.html" import render_field %}
3
+
4
+ {% block content %}
5
+ <div class="container-fluid py-4">
6
+ <div class="row">
7
+ <div class="col-12">
8
+ <nav aria-label="breadcrumb">
9
+ <ol class="breadcrumb">
10
+ <li class="breadcrumb-item">
11
+ <a href="{{ url_for(config.blueprint + '.' + config.route_prefix + 'index') }}">{{ config.plural }}</a>
12
+ </li>
13
+ <li class="breadcrumb-item active" aria-current="page">{{ title }}</li>
14
+ </ol>
15
+ </nav>
16
+ </div>
17
+ </div>
18
+
19
+ <div class="row">
20
+ <div class="col-12">
21
+ <div class="card shadow-sm">
22
+ <div class="card-header bg-white">
23
+ <h4 class="mb-0">
24
+ <i class="bi {{ config.icon }} me-2"></i>
25
+ {{ title }}
26
+ </h4>
27
+ </div>
28
+ <div class="card-body">
29
+ <form method="POST" novalidate>
30
+ {{ form.hidden_tag() }}
31
+
32
+ <!-- Basic Information -->
33
+ <h5 class="border-bottom pb-2 mb-3">
34
+ <i class="bi bi-info-circle me-2"></i>{{ _('Información Básica') }}
35
+ </h5>
36
+
37
+ <div class="row">
38
+ <div class="col-md-4">
39
+ {{ render_field(form.codigo) }}
40
+ </div>
41
+ <div class="col-md-8">
42
+ {{ render_field(form.nombre) }}
43
+ </div>
44
+ </div>
45
+
46
+ <div class="row">
47
+ <div class="col-12">
48
+ {{ render_field(form.descripcion) }}
49
+ </div>
50
+ </div>
51
+
52
+ <!-- Type-specific fields -->
53
+ {% if form.tipo is defined %}
54
+ <div class="row">
55
+ <div class="col-md-4">
56
+ {{ render_field(form.tipo) }}
57
+ </div>
58
+ {% if form.es_impuesto is defined %}
59
+ <div class="col-md-4 d-flex align-items-end">
60
+ <div class="mb-3">
61
+ {{ render_field(form.es_impuesto) }}
62
+ </div>
63
+ </div>
64
+ {% endif %}
65
+ </div>
66
+ {% endif %}
67
+
68
+ <!-- Calculation Configuration -->
69
+ <h5 class="border-bottom pb-2 mb-3 mt-4">
70
+ <i class="bi bi-calculator me-2"></i>{{ _('Configuración de Cálculo') }}
71
+ </h5>
72
+
73
+ <div class="row">
74
+ <div class="col-md-4">
75
+ {{ render_field(form.formula_tipo) }}
76
+ </div>
77
+ <div class="col-md-4">
78
+ {{ render_field(form.monto_default) }}
79
+ </div>
80
+ <div class="col-md-4">
81
+ {{ render_field(form.porcentaje) }}
82
+ </div>
83
+ </div>
84
+
85
+ <div class="row">
86
+ <div class="col-md-6">
87
+ {{ render_field(form.base_calculo) }}
88
+ </div>
89
+ {% if form.unidad_calculo is defined %}
90
+ <div class="col-md-6">
91
+ {{ render_field(form.unidad_calculo) }}
92
+ </div>
93
+ {% endif %}
94
+ </div>
95
+
96
+ {% if form.tope_aplicacion is defined %}
97
+ <div class="row">
98
+ <div class="col-md-6">
99
+ {{ render_field(form.tope_aplicacion) }}
100
+ </div>
101
+ </div>
102
+ {% endif %}
103
+
104
+ <!-- Options -->
105
+ <h5 class="border-bottom pb-2 mb-3 mt-4">
106
+ <i class="bi bi-toggles me-2"></i>{{ _('Opciones') }}
107
+ </h5>
108
+
109
+ <div class="row">
110
+ {% if form.gravable is defined %}
111
+ <div class="col-md-3">
112
+ <div class="mb-3">
113
+ {{ render_field(form.gravable) }}
114
+ </div>
115
+ </div>
116
+ {% endif %}
117
+ {% if form.antes_impuesto is defined %}
118
+ <div class="col-md-3">
119
+ <div class="mb-3">
120
+ {{ render_field(form.antes_impuesto) }}
121
+ </div>
122
+ </div>
123
+ {% endif %}
124
+ <div class="col-md-3">
125
+ <div class="mb-3">
126
+ {{ render_field(form.recurrente) }}
127
+ </div>
128
+ </div>
129
+ <div class="col-md-3">
130
+ <div class="mb-3">
131
+ {{ render_field(form.activo) }}
132
+ </div>
133
+ </div>
134
+ </div>
135
+
136
+ {% if form.editable_en_nomina is defined %}
137
+ <div class="row">
138
+ <div class="col-md-6">
139
+ <div class="mb-3">
140
+ {{ render_field(form.editable_en_nomina) }}
141
+ </div>
142
+ </div>
143
+ </div>
144
+ {% endif %}
145
+
146
+ <!-- Vigencia -->
147
+ <h5 class="border-bottom pb-2 mb-3 mt-4">
148
+ <i class="bi bi-calendar-range me-2"></i>{{ _('Vigencia') }}
149
+ </h5>
150
+
151
+ <div class="row">
152
+ {% if form.vigente_desde is defined %}
153
+ <div class="col-md-6">
154
+ {{ render_field(form.vigente_desde) }}
155
+ </div>
156
+ {% endif %}
157
+ {% if form.valido_hasta is defined %}
158
+ <div class="col-md-6">
159
+ {{ render_field(form.valido_hasta) }}
160
+ </div>
161
+ {% endif %}
162
+ </div>
163
+
164
+ <!-- Accounting -->
165
+ <h5 class="border-bottom pb-2 mb-3 mt-4">
166
+ <i class="bi bi-journal-text me-2"></i>{{ _('Configuración Contable') }}
167
+ </h5>
168
+
169
+ <div class="row">
170
+ <div class="col-md-4">
171
+ <div class="mb-3">
172
+ {{ render_field(form.contabilizable) }}
173
+ </div>
174
+ </div>
175
+ </div>
176
+
177
+ <div class="row">
178
+ <div class="col-md-6">
179
+ {{ render_field(form.codigo_cuenta_debe) }}
180
+ </div>
181
+ <div class="col-md-6">
182
+ {{ render_field(form.codigo_cuenta_haber) }}
183
+ </div>
184
+ </div>
185
+
186
+ <!-- Actions -->
187
+ <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">
189
+ <i class="bi bi-arrow-left me-1"></i> {{ _('Cancelar') }}
190
+ </a>
191
+ <button type="submit" class="btn btn-primary">
192
+ <i class="bi bi-check-lg me-1"></i> {{ _('Guardar') }}
193
+ </button>
194
+ </div>
195
+ </form>
196
+ </div>
197
+ </div>
198
+ </div>
199
+ </div>
200
+ </div>
201
+ {% endblock %}