|
|
|
|
|
from sqlalchemy import ( |
|
|
Column, |
|
|
Integer, |
|
|
String, |
|
|
Date, |
|
|
DateTime, |
|
|
Boolean, |
|
|
ForeignKey, |
|
|
Text |
|
|
) |
|
|
from sqlalchemy.orm import relationship |
|
|
|
|
|
|
|
|
|
|
|
from datetime import datetime |
|
|
from banco import Base |
|
|
from sqlalchemy.sql import func |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Equipamento(Base): |
|
|
__tablename__ = "equipamentos" |
|
|
|
|
|
id = Column(Integer, primary_key=True, index=True) |
|
|
|
|
|
|
|
|
fpso1 = Column(String, index=True, nullable=False) |
|
|
fpso = Column(String, index=True, nullable=False) |
|
|
data_coleta = Column(String, index=True, nullable=False) |
|
|
|
|
|
|
|
|
especialista = Column(String, nullable=False) |
|
|
conferente = Column(String, nullable=False) |
|
|
osm = Column(String, nullable=False) |
|
|
|
|
|
|
|
|
modal = Column(String, index=True, nullable=False) |
|
|
quant_equip = Column(Integer, default=0) |
|
|
mrob = Column(String, nullable=False) |
|
|
|
|
|
|
|
|
linhas_osm = Column(Integer, default=0) |
|
|
linhas_mrob = Column(Integer, default=0) |
|
|
linhas_erros = Column(Integer, default=0) |
|
|
|
|
|
|
|
|
erro_storekeeper = Column(String) |
|
|
erro_operacao = Column(String) |
|
|
erro_especialista = Column(String) |
|
|
erro_outros = Column(String) |
|
|
|
|
|
|
|
|
inclusao_exclusao = Column(String) |
|
|
po = Column(String) |
|
|
part_number = Column(String) |
|
|
material = Column(String) |
|
|
|
|
|
solicitante = Column(String, nullable=False) |
|
|
motivo = Column(String) |
|
|
requisitante = Column(String, nullable=False) |
|
|
nota_fiscal = Column(String, nullable=False) |
|
|
impacto = Column(String, nullable=False) |
|
|
dimensao = Column(String, nullable=False) |
|
|
|
|
|
observacoes = Column(String) |
|
|
|
|
|
|
|
|
dia_inclusao = Column(String, nullable=True, index=True) |
|
|
|
|
|
|
|
|
data_hora_input = Column(DateTime, default=datetime.utcnow, index=True) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class FPSO(Base): |
|
|
__tablename__ = "fpsos" |
|
|
|
|
|
id = Column(Integer, primary_key=True) |
|
|
nome = Column(String, unique=True, nullable=False, index=True) |
|
|
ativo = Column(Boolean, default=True) |
|
|
data_cadastro = Column(DateTime, default=datetime.utcnow) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class LogAcesso(Base): |
|
|
__tablename__ = "log_acesso" |
|
|
|
|
|
id = Column(Integer, primary_key=True) |
|
|
|
|
|
usuario = Column(String, nullable=False, index=True) |
|
|
acao = Column(String, nullable=False) |
|
|
tabela = Column(String, nullable=True) |
|
|
registro_id = Column(Integer, nullable=True) |
|
|
|
|
|
data_hora = Column(DateTime, default=datetime.utcnow, index=True) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Usuario(Base): |
|
|
__tablename__ = "usuarios" |
|
|
|
|
|
id = Column(Integer, primary_key=True) |
|
|
|
|
|
|
|
|
usuario = Column(String, unique=True, nullable=False, index=True) |
|
|
senha = Column(String, nullable=False) |
|
|
|
|
|
|
|
|
perfil = Column(String, nullable=False) |
|
|
ativo = Column(Boolean, default=True) |
|
|
|
|
|
|
|
|
data_criacao = Column(DateTime, default=datetime.utcnow) |
|
|
|
|
|
|
|
|
nome = Column(String, nullable=True, index=True) |
|
|
email = Column(String, unique=True, index=True, nullable=True) |
|
|
|
|
|
|
|
|
data_aniversario = Column(Date, nullable=True) |
|
|
|
|
|
|
|
|
@property |
|
|
def senha_hash(self) -> str | None: |
|
|
""" |
|
|
Alias compatível para códigos que esperam 'senha_hash'. |
|
|
Retorna o valor da coluna 'senha' (que deve conter o HASH bcrypt). |
|
|
Não altera o schema e não exige migration. |
|
|
""" |
|
|
return self.senha |
|
|
|
|
|
def __repr__(self) -> str: |
|
|
return f"<Usuario id={self.id} usuario={self.usuario!r} perfil={self.perfil!r} ativo={self.ativo}>" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class QuizPergunta(Base): |
|
|
__tablename__ = "quiz_perguntas" |
|
|
|
|
|
id = Column(Integer, primary_key=True) |
|
|
pergunta = Column(String, nullable=False) |
|
|
ativo = Column(Boolean, default=True) |
|
|
data_criacao = Column(DateTime, default=datetime.utcnow) |
|
|
|
|
|
respostas = relationship( |
|
|
"QuizResposta", |
|
|
back_populates="pergunta", |
|
|
cascade="all, delete-orphan" |
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class QuizResposta(Base): |
|
|
__tablename__ = "quiz_respostas" |
|
|
|
|
|
id = Column(Integer, primary_key=True) |
|
|
pergunta_id = Column(Integer, ForeignKey("quiz_perguntas.id"), nullable=False) |
|
|
texto = Column(String, nullable=False) |
|
|
correta = Column(Boolean, default=False) |
|
|
|
|
|
pergunta = relationship("QuizPergunta", back_populates="respostas") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class QuizPontuacao(Base): |
|
|
__tablename__ = "quiz_pontuacoes" |
|
|
|
|
|
id = Column(Integer, primary_key=True) |
|
|
usuario = Column(String, nullable=False, index=True) |
|
|
pontos = Column(Integer, nullable=False, default=0) |
|
|
data = Column(DateTime, default=datetime.utcnow, index=True) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class VideoCategoria(Base): |
|
|
__tablename__ = "video_categorias" |
|
|
|
|
|
id = Column(Integer, primary_key=True) |
|
|
nome = Column(String, nullable=False, unique=True) |
|
|
ativo = Column(Boolean, default=True) |
|
|
data_criacao = Column(DateTime, default=datetime.utcnow) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Video(Base): |
|
|
__tablename__ = "videos" |
|
|
|
|
|
id = Column(Integer, primary_key=True) |
|
|
titulo = Column(String, nullable=False) |
|
|
descricao = Column(String) |
|
|
url = Column(String, nullable=False) |
|
|
|
|
|
categoria_id = Column(Integer, ForeignKey("video_categorias.id")) |
|
|
categoria = relationship("VideoCategoria") |
|
|
|
|
|
ativo = Column(Boolean, default=True) |
|
|
data_criacao = Column(DateTime, default=datetime.utcnow) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class EventoCalendario(Base): |
|
|
__tablename__ = "eventos_calendario" |
|
|
|
|
|
id = Column(Integer, primary_key=True) |
|
|
titulo = Column(String, nullable=False) |
|
|
descricao = Column(String) |
|
|
data_evento = Column(Date, nullable=False) |
|
|
data_lembrete = Column(Date) |
|
|
ativo = Column(Boolean, default=True) |
|
|
usuario_criacao = Column(String, nullable=False) |
|
|
data_criacao = Column(DateTime, default=datetime.utcnow) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class IOIRunSugestao(Base): |
|
|
__tablename__ = "ioirun_sugestao" |
|
|
|
|
|
id = Column(Integer, primary_key=True, index=True) |
|
|
|
|
|
|
|
|
usuario = Column(String, nullable=False, index=True) |
|
|
|
|
|
|
|
|
area = Column(String, nullable=True, index=True) |
|
|
mensagem = Column(Text, nullable=False) |
|
|
|
|
|
|
|
|
resposta = Column(Text, nullable=True) |
|
|
status = Column(String, default="pendente", nullable=False, index=True) |
|
|
responsavel = Column(String, nullable=True) |
|
|
|
|
|
|
|
|
data_envio = Column(DateTime, default=datetime.utcnow, nullable=False, index=True) |
|
|
data_resposta = Column(DateTime, nullable=True) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class RNC(Base): |
|
|
__tablename__ = "rnc" |
|
|
|
|
|
id = Column(Integer, primary_key=True, index=True) |
|
|
|
|
|
|
|
|
codigo = Column(String(20), unique=True, index=True) |
|
|
titulo = Column(String(200), nullable=False) |
|
|
descricao = Column(Text, nullable=False) |
|
|
|
|
|
|
|
|
data_form = Column(Date, nullable=True, index=True) |
|
|
emitente = Column(String(120), nullable=True, index=True) |
|
|
rnc_cliente_numero = Column(String(50), nullable=True) |
|
|
cliente_emitente = Column(String(120), nullable=True) |
|
|
area_solicitante = Column(String(120), nullable=True, index=True) |
|
|
area_notificada = Column(String(120), nullable=True, index=True) |
|
|
origem = Column(String(50), nullable=True, index=True) |
|
|
|
|
|
|
|
|
envolvido1_nome = Column(String(120), nullable=True) |
|
|
envolvido1_matricula = Column(String(50), nullable=True) |
|
|
envolvido1_funcao = Column(String(120), nullable=True) |
|
|
envolvido2_nome = Column(String(120), nullable=True) |
|
|
envolvido2_matricula = Column(String(50), nullable=True) |
|
|
envolvido2_funcao = Column(String(120), nullable=True) |
|
|
|
|
|
|
|
|
tipo = Column(String(50), nullable=True) |
|
|
severidade = Column(String(20), nullable=True) |
|
|
prioridade = Column(String(20), nullable=True) |
|
|
|
|
|
|
|
|
status = Column(String(30), default="Aberta", nullable=False, index=True) |
|
|
data_abertura = Column(DateTime, default=datetime.utcnow, index=True) |
|
|
prazo = Column(DateTime, nullable=True, index=True) |
|
|
encerrada_em = Column(DateTime, nullable=True, index=True) |
|
|
|
|
|
|
|
|
responsavel = Column(String(120), nullable=True, index=True) |
|
|
criado_por = Column(String(120), nullable=False, index=True) |
|
|
|
|
|
|
|
|
cliente = Column(String(120), nullable=True) |
|
|
local = Column(String(120), nullable=True) |
|
|
|
|
|
|
|
|
metodologia = Column(String(120), nullable=True) |
|
|
causa_raiz = Column(Text, nullable=True) |
|
|
ishikawa_json = Column(Text, nullable=True) |
|
|
|
|
|
|
|
|
data_hora_input = Column(DateTime, default=datetime.utcnow, index=True) |
|
|
|
|
|
|
|
|
comentarios = relationship("RNCComentario", back_populates="rnc", cascade="all, delete-orphan") |
|
|
acoes = relationship("RNCAcaoCorretiva", back_populates="rnc", cascade="all, delete-orphan") |
|
|
anexos = relationship("RNCAnexo", back_populates="rnc", cascade="all, delete-orphan") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class RNCComentario(Base): |
|
|
__tablename__ = "rnc_comentario" |
|
|
|
|
|
id = Column(Integer, primary_key=True, index=True) |
|
|
rnc_id = Column(Integer, ForeignKey("rnc.id"), nullable=False, index=True) |
|
|
|
|
|
data = Column(DateTime, default=datetime.utcnow, index=True) |
|
|
autor = Column(String(120), nullable=False, index=True) |
|
|
mensagem = Column(Text, nullable=False) |
|
|
|
|
|
status_novo = Column(String(30), nullable=True, index=True) |
|
|
prazo_novo = Column(DateTime, nullable=True, index=True) |
|
|
responsavel_novo = Column(String(120), nullable=True, index=True) |
|
|
|
|
|
rnc = relationship("RNC", back_populates="comentarios") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class RNCAcaoCorretiva(Base): |
|
|
__tablename__ = "rnc_acao" |
|
|
|
|
|
id = Column(Integer, primary_key=True, index=True) |
|
|
rnc_id = Column(Integer, ForeignKey("rnc.id"), nullable=False, index=True) |
|
|
|
|
|
descricao = Column(Text, nullable=False) |
|
|
responsavel = Column(String(120), nullable=True, index=True) |
|
|
prazo = Column(DateTime, nullable=True, index=True) |
|
|
|
|
|
status = Column(String(30), default="Planejada", nullable=False, index=True) |
|
|
eficacia = Column(String(30), nullable=True, index=True) |
|
|
conclusao_em = Column(DateTime, nullable=True, index=True) |
|
|
|
|
|
rnc = relationship("RNC", back_populates="acoes") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class RNCAnexo(Base): |
|
|
__tablename__ = "rnc_anexo" |
|
|
|
|
|
id = Column(Integer, primary_key=True, index=True) |
|
|
rnc_id = Column(Integer, ForeignKey("rnc.id"), nullable=False, index=True) |
|
|
|
|
|
nome_arquivo = Column(String(255), nullable=False) |
|
|
caminho = Column(String(500), nullable=False) |
|
|
conteudo_tipo = Column(String(120), nullable=True) |
|
|
|
|
|
enviado_por = Column(String(120), nullable=True, index=True) |
|
|
enviado_em = Column(DateTime, default=datetime.utcnow, index=True) |
|
|
|
|
|
rnc = relationship("RNC", back_populates="anexos") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AvisoGlobal(Base): |
|
|
__tablename__ = "aviso_global" |
|
|
|
|
|
id = Column(Integer, primary_key=True, index=True) |
|
|
mensagem = Column(Text, nullable=False) |
|
|
|
|
|
|
|
|
bg_color = Column(String(32), default="#FFF3CD") |
|
|
text_color = Column(String(32), default="#664D03") |
|
|
largura = Column(String(16), default="100%") |
|
|
efeito = Column(String(16), default="marquee") |
|
|
velocidade = Column(Integer, default=20) |
|
|
font_size = Column(Integer, default=14) |
|
|
|
|
|
|
|
|
ativo = Column(Boolean, default=True, index=True) |
|
|
|
|
|
|
|
|
created_at = Column(DateTime(timezone=True), server_default=func.now()) |
|
|
updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now()) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class RecebimentoRegistro(Base): |
|
|
__tablename__ = "recebimento_registros" |
|
|
|
|
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True, index=True) |
|
|
id_planilha = Column(Integer, nullable=True, index=True, unique=True) |
|
|
|
|
|
|
|
|
data = Column(Date, nullable=True) |
|
|
data_emissao = Column(Date, nullable=True) |
|
|
|
|
|
|
|
|
hora_chegada_portaria = Column(String(8), nullable=True) |
|
|
hora_chegada_ifs = Column(String(8), nullable=True) |
|
|
hora_saida_ifs_wms = Column(String(8), nullable=True) |
|
|
hora_liberacao_operacao = Column(String(8), nullable=True) |
|
|
hora_chegada_operacao = Column(String(8), nullable=True) |
|
|
hora_saida_operacao = Column(String(8), nullable=True) |
|
|
hora_retorno_operacao = Column(String(8), nullable=True) |
|
|
hora_liberacao_motorista = Column(String(8), nullable=True) |
|
|
|
|
|
|
|
|
placa_veiculo = Column(String(50), nullable=True) |
|
|
transportadora = Column(String(255), nullable=True) |
|
|
po = Column(String(60), nullable=True) |
|
|
incoterms = Column(String(30), nullable=True) |
|
|
qtd_sku = Column(Integer, nullable=True) |
|
|
nota_fiscal = Column(String(80), nullable=True) |
|
|
fornecedor = Column(String(255), nullable=True) |
|
|
|
|
|
|
|
|
quimicos = Column(Boolean, nullable=True) |
|
|
fds = Column(Boolean, nullable=True) |
|
|
repetro = Column(Boolean, nullable=True) |
|
|
aprovado = Column(Boolean, nullable=True) |
|
|
|
|
|
|
|
|
natureza_operacao = Column(String(120), nullable=True) |
|
|
tipo_operacao = Column(String(120), nullable=True) |
|
|
barco = Column(String(80), nullable=True) |
|
|
|
|
|
|
|
|
divergencia = Column(String(200), nullable=True) |
|
|
|
|
|
ifs = Column(String(120), nullable=True) |
|
|
wms = Column(String(120), nullable=True) |
|
|
fotografia = Column(String(255), nullable=True) |
|
|
entrega = Column(String(120), nullable=True) |
|
|
projeto = Column(String(120), nullable=True) |
|
|
good_receipt = Column(String(120), nullable=True) |
|
|
divergencia_recebimento = Column(String(255), nullable=True) |
|
|
qualidade = Column(String(120), nullable=True) |
|
|
divergencia_qualidade = Column(String(255), nullable=True) |
|
|
observacao = Column(Text, nullable=True) |
|
|
agendamento = Column(String(120), nullable=True) |
|
|
responsavel = Column(String(120), nullable=True) |
|
|
|
|
|
|
|
|
po_alt = Column(String(60), nullable=True) |
|
|
pn = Column(String(120), nullable=True) |
|
|
lot_batch = Column(String(120), nullable=True) |
|
|
|
|
|
|
|
|
created_by = Column(String(150), nullable=True) |
|
|
updated_by = Column(String(150), nullable=True) |
|
|
created_at = Column(DateTime, default=datetime.utcnow) |
|
|
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) |