coati-payroll 0.0.8__tar.gz → 0.0.10__tar.gz
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-0.0.8 → coati_payroll-0.0.10}/PKG-INFO +4 -2
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/__init__.py +26 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/cli.py +90 -21
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/config.py +3 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/initial_data.py +0 -1
- coati_payroll-0.0.10/coati_payroll/migrations/20260125_032900_initial_migration.py +55 -0
- coati_payroll-0.0.10/coati_payroll/migrations/__init__.py +14 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/plugin_manager.py +0 -1
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/queue/selector.py +0 -1
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/queue/tasks.py +0 -1
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/report_engine.py +0 -1
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/static/styles.css +3 -1
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/system_reports.py +0 -1
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/version.py +2 -2
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/config_calculos.py +0 -1
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/liquidacion.py +0 -1
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/plugins.py +0 -1
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll.egg-info/PKG-INFO +4 -2
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll.egg-info/SOURCES.txt +3 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll.egg-info/requires.txt +3 -1
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/requirements.txt +3 -1
- coati_payroll-0.0.10/tests/test_alembic_migrations.py +221 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/LICENSE +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/README.md +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/app.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/audit_helpers.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/auth.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/demo_data.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/enums.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/forms.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/formula_engine/__init__.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/formula_engine/ast/__init__.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/formula_engine/ast/ast_visitor.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/formula_engine/ast/expression_evaluator.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/formula_engine/ast/safe_operators.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/formula_engine/ast/type_converter.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/formula_engine/data_sources.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/formula_engine/engine.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/formula_engine/exceptions.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/formula_engine/execution/__init__.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/formula_engine/execution/execution_context.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/formula_engine/execution/step_executor.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/formula_engine/execution/variable_store.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/formula_engine/novelty_codes.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/formula_engine/results/__init__.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/formula_engine/results/execution_result.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/formula_engine/steps/__init__.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/formula_engine/steps/assignment_step.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/formula_engine/steps/base_step.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/formula_engine/steps/calculation_step.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/formula_engine/steps/conditional_step.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/formula_engine/steps/step_factory.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/formula_engine/steps/tax_lookup_step.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/formula_engine/tables/__init__.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/formula_engine/tables/bracket_calculator.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/formula_engine/tables/table_lookup.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/formula_engine/tables/tax_table.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/formula_engine/validation/__init__.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/formula_engine/validation/schema_validator.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/formula_engine/validation/security_validator.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/formula_engine/validation/tax_table_validator.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/formula_engine_examples.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/i18n.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/interes_engine.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/liquidacion_engine/__init__.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/liquidacion_engine/engine.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/locale_config.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/log.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/model.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/__init__.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/calculators/__init__.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/calculators/benefit_calculator.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/calculators/concept_calculator.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/calculators/deduction_calculator.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/calculators/exchange_rate_calculator.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/calculators/perception_calculator.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/calculators/salary_calculator.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/domain/__init__.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/domain/calculation_items.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/domain/employee_calculation.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/domain/payroll_context.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/engine.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/processors/__init__.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/processors/accounting_processor.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/processors/accumulation_processor.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/processors/loan_processor.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/processors/novelty_processor.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/processors/vacation_processor.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/repositories/__init__.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/repositories/acumulado_repository.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/repositories/base_repository.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/repositories/config_repository.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/repositories/employee_repository.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/repositories/exchange_rate_repository.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/repositories/novelty_repository.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/repositories/planilla_repository.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/results/__init__.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/results/error_result.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/results/payroll_result.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/results/validation_result.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/services/__init__.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/services/accounting_voucher_service.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/services/employee_processing_service.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/services/payroll_execution_service.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/services/snapshot_service.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/validators/__init__.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/validators/base_validator.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/validators/currency_validator.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/validators/employee_validator.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/validators/period_validator.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/nomina_engine/validators/planilla_validator.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/queue/__init__.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/queue/driver.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/queue/drivers/__init__.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/queue/drivers/dramatiq_driver.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/queue/drivers/huey_driver.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/queue/drivers/noop_driver.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/rate_limiting.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/rbac.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/report_export.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/schema_validator.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/security.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/static/logo/Icono-small.png +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/static/logo/Icono.png +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/static/logo/Icono.svg +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/auth/login.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/base.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/index.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/macros.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/calculation_rule/form.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/calculation_rule/index.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/calculation_rule/schema_editor.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/carga_inicial_prestacion/form.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/carga_inicial_prestacion/index.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/carga_inicial_prestacion/reporte.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/config_calculos/index.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/configuracion/index.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/currency/form.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/currency/index.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/custom_field/form.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/custom_field/index.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/deduccion/form.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/deduccion/index.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/employee/form.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/employee/index.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/empresa/form.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/empresa/index.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/exchange_rate/form.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/exchange_rate/import.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/exchange_rate/index.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/liquidacion/index.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/liquidacion/nueva.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/liquidacion/ver.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/payroll_concepts/audit_log.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/percepcion/form.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/percepcion/index.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/planilla/config.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/planilla/config_deducciones.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/planilla/config_empleados.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/planilla/config_percepciones.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/planilla/config_prestaciones.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/planilla/config_reglas.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/planilla/ejecutar_nomina.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/planilla/form.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/planilla/index.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/planilla/listar_nominas.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/planilla/log_nomina.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/planilla/novedades/form.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/planilla/novedades/index.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/planilla/ver_nomina.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/planilla/ver_nomina_empleado.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/plugins/index.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/prestacion/form.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/prestacion/index.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/prestacion_management/dashboard.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/prestacion_management/initial_balance_bulk.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/prestamo/approve.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/prestamo/condonacion.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/prestamo/detail.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/prestamo/form.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/prestamo/index.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/prestamo/pago_extraordinario.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/prestamo/tabla_pago_pdf.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/report/admin_index.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/report/detail.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/report/execute.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/report/index.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/report/permissions.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/settings/index.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/shared/concept_form.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/shared/concept_index.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/tipo_planilla/form.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/tipo_planilla/index.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/user/form.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/user/index.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/user/profile.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/vacation/account_detail.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/vacation/account_form.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/vacation/account_index.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/vacation/dashboard.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/vacation/initial_balance_bulk.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/vacation/initial_balance_form.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/vacation/leave_request_detail.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/vacation/leave_request_form.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/vacation/leave_request_index.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/vacation/policy_detail.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/vacation/policy_form.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/vacation/policy_index.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/templates/modules/vacation/register_taken_form.html +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/translations/en/LC_MESSAGES/messages.mo +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/translations/en/LC_MESSAGES/messages.po +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/translations/es/LC_MESSAGES/messages.mo +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/translations/es/LC_MESSAGES/messages.po +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vacation_service.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/__init__.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/calculation_rule.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/carga_inicial_prestacion.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/configuracion.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/constants.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/currency.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/custom_field.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/employee.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/empresa.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/exchange_rate.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/payroll_concepts.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/planilla/__init__.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/planilla/association_routes.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/planilla/config_routes.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/planilla/export_routes.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/planilla/helpers/__init__.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/planilla/helpers/association_helpers.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/planilla/helpers/excel_helpers.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/planilla/helpers/form_helpers.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/planilla/nomina_routes.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/planilla/novedad_routes.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/planilla/routes.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/planilla/services/__init__.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/planilla/services/export_service.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/planilla/services/nomina_service.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/planilla/services/novedad_service.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/planilla/services/planilla_service.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/planilla/validators/__init__.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/planilla/validators/planilla_validators.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/prestacion.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/prestamo.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/report.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/settings.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/tipo_planilla.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/user.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll/vistas/vacation.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll.egg-info/dependency_links.txt +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll.egg-info/entry_points.txt +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/coati_payroll.egg-info/top_level.txt +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/pyproject.toml +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/setup.cfg +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/tests/test_ast_security.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/tests/test_ast_visitor.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/tests/test_cli.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/tests/test_plugin_manager.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/tests/test_plugins_cli.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/tests/test_plugins_ui.py +0 -0
- {coati_payroll-0.0.8 → coati_payroll-0.0.10}/tests/test_routes_map.py +0 -0
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: coati-payroll
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.10
|
|
4
4
|
Summary: A jurisdiction-agnostic payroll calculation engine.
|
|
5
5
|
Requires-Python: >=3.11
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
7
7
|
License-File: LICENSE
|
|
8
|
+
Requires-Dist: alembic==1.18.1
|
|
8
9
|
Requires-Dist: argon2-cffi
|
|
9
10
|
Requires-Dist: babel
|
|
10
11
|
Requires-Dist: configobj
|
|
11
12
|
Requires-Dist: cryptography
|
|
12
13
|
Requires-Dist: dramatiq[redis]
|
|
13
14
|
Requires-Dist: email_validator
|
|
14
|
-
Requires-Dist: huey
|
|
15
15
|
Requires-Dist: flask
|
|
16
|
+
Requires-Dist: flask-alembic==3.2.0
|
|
16
17
|
Requires-Dist: flask-babel
|
|
17
18
|
Requires-Dist: flask-caching
|
|
18
19
|
Requires-Dist: flask-limiter
|
|
@@ -23,6 +24,7 @@ Requires-Dist: flask-session
|
|
|
23
24
|
Requires-Dist: flask-sqlalchemy
|
|
24
25
|
Requires-Dist: flask_weasyprint
|
|
25
26
|
Requires-Dist: flask-wtf
|
|
27
|
+
Requires-Dist: huey
|
|
26
28
|
Requires-Dist: mysql-connector-python
|
|
27
29
|
Requires-Dist: openpyxl
|
|
28
30
|
Requires-Dist: orjson
|
|
@@ -30,6 +30,7 @@ from datetime import datetime
|
|
|
30
30
|
# Third party packages
|
|
31
31
|
# <-------------------------------------------------------------------------> #
|
|
32
32
|
from flask import Flask, flash, redirect, url_for
|
|
33
|
+
from flask_alembic import Alembic
|
|
33
34
|
from flask_babel import Babel
|
|
34
35
|
from flask_login import LoginManager
|
|
35
36
|
from flask_session import Session
|
|
@@ -87,6 +88,7 @@ def _patched_create_session_model(db, table_name, schema=None, bind_key=None, se
|
|
|
87
88
|
fs_sqlalchemy.create_session_model = _patched_create_session_model
|
|
88
89
|
|
|
89
90
|
# Third party libraries
|
|
91
|
+
alembic = Alembic()
|
|
90
92
|
session_manager = Session()
|
|
91
93
|
login_manager = LoginManager()
|
|
92
94
|
babel = Babel()
|
|
@@ -156,7 +158,17 @@ def create_app(config) -> Flask:
|
|
|
156
158
|
log.warning("Using default SECRET_KEY in production! This can cause issues.")
|
|
157
159
|
|
|
158
160
|
log.trace("create_app: initializing app")
|
|
161
|
+
|
|
162
|
+
# Configure Alembic migrations directory
|
|
163
|
+
from os.path import abspath, dirname, join
|
|
164
|
+
|
|
165
|
+
migrations_dir = abspath(join(dirname(__file__), "migrations"))
|
|
166
|
+
app.config.setdefault("ALEMBIC", {})
|
|
167
|
+
app.config["ALEMBIC"]["script_location"] = migrations_dir
|
|
168
|
+
|
|
169
|
+
# Initialize database and alembic
|
|
159
170
|
db.init_app(app)
|
|
171
|
+
alembic.init_app(app)
|
|
160
172
|
|
|
161
173
|
# Mostrar la URI de la base de datos para diagnóstico
|
|
162
174
|
try:
|
|
@@ -406,6 +418,20 @@ def ensure_database_initialized(app: Flask | None = None) -> None:
|
|
|
406
418
|
_db.session.add(nuevo)
|
|
407
419
|
_db.session.commit()
|
|
408
420
|
|
|
421
|
+
# Handle database migrations with Alembic
|
|
422
|
+
# Check if AUTO_MIGRATE is enabled and run migrations if database is already initialized
|
|
423
|
+
from coati_payroll.config import AUTO_MIGRATE
|
|
424
|
+
|
|
425
|
+
if AUTO_MIGRATE:
|
|
426
|
+
try:
|
|
427
|
+
log.trace("ensure_database_initialized: AUTO_MIGRATE enabled, running alembic.upgrade()")
|
|
428
|
+
alembic.upgrade()
|
|
429
|
+
log.info("Database migrated successfully with alembic.upgrade()")
|
|
430
|
+
except Exception as exc:
|
|
431
|
+
log.warning(f"Error during automatic database migration: {exc}")
|
|
432
|
+
# Don't fail initialization if migration fails
|
|
433
|
+
pass
|
|
434
|
+
|
|
409
435
|
# Initialize language from environment variable if provided
|
|
410
436
|
try:
|
|
411
437
|
from coati_payroll.locale_config import initialize_language_from_env
|
|
@@ -903,26 +903,29 @@ def database_restore(ctx, backup_file, yes):
|
|
|
903
903
|
sys.exit(1)
|
|
904
904
|
|
|
905
905
|
|
|
906
|
+
def _database_migrate_upgrade():
|
|
907
|
+
"""Apply database migrations to latest version.
|
|
908
|
+
|
|
909
|
+
Helper function used by both migrate and upgrade commands.
|
|
910
|
+
"""
|
|
911
|
+
from coati_payroll import alembic
|
|
912
|
+
|
|
913
|
+
click.echo("Applying database migrations...")
|
|
914
|
+
alembic.upgrade()
|
|
915
|
+
|
|
916
|
+
|
|
906
917
|
@database.command("migrate")
|
|
907
918
|
@with_appcontext
|
|
908
919
|
@pass_context
|
|
909
920
|
def database_migrate(ctx):
|
|
910
|
-
"""
|
|
921
|
+
"""Apply database migrations to latest version."""
|
|
911
922
|
try:
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
from flask_migrate import Migrate, init, migrate # noqa: F401
|
|
915
|
-
|
|
916
|
-
click.echo("Generating database migration...")
|
|
917
|
-
# This would need proper setup
|
|
918
|
-
output_result(ctx, "Migration support requires flask-migrate setup")
|
|
919
|
-
|
|
920
|
-
except ImportError:
|
|
921
|
-
output_result(ctx, "flask-migrate not installed. Run: pip install flask-migrate", None, False)
|
|
922
|
-
sys.exit(1)
|
|
923
|
+
_database_migrate_upgrade()
|
|
924
|
+
output_result(ctx, "Database migrated successfully to latest version")
|
|
923
925
|
|
|
924
926
|
except Exception as e:
|
|
925
|
-
output_result(ctx, f"Failed to
|
|
927
|
+
output_result(ctx, f"Failed to apply migrations: {e}", None, False)
|
|
928
|
+
log.exception("Failed to apply migrations")
|
|
926
929
|
sys.exit(1)
|
|
927
930
|
|
|
928
931
|
|
|
@@ -930,20 +933,86 @@ def database_migrate(ctx):
|
|
|
930
933
|
@with_appcontext
|
|
931
934
|
@pass_context
|
|
932
935
|
def database_upgrade(ctx):
|
|
933
|
-
"""Apply database migrations."""
|
|
936
|
+
"""Apply database migrations (alias for migrate)."""
|
|
937
|
+
try:
|
|
938
|
+
_database_migrate_upgrade()
|
|
939
|
+
output_result(ctx, "Database migrated successfully to latest version")
|
|
940
|
+
|
|
941
|
+
except Exception as e:
|
|
942
|
+
output_result(ctx, f"Failed to apply migrations: {e}", None, False)
|
|
943
|
+
log.exception("Failed to apply migrations")
|
|
944
|
+
sys.exit(1)
|
|
945
|
+
|
|
946
|
+
|
|
947
|
+
@database.command("downgrade")
|
|
948
|
+
@click.argument("revision", default="-1")
|
|
949
|
+
@with_appcontext
|
|
950
|
+
@pass_context
|
|
951
|
+
def database_downgrade(ctx, revision):
|
|
952
|
+
"""Downgrade database to a previous migration.
|
|
953
|
+
|
|
954
|
+
Args:
|
|
955
|
+
revision: Target revision (default: -1 for one step back, or 'base' for all the way back)
|
|
956
|
+
"""
|
|
957
|
+
try:
|
|
958
|
+
from coati_payroll import alembic
|
|
959
|
+
|
|
960
|
+
click.echo(f"Downgrading database to revision: {revision}...")
|
|
961
|
+
alembic.downgrade(revision)
|
|
962
|
+
output_result(ctx, f"Database downgraded successfully to revision: {revision}")
|
|
963
|
+
|
|
964
|
+
except Exception as e:
|
|
965
|
+
output_result(ctx, f"Failed to downgrade database: {e}", None, False)
|
|
966
|
+
log.exception("Failed to downgrade database")
|
|
967
|
+
sys.exit(1)
|
|
968
|
+
|
|
969
|
+
|
|
970
|
+
@database.command("current")
|
|
971
|
+
@with_appcontext
|
|
972
|
+
@pass_context
|
|
973
|
+
def database_current(ctx):
|
|
974
|
+
"""Show current migration revision."""
|
|
934
975
|
try:
|
|
976
|
+
from coati_payroll.model import db
|
|
977
|
+
|
|
978
|
+
# Get current revision
|
|
979
|
+
revision = None
|
|
935
980
|
try:
|
|
936
|
-
|
|
981
|
+
revision = db.session.execute(db.text("SELECT version_num FROM alembic_version")).scalar()
|
|
982
|
+
except Exception:
|
|
983
|
+
pass
|
|
937
984
|
|
|
938
|
-
|
|
939
|
-
output_result(ctx, "
|
|
985
|
+
if revision:
|
|
986
|
+
output_result(ctx, f"Current database revision: {revision}", {"revision": revision})
|
|
987
|
+
else:
|
|
988
|
+
output_result(ctx, "No migration version found (database not stamped)", None, False)
|
|
940
989
|
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
990
|
+
except Exception as e:
|
|
991
|
+
output_result(ctx, f"Failed to get current revision: {e}", None, False)
|
|
992
|
+
log.exception("Failed to get current revision")
|
|
993
|
+
sys.exit(1)
|
|
994
|
+
|
|
995
|
+
|
|
996
|
+
@database.command("stamp")
|
|
997
|
+
@click.argument("revision", default="head")
|
|
998
|
+
@with_appcontext
|
|
999
|
+
@pass_context
|
|
1000
|
+
def database_stamp(ctx, revision):
|
|
1001
|
+
"""Stamp the database with a specific revision without running migrations.
|
|
1002
|
+
|
|
1003
|
+
Args:
|
|
1004
|
+
revision: Target revision to stamp (default: 'head' for latest)
|
|
1005
|
+
"""
|
|
1006
|
+
try:
|
|
1007
|
+
from coati_payroll import alembic
|
|
1008
|
+
|
|
1009
|
+
click.echo(f"Stamping database with revision: {revision}...")
|
|
1010
|
+
alembic.stamp(revision)
|
|
1011
|
+
output_result(ctx, f"Database stamped successfully with revision: {revision}")
|
|
944
1012
|
|
|
945
1013
|
except Exception as e:
|
|
946
|
-
output_result(ctx, f"Failed to
|
|
1014
|
+
output_result(ctx, f"Failed to stamp database: {e}", None, False)
|
|
1015
|
+
log.exception("Failed to stamp database")
|
|
947
1016
|
sys.exit(1)
|
|
948
1017
|
|
|
949
1018
|
|
|
@@ -99,6 +99,9 @@ DESARROLLO = any(
|
|
|
99
99
|
str(environ.get(var, "")).strip().lower() in VALORES_TRUE for var in [*DEBUG_VARS, *FRAMEWORK_VARS, *GENERIC_VARS]
|
|
100
100
|
)
|
|
101
101
|
|
|
102
|
+
# Auto-migrate configuration - enables automatic database migrations on startup
|
|
103
|
+
AUTO_MIGRATE = environ.get("COATI_AUTO_MIGRATE", "0").strip().lower() in VALORES_TRUE
|
|
104
|
+
|
|
102
105
|
# < --------------------------------------------------------------------------------------------- >
|
|
103
106
|
# Directorios base de la aplicacion
|
|
104
107
|
DIRECTORIO_ACTUAL: Path = Path(path.abspath(path.dirname(__file__)))
|
|
@@ -34,7 +34,6 @@ from __future__ import annotations
|
|
|
34
34
|
# <-------------------------------------------------------------------------> #
|
|
35
35
|
from coati_payroll.i18n import _l as _
|
|
36
36
|
|
|
37
|
-
|
|
38
37
|
# American currencies (North, Central, South America, and Caribbean)
|
|
39
38
|
# Currency names are marked for translation
|
|
40
39
|
CURRENCIES = [
|
|
@@ -0,0 +1,55 @@
|
|
|
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
|
+
"""Initial migration - mark existing database schema
|
|
15
|
+
|
|
16
|
+
Revision ID: 20260125_032900
|
|
17
|
+
Revises:
|
|
18
|
+
Create Date: 2026-01-25 03:29:00
|
|
19
|
+
|
|
20
|
+
This is the initial migration that marks the existing database schema as the base.
|
|
21
|
+
This migration doesn't create or modify any tables - it assumes that the database
|
|
22
|
+
was already initialized using db.create_all() before implementing flask-alembic.
|
|
23
|
+
|
|
24
|
+
For new databases, the schema will be created by db.create_all() in the
|
|
25
|
+
ensure_database_initialized() function, and then this migration will be stamped
|
|
26
|
+
as 'head' to mark the database as up to date.
|
|
27
|
+
|
|
28
|
+
For existing databases, this migration should be stamped as 'head' without running
|
|
29
|
+
any actual migrations, as the database already contains all the tables.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
# revision identifiers, used by Alembic.
|
|
34
|
+
revision = "20260125_032900"
|
|
35
|
+
down_revision = None
|
|
36
|
+
branch_labels = None
|
|
37
|
+
depends_on = None
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def upgrade():
|
|
41
|
+
"""Upgrade to this revision.
|
|
42
|
+
|
|
43
|
+
This is a no-op migration because we assume the database schema was already
|
|
44
|
+
created by db.create_all(). This migration simply marks the schema version.
|
|
45
|
+
"""
|
|
46
|
+
pass
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def downgrade():
|
|
50
|
+
"""Downgrade from this revision.
|
|
51
|
+
|
|
52
|
+
This is a no-op migration. Downgrading from the initial migration would
|
|
53
|
+
require dropping all tables, which should be done with db.drop_all() instead.
|
|
54
|
+
"""
|
|
55
|
+
pass
|
|
@@ -0,0 +1,14 @@
|
|
|
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
|
+
"""Database migrations for Coati Payroll."""
|
|
@@ -51,7 +51,6 @@ from coati_payroll.model import (
|
|
|
51
51
|
)
|
|
52
52
|
from coati_payroll.log import log
|
|
53
53
|
|
|
54
|
-
|
|
55
54
|
# ============================================================================
|
|
56
55
|
# Whitelisted entities and fields for custom reports
|
|
57
56
|
# ============================================================================
|
|
@@ -747,7 +747,9 @@ label{ color: var(--text-primary); font-size: 12px; font-weight: 500; }
|
|
|
747
747
|
/* Sidebar opens fully expanded on mobile (no collapse behavior) */
|
|
748
748
|
.sidebar.open{ left: 0; width: 240px; }
|
|
749
749
|
.sidebar:hover { width: 240px; }
|
|
750
|
-
.sidebar .nav-link span {
|
|
750
|
+
.sidebar .nav-link > span {
|
|
751
|
+
width: auto;
|
|
752
|
+
}
|
|
751
753
|
.sidebar .nav-link span span { opacity: 1; }
|
|
752
754
|
.sidebar .sidebar-header {
|
|
753
755
|
opacity: 1;
|
|
@@ -45,7 +45,6 @@ from coati_payroll.model import (
|
|
|
45
45
|
)
|
|
46
46
|
from coati_payroll.enums import TipoDetalle
|
|
47
47
|
|
|
48
|
-
|
|
49
48
|
# ============================================================================
|
|
50
49
|
# System Report Registry
|
|
51
50
|
# ============================================================================
|
|
@@ -29,7 +29,6 @@ from coati_payroll.liquidacion_engine import ejecutar_liquidacion, recalcular_li
|
|
|
29
29
|
from coati_payroll.vistas.planilla.helpers import check_openpyxl_available
|
|
30
30
|
from coati_payroll.vistas.planilla.services import ExportService
|
|
31
31
|
|
|
32
|
-
|
|
33
32
|
liquidacion_bp = Blueprint("liquidacion", __name__, url_prefix="/liquidaciones")
|
|
34
33
|
|
|
35
34
|
# Constants
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: coati-payroll
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.10
|
|
4
4
|
Summary: A jurisdiction-agnostic payroll calculation engine.
|
|
5
5
|
Requires-Python: >=3.11
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
7
7
|
License-File: LICENSE
|
|
8
|
+
Requires-Dist: alembic==1.18.1
|
|
8
9
|
Requires-Dist: argon2-cffi
|
|
9
10
|
Requires-Dist: babel
|
|
10
11
|
Requires-Dist: configobj
|
|
11
12
|
Requires-Dist: cryptography
|
|
12
13
|
Requires-Dist: dramatiq[redis]
|
|
13
14
|
Requires-Dist: email_validator
|
|
14
|
-
Requires-Dist: huey
|
|
15
15
|
Requires-Dist: flask
|
|
16
|
+
Requires-Dist: flask-alembic==3.2.0
|
|
16
17
|
Requires-Dist: flask-babel
|
|
17
18
|
Requires-Dist: flask-caching
|
|
18
19
|
Requires-Dist: flask-limiter
|
|
@@ -23,6 +24,7 @@ Requires-Dist: flask-session
|
|
|
23
24
|
Requires-Dist: flask-sqlalchemy
|
|
24
25
|
Requires-Dist: flask_weasyprint
|
|
25
26
|
Requires-Dist: flask-wtf
|
|
27
|
+
Requires-Dist: huey
|
|
26
28
|
Requires-Dist: mysql-connector-python
|
|
27
29
|
Requires-Dist: openpyxl
|
|
28
30
|
Requires-Dist: orjson
|
|
@@ -67,6 +67,8 @@ coati_payroll/formula_engine/validation/security_validator.py
|
|
|
67
67
|
coati_payroll/formula_engine/validation/tax_table_validator.py
|
|
68
68
|
coati_payroll/liquidacion_engine/__init__.py
|
|
69
69
|
coati_payroll/liquidacion_engine/engine.py
|
|
70
|
+
coati_payroll/migrations/20260125_032900_initial_migration.py
|
|
71
|
+
coati_payroll/migrations/__init__.py
|
|
70
72
|
coati_payroll/nomina_engine/__init__.py
|
|
71
73
|
coati_payroll/nomina_engine/engine.py
|
|
72
74
|
coati_payroll/nomina_engine/calculators/__init__.py
|
|
@@ -248,6 +250,7 @@ coati_payroll/vistas/planilla/services/novedad_service.py
|
|
|
248
250
|
coati_payroll/vistas/planilla/services/planilla_service.py
|
|
249
251
|
coati_payroll/vistas/planilla/validators/__init__.py
|
|
250
252
|
coati_payroll/vistas/planilla/validators/planilla_validators.py
|
|
253
|
+
tests/test_alembic_migrations.py
|
|
251
254
|
tests/test_ast_security.py
|
|
252
255
|
tests/test_ast_visitor.py
|
|
253
256
|
tests/test_cli.py
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
+
alembic==1.18.1
|
|
1
2
|
argon2-cffi
|
|
2
3
|
babel
|
|
3
4
|
configobj
|
|
4
5
|
cryptography
|
|
5
6
|
dramatiq[redis]
|
|
6
7
|
email_validator
|
|
7
|
-
huey
|
|
8
8
|
flask
|
|
9
|
+
flask-alembic==3.2.0
|
|
9
10
|
flask-babel
|
|
10
11
|
flask-caching
|
|
11
12
|
flask-limiter
|
|
@@ -16,6 +17,7 @@ flask-session
|
|
|
16
17
|
flask-sqlalchemy
|
|
17
18
|
flask_weasyprint
|
|
18
19
|
flask-wtf
|
|
20
|
+
huey
|
|
19
21
|
mysql-connector-python
|
|
20
22
|
openpyxl
|
|
21
23
|
orjson
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
+
alembic==1.18.1
|
|
1
2
|
argon2-cffi
|
|
2
3
|
babel
|
|
3
4
|
configobj
|
|
4
5
|
cryptography
|
|
5
6
|
dramatiq[redis]
|
|
6
7
|
email_validator
|
|
7
|
-
huey
|
|
8
8
|
flask
|
|
9
|
+
flask-alembic==3.2.0
|
|
9
10
|
flask-babel
|
|
10
11
|
flask-caching
|
|
11
12
|
flask-limiter
|
|
@@ -16,6 +17,7 @@ flask-session
|
|
|
16
17
|
flask-sqlalchemy
|
|
17
18
|
flask_weasyprint
|
|
18
19
|
flask-wtf
|
|
20
|
+
huey
|
|
19
21
|
mysql-connector-python
|
|
20
22
|
openpyxl
|
|
21
23
|
orjson
|