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