api-admim/app/database/models.py

656 lines
32 KiB
Python

# Importações de bibliotecas padrão
from __future__ import annotations
import enum
from datetime import datetime
from typing import List, Annotated
from uuid import UUID as UuidType
# from fastapi_users.db import SQLAlchemyBaseUserTable
from fastapi_users_db_sqlalchemy import SQLAlchemyBaseUserTableUUID
# Importações de bibliotecas de terceiros
from sqlalchemy import Column, String, Boolean, ForeignKey, Table, Integer, Date, Text, Numeric, Enum
from sqlalchemy import DateTime, FetchedValue, func
from sqlalchemy.dialects.postgresql import UUID as UuidColumn
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.ext.compiler import compiles
from sqlalchemy.orm import relationship, Mapped, mapped_column, with_polymorphic
from sqlalchemy.sql.expression import FunctionElement
from sqlalchemy.sql import expression
from uuid6 import uuid7
# from sqlalchemy.ext.asyncio import AsyncAttrs
# Importações do seu próprio projeto
from .session import Base
# EXTENSIONS = ["uuid-ossp", "postgis", "postgis_topology"]
#
# naming_convention = {
# "ix": "ix_ct_%(table_name)s_%(column_0_N_name)s",
# "uq": "uq_ct_%(table_name)s_%(column_0_N_name)s",
# "ck": "ck_ct_%(table_name)s_%(constraint_name)s",
# "fk": "fk_ct_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",
# "pk": "pk_ct_%(table_name)s",
# }
#
#
# class Base(DeclarativeBase, AsyncAttrs):
# metadata = MetaData(naming_convention=naming_convention,
# # Multi Tennat
# schema="tenant"
# )
uuid = Annotated[UuidType, mapped_column(primary_key=True)]
str1 = Annotated[str, mapped_column(String(1), nullable=True)]
str2 = Annotated[str, mapped_column(String(2), nullable=True)]
str8 = Annotated[str, mapped_column(String(8), nullable=True)]
str10 = Annotated[str, mapped_column(String(10), nullable=True)]
str10_not_null = Annotated[str, mapped_column(String(10), nullable=False)]
str11 = Annotated[str, mapped_column(String(11), nullable=True)]
str14 = Annotated[str, mapped_column(String(14), nullable=True)]
str20 = Annotated[str, mapped_column(String(20), nullable=True)]
str30_not_null = Annotated[str, mapped_column(String(30), nullable=False)]
str39_uid = Annotated[str, mapped_column(String(39), nullable=True)]
str36_uuid = Annotated[str, mapped_column(String(36), nullable=False)]
str36_uuid_null = Annotated[str, mapped_column(String(36), nullable=True)]
str50 = Annotated[str, mapped_column(String(50), nullable=True)]
str50_null = Annotated[str, mapped_column(String(50), nullable=False)]
str100 = Annotated[str, mapped_column(String(100), nullable=True)]
str150 = Annotated[str, mapped_column(String(150), nullable=True)]
str200 = Annotated[str, mapped_column(String(200), nullable=True)]
url = Annotated[str, mapped_column(String(2083), nullable=True)]
intpk = Annotated[int, mapped_column(primary_key=True, index=True)]
valor_monetario = Annotated[float, mapped_column(Numeric(precision=10, scale=2), nullable=True)]
valor_monetario_not_null = Annotated[float, mapped_column(Numeric(precision=10, scale=2), nullable=False)]
data = Annotated[Date, mapped_column(Date, nullable=True)]
data_null = Annotated[Date, mapped_column(Date, nullable=True)]
data_idx = Annotated[Date, mapped_column(Date, index=True)]
text = Annotated[Text, mapped_column(Text)]
text_null = Annotated[Text, mapped_column(Text, nullable=True)]
boleano = Annotated[Boolean, mapped_column(Boolean, default=True)]
boleano_false = Annotated[Boolean, mapped_column(Boolean, server_default=expression.false())]
# ------------------------------------------------------INICIO MIXIN----------------------------------------------------
class utcnow(FunctionElement):
type = DateTime()
inherit_cache = True
@compiles(utcnow, "postgresql")
def pg_utcnow(element, compiler, **kw):
return "TIMEZONE('utc', CURRENT_TIMESTAMP)"
class UuidMixin:
uuid: Mapped[UuidType] = mapped_column(
"uuid",
UuidColumn(as_uuid=True),
primary_key=True,
default=uuid7,
nullable=False,
)
class IdMixin:
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True, nullable=False)
class AtivoMixin:
ativo = Column(Boolean, nullable=False, server_default=expression.true(), index=True)
data_ativacao: Mapped[datetime] = mapped_column(
DateTime,
nullable=False,
server_default=utcnow(),
)
data_desativacao: Mapped[datetime] = mapped_column(
DateTime,
nullable=True,
index=True,
onupdate=func.now(),
server_default=utcnow(),
server_onupdate=FetchedValue(),
)
class TimestampMixin:
created_at: Mapped[datetime] = mapped_column(
DateTime,
nullable=False,
server_default=utcnow(),
)
updated_at: Mapped[datetime] = mapped_column(
DateTime,
nullable=True,
index=True,
onupdate=func.now(),
server_default=utcnow(),
server_onupdate=FetchedValue(),
)
# ------------------------------------------------------FIM MIXIN----------------------------------------------------
# ------------------------------------------------------MULTI TENNAT----------------------------------------------------
class Inquilino(UuidMixin, Base):
__tablename__ = "inquilinos"
__table_args__ = ({"schema": "shared"})
nome = Column(String(100), nullable=False, unique=False)
cpf_cnpj = Column(String(14), nullable=False, unique=True)
pessoa_celular = Column(String(20), nullable=True, unique=False)
# Relacionamento com a tabela de usuários
usuario: Mapped[List["RbacUser"]] = relationship(back_populates="inquilino", passive_deletes=True,
lazy="selectin",
join_depth=2)
# ---------------------------------------------------FIM MULTI TENNAT---------------------------------------------------
comercial_relacionamento_pessoa_empresa = Table('comercial_relacionamento_pessoa_empresa',
Base.metadata,
Column('relacao_comercial_uuid', UUID(as_uuid=True),
ForeignKey('comercial_relacoes_comercial.uuid',
ondelete="CASCADE")),
Column('pessoa_uuid', UUID(as_uuid=True),
ForeignKey('comercial_pessoas.uuid', ondelete="CASCADE")),
)
class ComercialTransacaoComercialEnum(enum.Enum):
PAGAMENTO = "PAGAMENTO"
RECEBIMENTO = "RECEBIMENTO"
AMBOS = "AMBOS"
class ComercialRelacaoComercial(Base, TimestampMixin, UuidMixin, AtivoMixin):
__tablename__ = "comercial_relacoes_comercial"
log_auditoria_habilitado = False
descricao_relacao_comercial: str = Column(String(30), nullable=False)
transacao_comercial: Mapped[ComercialTransacaoComercialEnum] = mapped_column(Enum(
ComercialTransacaoComercialEnum,
inherit_schema=True
),
nullable=False)
pessoa_relacao: Mapped[List["ComercialPessoa"]] = relationship(secondary=comercial_relacionamento_pessoa_empresa,
back_populates='rc',
passive_deletes=True,
lazy="selectin",
join_depth=1, )
class ComercialTipoEndereco(Base, TimestampMixin, UuidMixin, AtivoMixin):
__tablename__ = "comercial_tipos_endereco"
log_auditoria_habilitado = False
tipo_endereco_descricao: str = Column(String(30), nullable=False)
relacao_endereco_tp: Mapped[List["ComercialEndereco"]] = relationship(back_populates="relacao_tipo_endereco",
passive_deletes=True,
lazy="selectin",
cascade="all, delete-orphan",
join_depth=1)
class ComercialPessoa(UuidMixin, Base, TimestampMixin, AtivoMixin):
__tablename__ = "comercial_pessoas"
log_auditoria_habilitado = False
pessoa_status: bool = Column(Boolean, unique=False, default=True)
pessoa_telefone: Mapped[str20]
pessoa_celular: Mapped[str20]
pessoa_tipo: Mapped[str1]
pessoa_email: Mapped[str150]
pessoa_local_evento: bool = Column(Boolean, unique=False, default=False)
rc: Mapped[List["ComercialRelacaoComercial"]] = relationship(secondary=comercial_relacionamento_pessoa_empresa,
back_populates='pessoa_relacao',
passive_deletes=True,
lazy="selectin", join_depth=1)
enderecos: Mapped[List["ComercialEndereco"]] = relationship(back_populates="pessoa",
passive_deletes=True,
lazy="selectin",
join_depth=2)
# usuario: Mapped[List["RbacUser"]] = relationship(back_populates="pessoa", passive_deletes=True,
# lazy="selectin",
# join_depth=2)
relacao_conta: Mapped[List["FinanceiroConta"]] = relationship(back_populates="relacao_pessoa",
passive_deletes=True,
lazy="selectin",
cascade="all, delete-orphan",
join_depth=1)
__mapper_args__ = {"polymorphic_identity": "comercial_pessoas",
"polymorphic_on": "pessoa_tipo",
}
class ComercialJuridica(ComercialPessoa):
__tablename__ = "comercial_juridicas"
log_auditoria_habilitado = False
uuid: Mapped[uuid] = mapped_column(ForeignKey("comercial_pessoas.uuid", ondelete="CASCADE"), primary_key=True)
juridica_cnpj: Mapped[str14]
juridica_email_fiscal: Mapped[str100]
juridica_insc_est: Mapped[str50]
juridica_ins_mun: Mapped[str50]
juridica_razao_social: Mapped[str200]
juridica_representante: Mapped[str100]
__mapper_args__ = {
"polymorphic_identity": "0",
"polymorphic_load": "selectin"
}
class ComercialFisica(ComercialPessoa):
__tablename__ = "comercial_fisicas"
log_auditoria_habilitado = False
uuid: Mapped[uuid] = mapped_column(ForeignKey("comercial_pessoas.uuid", ondelete="CASCADE"), primary_key=True)
fisica_cpf: Mapped[str11]
fisica_rg: Mapped[str20]
fisica_genero: Mapped[str2]
fisica_nome: Mapped[str100]
__mapper_args__ = {
"polymorphic_identity": "1",
"polymorphic_load": "selectin"
}
class ComercialEndereco(Base, TimestampMixin, UuidMixin):
__tablename__ = "comercial_enderecos"
log_auditoria_habilitado = False
endereco_pessoa_status: bool = Column(Boolean, unique=False, default=True)
endereco_pessoa_descricao: Mapped[str50]
endereco_pessoa_numero: Mapped[str8]
endereco_pessoa_complemento: Mapped[str50]
endereco_pessoa_cep: Mapped[str8]
fk_pessoa_uuid: Mapped[UuidType] = mapped_column(ForeignKey("comercial_pessoas.uuid",
ondelete="CASCADE"),
nullable=False)
pessoa: Mapped["ComercialPessoa"] = relationship(back_populates="enderecos",
lazy="selectin",
join_depth=1)
fk_tipo_endereco_uuid: Mapped[UuidType] = mapped_column(ForeignKey("comercial_tipos_endereco.uuid",
ondelete="CASCADE"), nullable=False)
relacao_tipo_endereco: Mapped["ComercialTipoEndereco"] = relationship(back_populates="relacao_endereco_tp",
lazy="selectin",
join_depth=2)
# __________________________________________USUÁRIOS E PERMISSÃO DE ACESSO______________________________________________
rbac_papeis_usuario = Table(
'rbac_papeis_usuario', Base.metadata,
Column('user_uuid', UUID(as_uuid=True), ForeignKey('shared.rbac_usuarios.id'), primary_key=True),
Column('papel_uuid', UUID(as_uuid=True), ForeignKey('shared.rbac_papeis.uuid'), primary_key=True),
# Multi Tennat
schema='shared'
)
rbac_papel_permissoes = Table(
'rbac_papel_permissoes', Base.metadata,
Column('papel_uuid', UUID(as_uuid=True), ForeignKey('shared.rbac_papeis.uuid'), primary_key=True),
Column('permissao_id', Integer, ForeignKey('shared.rbac_permissoes.id'), primary_key=True),
# Multi Tennat
schema='shared'
)
class RbacPermissao(Base):
__tablename__ = "rbac_permissoes"
log_auditoria_habilitado = False
id = Column(Integer, primary_key=True, index=True)
nome: Mapped[str50] = mapped_column(nullable=False, unique=True)
papeis: Mapped[List["RbacPapel"]] = relationship(secondary=rbac_papel_permissoes,
back_populates='permissoes',
passive_deletes=True,
lazy="selectin",
join_depth=1, )
# Multi Tennat
__table_args__ = ({"schema": "shared"},)
class RbacPapel(UuidMixin, Base):
__tablename__ = "rbac_papeis"
log_auditoria_habilitado = False
# id = Column(Integer, primary_key=True, index=True, autoincrement=True)
nome: Mapped[str50] = mapped_column(nullable=False, unique=True)
permissoes: Mapped[List["RbacPermissao"]] = relationship(secondary=rbac_papel_permissoes,
back_populates='papeis',
passive_deletes=True,
lazy="selectin",
join_depth=2, )
usuarios: Mapped[List["RbacUser"]] = relationship(secondary=rbac_papeis_usuario,
back_populates='papeis',
passive_deletes=True,
lazy="selectin",
join_depth=1, )
# Multi Tennat
__table_args__ = ({"schema": "shared"},)
class RbacUser(SQLAlchemyBaseUserTableUUID, Base):
__tablename__ = "rbac_usuarios"
log_auditoria_habilitado = False
def __init__(self, **kwargs):
super().__init__(**kwargs)
papeis: Mapped[List[RbacPapel]] = relationship(secondary=rbac_papeis_usuario,
back_populates='usuarios',
passive_deletes=True,
lazy="selectin",
join_depth=1)
# Multi Tennat
fk_inquilino_uuid: Mapped[UuidType] = mapped_column(ForeignKey("shared.inquilinos.uuid", ondelete="CASCADE"),
nullable=False)
inquilino: Mapped["Inquilino"] = relationship(back_populates="usuario",
lazy="selectin",
passive_deletes=True,
join_depth=1)
nome_completo: Mapped[str100]
__table_args__ = ({"schema": "shared"},)
# __________________________________________FINAL USUÁRIOS E PERMISSÃO DE ACESSO________________________________________
# ________________________________________________CONTAS A PAGAR E RECEBER______________________________________________
class FinanceiroTipoContaEnum(enum.Enum):
PAGAR = "PAGAR"
RECEBER = "RECEBER"
class FinanceiroTipoMovimentacaoEnum(enum.Enum):
CREDITO = "CREDITO"
DEBITO = "DEBITO"
class FinanceiroStatus(Base, IdMixin):
__tablename__ = "financeiro_status"
log_auditoria_habilitado = False
status_nome_status: Mapped[str20]
status_descricao: Mapped[str200]
relacao_conta: Mapped[List["FinanceiroConta"]] = relationship(back_populates="relacao_status",
passive_deletes=True,
lazy="selectin", cascade="all, delete-orphan",
join_depth=1)
relacao_parcelas: Mapped[List["FinanceiroParcela"]] = relationship(back_populates="relacao_status",
passive_deletes=True,
lazy="selectin", cascade="all, delete-orphan",
join_depth=1)
class FinanceiroForma_Pagamento(Base, IdMixin):
__tablename__ = "financeiro_formas_pagamento"
log_auditoria_habilitado = False
formas_pagamento_descricao: Mapped[str20]
relacao_pagamentos: Mapped[List["FinanceiroPagamento"]] = relationship(back_populates="relacao_formas_pagamento",
passive_deletes=True, lazy="selectin",
cascade="all, delete-orphan", join_depth=1)
class FinanceiroCategoria(Base, IdMixin):
__tablename__ = "financeiro_categorias"
log_auditoria_habilitado = False
categorias_nome: Mapped[str20]
relacao_conta: Mapped[List["FinanceiroConta"]] = relationship(back_populates="relacao_categorias",
passive_deletes=True,
lazy="selectin", cascade="all, delete-orphan",
join_depth=1)
class FinanceiroCentro_Custo(Base, IdMixin):
__tablename__ = "financeiro_centros_custo"
log_auditoria_habilitado = False
centros_custo_nome: Mapped[str20]
centros_custo_descricao: Mapped[str100]
relacao_conta: Mapped[List["FinanceiroConta"]] = relationship(back_populates="relacao_centros_custo",
passive_deletes=True,
lazy="selectin", cascade="all, delete-orphan",
join_depth=1)
class FinanceiroParcela(Base, IdMixin):
__tablename__ = "financeiro_parcelas"
log_auditoria_habilitado = True
parcelas_numero_parcela: Mapped[int] = mapped_column(Integer, nullable=False)
parcelas_valor_parcela: Mapped[valor_monetario]
parcelas_valor_juros: Mapped[valor_monetario]
parcelas_valor_multa: Mapped[valor_monetario]
parcelas_valor_desconto: Mapped[valor_monetario]
parcelas_data_vencimento: Mapped[data_idx]
fk_contas_id: Mapped[int] = mapped_column(ForeignKey("financeiro_contas.id", ondelete="CASCADE"), nullable=False)
relacao_conta: Mapped["FinanceiroConta"] = relationship(back_populates="relacao_parcelas", lazy="selectin",
join_depth=2)
fk_status_id: Mapped[int] = mapped_column(ForeignKey("financeiro_status.id", ondelete="CASCADE"),
nullable=False)
relacao_status: Mapped["FinanceiroStatus"] = relationship(back_populates="relacao_parcelas", lazy="selectin",
join_depth=2)
relacao_pagamentos: Mapped[List["FinanceiroPagamento"]] = relationship(back_populates="relacao_parcela",
passive_deletes=True,
lazy="selectin",
cascade="all, delete-orphan",
join_depth=1)
class FinanceiroPagamento(Base, IdMixin):
__tablename__ = "financeiro_pagamentos"
log_auditoria_habilitado = True
data_pagamento: Mapped[data_idx]
valor_pago: Mapped[valor_monetario]
observacao: Mapped[text]
fk_parcelas_id: Mapped[int] = mapped_column(ForeignKey("financeiro_parcelas.id", ondelete="CASCADE"),
nullable=False)
relacao_parcela: Mapped["FinanceiroParcela"] = relationship(back_populates="relacao_pagamentos", lazy="selectin",
join_depth=2)
fk_contas_corrente_id: Mapped[int] = mapped_column(ForeignKey("financeiro_contas_corrente.id",
ondelete="CASCADE"), nullable=False)
relacao_contas_corrente: Mapped["FinanceiroConta_Corrente"] = relationship(back_populates="relacao_pagamentos",
lazy="selectin", join_depth=2)
fk_formas_pagamento_id: Mapped[int] = mapped_column(ForeignKey("financeiro_formas_pagamento.id",
ondelete="CASCADE"), nullable=False)
relacao_formas_pagamento: Mapped["FinanceiroForma_Pagamento"] = relationship(back_populates="relacao_pagamentos",
lazy="selectin", join_depth=2)
relacao_movimentacoes_conta: Mapped[List[
"FinanceiroMovimentacao_Conta"]] = relationship(back_populates="relacao_pagamentos",
passive_deletes=True,
lazy="selectin",
cascade="all, delete-orphan",
join_depth=1)
class FinanceiroConta(Base, IdMixin):
__tablename__ = "financeiro_contas"
log_auditoria_habilitado = True
contas_tipo_conta: Mapped[FinanceiroTipoContaEnum] = mapped_column(Enum(FinanceiroTipoContaEnum,
inherit_schema=True
),
nullable=False)
contas_data_emissao: Mapped[data]
contas_data_vencimento: Mapped[data]
contas_valor_total: Mapped[valor_monetario]
contas_valor_juros: Mapped[valor_monetario]
contas_valor_multa: Mapped[valor_monetario]
contas_valor_desconto: Mapped[valor_monetario]
contas_descricao: Mapped[str200]
fk_pessoas_uuid: Mapped[int] = mapped_column(ForeignKey("comercial_pessoas.uuid", ondelete="CASCADE"),
nullable=False)
relacao_pessoa: Mapped["ComercialPessoa"] = relationship(back_populates="relacao_conta", lazy="selectin",
join_depth=2)
fk_status_id: Mapped[int] = mapped_column(ForeignKey("financeiro_status.id", ondelete="CASCADE"),
nullable=False)
relacao_status: Mapped["FinanceiroStatus"] = relationship(back_populates="relacao_conta", lazy="selectin",
join_depth=2)
fk_categorias_id: Mapped[int] = mapped_column(ForeignKey("financeiro_categorias.id", ondelete="CASCADE"),
nullable=False)
relacao_categorias: Mapped["FinanceiroCategoria"] = relationship(back_populates="relacao_conta", lazy="selectin",
join_depth=2)
fk_centros_custo_id: Mapped[int] = mapped_column(ForeignKey("financeiro_centros_custo.id", ondelete="CASCADE"),
nullable=False)
relacao_centros_custo: Mapped["FinanceiroCentro_Custo"] = relationship(back_populates="relacao_conta",
lazy="selectin",
join_depth=2)
relacao_parcelas: Mapped[List["FinanceiroParcela"]] = relationship(back_populates="relacao_conta",
passive_deletes=True,
lazy="selectin", cascade="all, delete-orphan",
join_depth=1)
class FinanceiroConta_Corrente(Base, IdMixin):
__tablename__ = "financeiro_contas_corrente"
log_auditoria_habilitado = True
contas_corrente_nome_conta: Mapped[str50]
contas_corrente_saldo_inicial: Mapped[valor_monetario]
contas_corrente_data_criacao: Mapped[data_idx]
contas_corrente_descricao: Mapped[str100]
relacao_movimentacoes_conta: Mapped[List["FinanceiroMovimentacao_Conta"]] = relationship(
back_populates="relacao_contas_corrente",
passive_deletes=True, lazy="selectin",
cascade="all, delete-orphan", join_depth=1)
relacao_pagamentos: Mapped[List["FinanceiroPagamento"]] = relationship(back_populates="relacao_contas_corrente",
passive_deletes=True, lazy="selectin",
cascade="all, delete-orphan", join_depth=1)
class FinanceiroMovimentacao_Conta(Base, IdMixin):
__tablename__ = "financeiro_movimentacoes_conta"
log_auditoria_habilitado = True
movimentacoes_conta_tipo_movimentacao: Mapped[FinanceiroTipoMovimentacaoEnum] = mapped_column(
Enum(FinanceiroTipoMovimentacaoEnum,
# Multi Tennat
inherit_schema=True
# /Multi Tennat
),
nullable=False,
)
movimentacoes_conta_valor_movimentacao: Mapped[valor_monetario]
movimentacoes_conta_data_movimentacao: Mapped[data_idx]
movimentacoes_conta_descricao: Mapped[str200]
fk_contas_corrente_id: Mapped[int] = mapped_column(ForeignKey("financeiro_contas_corrente.id", ondelete="CASCADE"),
nullable=False)
relacao_contas_corrente: Mapped[
"FinanceiroConta_Corrente"] = relationship(back_populates="relacao_movimentacoes_conta",
lazy="selectin", join_depth=2)
fk_pagamentos_id: Mapped[int] = mapped_column(ForeignKey("financeiro_pagamentos.id", ondelete="CASCADE"),
nullable=False)
relacao_pagamentos: Mapped["FinanceiroPagamento"] = relationship(back_populates="relacao_movimentacoes_conta",
lazy="selectin", join_depth=2)
financeiro_conta_manutencao_equipamentos = Table('financeiro_conta_manutencao_equipamentos', Base.metadata,
Column('manutencao_uuid', UUID(as_uuid=True),
ForeignKey('estoque_manutencoes_equipamentos.uuid'),
primary_key=True),
Column('conta_id', Integer,
ForeignKey('financeiro_contas.id'), primary_key=True)
)
# ______________________________________________FIM CONTAS A PAGAR E RECEBER____________________________________________
# _____________________________________________________TABLEAS DE LOG___________________________________________________
class HistoricoAlteracoes(Base, UuidMixin):
__tablename__ = 'historico_alteracoes'
tabela: Mapped[str100]
data_modificacao: Mapped[datetime] = mapped_column(DateTime, nullable=False)
action: Mapped[str10] # 'update', 'delete'
usuario_id: Mapped[str36_uuid_null] # Assumindo que o "ID" do usuário é uma "string"
registro_id: Mapped[str36_uuid] # "ID" do registro que está sendo alterado
# Relacionamentos
updates: Mapped[List["HistoricoUpdate"]] = relationship(back_populates="alteracao", passive_deletes=True,
lazy="selectin", cascade="all, delete-orphan",
join_depth=1)
deletes: Mapped["HistoricoDelete"] = relationship(back_populates="alteracao", passive_deletes=True,
lazy="selectin", cascade="all, delete-orphan",
join_depth=1)
class HistoricoUpdate(Base, UuidMixin):
__tablename__ = 'historico_update'
fk_historico_alteracoes_uuid: Mapped[UuidType] = mapped_column(ForeignKey("historico_alteracoes.uuid",
ondelete="CASCADE"), nullable=False)
coluna: Mapped[str100]
valor_antigo: Mapped[str200]
valor_novo: Mapped[str200]
# Relacionamento com a tabela principal
alteracao: Mapped["HistoricoAlteracoes"] = relationship(back_populates="updates", lazy="selectin", join_depth=2)
class HistoricoDelete(Base, UuidMixin):
__tablename__ = 'historico_delete'
fk_historico_alteracoes_uuid: Mapped[UuidType] = mapped_column(ForeignKey("historico_alteracoes.uuid",
ondelete="CASCADE"), nullable=False)
registro_deletado: Mapped[text] # Aqui armazenamos o estado completo da linha deletada como JSON
# Relacionamento com a tabela principal
alteracao: Mapped["HistoricoAlteracoes"] = relationship(back_populates="deletes", lazy="selectin", join_depth=2)
# ___________________________________________________FIM TABLEAS DE LOG_________________________________________________
# ______________________________________________LOCALIZAÇÃO ARQUIVOS S3_________________________________________________
class S3Arquivo(Base, UuidMixin, TimestampMixin):
__tablename__ = "s3_arquivos"
arquivos_nome_original: Mapped[str200]
arquivos_nome_armazenado: Mapped[str200]
associacoes: Mapped["S3ArquivoAssociacao"] = relationship(back_populates="arquivos", passive_deletes=True,
lazy="selectin", cascade="all, delete-orphan",
join_depth=1)
class S3ArquivoAssociacao(Base, UuidMixin, TimestampMixin):
__tablename__ = "s3_arquivo_associacoes"
fk_arquivo_uuid: Mapped[UuidType] = mapped_column(ForeignKey("s3_arquivos.uuid",
ondelete="CASCADE"), nullable=False)
arquivo_associacoes_tabela_relacionada: Mapped[str100] # Nome da tabela associada
arquivo_associacoes_linha_uuid: Mapped[UuidType] # Uuid da linha na tabela associada
arquivos: Mapped["S3Arquivo"] = relationship(back_populates="associacoes", lazy="selectin", join_depth=2)
# ____________________________________________FIM LOCALIZAÇÃO ARQUIVOS S3_______________________________________________
# __________________________________________________CONFIGURAÇÃO HERANÇA________________________________________________
# ____________________________________________NECESSÁRIO FICA NO FIM DO CÓDIGO__________________________________________
# Definindo a consulta polimórfica
PESSOA_POLY = with_polymorphic(
ComercialPessoa, # Modelo base
[ComercialFisica, ComercialJuridica] # Subclasses
)
# ________________________________________________FIM CONFIGURAÇÃO HERANÇA______________________________________________