CERCON / modules /submissao.py
carlosh10's picture
fix: Adiciona conteudo completo do modulo submissao.py SIAPI/CBMGO
d71a683 verified
"""
modules/submissao.py
Modulo de submissao assistida ao SIAPI/CBMGO
Sistema de Prevencao e Protecao contra Incendio - NT-01/2025
"""
import re
from datetime import datetime
class SubmissaoSIAPI:
"""
Assistente para preparacao de documentacao para submissao no SIAPI/CBMGO
"""
DOCUMENTOS_OBRIGATORIOS = [
"Memorial descritivo assinado (PPCI)",
"Planta baixa cotada (escala 1:100 ou 1:50)",
"Planta de situacao e localizacao",
"Corte transversal e longitudinal",
"ART ou RRT do responsavel tecnico",
"Requerimento padrao CBMGO",
"DARM quitado (taxa de vistoria)",
]
DOCUMENTOS_ESPECIAIS = {
"sprinkler": "Projeto hidraulico do sistema de sprinklers",
"hidrante": "Projeto do sistema de hidrantes e mangotinhos",
"alarme": "Projeto do sistema de deteccao e alarme",
"spda": "Projeto do SPDA (para-raios)",
"brigada": "Lista de brigadistas treinados (NBR 14276)",
}
def __init__(self, use_llm=False):
self.use_llm = use_llm
def validar_cpf(self, cpf):
cpf = re.sub(r"[^0-9]", "", cpf)
if len(cpf) != 11:
return False, "CPF deve ter 11 digitos"
if len(set(cpf)) == 1:
return False, "CPF invalido"
return True, "CPF valido"
def validar_registro(self, registro):
registro = registro.strip().upper()
if "CREA" in registro or "CAU" in registro:
return True, f"{registro} reconhecido"
return False, "Formato invalido. Use: CREA-GO 12345-D ou CAU A123456-0"
def determinar_documentos(self, area_m2, pavimentos, grupo):
docs = list(self.DOCUMENTOS_OBRIGATORIOS)
letra = grupo.split("-")[0] if "-" in grupo else grupo[0]
altura = pavimentos * 3.0
if area_m2 > 750 or pavimentos >= 3:
docs.append(self.DOCUMENTOS_ESPECIAIS["hidrante"])
if altura > 15 or area_m2 > 1000:
docs.append(self.DOCUMENTOS_ESPECIAIS["spda"])
if altura > 30 or (letra in ["H","I"] and area_m2 > 750):
docs.append(self.DOCUMENTOS_ESPECIAIS["sprinkler"])
if letra in ["E","B"] or area_m2 > 1500:
docs.append(self.DOCUMENTOS_ESPECIAIS["alarme"])
if area_m2 > 750:
docs.append(self.DOCUMENTOS_ESPECIAIS["brigada"])
return docs
def preparar_documentos(self, tipo_edificacao, area_m2, responsavel, cpf_responsavel, registro_profissional):
cpf_ok, cpf_msg = self.validar_cpf(cpf_responsavel)
reg_ok, reg_msg = self.validar_registro(registro_profissional)
tipo_lower = tipo_edificacao.lower()
if any(w in tipo_lower for w in ["casa","apto","apartamento"]):
grupo = "A-2" if "apart" in tipo_lower else "A-1"
elif any(w in tipo_lower for w in ["hotel","motel","pousada"]):
grupo = "B-1"
elif any(w in tipo_lower for w in ["hospital","clinica","ubs"]):
grupo = "E-1"
elif any(w in tipo_lower for w in ["escola","universidade","colegio"]):
grupo = "D-3"
elif any(w in tipo_lower for w in ["escritorio","banco","consultorio"]):
grupo = "F-1"
elif any(w in tipo_lower for w in ["comercio","loja","mercado","shopping"]):
grupo = "C-2" if area_m2 > 750 else "C-1"
elif any(w in tipo_lower for w in ["industria","fabrica"]):
grupo = "H-2"
elif any(w in tipo_lower for w in ["deposito","armazem","galpao"]):
grupo = "I-1"
else:
grupo = "F-1"
pavimentos = max(1, int(area_m2 / 300))
docs = self.determinar_documentos(area_m2, pavimentos, grupo)
docs_str = chr(10).join(" [ ] " + d for d in docs)
protocolo = f"CBMGO-{datetime.now().strftime('%Y%m%d')}-{abs(hash(tipo_edificacao)) % 10000:04d}"
return f"""PREPARACAO PARA SUBMISSAO SIAPI/CBMGO\n{"="*60}\nPROTOCOLO PROVISORIO: {protocolo}\nData: {datetime.now().strftime('%d/%m/%Y %H:%M')}\n\nDADOS DA EDIFICACAO:\n Tipo: {tipo_edificacao}\n Grupo NT-01/2025: {grupo}\n Area Total: {area_m2:.1f} m2\n\nRESPONSAVEL TECNICO:\n Nome: {responsavel}\n CPF: {cpf_msg}\n Registro: {reg_msg}\n\nDOCUMENTOS NECESSARIOS:\n{docs_str}\n\nCOMO SUBMETER NO SIAPI:\n 1. Acesse: https://siapi.goias.gov.br\n 2. Login com seu CPF\n 3. Novo Protocolo de Analise\n 4. Anexe documentos (PDF, max 10MB)\n 5. Pague DARM e confirme\n Prazo analise: 30 dias uteis\n\nCBMGO: www.bombeiros.go.gov.br | (62) 3201-5959\n{"="*60}"""