Spaces:
Sleeping
Sleeping
| 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) | |
| 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) | |
| """ | |
| ) | |