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,153 @@
|
|
|
1
|
+
# Copyright 2025 BMO Soluciones, S.A.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
"""Formula calculation engine examples for payroll processing.
|
|
15
|
+
|
|
16
|
+
IMPORTANT: EXAMPLE DATA ONLY - NOT PART OF THE ENGINE
|
|
17
|
+
=========================================================
|
|
18
|
+
The examples in this module are provided SOLELY for demonstration and testing
|
|
19
|
+
purposes. They do NOT represent legal rules, tax rates, or compliance requirements
|
|
20
|
+
for any specific jurisdiction.
|
|
21
|
+
|
|
22
|
+
Per the project's Social Contract:
|
|
23
|
+
- The engine is jurisdiction-agnostic and does not incorporate hardcoded legal rules.
|
|
24
|
+
- These examples use fictional/placeholder values that may not reflect any real legislation.
|
|
25
|
+
- Implementers must define their own rules based on their specific legal requirements.
|
|
26
|
+
- The project makes no guarantees about the correctness of these examples for any use case.
|
|
27
|
+
|
|
28
|
+
These examples demonstrate the STRUCTURE and CAPABILITIES of the formula engine,
|
|
29
|
+
not actual legal calculations.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
from __future__ import annotations
|
|
33
|
+
|
|
34
|
+
# <-------------------------------------------------------------------------> #
|
|
35
|
+
# Standard library
|
|
36
|
+
# <-------------------------------------------------------------------------> #
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
# <-------------------------------------------------------------------------> #
|
|
40
|
+
# Third party libraries
|
|
41
|
+
# <-------------------------------------------------------------------------> #
|
|
42
|
+
|
|
43
|
+
# <-------------------------------------------------------------------------> #
|
|
44
|
+
# Local modules
|
|
45
|
+
# <-------------------------------------------------------------------------> #
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
# ===========================================================================
|
|
49
|
+
# EXAMPLE: Progressive Income Tax Calculation Schema
|
|
50
|
+
# ===========================================================================
|
|
51
|
+
# This is a DEMONSTRATION of how to structure a progressive tax calculation.
|
|
52
|
+
# The values, rates, and brackets shown are FICTIONAL and for illustration only.
|
|
53
|
+
# Implementers must create their own schemas based on applicable laws.
|
|
54
|
+
# ===========================================================================
|
|
55
|
+
EXAMPLE_PROGRESSIVE_TAX_SCHEMA = {
|
|
56
|
+
"meta": {
|
|
57
|
+
"name": "Example Progressive Income Tax",
|
|
58
|
+
"jurisdiction": "Example Jurisdiction",
|
|
59
|
+
"reference_currency": "XXX",
|
|
60
|
+
"version": "1.0.0",
|
|
61
|
+
"description": "EXAMPLE ONLY: Demonstrates progressive income tax calculation. "
|
|
62
|
+
"Values are fictional. Implementers must define their own rules.",
|
|
63
|
+
},
|
|
64
|
+
"inputs": [
|
|
65
|
+
{
|
|
66
|
+
"name": "salario_mensual",
|
|
67
|
+
"type": "decimal",
|
|
68
|
+
"source": "empleado.salario_base",
|
|
69
|
+
"description": "Salario mensual bruto",
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"name": "social_security_deduction",
|
|
73
|
+
"type": "decimal",
|
|
74
|
+
"source": "calculated",
|
|
75
|
+
"description": "Pre-tax social security deduction (example)",
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"name": "meses_restantes",
|
|
79
|
+
"type": "integer",
|
|
80
|
+
"default": 12,
|
|
81
|
+
"description": "Meses restantes en el año fiscal",
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"name": "salario_acumulado",
|
|
85
|
+
"type": "decimal",
|
|
86
|
+
"default": 0,
|
|
87
|
+
"description": "Salario bruto acumulado del año",
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"name": "ir_retenido_acumulado",
|
|
91
|
+
"type": "decimal",
|
|
92
|
+
"default": 0,
|
|
93
|
+
"description": "IR ya retenido en el año",
|
|
94
|
+
},
|
|
95
|
+
],
|
|
96
|
+
"steps": [
|
|
97
|
+
{
|
|
98
|
+
"name": "salario_neto_mensual",
|
|
99
|
+
"type": "calculation",
|
|
100
|
+
"formula": "salario_mensual - social_security_deduction",
|
|
101
|
+
"description": "Net salary after pre-tax deductions",
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"name": "expectativa_anual",
|
|
105
|
+
"type": "calculation",
|
|
106
|
+
"formula": "salario_neto_mensual * meses_restantes",
|
|
107
|
+
"description": "Proyección de salario restante del año",
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"name": "base_imponible_anual",
|
|
111
|
+
"type": "calculation",
|
|
112
|
+
"formula": "salario_acumulado + expectativa_anual",
|
|
113
|
+
"description": "Base imponible anual total",
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"name": "annual_tax",
|
|
117
|
+
"type": "tax_lookup",
|
|
118
|
+
"table": "example_tax_brackets",
|
|
119
|
+
"input": "base_imponible_anual",
|
|
120
|
+
"description": "Annual tax calculation using example brackets",
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"name": "pending_tax",
|
|
124
|
+
"type": "calculation",
|
|
125
|
+
"formula": "annual_tax - ir_retenido_acumulado",
|
|
126
|
+
"description": "Pending tax to withhold",
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"name": "monthly_tax",
|
|
130
|
+
"type": "calculation",
|
|
131
|
+
"formula": "pending_tax / meses_restantes",
|
|
132
|
+
"description": "Tax to withhold this month",
|
|
133
|
+
},
|
|
134
|
+
],
|
|
135
|
+
# EXAMPLE TAX BRACKETS - FICTIONAL VALUES FOR DEMONSTRATION ONLY
|
|
136
|
+
# These do NOT represent any real tax legislation.
|
|
137
|
+
# Implementers must define their own brackets based on applicable laws.
|
|
138
|
+
"tax_tables": {
|
|
139
|
+
"example_tax_brackets": [
|
|
140
|
+
{"min": 0, "max": 100000, "rate": 0, "fixed": 0, "over": 0},
|
|
141
|
+
{"min": 100000.01, "max": 200000, "rate": 0.10, "fixed": 0, "over": 100000},
|
|
142
|
+
{"min": 200000.01, "max": 350000, "rate": 0.15, "fixed": 10000, "over": 200000},
|
|
143
|
+
{"min": 350000.01, "max": 500000, "rate": 0.20, "fixed": 32500, "over": 350000},
|
|
144
|
+
{"min": 500000.01, "max": None, "rate": 0.25, "fixed": 62500, "over": 500000},
|
|
145
|
+
]
|
|
146
|
+
},
|
|
147
|
+
"output": "monthly_tax",
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
# Backward compatibility alias - DEPRECATED, will be removed in future versions
|
|
151
|
+
# This alias exists only to prevent breaking existing code that references the old name.
|
|
152
|
+
# New code should use EXAMPLE_PROGRESSIVE_TAX_SCHEMA instead.
|
|
153
|
+
EXAMPLE_IR_NICARAGUA_SCHEMA = EXAMPLE_PROGRESSIVE_TAX_SCHEMA
|
coati_payroll/i18n.py
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Copyright 2025 BMO Soluciones, S.A.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
"""Internationalization module."""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
# <-------------------------------------------------------------------------> #
|
|
19
|
+
# Standard library
|
|
20
|
+
# <-------------------------------------------------------------------------> #
|
|
21
|
+
|
|
22
|
+
# <-------------------------------------------------------------------------> #
|
|
23
|
+
# Third party libraries
|
|
24
|
+
# <-------------------------------------------------------------------------> #
|
|
25
|
+
from flask_babel import gettext, lazy_gettext, ngettext
|
|
26
|
+
|
|
27
|
+
# <-------------------------------------------------------------------------> #
|
|
28
|
+
# Local modules
|
|
29
|
+
# <-------------------------------------------------------------------------> #
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
# ---------------------------------------------------------------------------------------
|
|
33
|
+
# Translation functions
|
|
34
|
+
# ---------------------------------------------------------------------------------------
|
|
35
|
+
def _(text: str, **kwargs) -> str:
|
|
36
|
+
"""Mark text for translation.
|
|
37
|
+
|
|
38
|
+
Supports keyword arguments for string formatting.
|
|
39
|
+
Example: _("Hello %(name)s", name="World")
|
|
40
|
+
"""
|
|
41
|
+
translated = gettext(text)
|
|
42
|
+
if kwargs:
|
|
43
|
+
return translated % kwargs
|
|
44
|
+
return translated
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _n(singular: str, plural: str, n: int) -> str:
|
|
48
|
+
"""Mark text for plural translation."""
|
|
49
|
+
return ngettext(singular, plural, n)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _l(text: str) -> str:
|
|
53
|
+
"""Mark text for lazy translation (useful in forms)."""
|
|
54
|
+
return lazy_gettext(text)
|