coati-payroll 0.0.9__py3-none-any.whl → 0.0.11__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 +39 -33
- coati_payroll/cli.py +90 -21
- coati_payroll/config.py +3 -0
- coati_payroll/initial_data.py +0 -1
- coati_payroll/log.py +1 -1
- coati_payroll/migrations/20260125_032900_initial_migration.py +55 -0
- coati_payroll/migrations/__init__.py +14 -0
- coati_payroll/plugin_manager.py +0 -1
- coati_payroll/queue/selector.py +0 -1
- coati_payroll/queue/tasks.py +0 -1
- coati_payroll/report_engine.py +0 -1
- coati_payroll/system_reports.py +0 -1
- coati_payroll/version.py +1 -1
- coati_payroll/vistas/config_calculos.py +0 -1
- coati_payroll/vistas/liquidacion.py +0 -1
- coati_payroll/vistas/plugins.py +0 -1
- {coati_payroll-0.0.9.dist-info → coati_payroll-0.0.11.dist-info}/METADATA +4 -2
- {coati_payroll-0.0.9.dist-info → coati_payroll-0.0.11.dist-info}/RECORD +22 -20
- {coati_payroll-0.0.9.dist-info → coati_payroll-0.0.11.dist-info}/LICENSE +0 -0
- {coati_payroll-0.0.9.dist-info → coati_payroll-0.0.11.dist-info}/WHEEL +0 -0
- {coati_payroll-0.0.9.dist-info → coati_payroll-0.0.11.dist-info}/entry_points.txt +0 -0
- {coati_payroll-0.0.9.dist-info → coati_payroll-0.0.11.dist-info}/top_level.txt +0 -0
coati_payroll/__init__.py
CHANGED
|
@@ -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:
|
|
@@ -165,7 +177,7 @@ def create_app(config) -> Flask:
|
|
|
165
177
|
except Exception:
|
|
166
178
|
log.trace("create_app: could not read SQLALCHEMY_DATABASE_URI from app.config")
|
|
167
179
|
|
|
168
|
-
#
|
|
180
|
+
# Garantizar que las tablas básicas, el usuario admin y la configuración inicial existan
|
|
169
181
|
try:
|
|
170
182
|
log.trace("create_app: calling ensure_database_initialized")
|
|
171
183
|
ensure_database_initialized(app)
|
|
@@ -176,7 +188,7 @@ def create_app(config) -> Flask:
|
|
|
176
188
|
log.exception("create_app: ensure_database_initialized exception")
|
|
177
189
|
except Exception:
|
|
178
190
|
pass
|
|
179
|
-
# No
|
|
191
|
+
# No detener el arranque si la inicialización automática falla
|
|
180
192
|
pass
|
|
181
193
|
|
|
182
194
|
try:
|
|
@@ -231,30 +243,6 @@ def create_app(config) -> Flask:
|
|
|
231
243
|
|
|
232
244
|
limiter = configure_rate_limiting(app)
|
|
233
245
|
|
|
234
|
-
# Load initial data and demo data after Babel is initialized
|
|
235
|
-
# This allows translations to work properly
|
|
236
|
-
# Skip loading in test environments to keep test databases clean
|
|
237
|
-
if not app.config.get("TESTING"):
|
|
238
|
-
with app.app_context():
|
|
239
|
-
# Load initial data (currencies, income concepts, deduction concepts)
|
|
240
|
-
# Strings are translated automatically based on the configured language
|
|
241
|
-
try:
|
|
242
|
-
from coati_payroll.initial_data import load_initial_data
|
|
243
|
-
|
|
244
|
-
load_initial_data()
|
|
245
|
-
except Exception as exc:
|
|
246
|
-
log.trace(f"Could not load initial data: {exc}")
|
|
247
|
-
|
|
248
|
-
# Load demo data if COATI_LOAD_DEMO_DATA environment variable is set
|
|
249
|
-
# This provides comprehensive sample data for manual testing
|
|
250
|
-
if environ.get("COATI_LOAD_DEMO_DATA"):
|
|
251
|
-
try:
|
|
252
|
-
from coati_payroll.demo_data import load_demo_data
|
|
253
|
-
|
|
254
|
-
load_demo_data()
|
|
255
|
-
except Exception as exc:
|
|
256
|
-
log.trace(f"Could not load demo data: {exc}")
|
|
257
|
-
|
|
258
246
|
app.register_blueprint(auth, url_prefix="/auth")
|
|
259
247
|
app.register_blueprint(app_blueprint, url_prefix="/")
|
|
260
248
|
|
|
@@ -378,13 +366,17 @@ def ensure_database_initialized(app: Flask | None = None) -> None:
|
|
|
378
366
|
_db.create_all()
|
|
379
367
|
log.trace("ensure_database_initialized: create_all() completed")
|
|
380
368
|
except Exception as exc:
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
369
|
+
from sqlalchemy.exc import OperationalError
|
|
370
|
+
|
|
371
|
+
msg = str(exc).lower()
|
|
372
|
+
if isinstance(exc, OperationalError) and "already exists" in msg:
|
|
373
|
+
log.trace("ensure_database_initialized: create_all skipped existing objects")
|
|
374
|
+
else:
|
|
375
|
+
log.trace(f"ensure_database_initialized: create_all() raised: {exc}")
|
|
376
|
+
try:
|
|
377
|
+
log.exception("ensure_database_initialized: create_all() exception")
|
|
378
|
+
except Exception:
|
|
379
|
+
pass
|
|
388
380
|
|
|
389
381
|
# Comprobar existencia de al menos un admin.
|
|
390
382
|
registro_admin = _db.session.execute(_db.select(Usuario).filter_by(tipo="admin")).scalar_one_or_none()
|
|
@@ -406,6 +398,20 @@ def ensure_database_initialized(app: Flask | None = None) -> None:
|
|
|
406
398
|
_db.session.add(nuevo)
|
|
407
399
|
_db.session.commit()
|
|
408
400
|
|
|
401
|
+
# Handle database migrations with Alembic
|
|
402
|
+
# Check if AUTO_MIGRATE is enabled and run migrations if database is already initialized
|
|
403
|
+
from coati_payroll.config import AUTO_MIGRATE
|
|
404
|
+
|
|
405
|
+
if AUTO_MIGRATE:
|
|
406
|
+
try:
|
|
407
|
+
log.trace("ensure_database_initialized: AUTO_MIGRATE enabled, running alembic.upgrade()")
|
|
408
|
+
alembic.upgrade()
|
|
409
|
+
log.info("Database migrated successfully with alembic.upgrade()")
|
|
410
|
+
except Exception as exc:
|
|
411
|
+
log.warning(f"Error during automatic database migration: {exc}")
|
|
412
|
+
# Don't fail initialization if migration fails
|
|
413
|
+
pass
|
|
414
|
+
|
|
409
415
|
# Initialize language from environment variable if provided
|
|
410
416
|
try:
|
|
411
417
|
from coati_payroll.locale_config import initialize_language_from_env
|
coati_payroll/cli.py
CHANGED
|
@@ -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
|
|
coati_payroll/config.py
CHANGED
|
@@ -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__)))
|
coati_payroll/initial_data.py
CHANGED
|
@@ -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 = [
|
coati_payroll/log.py
CHANGED
|
@@ -62,7 +62,7 @@ custom_levels = {
|
|
|
62
62
|
numeric_level = custom_levels.get(log_level_str, logging.INFO)
|
|
63
63
|
|
|
64
64
|
# Configurar logger raíz
|
|
65
|
-
root_logger = logging.getLogger("
|
|
65
|
+
root_logger = logging.getLogger("coati_payroll")
|
|
66
66
|
root_logger.setLevel(numeric_level)
|
|
67
67
|
|
|
68
68
|
# Handler solo para stdout
|
|
@@ -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."""
|
coati_payroll/plugin_manager.py
CHANGED
coati_payroll/queue/selector.py
CHANGED
coati_payroll/queue/tasks.py
CHANGED
coati_payroll/report_engine.py
CHANGED
|
@@ -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
|
# ============================================================================
|
coati_payroll/system_reports.py
CHANGED
|
@@ -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
|
# ============================================================================
|
coati_payroll/version.py
CHANGED
|
@@ -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
|
coati_payroll/vistas/plugins.py
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: coati-payroll
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.11
|
|
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
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
coati_payroll/__init__.py,sha256=
|
|
1
|
+
coati_payroll/__init__.py,sha256=sq6mEPCWCH3W6-kfrcrX04TpMhNzePace0sz-_lMgUg,16258
|
|
2
2
|
coati_payroll/app.py,sha256=PPn5U2ViKU8yRiP0OMPkozq4CRWxp9Un27R_jAAkQ_g,3502
|
|
3
3
|
coati_payroll/audit_helpers.py,sha256=0BDspyO5eQLRrdUCUcu5xe7F--2a-8OOAcejLJ4CcAg,27556
|
|
4
4
|
coati_payroll/auth.py,sha256=v8yzxQnDZy3kbJnt9MWikyDJNwgCSkZpvfwARUnDh4s,4436
|
|
5
|
-
coati_payroll/cli.py,sha256=
|
|
6
|
-
coati_payroll/config.py,sha256=
|
|
5
|
+
coati_payroll/cli.py,sha256=9FHCzZ1OUE1lDJNeCHYNrXV8at36H5lHsQVKCnZ6-Yo,50035
|
|
6
|
+
coati_payroll/config.py,sha256=P0h7jI8-hW85WbnS_TT39C3rZ1Agap1GL52YgxkceGs,9587
|
|
7
7
|
coati_payroll/demo_data.py,sha256=pE7DUwZWq3jHCwt6vO_kW0sIuMFJmu9u1pqKUGWF9Ag,31437
|
|
8
8
|
coati_payroll/enums.py,sha256=TEJ8Yxy-0UPsQUSDs7pbZgOg-VoqFOx8KnY0lTh3KzA,9211
|
|
9
9
|
coati_payroll/forms.py,sha256=JwzWYyF5B27vV6QqWRPDNPSEMDhOU8djTzlpXT0SAik,62027
|
|
10
10
|
coati_payroll/formula_engine_examples.py,sha256=Dro6z9xG_QDkio-UGgsJ6DItj3jc1sJBdZYI-lRAdo0,6320
|
|
11
11
|
coati_payroll/i18n.py,sha256=d5tMFKz_CII3EaaFhCBaMr0chi7UqdhibEOlp2GvU2k,1996
|
|
12
|
-
coati_payroll/initial_data.py,sha256=
|
|
12
|
+
coati_payroll/initial_data.py,sha256=qs7IIOJit5wZNc3JNPResSPhuPPEi_ohObSJ9UzMedw,22227
|
|
13
13
|
coati_payroll/interes_engine.py,sha256=YIvIj2WIb6rqFxNOIpqYaqnT04Gn0Nq9YVkPyg5LiDw,15013
|
|
14
14
|
coati_payroll/locale_config.py,sha256=j_p24MVrdVN58-XcplD5SziLFs99PTb1IOfU0quU35g,5457
|
|
15
|
-
coati_payroll/log.py,sha256=
|
|
15
|
+
coati_payroll/log.py,sha256=xbGSNLY4Xv3kCbLsvOnJwg0CRDEcCsaAIkR8Nw7alJQ,4445
|
|
16
16
|
coati_payroll/model.py,sha256=CSjxdNNDyUn7z8R_zJvKkqTn4L4_rH0JurB150ayu08,111479
|
|
17
|
-
coati_payroll/plugin_manager.py,sha256=
|
|
17
|
+
coati_payroll/plugin_manager.py,sha256=unQQ98D7ECT0AWH0oZH-eL8YzezSAJMc4X76BqPKmSQ,5694
|
|
18
18
|
coati_payroll/rate_limiting.py,sha256=jCrLdfjTRZa8ldY1W4Oc9E5bJgg9xj73zfgAegWK1KY,2918
|
|
19
19
|
coati_payroll/rbac.py,sha256=CQSAOdrG05U5KZvAsmSSffOtJNgYjTVAQqZutOzpsUw,5700
|
|
20
|
-
coati_payroll/report_engine.py,sha256=
|
|
20
|
+
coati_payroll/report_engine.py,sha256=UnQqD39DEsXOCO4Y_NFSgT9Xqo5oNHjJoV48zWekU6Y,16904
|
|
21
21
|
coati_payroll/report_export.py,sha256=pAWdE-VRBxi6brUbuAE79BnCL-yPQBQhe4FYqsLB9JA,7536
|
|
22
22
|
coati_payroll/schema_validator.py,sha256=wa2X7VrXrEA6OzybycHdMD7smKqeF6Vp7oNSmV7y8zY,6175
|
|
23
23
|
coati_payroll/security.py,sha256=EYARqQI6llhfczpGamaaJdFF0fLBHn0-2dWcXy6kEO0,3040
|
|
24
|
-
coati_payroll/system_reports.py,sha256=
|
|
24
|
+
coati_payroll/system_reports.py,sha256=Py51zWa6oUHLqoYkqMXmdNcb7QxRlScDKnWaDhW7l-M,20405
|
|
25
25
|
coati_payroll/vacation_service.py,sha256=iMgE7CcCfd5ytCWknyokFlphfYrnmAu6jtlPIPzgpHQ,17600
|
|
26
|
-
coati_payroll/version.py,sha256=
|
|
26
|
+
coati_payroll/version.py,sha256=57Nzu6Q5Hw1Q4PqUHfwW9cowaKMegirNu_GxZMz9BOI,651
|
|
27
27
|
coati_payroll/formula_engine/__init__.py,sha256=Nixn2nFtOk6PGZpnXCwRLnb-Pid_lz6qPRIv7j2P3HM,2461
|
|
28
28
|
coati_payroll/formula_engine/data_sources.py,sha256=_UapWZiyWUqADnafpcd8936Vpg3Av_R2wxbvUEEi9Dc,30785
|
|
29
29
|
coati_payroll/formula_engine/engine.py,sha256=f3a7mM8ckiGtE6RMK9ByEZdsllSGUsBLi19WxreDYsE,8897
|
|
@@ -57,6 +57,8 @@ coati_payroll/formula_engine/validation/security_validator.py,sha256=DZxNf3fc8Jg
|
|
|
57
57
|
coati_payroll/formula_engine/validation/tax_table_validator.py,sha256=8Z0uxzAfk27acx-miyc7TmOeKSz1g8-WNLBeHv18CwI,8649
|
|
58
58
|
coati_payroll/liquidacion_engine/__init__.py,sha256=YGGcF7_dpYn08YW5B0kb5RjnffTWl9R1O55Tm9sCkNA,848
|
|
59
59
|
coati_payroll/liquidacion_engine/engine.py,sha256=EtLTiSop10J_mgCk2z2e8qk_KRxFR9NyqsdbdRxAod4,9531
|
|
60
|
+
coati_payroll/migrations/20260125_032900_initial_migration.py,sha256=grigZ2TQg2mPfM8823612y66ioAGENXqAmc68tIEG6E,1906
|
|
61
|
+
coati_payroll/migrations/__init__.py,sha256=VFMuf3JIEjJbp7R8Hnfsm98t6T5fjkXD5hZiw0f0FhU,628
|
|
60
62
|
coati_payroll/nomina_engine/__init__.py,sha256=XwCgr9bAor7649S6XcpDmZtBGYgF2r2W0JAtjhSUSWM,2203
|
|
61
63
|
coati_payroll/nomina_engine/engine.py,sha256=AKcDjbfxHIKBQ-DPaNWUPmY0lDyHNAYNiUzmfAPfiSw,6442
|
|
62
64
|
coati_payroll/nomina_engine/calculators/__init__.py,sha256=-lacxFmD_VJHNkQHhzkWdWT9ufNhZFvbT92AHAyHuA0,1119
|
|
@@ -101,8 +103,8 @@ coati_payroll/nomina_engine/validators/period_validator.py,sha256=YRwM_2nyPWCKxq
|
|
|
101
103
|
coati_payroll/nomina_engine/validators/planilla_validator.py,sha256=AYCxq6m4zwgxxTrqvVzH344WQc71lUsgnwv7TLP36t0,5620
|
|
102
104
|
coati_payroll/queue/__init__.py,sha256=HScxlH4ukGEurcClf5Qw9JBKkmangUNyBYwTj0z_bMw,1224
|
|
103
105
|
coati_payroll/queue/driver.py,sha256=lCHv-tTtIlYcp-ZtcEbaZdAtcZxkjVih4RHc0r7NkKE,4078
|
|
104
|
-
coati_payroll/queue/selector.py,sha256=
|
|
105
|
-
coati_payroll/queue/tasks.py,sha256=
|
|
106
|
+
coati_payroll/queue/selector.py,sha256=S_6n1rP0EzpGclkWdz4zpU3-ESRJEF4PtkThWVtzNhk,3988
|
|
107
|
+
coati_payroll/queue/tasks.py,sha256=XoKPIjs-Ho8kQEizg3XJiLkytMgZNxF0zKKkS1ddFtA,27293
|
|
106
108
|
coati_payroll/queue/drivers/__init__.py,sha256=Hyk6C7ecWBv7NDC5q047EVnJy2ETue97MFLUseu83gI,921
|
|
107
109
|
coati_payroll/queue/drivers/dramatiq_driver.py,sha256=-mSLzIpy0DixQOAt_btv0dQC4D05Ut-41VlR7QIfFsQ,9083
|
|
108
110
|
coati_payroll/queue/drivers/huey_driver.py,sha256=95edM5R1N-03rdSQb1t3VeH4SG99pxJn7i3RmG3ZrwM,13668
|
|
@@ -202,7 +204,7 @@ coati_payroll/translations/es/LC_MESSAGES/messages.po,sha256=k9e_ZGIytIILAy6GnJT
|
|
|
202
204
|
coati_payroll/vistas/__init__.py,sha256=mBrQiK6rzugKlmWGkMjjisKPzSUefuzXWQvAGbCsY7A,2370
|
|
203
205
|
coati_payroll/vistas/calculation_rule.py,sha256=sMa-ZNt8JWpqAGjZstMxeuD5ZaQX6XYZTWATYbtZAFU,10765
|
|
204
206
|
coati_payroll/vistas/carga_inicial_prestacion.py,sha256=q4UEi2tR7pIKzZVJ3oxhrZ0WVeZ0oUYeiB4bqV_YZ_I,16385
|
|
205
|
-
coati_payroll/vistas/config_calculos.py,sha256=
|
|
207
|
+
coati_payroll/vistas/config_calculos.py,sha256=J7XNofgE7k0gSUYRU9RuoQwDaESBnFI6Qt3g3Wsstfs,2466
|
|
206
208
|
coati_payroll/vistas/configuracion.py,sha256=4Q_JmZsXgrvMlg76JiltO3zYTQ-MEXF4dQr_fIwZefI,3060
|
|
207
209
|
coati_payroll/vistas/constants.py,sha256=AvqBNVoSQI6njzRrOhKFGkFQzrFNpAyxCM7aYF4N7TU,679
|
|
208
210
|
coati_payroll/vistas/currency.py,sha256=IPbHEqe-N16h4RMWITRjhQKqYnz6OQzOqpifpLPPHko,3617
|
|
@@ -210,9 +212,9 @@ coati_payroll/vistas/custom_field.py,sha256=dcUgK3MwDOf0MxiG-mgQe-7Rdwjg-oSuIKFc
|
|
|
210
212
|
coati_payroll/vistas/employee.py,sha256=bZ7yCkr2IGmBBeLaPksjYJGWyyPnRQaGuPeiLlwpmz8,12843
|
|
211
213
|
coati_payroll/vistas/empresa.py,sha256=mnFxp_ncGwDNX0_FYhyOKZa1DXetXsv94NSFFBnJxm4,5213
|
|
212
214
|
coati_payroll/vistas/exchange_rate.py,sha256=TXdVQRE8HixbdUqSCdYERLSNWs58yndWxtS6Dsg1gF0,13275
|
|
213
|
-
coati_payroll/vistas/liquidacion.py,sha256=
|
|
215
|
+
coati_payroll/vistas/liquidacion.py,sha256=kZtvpvMBj9OH3dL2bu7tQoqlrq1VIPrmGINs0XvHtTI,7371
|
|
214
216
|
coati_payroll/vistas/payroll_concepts.py,sha256=JEZSJrxqZxDGfEYNOBQh1olcvj2I132G0sK9ImICugc,20128
|
|
215
|
-
coati_payroll/vistas/plugins.py,sha256=
|
|
217
|
+
coati_payroll/vistas/plugins.py,sha256=ZtwJU-YYtSsbVDExkv7NvRkGRf318yyYLu0MYqvjNSE,1436
|
|
216
218
|
coati_payroll/vistas/prestacion.py,sha256=DKHhkspS7ycahFGFZANx0naYK8LagUFO8a3uh-I0GGw,10612
|
|
217
219
|
coati_payroll/vistas/prestamo.py,sha256=7Eqedla6e09nyTuQBw17pO66OTD-6rB4JByoxxF7nvo,29646
|
|
218
220
|
coati_payroll/vistas/report.py,sha256=bxiv_xucTap5rUD8_rKCP0TFmHoDZF_VeEql5E58P84,14490
|
|
@@ -238,9 +240,9 @@ coati_payroll/vistas/planilla/services/novedad_service.py,sha256=MYxbiqVrwzBbBTX
|
|
|
238
240
|
coati_payroll/vistas/planilla/services/planilla_service.py,sha256=xpqxD6XLdTMRJfbPhvpWSYW7P6IcHKZgW6Ahg7kthk4,1195
|
|
239
241
|
coati_payroll/vistas/planilla/validators/__init__.py,sha256=K-WnUGZaMYX-2DcduB-yMssuxUlztMCQKuGfqK67Vsk,754
|
|
240
242
|
coati_payroll/vistas/planilla/validators/planilla_validators.py,sha256=WH1cyY1D7XPSb3MupNszofT3-YvgqBfp8vFDpo8hDA8,1680
|
|
241
|
-
coati_payroll-0.0.
|
|
242
|
-
coati_payroll-0.0.
|
|
243
|
-
coati_payroll-0.0.
|
|
244
|
-
coati_payroll-0.0.
|
|
245
|
-
coati_payroll-0.0.
|
|
246
|
-
coati_payroll-0.0.
|
|
243
|
+
coati_payroll-0.0.11.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
244
|
+
coati_payroll-0.0.11.dist-info/METADATA,sha256=RuRkJ9aT1Qoxa0DGp3K1EBBtNDMx_hNRPxM4PWmyoEE,22304
|
|
245
|
+
coati_payroll-0.0.11.dist-info/WHEEL,sha256=hPN0AlP2dZM_3ZJZWP4WooepkmU9wzjGgCLCeFjkHLA,92
|
|
246
|
+
coati_payroll-0.0.11.dist-info/entry_points.txt,sha256=GtZVGVYEFlpeSs7eHYh701VG7ftRRrZ54fsyFmbeZZc,54
|
|
247
|
+
coati_payroll-0.0.11.dist-info/top_level.txt,sha256=wRaRlWHJnSoqktbTT1XJUkPNgKnR7VS75Ytyl8JJYPY,14
|
|
248
|
+
coati_payroll-0.0.11.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|