feat(fin): agrega las claves 628, 629 y 630 a c_RegimenFiscal

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) <noreply@anthropic.com>
This commit is contained in:
2026-08-11 11:38:31 -05:00
parent 4f3bb81607
commit 57745af9b5
2 changed files with 53 additions and 0 deletions

View File

@@ -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))
)

View File

@@ -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),
]