siprio / backend /app /database.py
gui-sparim's picture
Preserva historico do atendimento efetivo
f25bf29
Raw
History Blame Contribute Delete
5.32 kB
from __future__ import annotations
import os
import sqlite3
from contextlib import contextmanager
from pathlib import Path
from typing import Iterator
PROJECT_ROOT = Path(__file__).resolve().parents[2]
DATA_DIR = Path(os.getenv("PRIORIZACOES_DATA_DIR", PROJECT_ROOT / "data")).resolve()
UPLOAD_DIR = DATA_DIR / "uploads"
DB_PATH = DATA_DIR / "priorizacoes.db"
NEW_COLUMNS = {
"data_solicitacao_origem": "TEXT",
"data_registro_solicitacao": "TEXT",
"data_resposta_coordenacao": "TEXT",
"data_resposta_direcao_origem": "TEXT",
"data_informacao_conclusao_origem": "TEXT",
"data_registro_conclusao_siprio": "TEXT",
"prazo_informado": "TEXT",
"prazo_informado_anterior": "TEXT",
"data_atendimento": "TEXT",
"data_atendimento_anterior": "TEXT",
"equipes_participantes": "TEXT NOT NULL DEFAULT '[]'",
"primeira_equipe_indicada": "TEXT",
"prazo_epgv": "TEXT",
"prazo_esjl": "TEXT",
"prazo_eav": "TEXT",
"equipe_atual": "TEXT",
"retorno_epgv_pendente": "INTEGER NOT NULL DEFAULT 0",
"observacoes_direcao_final": "TEXT NOT NULL DEFAULT ''",
"justificativa_revisao_direcao": "TEXT NOT NULL DEFAULT ''",
"justificativa_atendimento_direcao": "TEXT NOT NULL DEFAULT ''",
"direcao_revisao_pendente": "INTEGER NOT NULL DEFAULT 0",
"direcao_conclusao_revisao_pendente": "INTEGER NOT NULL DEFAULT 0",
}
def ensure_storage() -> None:
DATA_DIR.mkdir(parents=True, exist_ok=True)
UPLOAD_DIR.mkdir(parents=True, exist_ok=True)
@contextmanager
def get_connection() -> Iterator[sqlite3.Connection]:
ensure_storage()
connection = sqlite3.connect(DB_PATH)
connection.row_factory = sqlite3.Row
try:
yield connection
connection.commit()
finally:
connection.close()
def init_db() -> None:
with get_connection() as connection:
connection.execute(
"""
CREATE TABLE IF NOT EXISTS processos (
id INTEGER PRIMARY KEY AUTOINCREMENT,
numero_processo TEXT NOT NULL UNIQUE,
origem_priorizacao TEXT NOT NULL,
arquivo_nome_original TEXT,
arquivo_nome_salvo TEXT,
arquivo_content_type TEXT,
data_previsao_conclusao TEXT,
observacoes_direcao TEXT NOT NULL DEFAULT '',
observacoes_coordenacao TEXT NOT NULL DEFAULT '',
criado_em TEXT NOT NULL,
atualizado_em TEXT NOT NULL
)
"""
)
existing_columns = {
row["name"]
for row in connection.execute("PRAGMA table_info(processos)").fetchall()
}
for column_name, column_type in NEW_COLUMNS.items():
if column_name not in existing_columns:
connection.execute(
f"ALTER TABLE processos ADD COLUMN {column_name} {column_type}"
)
connection.execute(
"""
CREATE INDEX IF NOT EXISTS idx_processos_atualizado_em
ON processos (atualizado_em DESC)
"""
)
connection.execute(
"""
CREATE TABLE IF NOT EXISTS fluxo_etapas (
id INTEGER PRIMARY KEY AUTOINCREMENT,
processo_id INTEGER NOT NULL,
ordem INTEGER NOT NULL,
equipe TEXT NOT NULL,
prazo TEXT,
data_resposta TEXT,
data_atendimento TEXT,
observacoes TEXT NOT NULL DEFAULT '',
proxima_equipe TEXT,
encerrado_fluxo INTEGER NOT NULL DEFAULT 0,
criado_em TEXT NOT NULL,
FOREIGN KEY (processo_id) REFERENCES processos (id) ON DELETE CASCADE
)
"""
)
existing_fluxo_columns = {
row["name"]
for row in connection.execute("PRAGMA table_info(fluxo_etapas)").fetchall()
}
if "data_atendimento" not in existing_fluxo_columns:
connection.execute("ALTER TABLE fluxo_etapas ADD COLUMN data_atendimento TEXT")
if "data_atendimento_anterior" not in existing_fluxo_columns:
connection.execute(
"ALTER TABLE fluxo_etapas ADD COLUMN data_atendimento_anterior TEXT"
)
if "prazo_anterior" not in existing_fluxo_columns:
connection.execute("ALTER TABLE fluxo_etapas ADD COLUMN prazo_anterior TEXT")
if "justificativa_revisao" not in existing_fluxo_columns:
connection.execute(
"ALTER TABLE fluxo_etapas ADD COLUMN justificativa_revisao TEXT NOT NULL DEFAULT ''"
)
if "justificativa_atendimento_revisao" not in existing_fluxo_columns:
connection.execute(
"ALTER TABLE fluxo_etapas ADD COLUMN justificativa_atendimento_revisao TEXT NOT NULL DEFAULT ''"
)
if "revisao_pendente" not in existing_fluxo_columns:
connection.execute(
"ALTER TABLE fluxo_etapas ADD COLUMN revisao_pendente INTEGER NOT NULL DEFAULT 0"
)
connection.execute(
"""
CREATE INDEX IF NOT EXISTS idx_fluxo_etapas_processo_ordem
ON fluxo_etapas (processo_id, ordem)
"""
)