servico_plugnotas_teste/backup/src/utils/banco.py
2026-07-10 16:32:22 -03:00

241 lines
9.3 KiB
Python

from datetime import datetime
import uuid
from sqlalchemy import Column, Integer, String, DateTime, Text, create_engine, Boolean
from sqlalchemy.orm import declarative_base, sessionmaker
from sqlalchemy.exc import SQLAlchemyError
Base = declarative_base()
class CertificadoDigitalTable(Base):
__tablename__ = 'certificado_digital'
id = Column(Integer, primary_key=True, autoincrement=True)
id_tecnospeed = Column(String(50), nullable=False)
certificado = Column(Text, nullable=False)
createdAt = Column(DateTime, default=datetime.now)
updatedAt = Column(DateTime, default=datetime.now, onupdate=datetime.now)
deletedAt = Column(DateTime, nullable=True)
expirationAt = Column(DateTime, nullable=False)
senha = Column(String(50), nullable=False)
status = Column(Boolean, nullable=False)
id_empresa = Column(String(50), nullable=False)
id_usuario = Column(Integer, nullable=False)
email = Column(String(255), nullable=True)
class EnterpriseTable(Base):
__tablename__ = 'Enterprise'
id = Column(String(50), primary_key=True)
name = Column(String(255), nullable=False)
cnpj = Column(String(50), nullable=False)
banco = Column(Text, nullable=True)
email = Column(String(255), nullable=True)
createdAt = Column(DateTime, default=datetime.now)
updatedAt = Column(DateTime, default=datetime.now, onupdate=datetime.now)
deletedAt = Column(DateTime, nullable=True)
status = Column(Boolean, nullable=False, default=True)
class LogoTable(Base):
__tablename__ = 'logo'
id = Column(Integer, primary_key=True, autoincrement=True)
logo = Column(Text, nullable=False)
id_empresa = Column(String(50), nullable=False)
createdAt = Column(DateTime, default=datetime.now)
updatedAt = Column(DateTime, default=datetime.now, onupdate=datetime.now)
deletedAt = Column(DateTime, nullable=True)
status = Column(Boolean, nullable=False)
class LogTable(Base):
__tablename__ = 'log'
id = Column(Integer, primary_key=True, autoincrement=True)
id_usuario = Column(Integer, nullable=False)
createdAt = Column(DateTime, default=datetime.now)
updatedAt = Column(DateTime, default=datetime.now, onupdate=datetime.now)
deletedAt = Column(DateTime, nullable=True)
acao = Column(String(50), nullable=False)
tabela = Column(String(50), nullable=False)
id_registro = Column(String(50), nullable=False)
json = Column(Text, nullable=False)
status = Column(String(20), nullable=False, default='INICIO')
mensagem = Column(Text, nullable=False, default='')
cliente = Column(String(100), nullable=True)
correlation_id = Column(String(50), nullable=True)
class ServicoTable(Base):
__tablename__ = 'servico'
id = Column(Integer, primary_key=True, autoincrement=True)
id_tecnospeed = Column(String(50), nullable=False)
descricao = Column(Text, nullable=False)
id_usuario = Column(Integer, nullable=False)
createdAt = Column(DateTime, default=datetime.now)
updatedAt = Column(DateTime, default=datetime.now, onupdate=datetime.now)
deletedAt = Column(DateTime, nullable=True)
status = Column(Boolean, nullable=False)
class TomadorTable(Base):
__tablename__ = 'tomador'
id = Column(Integer, primary_key=True, autoincrement=True)
id_tecnospeed = Column(String(50), nullable=False)
nome = Column(String(50), nullable=False)
cpf_cnpj = Column(String(50), nullable=False)
email = Column(String(50), nullable=False)
telefone = Column(String(50), nullable=False)
id_usuario = Column(Integer, nullable=False)
createdAt = Column(DateTime, default=datetime.now)
updatedAt = Column(DateTime, default=datetime.now, onupdate=datetime.now)
deletedAt = Column(DateTime, nullable=True)
status = Column(Boolean, nullable=False)
class NFSeTable(Base):
__tablename__ = 'nfse'
id = Column(Integer, primary_key=True, autoincrement=True)
id_tecnospeed = Column(String(50), nullable=False)
id_empresa = Column(String(50), nullable=False)
id_usuario = Column(Integer, nullable=False)
createdAt = Column(DateTime, default=datetime.now)
updatedAt = Column(DateTime, default=datetime.now, onupdate=datetime.now)
deletedAt = Column(DateTime, nullable=True)
status = Column(Boolean, nullable=False)
class NFeTable(Base):
__tablename__ = 'nfe'
id = Column(Integer, primary_key=True, autoincrement=True)
id_tecnospeed = Column(String(50), nullable=False)
id_empresa = Column(String(50), nullable=False)
id_usuario = Column(Integer, nullable=False)
createdAt = Column(DateTime, default=datetime.now)
updatedAt = Column(DateTime, default=datetime.now, onupdate=datetime.now)
deletedAt = Column(DateTime, nullable=True)
status = Column(Boolean, nullable=False)
# Cache de motores criados pelo SQLAlchemy por URL de conexao
_engines = {}
# Abstração de conexão base e de persistência de instâncias de metadados relacionais usando PostgreSQL
class Banco:
def __init__(self, host, port, user, password, database):
conn_str = f'postgresql://{user}:{password}@{host}:{port}/{database}'
if conn_str not in _engines:
_engines[conn_str] = create_engine(
conn_str,
pool_pre_ping=True,
pool_recycle=3600
)
self.engine = _engines[conn_str]
self.Session = sessionmaker(bind=self.engine)
self.session = self.Session()
def close(self):
"""Encerra a sessão SQLAlchemy atual liberando do pooler."""
if hasattr(self, 'session') and self.session is not None:
self.session.close()
def create_tables(self):
"""Cria as tabelas no banco de dados."""
try:
Base.metadata.create_all(self.engine)
except SQLAlchemyError as e:
print(f"Erro ao criar tabelas (SQLAlchemy): {e}")
except Exception as e:
print(f"Erro ao criar tabelas: {e}")
def add(self, obj):
"""Adiciona um novo registro no banco."""
try:
self.session.add(obj)
self.session.commit()
return obj
except SQLAlchemyError as e:
self.session.rollback()
print(f"Erro ao adicionar registro (SQLAlchemy): {e}")
raise e
except Exception as e:
self.session.rollback()
print(f"Erro ao adicionar registro: {e}")
raise e
def get(self, model, obj_id):
"""Busca um registro pelo ID."""
try:
return self.session.query(model).get(obj_id)
except SQLAlchemyError as e:
self.session.rollback()
print(f"Erro ao buscar registro (SQLAlchemy): {e}")
raise e
except Exception as e:
self.session.rollback()
print(f"Erro ao buscar registro: {e}")
raise e
def get_all(self, model):
"""Retorna todos os registros de um modelo."""
try:
return self.session.query(model).all()
except SQLAlchemyError as e:
print(f"Erro ao buscar registros (SQLAlchemy): {e}")
raise e
except Exception as e:
print(f"Erro ao buscar registros: {e}")
raise e
def update(self, obj):
"""Atualiza um registro no banco."""
try:
self.session.commit()
return obj
except SQLAlchemyError as e:
self.session.rollback()
print(f"Erro ao atualizar registro (SQLAlchemy): {e}")
raise e
except Exception as e:
self.session.rollback()
print(f"Erro ao atualizar registro: {e}")
raise e
def delete(self, obj):
"""Deleta um registro do banco."""
try:
self.session.delete(obj)
self.session.commit()
return True
except SQLAlchemyError as e:
self.session.rollback()
print(f"Erro ao deletar registro (SQLAlchemy): {e}")
raise e
except Exception as e:
self.session.rollback()
print(f"Erro ao deletar registro: {e}")
raise e
def rollback(self):
"""Desfaz as alterações pendentes."""
try:
self.session.rollback()
except SQLAlchemyError as e:
print(f"Erro ao desfazer alterações (SQLAlchemy): {e}")
except Exception as e:
print(f"Erro ao desfazer alterações: {e}")
def logar_sistema(self, id_usuario, acao, tabela, id_registro=0, json="{}", status="INICIO", mensagem="", cliente=None, correlation_id=None):
"""Registra uma ação no log do sistema."""
try:
log = LogTable(
id_usuario=id_usuario,
acao=acao,
tabela=tabela,
id_registro=id_registro,
json=json,
status=status,
mensagem=mensagem,
cliente=cliente,
correlation_id=correlation_id
)
self.add(log)
except SQLAlchemyError as e:
print(f"Erro ao logar ação (SQLAlchemy): {e}")
except Exception as e:
print(f"Erro ao logar ação: {e}")
@staticmethod
def gerar_correlation_id():
"""Gera um ID único para rastrear toda a cadeia de uma operação."""
return str(uuid.uuid4())[:8]