Files
plantillas-proyectos/backend/alembic/versions/ca7d3c4e8b2a_invoice_logistics_int_fk_constraints.py

267 lines
8.2 KiB
Python

"""Add surrogate int IDs for transport catalogs and invoice logistics.
Single consolidated migration for:
- transporter_id, trailer_id, vehicle_id, driver_id
- carrier_int_id, transport_int_id, trailer_int_id in invoice_logistics
- backfill mappings from existing string keys/codes
- FK constraints for the new invoice_logistics int references
"""
from __future__ import annotations
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
revision: str = "ca7d3c4e8b2a"
down_revision: Union[str, Sequence[str], None] = "c1a2b3d4e5f6"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
# transporter
op.add_column("transporter", sa.Column("transporter_id", sa.BigInteger(), nullable=True), schema="a76")
op.execute(
"""
WITH s AS (
SELECT transporter_key, ROW_NUMBER() OVER (ORDER BY transporter_key) AS new_id
FROM a76.transporter
)
UPDATE a76.transporter t
SET transporter_id = s.new_id
FROM s
WHERE t.transporter_key = s.transporter_key
"""
)
op.execute("CREATE SEQUENCE IF NOT EXISTS a76.transporter_transporter_id_seq")
op.execute(
"""
SELECT setval(
'a76.transporter_transporter_id_seq',
COALESCE((SELECT MAX(transporter_id) FROM a76.transporter), 0) + 1,
false
)
"""
)
op.execute(
"""
ALTER TABLE a76.transporter
ALTER COLUMN transporter_id
SET DEFAULT nextval('a76.transporter_transporter_id_seq')
"""
)
op.execute("ALTER TABLE a76.transporter ALTER COLUMN transporter_id SET NOT NULL")
op.create_unique_constraint("uq_a76_transporter_transporter_id", "transporter", ["transporter_id"], schema="a76")
# trailer
op.add_column("trailer", sa.Column("trailer_id", sa.BigInteger(), nullable=True), schema="a76")
op.execute(
"""
WITH s AS (
SELECT trailer_number, ROW_NUMBER() OVER (ORDER BY trailer_number) AS new_id
FROM a76.trailer
)
UPDATE a76.trailer t
SET trailer_id = s.new_id
FROM s
WHERE t.trailer_number = s.trailer_number
"""
)
op.execute("CREATE SEQUENCE IF NOT EXISTS a76.trailer_trailer_id_seq")
op.execute(
"""
SELECT setval(
'a76.trailer_trailer_id_seq',
COALESCE((SELECT MAX(trailer_id) FROM a76.trailer), 0) + 1,
false
)
"""
)
op.execute(
"""
ALTER TABLE a76.trailer
ALTER COLUMN trailer_id
SET DEFAULT nextval('a76.trailer_trailer_id_seq')
"""
)
op.execute("ALTER TABLE a76.trailer ALTER COLUMN trailer_id SET NOT NULL")
op.create_unique_constraint("uq_a76_trailer_trailer_id", "trailer", ["trailer_id"], schema="a76")
# vehicle
op.add_column("vehicle", sa.Column("vehicle_id", sa.BigInteger(), nullable=True), schema="a76")
op.execute(
"""
WITH s AS (
SELECT vehicle_key, ROW_NUMBER() OVER (ORDER BY vehicle_key) AS new_id
FROM a76.vehicle
)
UPDATE a76.vehicle v
SET vehicle_id = s.new_id
FROM s
WHERE v.vehicle_key = s.vehicle_key
"""
)
op.execute("CREATE SEQUENCE IF NOT EXISTS a76.vehicle_vehicle_id_seq")
op.execute(
"""
SELECT setval(
'a76.vehicle_vehicle_id_seq',
COALESCE((SELECT MAX(vehicle_id) FROM a76.vehicle), 0) + 1,
false
)
"""
)
op.execute(
"""
ALTER TABLE a76.vehicle
ALTER COLUMN vehicle_id
SET DEFAULT nextval('a76.vehicle_vehicle_id_seq')
"""
)
op.execute("ALTER TABLE a76.vehicle ALTER COLUMN vehicle_id SET NOT NULL")
op.create_unique_constraint("uq_a76_vehicle_vehicle_id", "vehicle", ["vehicle_id"], schema="a76")
# driver
op.add_column("driver", sa.Column("driver_id", sa.BigInteger(), nullable=True), schema="a76")
op.execute(
"""
WITH s AS (
SELECT transporter_key, line, ROW_NUMBER() OVER (ORDER BY transporter_key, line) AS new_id
FROM a76.driver
)
UPDATE a76.driver d
SET driver_id = s.new_id
FROM s
WHERE d.transporter_key = s.transporter_key
AND d.line = s.line
"""
)
op.execute("CREATE SEQUENCE IF NOT EXISTS a76.driver_driver_id_seq")
op.execute(
"""
SELECT setval(
'a76.driver_driver_id_seq',
COALESCE((SELECT MAX(driver_id) FROM a76.driver), 0) + 1,
false
)
"""
)
op.execute(
"""
ALTER TABLE a76.driver
ALTER COLUMN driver_id
SET DEFAULT nextval('a76.driver_driver_id_seq')
"""
)
op.execute("ALTER TABLE a76.driver ALTER COLUMN driver_id SET NOT NULL")
op.create_unique_constraint("uq_a76_driver_driver_id", "driver", ["driver_id"], schema="a76")
# invoice_logistics int refs
op.add_column("invoice_logistics", sa.Column("carrier_int_id", sa.BigInteger(), nullable=True), schema="a76")
op.add_column("invoice_logistics", sa.Column("transport_int_id", sa.BigInteger(), nullable=True), schema="a76")
op.add_column("invoice_logistics", sa.Column("trailer_int_id", sa.BigInteger(), nullable=True), schema="a76")
# ensure referenced codes exist
op.execute(
"""
INSERT INTO a76.transporter (transporter_key, tenant_id, company_id)
SELECT DISTINCT ON (il.carrier_id) il.carrier_id, il.tenant_id, il.company_id
FROM a76.invoice_logistics il
WHERE il.carrier_id IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM a76.transporter t WHERE t.transporter_key = il.carrier_id
)
"""
)
op.execute(
"""
INSERT INTO a76.vehicle (vehicle_key, tenant_id, company_id)
SELECT DISTINCT ON (il.transport_id) il.transport_id, il.tenant_id, il.company_id
FROM a76.invoice_logistics il
WHERE il.transport_id IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM a76.vehicle v WHERE v.vehicle_key = il.transport_id
)
"""
)
op.execute(
"""
INSERT INTO a76.trailer (trailer_number, tenant_id, company_id)
SELECT DISTINCT ON (il.trailer_num) il.trailer_num, il.tenant_id, il.company_id
FROM a76.invoice_logistics il
WHERE il.trailer_num IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM a76.trailer tr WHERE tr.trailer_number = il.trailer_num
)
"""
)
# backfill int refs
op.execute(
"""
UPDATE a76.invoice_logistics il
SET carrier_int_id = t.transporter_id
FROM a76.transporter t
WHERE il.carrier_id IS NOT NULL
AND il.carrier_id = t.transporter_key
"""
)
op.execute(
"""
UPDATE a76.invoice_logistics il
SET transport_int_id = v.vehicle_id
FROM a76.vehicle v
WHERE il.transport_id IS NOT NULL
AND il.transport_id = v.vehicle_key
"""
)
op.execute(
"""
UPDATE a76.invoice_logistics il
SET trailer_int_id = tr.trailer_id
FROM a76.trailer tr
WHERE il.trailer_num IS NOT NULL
AND il.trailer_num = tr.trailer_number
"""
)
# FK constraints
op.create_foreign_key(
"fk_a76_invoice_logistics_carrier_int_id_transporter_id",
"invoice_logistics",
"transporter",
["carrier_int_id"],
["transporter_id"],
source_schema="a76",
referent_schema="a76",
ondelete="SET NULL",
)
op.create_foreign_key(
"fk_a76_invoice_logistics_transport_int_id_vehicle_id",
"invoice_logistics",
"vehicle",
["transport_int_id"],
["vehicle_id"],
source_schema="a76",
referent_schema="a76",
ondelete="SET NULL",
)
op.create_foreign_key(
"fk_a76_invoice_logistics_trailer_int_id_trailer_id",
"invoice_logistics",
"trailer",
["trailer_int_id"],
["trailer_id"],
source_schema="a76",
referent_schema="a76",
ondelete="SET NULL",
)
def downgrade() -> None:
pass