fix/AS-prosec-revertir-boolean (#483)

alembic seed para empresas ya existentes

Reviewed-on: ADUANASOFT/anexo76#483
Co-authored-by: hreyes <hreyes@aduanasoft.com.mx>
Co-committed-by: hreyes <hreyes@aduanasoft.com.mx>
This commit is contained in:
2026-06-02 21:21:01 +00:00
committed by acazares
parent 26c5a97c04
commit 47e3f36f5c

View File

@@ -0,0 +1,63 @@
"""seed sectors for existing companies
Siembra el catálogo de sectores PROSEC (a76.sectors) para todas las empresas
existentes. Los sectores son por empresa y solo se sembraban dentro de
_seed_company_data() al crear una empresa; las empresas que no pasaron por ese
flujo (BD recreada o creadas por otra vía) quedaban sin sectores y el selector
del frontend aparecía vacío. Idempotente: ON CONFLICT DO NOTHING.
Revision ID: e1f2a3b4c5d6
Revises: c8d9e0f1a2b3
Create Date: 2026-06-02 14:00:00.000000
"""
from typing import Sequence, Union
from alembic import op
from sqlalchemy import text
from sqlalchemy.orm import Session
from api.v1.modules.a76.general_catalogs.sectors.seed import seed as sectors_seed
revision: str = "e1f2a3b4c5d6"
down_revision: Union[str, None] = "c8d9e0f1a2b3"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
def format_value(val):
if val is None or str(val).strip() == "" or str(val).upper() == "NONE":
return "NULL"
return f"'{str(val).replace(chr(39), chr(39) * 2)}'"
bind = op.get_bind()
session = Session(bind=bind)
companies = session.execute(
text("SELECT tenant_id, id FROM a76.company WHERE deleted_at IS NULL")
).fetchall()
for tenant_id, company_id in companies:
values = ", ".join(
[
f"({format_value(key)}, {format_value(description)}, {str(authorized).upper()}, {tenant_id}, {company_id})"
for key, description, authorized in sectors_seed
]
)
if values:
session.execute(
text(
f"""
INSERT INTO a76.sectors (key, description, authorized, tenant_id, company_id)
VALUES {values}
ON CONFLICT (key, tenant_id, company_id) DO NOTHING;
"""
)
)
session.commit()
def downgrade() -> None:
# Backfill de datos: no se eliminan sectores en el downgrade porque podrían
# haberse editado/agregado manualmente tras la siembra. No-op intencional.
pass