From 57745af9b51f09671f80d85ac489493680bd5489 Mon Sep 17 00:00:00 2001 From: Jair Cedillo Date: Tue, 11 Aug 2026 11:38:31 -0500 Subject: [PATCH] feat(fin): agrega las claves 628, 629 y 630 a c_RegimenFiscal MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit El catálogo sat.tax_regimes tenía 19 claves: las vigentes hasta 2022. Faltaban las tres que el SAT publicó con vigencia 01-01-2024, así que un receptor en esos regímenes no se podía representar y el timbrado habría quedado con clave incorrecta. - 628 Hidrocarburos (moral) - 629 De los Regímenes Fiscales Preferentes y de las Empresas Multinacionales (física) - 630 Enajenación de acciones en bolsa de valores (física) La migración reusa sync_catalogs (upsert idempotente). El downgrade desactiva las claves en vez de borrarlas: crm.accounts y fin.issuer_settings las referencian por FK y un CFDI ya timbrado debe seguir siendo legible. Co-Authored-By: Claude Opus 5 (1M context) --- .../k6l7m8n9o0p1_sat_tax_regimes_2024.py | 49 +++++++++++++++++++ .../api/v1/modules/fin/catalogs/seed_data.py | 4 ++ 2 files changed, 53 insertions(+) create mode 100644 backend/alembic/versions/k6l7m8n9o0p1_sat_tax_regimes_2024.py diff --git a/backend/alembic/versions/k6l7m8n9o0p1_sat_tax_regimes_2024.py b/backend/alembic/versions/k6l7m8n9o0p1_sat_tax_regimes_2024.py new file mode 100644 index 0000000..1cc1efd --- /dev/null +++ b/backend/alembic/versions/k6l7m8n9o0p1_sat_tax_regimes_2024.py @@ -0,0 +1,49 @@ +"""Claves de c_RegimenFiscal con vigencia 2024: 628, 629 y 630. + +El catálogo se había sembrado con las 19 claves vigentes hasta 2022 y quedaron fuera las +tres que el SAT publicó con vigencia a partir del 01-01-2024 (628 Hidrocarburos, 629 +Regímenes Fiscales Preferentes y Empresas Multinacionales, 630 Enajenación de acciones en +bolsa de valores). Sin ellas, el select de régimen del receptor no puede representar a un +contribuyente en esos regímenes y el timbrado quedaría con una clave incorrecta. + +``sync_catalogs`` es idempotente y hace upsert: inserta las tres claves nuevas y refresca +descripción y banderas de las que ya existen, sin tocar el resto de los catálogos. + +No se agrega la clave 609 (Consolidación): su vigencia terminó el 31-12-2019 y el catálogo +solo lleva claves vigentes. + +Revision ID: k6l7m8n9o0p1 +Revises: j5k6l7m8n9o0 +Create Date: 2026-08-11 00:00:00.000000 + +""" +from typing import Sequence, Union + +import sqlalchemy as sa +from alembic import op + +from api.v1.modules.fin.catalogs.seed_data import sync_catalogs + +revision: str = "k6l7m8n9o0p1" +down_revision: Union[str, None] = "j5k6l7m8n9o0" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + +_NUEVAS = ("628", "629", "630") + + +def upgrade() -> None: + sync_catalogs(op.get_bind()) + + +def downgrade() -> None: + # No se borran las filas: ``crm.accounts.tax_regime_id`` y + # ``fin.issuer_settings.tax_regime_id`` las referencian por FK, y un CFDI ya timbrado + # con una de estas claves debe seguir siendo legible. Se desactivan, que es el mismo + # criterio que usa el catálogo para una clave retirada por el SAT. + op.execute( + sa.text( + "UPDATE sat.tax_regimes SET is_active = false, updated_at = now() " + "WHERE code IN :codes" + ).bindparams(sa.bindparam("codes", value=_NUEVAS, expanding=True)) + ) diff --git a/backend/api/v1/modules/fin/catalogs/seed_data.py b/backend/api/v1/modules/fin/catalogs/seed_data.py index 71beb47..b87c00a 100644 --- a/backend/api/v1/modules/fin/catalogs/seed_data.py +++ b/backend/api/v1/modules/fin/catalogs/seed_data.py @@ -86,6 +86,10 @@ TAX_REGIMES: list[dict] = [ _regime("624", "Coordinados", False, True), _regime("625", "Régimen de las Actividades Empresariales con ingresos a través de Plataformas Tecnológicas", True, False), _regime("626", "Régimen Simplificado de Confianza", True, True), + # Claves publicadas por el SAT con vigencia a partir del 01-01-2024. + _regime("628", "Hidrocarburos", False, True), + _regime("629", "De los Regímenes Fiscales Preferentes y de las Empresas Multinacionales", True, False), + _regime("630", "Enajenación de acciones en bolsa de valores", True, False), ]