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) """ )