Saltar a contenido

Especificación Técnica: trx_cobros_campo

Esquema: contable
Base de Datos: erp
Servicio: svc-contable
Tabla Legacy Origen: c213t_amortizacion_cliente
Propósito: Registro de cobros y recaudaciones comerciales efectuadas directamente en campo por promotores o cobradores móviles. Conecta los ingresos recibidos en ruta con el módulo de tesorería y contabilidad del ERP.


1. Justificación y Mejoras de Arquitectura

  • Integración Desacoplada Cross-Database: Enlaza de forma limpia mediante UUIDs de correlación lógica a los clientes (cliente_id), promotores (promotor_id) y visitas (visita_id) administrados en crm, sin generar acoplamiento físico inter-base.
  • Integración con Catálogos Contables: Relaciona formalmente mediante FKs compuestas hacia contable.cat_metodos_pago(empresa_id, id), contable.cat_bancos(empresa_id, id) y contable.cat_estados_cobro(empresa_id, id).
  • Aislamiento Multi-Tenant (RLS): Integra empresa_id BIGINT NOT NULL con políticas RLS obligatorias (USING y WITH CHECK) garantizando aislamiento total de las operaciones financieras por empresa.
  • Integridad Compuesta para Imputaciones: Incorpora la restricción UNIQUE (empresa_id, id) para permitir que trx_cobros_campo_imputaciones aplique claves foráneas compuestas con eliminación en cascada.
  • Unicidad de Recibo de Cobranza: Restricción UNIQUE (empresa_id, numero_recibo_campo) para blindar contra duplicidad de recibos emitidos desde dispositivos móviles.
  • Trazabilidad de Geolocalización y Conciliación: Almacena coordenadas GPS del cobro (latitud_cobro, longitud_cobro como DOUBLE PRECISION) y auditoría con auditoría integral.

2. Definiciones de Implementación

Table contable.trx_cobros_campo {
    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)']
    promotor_id                   uuid             [not null, note: 'Correlación lógica con crm.fuerza_ventas.mae_promotores (sin FK física)']
    visita_id                     uuid             [note: 'Correlación lógica con crm.fuerza_ventas.trx_visitas (sin FK física)']
    metodo_pago_id                uuid             [not null, note: 'Método de pago (FK contable.cat_metodos_pago)']
    banco_id                      uuid             [note: 'Banco receptor/emisor (FK contable.cat_bancos)']
    estado_cobro_id               uuid             [not null, note: 'Estado del cobro (FK contable.cat_estados_cobro)']
    numero_recibo_campo           varchar(30)      [not null, note: 'Número correlativo único del recibo móvil']
    fecha_cobro                   timestamptz      [not null, default: `now()`, note: 'Fecha y hora del cobro en campo']
    monto_total_recaudado         numeric(12,2)    [not null, note: 'Monto total monetario recaudado']
    numero_documento_pago         varchar(50)      [note: 'Número de cheque, comprobante de transferencia o depósito']
    comprobante_imagen_url        varchar(500)     [note: 'URL de almacenamiento de la foto o comprobante de pago']
    latitud_cobro                 double precision [note: 'Coordenada de latitud GPS del cobro']
    longitud_cobro                double precision [note: 'Coordenada de longitud GPS del cobro']
    observaciones                 text             [note: 'Comentarios u observaciones de cobranza']

    // 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_cobros_campo_empresa_id']
        (empresa_id, numero_recibo_campo) [unique, name: 'uq_trx_cobros_campo_empresa_recibo']
        (empresa_id, cliente_id) [name: 'ix_trx_cobros_campo_empresa_cliente']
        (empresa_id, promotor_id) [name: 'ix_trx_cobros_campo_empresa_promotor']
        (empresa_id, visita_id) [name: 'ix_trx_cobros_campo_empresa_visita']
        (empresa_id, metodo_pago_id) [name: 'ix_trx_cobros_campo_empresa_metodo']
        (empresa_id, banco_id) [name: 'ix_trx_cobros_campo_empresa_banco']
        (empresa_id, estado_cobro_id) [name: 'ix_trx_cobros_campo_empresa_estado']
        (empresa_id, fecha_cobro) [name: 'ix_trx_cobros_campo_empresa_fecha']
        (empresa_id, is_activo) [name: 'ix_trx_cobros_campo_empresa_activo']
    }
}

Ref: contable.trx_cobros_campo.(empresa_id, metodo_pago_id) > contable.cat_metodos_pago.(empresa_id, id) [delete: restrict]
Ref: contable.trx_cobros_campo.(empresa_id, banco_id) > contable.cat_bancos.(empresa_id, id) [delete: restrict]
Ref: contable.trx_cobros_campo.(empresa_id, estado_cobro_id) > contable.cat_estados_cobro.(empresa_id, id) [delete: restrict]
CREATE TABLE IF NOT EXISTS contable.trx_cobros_campo (
    id UUID NOT NULL DEFAULT gen_random_uuid(),
    empresa_id BIGINT NOT NULL,
    cliente_id UUID NOT NULL,
    promotor_id UUID NOT NULL,
    visita_id UUID,
    metodo_pago_id UUID NOT NULL,
    banco_id UUID,
    estado_cobro_id UUID NOT NULL,
    numero_recibo_campo VARCHAR(30) NOT NULL,
    fecha_cobro TIMESTAMPTZ NOT NULL DEFAULT now(),
    monto_total_recaudado NUMERIC(12,2) NOT NULL,
    numero_documento_pago VARCHAR(50),
    comprobante_imagen_url VARCHAR(500),
    latitud_cobro DOUBLE PRECISION,
    longitud_cobro DOUBLE PRECISION,
    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_cobros_campo PRIMARY KEY (id),
    CONSTRAINT uq_trx_cobros_campo_empresa_id UNIQUE (empresa_id, id),
    CONSTRAINT uq_trx_cobros_campo_empresa_recibo UNIQUE (empresa_id, numero_recibo_campo),
    CONSTRAINT fk_trx_cobros_campo_metodo FOREIGN KEY (empresa_id, metodo_pago_id)
        REFERENCES contable.cat_metodos_pago (empresa_id, id)
        ON DELETE RESTRICT,
    CONSTRAINT fk_trx_cobros_campo_banco FOREIGN KEY (empresa_id, banco_id)
        REFERENCES contable.cat_bancos (empresa_id, id)
        ON DELETE RESTRICT,
    CONSTRAINT fk_trx_cobros_campo_estado FOREIGN KEY (empresa_id, estado_cobro_id)
        REFERENCES contable.cat_estados_cobro (empresa_id, id)
        ON DELETE RESTRICT
);

-- Índices
CREATE INDEX IF NOT EXISTS ix_trx_cobros_campo_empresa_cliente
    ON contable.trx_cobros_campo (empresa_id, cliente_id);

CREATE INDEX IF NOT EXISTS ix_trx_cobros_campo_empresa_promotor
    ON contable.trx_cobros_campo (empresa_id, promotor_id);

CREATE INDEX IF NOT EXISTS ix_trx_cobros_campo_empresa_visita
    ON contable.trx_cobros_campo (empresa_id, visita_id);

CREATE INDEX IF NOT EXISTS ix_trx_cobros_campo_empresa_metodo
    ON contable.trx_cobros_campo (empresa_id, metodo_pago_id);

CREATE INDEX IF NOT EXISTS ix_trx_cobros_campo_empresa_banco
    ON contable.trx_cobros_campo (empresa_id, banco_id);

CREATE INDEX IF NOT EXISTS ix_trx_cobros_campo_empresa_estado
    ON contable.trx_cobros_campo (empresa_id, estado_cobro_id);

CREATE INDEX IF NOT EXISTS ix_trx_cobros_campo_empresa_fecha
    ON contable.trx_cobros_campo (empresa_id, fecha_cobro);

CREATE INDEX IF NOT EXISTS ix_trx_cobros_campo_empresa_activo
    ON contable.trx_cobros_campo (empresa_id, is_activo);

-- Row-Level Security
ALTER TABLE contable.trx_cobros_campo ENABLE ROW LEVEL SECURITY;

CREATE POLICY rls_trx_cobros_campo_empresa
    ON contable.trx_cobros_campo
    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
    );

-- Comentarios
COMMENT ON TABLE contable.trx_cobros_campo IS 'Cobros y amortizaciones recaudados en campo por promotores';
COMMENT ON COLUMN contable.trx_cobros_campo.cliente_id IS 'Correlación con crm.clientes.mae_clientes (sin FK cross-DB)';
COMMENT ON COLUMN contable.trx_cobros_campo.promotor_id IS 'Correlación con crm.fuerza_ventas.mae_promotores (sin FK cross-DB)';
COMMENT ON COLUMN contable.trx_cobros_campo.visita_id IS 'Correlación con crm.fuerza_ventas.trx_visitas (sin FK cross-DB)';
COMMENT ON COLUMN contable.trx_cobros_campo.metodo_pago_id IS 'Identificador del método de pago (FK cat_metodos_pago)';
COMMENT ON COLUMN contable.trx_cobros_campo.banco_id IS 'Identificador de la entidad bancaria (FK cat_bancos)';
COMMENT ON COLUMN contable.trx_cobros_campo.estado_cobro_id IS 'Identificador del estado de cobro (FK cat_estados_cobro)';
from datetime import datetime
from typing import Optional
import uuid

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


class Base(DeclarativeBase):
    pass


class TrxCobroCampo(Base):
    __tablename__ = "trx_cobros_campo"
    __table_args__ = (
        UniqueConstraint(
            "empresa_id",
            "id",
            name="uq_trx_cobros_campo_empresa_id",
        ),
        UniqueConstraint(
            "empresa_id",
            "numero_recibo_campo",
            name="uq_trx_cobros_campo_empresa_recibo",
        ),
        ForeignKeyConstraint(
            ["empresa_id", "metodo_pago_id"],
            ["contable.cat_metodos_pago.empresa_id", "contable.cat_metodos_pago.id"],
            ondelete="RESTRICT",
            name="fk_trx_cobros_campo_metodo",
        ),
        ForeignKeyConstraint(
            ["empresa_id", "banco_id"],
            ["contable.cat_bancos.empresa_id", "contable.cat_bancos.id"],
            ondelete="RESTRICT",
            name="fk_trx_cobros_campo_banco",
        ),
        ForeignKeyConstraint(
            ["empresa_id", "estado_cobro_id"],
            ["contable.cat_estados_cobro.empresa_id", "contable.cat_estados_cobro.id"],
            ondelete="RESTRICT",
            name="fk_trx_cobros_campo_estado",
        ),
        Index(
            "ix_trx_cobros_campo_empresa_cliente",
            "empresa_id",
            "cliente_id",
        ),
        Index(
            "ix_trx_cobros_campo_empresa_promotor",
            "empresa_id",
            "promotor_id",
        ),
        Index(
            "ix_trx_cobros_campo_empresa_visita",
            "empresa_id",
            "visita_id",
        ),
        Index(
            "ix_trx_cobros_campo_empresa_metodo",
            "empresa_id",
            "metodo_pago_id",
        ),
        Index(
            "ix_trx_cobros_campo_empresa_banco",
            "empresa_id",
            "banco_id",
        ),
        Index(
            "ix_trx_cobros_campo_empresa_estado",
            "empresa_id",
            "estado_cobro_id",
        ),
        Index(
            "ix_trx_cobros_campo_empresa_fecha",
            "empresa_id",
            "fecha_cobro",
        ),
        Index(
            "ix_trx_cobros_campo_empresa_activo",
            "empresa_id",
            "is_activo",
        ),
        {"schema": "contable"},
    )

    # Identificadores y Claves
    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 cross-DB)",
    )

    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 cross-DB)",
    )

    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 cross-DB)",
    )

    metodo_pago_id: Mapped[uuid.UUID] = mapped_column(
        UUID(as_uuid=True),
        nullable=False,
        comment="Identificador del método de pago (FK cat_metodos_pago)",
    )

    banco_id: Mapped[Optional[uuid.UUID]] = mapped_column(
        UUID(as_uuid=True),
        nullable=True,
        comment="Identificador del banco emisor/receptor (FK cat_bancos)",
    )

    estado_cobro_id: Mapped[uuid.UUID] = mapped_column(
        UUID(as_uuid=True),
        nullable=False,
        comment="Identificador del estado de cobro (FK cat_estados_cobro)",
    )

    # Campos de Negocio
    numero_recibo_campo: Mapped[str] = mapped_column(
        String(30),
        nullable=False,
        comment="Número correlativo único del recibo móvil",
    )

    fecha_cobro: Mapped[datetime] = mapped_column(
        TIMESTAMPTZ,
        nullable=False,
        server_default=text("now()"),
        comment="Fecha y hora del cobro en campo",
    )

    monto_total_recaudado: Mapped[float] = mapped_column(
        Numeric(12, 2),
        nullable=False,
        comment="Monto total monetario recaudado",
    )

    numero_documento_pago: Mapped[Optional[str]] = mapped_column(
        String(50),
        nullable=True,
        comment="Número de cheque o transferencia",
    )

    comprobante_imagen_url: Mapped[Optional[str]] = mapped_column(
        String(500),
        nullable=True,
        comment="URL del comprobante fotográfico",
    )

    latitud_cobro: Mapped[Optional[float]] = mapped_column(
        Float,
        nullable=True,
        comment="Latitud GPS de la recaudación",
    )

    longitud_cobro: Mapped[Optional[float]] = mapped_column(
        Float,
        nullable=True,
        comment="Longitud GPS de la recaudación",
    )

    observaciones: Mapped[Optional[str]] = mapped_column(
        Text,
        nullable=True,
        comment="Comentarios u observaciones de cobranza",
    )

    # Auditoría General
    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()"),
        onupdate=datetime.utcnow,
        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",
    )

```python """create trx_cobros_campo

Revision ID: erp_0004 Revises: erp_0003 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_0004" down_revision: Union[str, Sequence[str], None] = "erp_0003" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None

def upgrade() -> None:

op.create_table(
    "trx_cobros_campo",

    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(
        "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(
        "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(
        "metodo_pago_id",
        postgresql.UUID(as_uuid=True),
        nullable=False,
        comment="Identificador del método de pago (FK cat_metodos_pago)",
    ),

    sa.Column(
        "banco_id",
        postgresql.UUID(as_uuid=True),
        nullable=True,
        comment="Identificador del banco emisor/receptor (FK cat_bancos)",
    ),

    sa.Column(
        "estado_cobro_id",
        postgresql.UUID(as_uuid=True),
        nullable=False,
        comment="Identificador del estado de cobro (FK cat_estados_cobro)",
    ),

    sa.Column(
        "numero_recibo_campo",
        sa.String(length=30),
        nullable=False,
        comment="Número correlativo único del recibo móvil",
    ),

    sa.Column(
        "fecha_cobro",
        sa.TIMESTAMP(timezone=True),
        nullable=False,
        server_default=sa.text("now()"),
        comment="Fecha y hora del cobro en campo",
    ),

    sa.Column(
        "monto_total_recaudado",
        sa.Numeric(precision=12, scale=2),
        nullable=False,
        comment="Monto total monetario recaudado",
    ),

    sa.Column(
        "numero_documento_pago",
        sa.String(length=50),
        nullable=True,
        comment="Número de cheque o transferencia",
    ),

    sa.Column(
        "comprobante_imagen_url",
        sa.String(length=500),
        nullable=True,
        comment="URL del comprobante fotográfico",
    ),

    sa.Column(
        "latitud_cobro",
        sa.Float(),
        nullable=True,
        comment="Latitud GPS de la recaudación",
    ),

    sa.Column(
        "longitud_cobro",
        sa.Float(),
        nullable=True,
        comment="Longitud GPS de la recaudación",
    ),

    sa.Column(
        "observaciones",
        sa.Text(),
        nullable=True,
        comment="Comentarios u observaciones de cobranza",
    ),

    # 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_cobros_campo",
    ),

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

    sa.UniqueConstraint(
        "empresa_id",
        "numero_recibo_campo",
        name="uq_trx_cobros_campo_empresa_recibo",
    ),

    sa.ForeignKeyConstraint(
        ["empresa_id", "metodo_pago_id"],
        ["contable.cat_metodos_pago.empresa_id", "contable.cat_metodos_pago.id"],
        ondelete="RESTRICT",
        name="fk_trx_cobros_campo_metodo",
    ),

    sa.ForeignKeyConstraint(
        ["empresa_id", "banco_id"],
        ["contable.cat_bancos.empresa_id", "contable.cat_bancos.id"],
        ondelete="RESTRICT",
        name="fk_trx_cobros_campo_banco",
    ),

    sa.ForeignKeyConstraint(
        ["empresa_id", "estado_cobro_id"],
        ["contable.cat_estados_cobro.empresa_id", "contable.cat_estados_cobro.id"],
        ondelete="RESTRICT",
        name="fk_trx_cobros_campo_estado",
    ),

    comment="Cobros y Recaudaciones en Campo",
    schema="contable",
)

op.create_index(
    "ix_trx_cobros_campo_empresa_activo",
    "trx_cobros_campo",
    ["empresa_id", "is_activo"],
    unique=False,
    schema="contable",
)

op.create_index(
    "ix_trx_cobros_campo_empresa_cliente",
    "trx_cobros_campo",
    ["empresa_id", "cliente_id"],
    unique=False,
    schema="contable",
)

op.create_index(
    "ix_trx_cobros_campo_empresa_promotor",
    "trx_cobros_campo",
    ["empresa_id", "promotor_id"],
    unique=False,
    schema="contable",
)

op.create_index(
    "ix_trx_cobros_campo_empresa_visita",
    "trx_cobros_campo",
    ["empresa_id", "visita_id"],
    unique=False,
    schema="contable",
)

op.create_index(
    "ix_trx_cobros_campo_empresa_metodo",
    "trx_cobros_campo",
    ["empresa_id", "metodo_pago_id"],
    unique=False,
    schema="contable",
)

op.create_index(
    "ix_trx_cobros_campo_empresa_banco",
    "trx_cobros_campo",
    ["empresa_id", "banco_id"],
    unique=False,
    schema="contable",
)

op.create_index(
    "ix_trx_cobros_campo_empresa_estado",
    "trx_cobros_campo",
    ["empresa_id", "estado_cobro_id"],
    unique=False,
    schema="contable",
)

op.create_index(
    "ix_trx_cobros_campo_empresa_fecha",
    "trx_cobros_campo",
    ["empresa_id", "fecha_cobro"],
    unique=False,
    schema="contable",
)

op.execute(
    """
    ALTER TABLE contable.trx_cobros_campo
    ENABLE ROW LEVEL SECURITY;
    """
)

op.execute(
    """
    CREATE POLICY rls_trx_cobros_campo_empresa
    ON contable.trx_cobros_campo
    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_cobros_campo_empresa
    ON contable.trx_cobros_campo;
    """
)

op.execute(
    """
    ALTER TABLE contable.trx_cobros_campo
    DISABLE ROW LEVEL SECURITY;
    """
)

op.drop_index(
    "ix_trx_cobros_campo_empresa_fecha",
    table_name="trx_cobros_campo",
    schema="contable",
)

op.drop_index(
    "ix_trx_cobros_campo_empresa_estado",
    table_name="trx_cobros_campo",
    schema="contable",
)

op.drop_index(
    "ix_trx_cobros_campo_empresa_banco",
    table_name="trx_cobros_campo",
    schema="contable",
)

op.drop_index(
    "ix_trx_cobros_campo_empresa_metodo",
    table_name="trx_cobros_campo",
    schema="contable",
)

op.drop_index(
    "ix_trx_cobros_campo_empresa_visita",
    table_name="trx_cobros_campo",
    schema="contable",
)

op.drop_index(
    "ix_trx_cobros_campo_empresa_promotor",
    table_name="trx_cobros_campo",
    schema="contable",
)

op.drop_index(
    "ix_trx_cobros_campo_empresa_cliente",
    table_name="trx_cobros_campo",
    schema="contable",
)

op.drop_index(
    "ix_trx_cobros_campo_empresa_activo",
    table_name="trx_cobros_campo",
    schema="contable",
)

op.drop_table(
    "trx_cobros_campo",
    schema="contable",
)