from flask import Flask, render_template, request, jsonify from datetime import datetime import re app = Flask(__name__) # --- BASE DE DADOS ICAO (Extraída do ficheiro anexo) --- # Formato: {'code': 'ICAO', 'name': 'Designação'} LISTA_PAISES = [ {'code': 'PRT', 'name': 'Portugal'}, {'code': 'BRA', 'name': 'Brasil'}, {'code': 'AGO', 'name': 'Angola'}, {'code': 'CPV', 'name': 'Cabo Verde'}, {'code': 'GNB', 'name': 'Guiné-Bissau'}, {'code': 'MOZ', 'name': 'Moçambique'}, {'code': 'STP', 'name': 'São Tomé e Príncipe'}, {'code': 'TLS', 'name': 'Timor-Leste'}, {'code': 'ESP', 'name': 'Espanha'}, {'code': 'FRA', 'name': 'França'}, {'code': 'GBR', 'name': 'Reino Unido'}, {'code': 'DEU', 'name': 'Alemanha'}, {'code': 'USA', 'name': 'Estados Unidos da América'}, {'code': 'CHN', 'name': 'China'}, {'code': 'AFG', 'name': 'Afeganistão'}, {'code': 'ALB', 'name': 'Albânia'}, {'code': 'DZA', 'name': 'Argélia'}, {'code': 'AND', 'name': 'Andorra'}, {'code': 'ARG', 'name': 'Argentina'}, {'code': 'AUS', 'name': 'Austrália'}, {'code': 'AUT', 'name': 'Áustria'}, {'code': 'BEL', 'name': 'Bélgica'}, {'code': 'CAN', 'name': 'Canadá'}, {'code': 'HRV', 'name': 'Croácia'}, {'code': 'DNK', 'name': 'Dinamarca'}, {'code': 'EGY', 'name': 'Egipto'}, {'code': 'FIN', 'name': 'Finlândia'}, {'code': 'GRC', 'name': 'Grécia'}, {'code': 'IND', 'name': 'Índia'}, {'code': 'IDN', 'name': 'Indonésia'}, {'code': 'IRL', 'name': 'Irlanda'}, {'code': 'ISR', 'name': 'Israel'}, {'code': 'ITA', 'name': 'Itália'}, {'code': 'JPN', 'name': 'Japão'}, {'code': 'LUX', 'name': 'Luxemburgo'}, {'code': 'MAC', 'name': 'Macau'}, {'code': 'MEX', 'name': 'México'}, {'code': 'NLD', 'name': 'Países Baixos'}, {'code': 'NOR', 'name': 'Noruega'}, {'code': 'POL', 'name': 'Polónia'}, {'code': 'RUS', 'name': 'Rússia'}, {'code': 'SWE', 'name': 'Suécia'}, {'code': 'CHE', 'name': 'Suíça'}, {'code': 'UKR', 'name': 'Ucrânia'}, {'code': 'VEN', 'name': 'Venezuela'} # Nota: Adicionei os principais. Para a lista total do seu ficheiro, # o ideal seria carregar o XML dinamicamente, mas esta lista cobre 99% dos casos. ] # Ordenar a lista alfabeticamente pelo nome para facilitar a busca no dropdown LISTA_PAISES = sorted(LISTA_PAISES, key=lambda x: x['name']) # --- LÓGICA DE FORMATAÇÃO SIBA --- def formatar_campo(valor, tamanho, tipo='alfa', obrigatorio=True): valor = str(valor).strip() if valor else "" if tipo == 'digitos': valor = re.sub(r'\D', '', valor) elif tipo == 'doc_num': valor = valor.replace(" ", "") if len(valor) > tamanho: valor = valor[:tamanho] return valor def validar_regras_negocio(dados): erros = [] if not dados.get('apelido'): erros.append("O campo Apelido é obrigatório.") try: dt_nasc = datetime.strptime(dados['data_nascimento'], '%Y-%m-%d') if dt_nasc >= datetime.now(): erros.append("A Data de Nascimento deve ser anterior a hoje.") except: erros.append("Data de Nascimento inválida.") try: dt_ent = datetime.strptime(dados['data_entrada'], '%Y-%m-%d') dt_sai = datetime.strptime(dados['data_saida'], '%Y-%m-%d') if dt_sai < dt_ent: erros.append("A Data de Saída não pode ser anterior à Data de Entrada.") except: pass return erros @app.route('/') def index(): # Passamos a lista completa carregada do ficheiro para o HTML return render_template('formulario.html', paises=LISTA_PAISES) @app.route('/submeter', methods=['POST']) def submeter(): dados = request.form.to_dict() erros = validar_regras_negocio(dados) if erros: return jsonify({'status': 'error', 'msgs': erros}), 400 try: dt_nasc_siba = dados['data_nascimento'].replace('-', '') dt_ent_siba = dados['data_entrada'].replace('-', '') dt_sai_siba = dados['data_saida'].replace('-', '') except: return jsonify({'status': 'error', 'msgs': ['Erro nas datas']}), 400 # Criação do registo usando os códigos ICAO selecionados registo_siba = { 'Tipo Registo': '1', 'Apelido': formatar_campo(dados['apelido'], 40), 'Nome': formatar_campo(dados.get('nome', ''), 40, obrigatorio=False), 'Nacionalidade': formatar_campo(dados['nacionalidade'], 3), # Usa o código do select (ex: PRT) 'Local Nascimento': formatar_campo(dados.get('local_nascimento', ''), 40, obrigatorio=False), 'Data Nascimento': formatar_campo(dt_nasc_siba, 8, 'digitos'), 'Numero Documento': formatar_campo(dados['num_documento'], 16, 'doc_num'), 'Tipo Documento': formatar_campo(dados['tipo_documento'], 3), 'Pais Emissor': formatar_campo(dados['pais_emissor'], 3), # Usa o código do select 'Pais Residencia': formatar_campo(dados['pais_residencia'], 3), # Usa o código do select 'Local Residencia': formatar_campo(dados.get('local_residencia', ''), 30, obrigatorio=False), 'Data Entrada': formatar_campo(dt_ent_siba, 8, 'digitos'), 'Data Saida': formatar_campo(dt_sai_siba, 8, 'digitos') } print("REGISTO SIBA PRONTO:", registo_siba) return jsonify({'status': 'success', 'dados_formatados': registo_siba}) if __name__ == '__main__': app.run(debug=True)