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 encrm, 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)ycontable.cat_estados_cobro(empresa_id, id). - Aislamiento Multi-Tenant (RLS): Integra
empresa_id BIGINT NOT NULLcon políticas RLS obligatorias (USINGyWITH CHECK) garantizando aislamiento total de las operaciones financieras por empresa. - Integridad Compuesta para Imputaciones: Incorpora la restricción
UNIQUE (empresa_id, id)para permitir quetrx_cobros_campo_imputacionesaplique 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_cobrocomoDOUBLE 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",
)