coati-payroll 0.0.9__py3-none-any.whl → 0.0.10__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 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:
@@ -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
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
- """Generate database migration."""
921
+ """Apply database migrations to latest version."""
911
922
  try:
912
- # Try to use flask-migrate
913
- try:
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 generate migration: {e}", None, False)
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
- from flask_migrate import upgrade # noqa: F401
981
+ revision = db.session.execute(db.text("SELECT version_num FROM alembic_version")).scalar()
982
+ except Exception:
983
+ pass
937
984
 
938
- click.echo("Applying database migrations...")
939
- output_result(ctx, "Migration support requires flask-migrate setup")
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
- except ImportError:
942
- output_result(ctx, "flask-migrate not installed. Run: pip install flask-migrate", None, False)
943
- sys.exit(1)
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 apply migrations: {e}", None, False)
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__)))
@@ -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."""
@@ -9,7 +9,6 @@ from flask import Flask
9
9
  from coati_payroll.log import log
10
10
  from coati_payroll.model import PluginRegistry, db
11
11
 
12
-
13
12
  PLUGIN_DISTRIBUTION_PREFIX = "coati-payroll-plugin-"
14
13
 
15
14
 
@@ -21,7 +21,6 @@ from coati_payroll.log import log
21
21
  from coati_payroll.queue.driver import QueueDriver
22
22
  from coati_payroll.queue.drivers import DramatiqDriver, HueyDriver, NoopQueueDriver
23
23
 
24
-
25
24
  _cached_driver: QueueDriver | None = None
26
25
 
27
26
 
@@ -46,7 +46,6 @@ from coati_payroll.model import (
46
46
  from coati_payroll.nomina_engine import NominaEngine
47
47
  from coati_payroll.queue import get_queue_driver
48
48
 
49
-
50
49
  # Get the queue driver
51
50
  queue = get_queue_driver()
52
51
 
@@ -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
  # ============================================================================
@@ -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
@@ -15,4 +15,4 @@
15
15
  Canonical version of coati_payroll.
16
16
  """
17
17
 
18
- __version__ = "0.0.9"
18
+ __version__ = "0.0.10"
@@ -23,7 +23,6 @@ from coati_payroll.i18n import _
23
23
  from coati_payroll.model import ConfiguracionCalculos, db
24
24
  from coati_payroll.rbac import require_write_access
25
25
 
26
-
27
26
  config_calculos_bp = Blueprint("config_calculos", __name__, url_prefix="/config-calculos")
28
27
 
29
28
 
@@ -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
@@ -6,7 +6,6 @@ from coati_payroll.i18n import _
6
6
  from coati_payroll.model import PluginRegistry, db
7
7
  from coati_payroll.rbac import require_write_access
8
8
 
9
-
10
9
  plugins_bp = Blueprint("plugins", __name__, url_prefix="/plugins")
11
10
 
12
11
  # Constants
@@ -1,18 +1,19 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: coati-payroll
3
- Version: 0.0.9
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
@@ -1,29 +1,29 @@
1
- coati_payroll/__init__.py,sha256=UMMb03475dPNvlnvP4TuyNH0GAmL1FjPi5ND92-igbc,16126
1
+ coati_payroll/__init__.py,sha256=XLgl3-49tFRB1L6IWMGpuTGrpmor2NorLAiCcWBlK7w,17179
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=n1DbogA1dYH_Jbs393pvpT_DPi6vSwKWR0sGjsYcbhY,47962
6
- coati_payroll/config.py,sha256=dM3kcUsW6_gR1Vopdb_28fWxmhUi7lkj30kJfSU8zrY,9420
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=TpmEX6QMBhfA5Scrwi2hr1tMg3bdzNmW46W_U_bGras,22228
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
15
  coati_payroll/log.py,sha256=SAD_X-yMuvYZPIx1FbvwdMCEeS9_aX71A6EIeD8dLX4,4439
16
16
  coati_payroll/model.py,sha256=CSjxdNNDyUn7z8R_zJvKkqTn4L4_rH0JurB150ayu08,111479
17
- coati_payroll/plugin_manager.py,sha256=CJy_HK6WsGnjBDjm2m6ftVxneTffUKbPAep5cjyV1GU,5695
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=TqhBD5o7wyWnM9kPuI0y28HEuQUaVcwMOElBsSCsepg,16905
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=b0rLFUsGt-KYZPWh4tSpBeGqdJBOYfIO3cDuIAFJMIg,20406
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=HMZR0y5DSyL_cyJw4lIb_vBV8YVKPSAWqwztiM0jZUk,650
26
+ coati_payroll/version.py,sha256=woAE2W4I24adU-iLRW57CeSO8SsZZKKhBdPrl2wMMlY,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=WRg_MDTewhBGJg0K6Z6cnufBYCaUvY2eLvrkZDbFL8I,3989
105
- coati_payroll/queue/tasks.py,sha256=QsHJ-kcbqB-3diKevvpcUW-D0Ie6bvIRiqAtv2ez40E,27294
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=YgN5gi161bvHDJ5wLpfY5GsTrssSgsj0HXu5nNI4mWE,2467
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=vIn8pKgaZ8xN8aBvTC34xr4qxwFgiCNGc0hn1XjBNk4,7372
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=0eE6PbmBOIeNfC43R28HrR2jZEx3kARYlFana196wRI,1437
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.9.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
242
- coati_payroll-0.0.9.dist-info/METADATA,sha256=rna4Pt38udfQM7FXZGdvVwx-RE_669ugOKvrrkJb__s,22236
243
- coati_payroll-0.0.9.dist-info/WHEEL,sha256=hPN0AlP2dZM_3ZJZWP4WooepkmU9wzjGgCLCeFjkHLA,92
244
- coati_payroll-0.0.9.dist-info/entry_points.txt,sha256=GtZVGVYEFlpeSs7eHYh701VG7ftRRrZ54fsyFmbeZZc,54
245
- coati_payroll-0.0.9.dist-info/top_level.txt,sha256=wRaRlWHJnSoqktbTT1XJUkPNgKnR7VS75Ytyl8JJYPY,14
246
- coati_payroll-0.0.9.dist-info/RECORD,,
243
+ coati_payroll-0.0.10.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
244
+ coati_payroll-0.0.10.dist-info/METADATA,sha256=CP1cA2idUzgCUWHyYLzF6lkQiCePysm3u1x_laJDdVw,22304
245
+ coati_payroll-0.0.10.dist-info/WHEEL,sha256=hPN0AlP2dZM_3ZJZWP4WooepkmU9wzjGgCLCeFjkHLA,92
246
+ coati_payroll-0.0.10.dist-info/entry_points.txt,sha256=GtZVGVYEFlpeSs7eHYh701VG7ftRRrZ54fsyFmbeZZc,54
247
+ coati_payroll-0.0.10.dist-info/top_level.txt,sha256=wRaRlWHJnSoqktbTT1XJUkPNgKnR7VS75Ytyl8JJYPY,14
248
+ coati_payroll-0.0.10.dist-info/RECORD,,