Saltar a contenido

Especificación Técnica: trx_pedidos

Esquema: pedidos
Base de Datos: erp
Tabla Legacy Origen: c067t_pedido (42 col)
Propósito: Cabecera de órdenes de pedido generadas desde la aplicación móvil de promotores hacia el dominio de pedidos del ERP. Aplica integración desacoplada mediante UUIDs de correlación hacia CRM y Core sin dependencias foráneas físicas entre bases de datos.


1. Justificación y Mejoras de Arquitectura

  • Integración Desacoplada Cross-Database: Mantiene la autonomía del microservicio ERP utilizando identificadores UUID de correlación para vincular clientes (cliente_id), locales (local_entrega_id), promotores (promotor_id), visitas (visita_id), canales (canal_id), términos de pago (termino_pago_id) y tipos de envío (tipo_envio_id) hacia crm, y sucursales (sucursal_id) hacia core.identidad, sin claves foráneas físicas inter-base.
  • Aislamiento Multi-Tenant (RLS): Integra empresa_id BIGINT NOT NULL con políticas RLS obligatorias (USING y WITH CHECK) garantizando aislamiento estricto por organización.
  • Integridad Referencial Compuesta para Detalle y Planificaciones: Define la restricción UNIQUE (empresa_id, id) en la cabecera para permitir que las tablas hijas (trx_pedidos_detalle y trx_pedidos_planificaciones) vinculen claves foráneas compuestas garantizando consistencia multi-tenant.
  • Control de Unicidad de Correlativo: Restricción UNIQUE (empresa_id, numero_pedido) para evitar colisiones de numeración de pedidos dentro del mismo tenant.
  • Trazabilidad y Auditoría: Auditoría integral (created_at, updated_at, deleted_at, created_by, updated_by) con auditoría integral.

2. Definiciones de Implementación

Table pedidos.trx_pedidos {
    id                      uuid          [pk, default: `gen_random_uuid()`, note: 'Identificador único UUID']
    empresa_id                  bigint        [not null, note: 'Identificador BIGINT de la empresa en core.identidad (RLS)']
    cliente_id              uuid          [not null, note: 'Correlación lógica con crm.clientes.mae_clientes (sin FK física)']
    local_entrega_id        uuid          [note: 'Correlación lógica con crm.clientes.mae_locales_cliente (sin FK física)']
    promotor_id             uuid          [not null, note: 'Correlación lógica con crm.fuerza_ventas.mae_promotores (sin FK física)']
    sucursal_id             uuid          [not null, note: 'Correlación lógica con core.identidad.mae_sucursales (sin FK física)']
    visita_id               uuid          [note: 'Correlación lógica con crm.fuerza_ventas.trx_visitas (sin FK física)']
    numero_pedido           varchar(30)   [not null, note: 'Número correlativo comercial del pedido']
    fecha_pedido            timestamptz   [not null, default: `now()`, note: 'Fecha y hora de emisión']
    fecha_entrega_estimada  date          [not null, note: 'Fecha comprometida de despacho']
    canal_id                uuid          [not null, note: 'Correlación lógica con crm.clientes.cat_canales_comerciales']
    termino_pago_id         uuid          [not null, note: 'Correlación lógica con crm.clientes.cat_terminos_pago']
    tipo_envio_id           uuid          [note: 'Correlación lógica con crm.clientes.cat_tipos_envio']
    monto_subtotal          numeric(12,2) [not null, default: `0.00`, note: 'Subtotal antes de descuentos e impuestos']
    monto_descuento         numeric(12,2) [not null, default: `0.00`, note: 'Descuento comercial global']
    monto_impuestos         numeric(12,2) [not null, default: `0.00`, note: 'Total de tributos (IVA)']
    monto_total             numeric(12,2) [not null, default: `0.00`, note: 'Monto neto final del pedido']
    estado_pedido           varchar(30)   [not null, default: `'BORRADOR'`, note: 'BORRADOR, ENVIADO, APROBADO_CREDITO, FACTURADO, DESPACHADO, ENTREGADO, CANCELADO']
    observaciones           text          [note: 'Instrucciones de entrega o notas comerciales']

    // Auditoría General
    is_activo               boolean       [not null, default: `true`, note: 'Estado lógico del registro']
    created_at              timestamptz   [not null, default: `now()`, note: 'Fecha de creación']
    updated_at              timestamptz   [not null, default: `now()`, note: 'Fecha de última actualización']
    deleted_at              timestamptz   [note: 'Fecha de eliminación lógica']
    created_by              uuid          [note: 'Usuario creador']
    updated_by              uuid          [note: 'Usuario modificador']

    Indexes {
        (empresa_id, id) [unique, name: 'uq_trx_pedidos_empresa_id']
        (empresa_id, numero_pedido) [unique, name: 'uq_trx_pedidos_empresa_numero']
        (empresa_id, is_activo) [name: 'ix_trx_pedidos_empresa_activo']
        (empresa_id, cliente_id, fecha_pedido) [name: 'ix_trx_pedidos_empresa_cliente_fecha']
        (empresa_id, promotor_id, fecha_pedido) [name: 'ix_trx_pedidos_empresa_promotor_fecha']
        (empresa_id, estado_pedido) [name: 'ix_trx_pedidos_empresa_estado']
    }
}
CREATE TABLE IF NOT EXISTS pedidos.trx_pedidos (
    id UUID NOT NULL DEFAULT gen_random_uuid(),
    empresa_id BIGINT NOT NULL,
    cliente_id UUID NOT NULL,
    local_entrega_id UUID,
    promotor_id UUID NOT NULL,
    sucursal_id UUID NOT NULL,
    visita_id UUID,
    numero_pedido VARCHAR(30) NOT NULL,
    fecha_pedido TIMESTAMPTZ NOT NULL DEFAULT now(),
    fecha_entrega_estimada DATE NOT NULL,
    canal_id UUID NOT NULL,
    termino_pago_id UUID NOT NULL,
    tipo_envio_id UUID,
    monto_subtotal NUMERIC(12,2) NOT NULL DEFAULT 0.00,
    monto_descuento NUMERIC(12,2) NOT NULL DEFAULT 0.00,
    monto_impuestos NUMERIC(12,2) NOT NULL DEFAULT 0.00,
    monto_total NUMERIC(12,2) NOT NULL DEFAULT 0.00,
    estado_pedido VARCHAR(30) NOT NULL DEFAULT 'BORRADOR',
    observaciones TEXT,

    -- Auditoría General
    is_activo BOOLEAN NOT NULL DEFAULT true,
    created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
    updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
    deleted_at TIMESTAMPTZ,
    created_by UUID,
    updated_by UUID,

    CONSTRAINT pk_trx_pedidos
        PRIMARY KEY (id),

    CONSTRAINT uq_trx_pedidos_empresa_id
        UNIQUE (empresa_id, id),

    CONSTRAINT uq_trx_pedidos_empresa_numero
        UNIQUE (empresa_id, numero_pedido)
);

CREATE INDEX IF NOT EXISTS ix_trx_pedidos_empresa_activo
    ON pedidos.trx_pedidos (empresa_id, is_activo);

CREATE INDEX IF NOT EXISTS ix_trx_pedidos_empresa_cliente_fecha
    ON pedidos.trx_pedidos (empresa_id, cliente_id, fecha_pedido);

CREATE INDEX IF NOT EXISTS ix_trx_pedidos_empresa_promotor_fecha
    ON pedidos.trx_pedidos (empresa_id, promotor_id, fecha_pedido);

CREATE INDEX IF NOT EXISTS ix_trx_pedidos_empresa_estado
    ON pedidos.trx_pedidos (empresa_id, estado_pedido);

COMMENT ON TABLE pedidos.trx_pedidos IS
    'Órdenes de Pedido de Ventas (Cabecera ERP): Cabecera de pedidos generados desde la aplicación móvil de promotores hacia el dominio de pedidos del ERP. Aplica integración desacoplada mediante UUIDs de correlación hacia CRM y Core sin dependencias foráneas físicas entre bases.';

COMMENT ON COLUMN pedidos.trx_pedidos.id IS
    'Identificador único UUID';

COMMENT ON COLUMN pedidos.trx_pedidos.empresa_id IS
    'Identificador UUID de la empresa en core.identidad (RLS)';

COMMENT ON COLUMN pedidos.trx_pedidos.cliente_id IS
    'Correlación lógica con crm.clientes.mae_clientes (sin FK física)';

COMMENT ON COLUMN pedidos.trx_pedidos.local_entrega_id IS
    'Correlación lógica con crm.clientes.mae_locales_cliente (sin FK física)';

COMMENT ON COLUMN pedidos.trx_pedidos.promotor_id IS
    'Correlación lógica con crm.fuerza_ventas.mae_promotores (sin FK física)';

COMMENT ON COLUMN pedidos.trx_pedidos.sucursal_id IS
    'Correlación lógica con core.identidad.mae_sucursales (sin FK física)';

COMMENT ON COLUMN pedidos.trx_pedidos.visita_id IS
    'Correlación lógica con crm.fuerza_ventas.trx_visitas (sin FK física)';

COMMENT ON COLUMN pedidos.trx_pedidos.numero_pedido IS
    'Número correlativo comercial del pedido';

COMMENT ON COLUMN pedidos.trx_pedidos.fecha_pedido IS
    'Fecha y hora de emisión';

COMMENT ON COLUMN pedidos.trx_pedidos.fecha_entrega_estimada IS
    'Fecha comprometida de despacho';

COMMENT ON COLUMN pedidos.trx_pedidos.canal_id IS
    'Correlación lógica con crm.clientes.cat_canales_comerciales';

COMMENT ON COLUMN pedidos.trx_pedidos.termino_pago_id IS
    'Correlación lógica con crm.clientes.cat_terminos_pago';

COMMENT ON COLUMN pedidos.trx_pedidos.tipo_envio_id IS
    'Correlación lógica con crm.clientes.cat_tipos_envio';

COMMENT ON COLUMN pedidos.trx_pedidos.monto_subtotal IS
    'Subtotal antes de descuentos e impuestos';

COMMENT ON COLUMN pedidos.trx_pedidos.monto_descuento IS
    'Descuento comercial global';

COMMENT ON COLUMN pedidos.trx_pedidos.monto_impuestos IS
    'Total de tributos (IVA)';

COMMENT ON COLUMN pedidos.trx_pedidos.monto_total IS
    'Monto neto final del pedido';

COMMENT ON COLUMN pedidos.trx_pedidos.estado_pedido IS
    'BORRADOR, ENVIADO, APROBADO_CREDITO, FACTURADO, DESPACHADO, ENTREGADO, CANCELADO';

COMMENT ON COLUMN pedidos.trx_pedidos.observaciones IS
    'Instrucciones de entrega o notas comerciales';

COMMENT ON COLUMN pedidos.trx_pedidos.is_activo IS
    'Estado lógico del registro';

COMMENT ON COLUMN pedidos.trx_pedidos.created_at IS
    'Fecha de creación';

COMMENT ON COLUMN pedidos.trx_pedidos.updated_at IS
    'Fecha de última actualización';

COMMENT ON COLUMN pedidos.trx_pedidos.deleted_at IS
    'Fecha de eliminación lógica';

COMMENT ON COLUMN pedidos.trx_pedidos.created_by IS
    'Usuario creador';

COMMENT ON COLUMN pedidos.trx_pedidos.updated_by IS
    'Usuario modificador';

ALTER TABLE pedidos.trx_pedidos
    ENABLE ROW LEVEL SECURITY;

CREATE POLICY rls_trx_pedidos_empresa
    ON pedidos.trx_pedidos
    FOR ALL
    USING (
        empresa_id = current_setting(
            'app.current_empresa_id',
            true
        )::BIGINT
    )
    WITH CHECK (
        empresa_id = current_setting(
            'app.current_empresa_id',
            true
        )::BIGINT
    );
import uuid
from datetime import date, datetime
from decimal import Decimal
from typing import Optional

from sqlalchemy import (
    BigInteger,
    Boolean,
    Date,
    Index,
    Numeric,
    String,
    Text,
    UniqueConstraint,
    text,
)
from sqlalchemy.dialects.postgresql import TIMESTAMPTZ, UUID
from sqlalchemy.orm import Mapped, mapped_column

from app.db.base import Base


class TrxPedidos(Base):
    """
    Órdenes de Pedido de Ventas (Cabecera ERP).

    Cabecera de pedidos generados desde la aplicación móvil de promotores
    hacia el dominio de pedidos del ERP. Aplica integración desacoplada
    mediante UUIDs de correlación hacia CRM y Core.

    Legacy:
        c067t_pedido (42 col)
    """

    __tablename__ = "trx_pedidos"

    __table_args__ = (
        UniqueConstraint(
            "empresa_id",
            "id",
            name="uq_trx_pedidos_empresa_id",
        ),
        UniqueConstraint(
            "empresa_id",
            "numero_pedido",
            name="uq_trx_pedidos_empresa_numero",
        ),
        Index(
            "ix_trx_pedidos_empresa_activo",
            "empresa_id",
            "is_activo",
        ),
        Index(
            "ix_trx_pedidos_empresa_cliente_fecha",
            "empresa_id",
            "cliente_id",
            "fecha_pedido",
        ),
        Index(
            "ix_trx_pedidos_empresa_promotor_fecha",
            "empresa_id",
            "promotor_id",
            "fecha_pedido",
        ),
        Index(
            "ix_trx_pedidos_empresa_estado",
            "empresa_id",
            "estado_pedido",
        ),
        {
            "schema": "pedidos",
            "comment": "Órdenes de Pedido de Ventas (Cabecera ERP)",
        },
    )

    id: Mapped[uuid.UUID] = mapped_column(
        UUID(as_uuid=True),
        primary_key=True,
        server_default=text("gen_random_uuid()"),
        comment="Identificador único UUID",
    )

    empresa_id: Mapped[int] = mapped_column(
        BigInteger,
        nullable=False,
        comment="Identificador UUID de la empresa en core.identidad (RLS)",
    )

    cliente_id: Mapped[uuid.UUID] = mapped_column(
        UUID(as_uuid=True),
        nullable=False,
        comment="Correlación lógica con crm.clientes.mae_clientes (sin FK física)",
    )

    local_entrega_id: Mapped[Optional[uuid.UUID]] = mapped_column(
        UUID(as_uuid=True),
        nullable=True,
        comment="Correlación lógica con crm.clientes.mae_locales_cliente (sin FK física)",
    )

    promotor_id: Mapped[uuid.UUID] = mapped_column(
        UUID(as_uuid=True),
        nullable=False,
        comment="Correlación lógica con crm.fuerza_ventas.mae_promotores (sin FK física)",
    )

    sucursal_id: Mapped[uuid.UUID] = mapped_column(
        UUID(as_uuid=True),
        nullable=False,
        comment="Correlación lógica con core.identidad.mae_sucursales (sin FK física)",
    )

    visita_id: Mapped[Optional[uuid.UUID]] = mapped_column(
        UUID(as_uuid=True),
        nullable=True,
        comment="Correlación lógica con crm.fuerza_ventas.trx_visitas (sin FK física)",
    )

    numero_pedido: Mapped[str] = mapped_column(
        String(30),
        nullable=False,
        comment="Número correlativo comercial del pedido",
    )

    fecha_pedido: Mapped[datetime] = mapped_column(
        TIMESTAMPTZ,
        nullable=False,
        server_default=text("now()"),
        comment="Fecha y hora de emisión",
    )

    fecha_entrega_estimada: Mapped[date] = mapped_column(
        Date,
        nullable=False,
        comment="Fecha comprometida de despacho",
    )

    canal_id: Mapped[uuid.UUID] = mapped_column(
        UUID(as_uuid=True),
        nullable=False,
        comment="Correlación lógica con crm.clientes.cat_canales_comerciales",
    )

    termino_pago_id: Mapped[uuid.UUID] = mapped_column(
        UUID(as_uuid=True),
        nullable=False,
        comment="Correlación lógica con crm.clientes.cat_terminos_pago",
    )

    tipo_envio_id: Mapped[Optional[uuid.UUID]] = mapped_column(
        UUID(as_uuid=True),
        nullable=True,
        comment="Correlación lógica con crm.clientes.cat_tipos_envio",
    )

    monto_subtotal: Mapped[Decimal] = mapped_column(
        Numeric(12, 2),
        nullable=False,
        server_default=text("0.00"),
        comment="Subtotal antes de descuentos e impuestos",
    )

    monto_descuento: Mapped[Decimal] = mapped_column(
        Numeric(12, 2),
        nullable=False,
        server_default=text("0.00"),
        comment="Descuento comercial global",
    )

    monto_impuestos: Mapped[Decimal] = mapped_column(
        Numeric(12, 2),
        nullable=False,
        server_default=text("0.00"),
        comment="Total de tributos (IVA)",
    )

    monto_total: Mapped[Decimal] = mapped_column(
        Numeric(12, 2),
        nullable=False,
        server_default=text("0.00"),
        comment="Monto neto final del pedido",
    )

    estado_pedido: Mapped[str] = mapped_column(
        String(30),
        nullable=False,
        server_default=text("'BORRADOR'"),
        comment="BORRADOR, ENVIADO, APROBADO_CREDITO, FACTURADO, DESPACHADO, ENTREGADO, CANCELADO",
    )

    observaciones: Mapped[Optional[str]] = mapped_column(
        Text,
        nullable=True,
        comment="Instrucciones de entrega o notas comerciales",
    )

    is_activo: Mapped[bool] = mapped_column(
        Boolean,
        nullable=False,
        server_default=text("true"),
        comment="Estado lógico del registro",
    )

    created_at: Mapped[datetime] = mapped_column(
        TIMESTAMPTZ,
        nullable=False,
        server_default=text("now()"),
        comment="Fecha de creación",
    )

    updated_at: Mapped[datetime] = mapped_column(
        TIMESTAMPTZ,
        nullable=False,
        server_default=text("now()"),
        comment="Fecha de última actualización",
    )

    deleted_at: Mapped[Optional[datetime]] = mapped_column(
        TIMESTAMPTZ,
        nullable=True,
        comment="Fecha de eliminación lógica",
    )

    created_by: Mapped[Optional[uuid.UUID]] = mapped_column(
        UUID(as_uuid=True),
        nullable=True,
        comment="Usuario creador",
    )

    updated_by: Mapped[Optional[uuid.UUID]] = mapped_column(
        UUID(as_uuid=True),
        nullable=True,
        comment="Usuario modificador",
    )
"""create trx_pedidos

Revision ID: erp_0001
Revises: None
Create Date: 2026-09-10
"""

from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql


# revision identifiers, used by Alembic.
revision: str = "erp_0001"
down_revision: Union[str, Sequence[str], None] = None
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:

    op.create_table(
        "trx_pedidos",

        sa.Column(
            "id",
            postgresql.UUID(as_uuid=True),
            nullable=False,
            server_default=sa.text("gen_random_uuid()"),
            comment="Identificador único UUID",
        ),

        sa.Column(
            "empresa_id",
            sa.BigInteger(),
            nullable=False,
            comment="Identificador UUID de la empresa en core.identidad (RLS)",
        ),

        sa.Column(
            "cliente_id",
            postgresql.UUID(as_uuid=True),
            nullable=False,
            comment="Correlación lógica con crm.clientes.mae_clientes (sin FK física)",
        ),

        sa.Column(
            "local_entrega_id",
            postgresql.UUID(as_uuid=True),
            nullable=True,
            comment="Correlación lógica con crm.clientes.mae_locales_cliente (sin FK física)",
        ),

        sa.Column(
            "promotor_id",
            postgresql.UUID(as_uuid=True),
            nullable=False,
            comment="Correlación lógica con crm.fuerza_ventas.mae_promotores (sin FK física)",
        ),

        sa.Column(
            "sucursal_id",
            postgresql.UUID(as_uuid=True),
            nullable=False,
            comment="Correlación lógica con core.identidad.mae_sucursales (sin FK física)",
        ),

        sa.Column(
            "visita_id",
            postgresql.UUID(as_uuid=True),
            nullable=True,
            comment="Correlación lógica con crm.fuerza_ventas.trx_visitas (sin FK física)",
        ),

        sa.Column(
            "numero_pedido",
            sa.String(length=30),
            nullable=False,
            comment="Número correlativo comercial del pedido",
        ),

        sa.Column(
            "fecha_pedido",
            sa.TIMESTAMP(timezone=True),
            nullable=False,
            server_default=sa.text("now()"),
            comment="Fecha y hora de emisión",
        ),

        sa.Column(
            "fecha_entrega_estimada",
            sa.Date(),
            nullable=False,
            comment="Fecha comprometida de despacho",
        ),

        sa.Column(
            "canal_id",
            postgresql.UUID(as_uuid=True),
            nullable=False,
            comment="Correlación lógica con crm.clientes.cat_canales_comerciales",
        ),

        sa.Column(
            "termino_pago_id",
            postgresql.UUID(as_uuid=True),
            nullable=False,
            comment="Correlación lógica con crm.clientes.cat_terminos_pago",
        ),

        sa.Column(
            "tipo_envio_id",
            postgresql.UUID(as_uuid=True),
            nullable=True,
            comment="Correlación lógica con crm.clientes.cat_tipos_envio",
        ),

        sa.Column(
            "monto_subtotal",
            sa.Numeric(precision=12, scale=2),
            nullable=False,
            server_default=sa.text("0.00"),
            comment="Subtotal antes de descuentos e impuestos",
        ),

        sa.Column(
            "monto_descuento",
            sa.Numeric(precision=12, scale=2),
            nullable=False,
            server_default=sa.text("0.00"),
            comment="Descuento comercial global",
        ),

        sa.Column(
            "monto_impuestos",
            sa.Numeric(precision=12, scale=2),
            nullable=False,
            server_default=sa.text("0.00"),
            comment="Total de tributos (IVA)",
        ),

        sa.Column(
            "monto_total",
            sa.Numeric(precision=12, scale=2),
            nullable=False,
            server_default=sa.text("0.00"),
            comment="Monto neto final del pedido",
        ),

        sa.Column(
            "estado_pedido",
            sa.String(length=30),
            nullable=False,
            server_default=sa.text("'BORRADOR'"),
            comment="BORRADOR, ENVIADO, APROBADO_CREDITO, FACTURADO, DESPACHADO, ENTREGADO, CANCELADO",
        ),

        sa.Column(
            "observaciones",
            sa.Text(),
            nullable=True,
            comment="Instrucciones de entrega o notas comerciales",
        ),

        # Auditoría General
        sa.Column(
            "is_activo",
            sa.Boolean(),
            nullable=False,
            server_default=sa.text("true"),
            comment="Estado lógico del registro",
        ),

        sa.Column(
            "created_at",
            sa.TIMESTAMP(timezone=True),
            nullable=False,
            server_default=sa.text("now()"),
            comment="Fecha de creación",
        ),

        sa.Column(
            "updated_at",
            sa.TIMESTAMP(timezone=True),
            nullable=False,
            server_default=sa.text("now()"),
            comment="Fecha de última actualización",
        ),

        sa.Column(
            "deleted_at",
            sa.TIMESTAMP(timezone=True),
            nullable=True,
            comment="Fecha de eliminación lógica",
        ),

        sa.Column(
            "created_by",
            postgresql.UUID(as_uuid=True),
            nullable=True,
            comment="Usuario creador",
        ),

        sa.Column(
            "updated_by",
            postgresql.UUID(as_uuid=True),
            nullable=True,
            comment="Usuario modificador",
        ),

        sa.PrimaryKeyConstraint(
            "id",
            name="pk_trx_pedidos",
        ),

        sa.UniqueConstraint(
            "empresa_id",
            "id",
            name="uq_trx_pedidos_empresa_id",
        ),

        sa.UniqueConstraint(
            "empresa_id",
            "numero_pedido",
            name="uq_trx_pedidos_empresa_numero",
        ),

        comment="Órdenes de Pedido de Ventas (Cabecera ERP)",
        schema="pedidos",
    )

    op.create_index(
        "ix_trx_pedidos_empresa_activo",
        "trx_pedidos",
        ["empresa_id", "is_activo"],
        unique=False,
        schema="pedidos",
    )

    op.create_index(
        "ix_trx_pedidos_empresa_cliente_fecha",
        "trx_pedidos",
        ["empresa_id", "cliente_id", "fecha_pedido"],
        unique=False,
        schema="pedidos",
    )

    op.create_index(
        "ix_trx_pedidos_empresa_promotor_fecha",
        "trx_pedidos",
        ["empresa_id", "promotor_id", "fecha_pedido"],
        unique=False,
        schema="pedidos",
    )

    op.create_index(
        "ix_trx_pedidos_empresa_estado",
        "trx_pedidos",
        ["empresa_id", "estado_pedido"],
        unique=False,
        schema="pedidos",
    )

    op.execute(
        """
        ALTER TABLE pedidos.trx_pedidos
        ENABLE ROW LEVEL SECURITY;
        """
    )

    op.execute(
        """
        CREATE POLICY rls_trx_pedidos_empresa
        ON pedidos.trx_pedidos
        FOR ALL
        USING (
            empresa_id = current_setting(
                'app.current_empresa_id',
                true
            )::BIGINT
        )
        WITH CHECK (
            empresa_id = current_setting(
                'app.current_empresa_id',
                true
            )::BIGINT
        );
        """
    )


def downgrade() -> None:

    op.execute(
        """
        DROP POLICY IF EXISTS rls_trx_pedidos_empresa
        ON pedidos.trx_pedidos;
        """
    )

    op.execute(
        """
        ALTER TABLE pedidos.trx_pedidos
        DISABLE ROW LEVEL SECURITY;
        """
    )

    op.drop_index(
        "ix_trx_pedidos_empresa_estado",
        table_name="trx_pedidos",
        schema="pedidos",
    )

    op.drop_index(
        "ix_trx_pedidos_empresa_promotor_fecha",
        table_name="trx_pedidos",
        schema="pedidos",
    )

    op.drop_index(
        "ix_trx_pedidos_empresa_cliente_fecha",
        table_name="trx_pedidos",
        schema="pedidos",
    )

    op.drop_index(
        "ix_trx_pedidos_empresa_activo",
        table_name="trx_pedidos",
        schema="pedidos",
    )

    op.drop_table(
        "trx_pedidos",
        schema="pedidos",
    )