diff --git a/LOG.md b/LOG.md index 16b747f..37bf86a 100644 --- a/LOG.md +++ b/LOG.md @@ -20,3 +20,4 @@ Legenda de autores: | 2026-06-15 | 16:43 | VTO | Renomeou o projeto e trocou o repositório remoto | `README.md`; `CONTEXTO.md`; `.git/config` | Projeto passou a se chamar `arara_oarmp`; remoto atualizado para `https://git.ppgao.ita.br/vitorcesavc/arara_oarmp.git`. | | 2026-06-15 | 17:57 | VTO | Criou documentação técnica no padrão `docs/` | `docs/about.md`; `docs/authors.md`; `docs/changelog.md`; `README.md`; `CONTEXTO.md`; `LOG.md` | Estrutura inspirada no módulo `meteorologia_aeroportos`: documentação técnica, autoria e changelog separados do log operacional. | | 2026-06-15 | 18:11 | VTO | Agrupou artefatos do relatório de ciclo em subpasta própria | `pre_process/relatorio_ciclo_inspecoes_c105_2805_2026-06-15/`; `README.md`; `docs/about.md` | Removido `.gitkeep` de `pre_process/` porque a pasta deixou de estar vazia; `.gitkeep` de `processed/` foi mantido. | +| 2026-06-15 | 18:33 | VTO | Comparou ICA 66-31/2023 com relatório de ciclo C-105 2805 | `raw/ICA 66-31 2023.pdf`; `pre_process/comparacao_ica_66_31_c105_2023/` | A comparação usou o Anexo D textual do PDF completo da ICA. | diff --git a/pre_process/comparacao_ica_66_31_c105_2023/comparacao_ica_66_31_c105_2023_vs_relatorio_ciclo.csv b/pre_process/comparacao_ica_66_31_c105_2023/comparacao_ica_66_31_c105_2023_vs_relatorio_ciclo.csv new file mode 100644 index 0000000..bd04abb --- /dev/null +++ b/pre_process/comparacao_ica_66_31_c105_2023/comparacao_ica_66_31_c105_2023_vs_relatorio_ciclo.csv @@ -0,0 +1,24 @@ +chave;status;tipo_ica;tipo_relatorio;nivel_ica;nivel_relatorio;intervalo_horas_ica;intervalo_horas_relatorio;intervalo_meses_ica;intervalo_meses_relatorio;duracao_ica;duracao_relatorio;hxh_ica;seq_relatorio;observacoes +PRE VOO;somente_ica;PRÉ VOO;;Base;;;;;;1 H;;1;;Não encontrada no relatório de ciclo +TRANSITO;somente_ica;TRÂNSITO;;Base;;;;;;1 H;;1;;Não encontrada no relatório de ciclo +DIARIA;somente_ica;DIÁRIA;;Base;;;;;;1 H;;1;;Não encontrada no relatório de ciclo +SERV 72H;somente_ica;SERV 72H;;Base;;72;;;;4 H;;16;;Não encontrada no relatório de ciclo +OPERACIONAL 300FH;divergente;OPERACIONAL 300FH;CHECK OPERACIONAL DE 300FH;Base;Orgânico;300;300;;;1 D;6 H;14;6;"nível ICA=Base relatório=Orgânico; duração ICA=1 D relatório=6 H" +OPERACIONAL 400FH;divergente;OPERACIONAL 400FH;CHECK OPERACIONAL DE 400FH;Base;Orgânico;400;400;;;1 D;6 H;14;7;"nível ICA=Base relatório=Orgânico; duração ICA=1 D relatório=6 H" +OPERACIONAL 600FH;somente_ica;OPERACIONAL 600FH;;Base;;600;;;;1 D;;14;;Não encontrada no relatório de ciclo +CHECK 1A;compatível;CHECK 1A;INSPEÇÃO CHECK 1A;Base;Base;300;300;8;8;3 D;3 D;16;2; +CHECK 2A;compatível;CHECK 2A;INSPEÇÃO CHECK 2A;Base;Base;600;600;16;16;4 D;4 D;28;3; +CHECK 3A;compatível;CHECK 3A;INSPEÇÃO CHECK 3A;Base;Base;900;900;24;24;5 D;5 D;76;4; +CHECK 1C;divergente;CHECK 1C;INSPEÇÃO CHECK 1C;Base;Parque;2400;2400;48;48;65 D;65 D;526;15;nível ICA=Base relatório=Parque +CHECK 2C;divergente;CHECK 2C;INSPEÇÃO GERAL CHECK 2C;Base;Parque;4800;4800;96;96;5 D;10 D;17;16;"nível ICA=Base relatório=Parque; duração ICA=5 D relatório=10 D" +CALENDARICA 2Y;compatível;CALENDÁRICA 2Y;INSPEÇÃO CALENDÁRICA DE 2 YEARS;Base;Base;;;24;24;5 D;5 D;30;5; +CALENDARICA 4Y;compatível;CALENDÁRICA 4Y;INSPEÇÃO CALENDÁRICA DE 4 YEARS;Parque;Parque;;;48;48;10 D;10 D;123;17; +CALENDARICA 8Y;compatível;CALENDÁRICA 8Y;INSPEÇÃO CALENDÁRICA DE 8 YEARS;Parque;Parque;;;96;96;20 D;20 D;336;14; +;somente_relatorio;;INSPEÇÃO AOL 295-019;;Base;;;;;;1 D;;8;Não encontrada na tabela C/SC-105 da ICA 66-31/2023 usada nesta comparação +;somente_relatorio;;INSPEÇÃO AOL 295-019;;Base;;;;;;1 D;;9;Não encontrada na tabela C/SC-105 da ICA 66-31/2023 usada nesta comparação +;somente_relatorio;;INSPEÇÃO AOL 295-019;;Base;;;;;;1 D;;10;Não encontrada na tabela C/SC-105 da ICA 66-31/2023 usada nesta comparação +;somente_relatorio;;INSPEÇÃO DE 100 FH;;Orgânico;;100;;;;1 H;;18;Não encontrada na tabela C/SC-105 da ICA 66-31/2023 usada nesta comparação +;somente_relatorio;;INPEÇÃO 2400FH;;Orgânico;;2400;;;;3 H;;19;Não encontrada na tabela C/SC-105 da ICA 66-31/2023 usada nesta comparação +;somente_relatorio;;INSPEÇÃO 3000FH;;Base;;3000;;;;1 D;;20;Não encontrada na tabela C/SC-105 da ICA 66-31/2023 usada nesta comparação +;somente_relatorio;;INPEÇÃO 1000FH;;Base;;1000;;;;1 D;;22;Não encontrada na tabela C/SC-105 da ICA 66-31/2023 usada nesta comparação +;somente_relatorio;;INSPEÇÃO 50 FH;;Base;;50;;;;1 D;;23;Não encontrada na tabela C/SC-105 da ICA 66-31/2023 usada nesta comparação diff --git a/pre_process/comparacao_ica_66_31_c105_2023/comparacao_ica_66_31_c105_2023_vs_relatorio_ciclo.md b/pre_process/comparacao_ica_66_31_c105_2023/comparacao_ica_66_31_c105_2023_vs_relatorio_ciclo.md new file mode 100644 index 0000000..b720a25 --- /dev/null +++ b/pre_process/comparacao_ica_66_31_c105_2023/comparacao_ica_66_31_c105_2023_vs_relatorio_ciclo.md @@ -0,0 +1,26 @@ +# Comparação ICA 66-31/2023 x Relatório de Ciclo C-105 2805 + +Fonte ICA: `raw/ICA 66-31 2023.pdf`, Anexo D - Projeto C/SC-105. + +Observação: a comparação foi feita com o Anexo D textual do PDF completo da ICA. + +## Resumo + +- `compatível`: 6 +- `divergente`: 4 +- `somente_ica`: 5 +- `somente_relatorio`: 8 + +## Principais Achados + +- `CHECK 1A`, `CHECK 2A`, `CHECK 3A`, `CALENDÁRICA 2Y`, `CALENDÁRICA 4Y` e `CALENDÁRICA 8Y` estão compatíveis nos intervalos e durações. +- `CHECK 1C` bate em intervalo e duração, mas diverge no nível: ICA indica Base na tabela D.2, enquanto o relatório de ciclo indica Parque. +- `CHECK 2C` diverge em nível e duração: ICA indica Base e 5 D; relatório de ciclo indica Parque e 10 D. +- `OPERACIONAL 300FH` e `OPERACIONAL 400FH` batem no intervalo de horas, mas divergem em nível e duração: ICA indica Base e 1 D; relatório de ciclo indica Orgânico e 6 H. +- `OPERACIONAL 600FH`, `PRÉ VOO`, `TRÂNSITO`, `DIÁRIA` e `SERV 72H` aparecem na ICA, mas não apareceram no relatório de ciclo processado. +- Inspeções como AOL, 50FH, 100FH, 1000FH, 2400FH e 3000FH aparecem no relatório de ciclo, mas não na tabela C/SC-105 da ICA usada na comparação. + +## Arquivo Detalhado + +- `pre_process\comparacao_ica_66_31_c105_2023\comparacao_ica_66_31_c105_2023_vs_relatorio_ciclo.csv` + diff --git a/pre_process/comparacao_ica_66_31_c105_2023/comparar_ica_relatorio_ciclo.py b/pre_process/comparacao_ica_66_31_c105_2023/comparar_ica_relatorio_ciclo.py new file mode 100644 index 0000000..0e55312 --- /dev/null +++ b/pre_process/comparacao_ica_66_31_c105_2023/comparar_ica_relatorio_ciclo.py @@ -0,0 +1,182 @@ +import csv +import json +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[2] +RELATORIO_JSON = ( + ROOT + / "pre_process" + / "relatorio_ciclo_inspecoes_c105_2805_2026-06-15" + / "relatorio_ciclo_inspecoes_c105_2805_2026-06-15_inspecoes.json" +) +OUTPUT_DIR = Path(__file__).resolve().parent +CSV_PATH = OUTPUT_DIR / "comparacao_ica_66_31_c105_2023_vs_relatorio_ciclo.csv" +MD_PATH = OUTPUT_DIR / "comparacao_ica_66_31_c105_2023_vs_relatorio_ciclo.md" + + +ICA_C105 = [ + {"chave": "PRE VOO", "tipo_ica": "PRÉ VOO", "nivel_ica": "Base", "intervalo_horas_ica": "", "intervalo_meses_ica": "", "duracao_ica": "1 H", "hxh_ica": 1}, + {"chave": "TRANSITO", "tipo_ica": "TRÂNSITO", "nivel_ica": "Base", "intervalo_horas_ica": "", "intervalo_meses_ica": "", "duracao_ica": "1 H", "hxh_ica": 1}, + {"chave": "DIARIA", "tipo_ica": "DIÁRIA", "nivel_ica": "Base", "intervalo_horas_ica": "", "intervalo_meses_ica": "", "duracao_ica": "1 H", "hxh_ica": 1}, + {"chave": "SERV 72H", "tipo_ica": "SERV 72H", "nivel_ica": "Base", "intervalo_horas_ica": 72, "intervalo_meses_ica": "", "duracao_ica": "4 H", "hxh_ica": 16}, + {"chave": "OPERACIONAL 300FH", "tipo_ica": "OPERACIONAL 300FH", "nivel_ica": "Base", "intervalo_horas_ica": 300, "intervalo_meses_ica": "", "duracao_ica": "1 D", "hxh_ica": 14}, + {"chave": "OPERACIONAL 400FH", "tipo_ica": "OPERACIONAL 400FH", "nivel_ica": "Base", "intervalo_horas_ica": 400, "intervalo_meses_ica": "", "duracao_ica": "1 D", "hxh_ica": 14}, + {"chave": "OPERACIONAL 600FH", "tipo_ica": "OPERACIONAL 600FH", "nivel_ica": "Base", "intervalo_horas_ica": 600, "intervalo_meses_ica": "", "duracao_ica": "1 D", "hxh_ica": 14}, + {"chave": "CHECK 1A", "tipo_ica": "CHECK 1A", "nivel_ica": "Base", "intervalo_horas_ica": 300, "intervalo_meses_ica": 8, "duracao_ica": "3 D", "hxh_ica": 16}, + {"chave": "CHECK 2A", "tipo_ica": "CHECK 2A", "nivel_ica": "Base", "intervalo_horas_ica": 600, "intervalo_meses_ica": 16, "duracao_ica": "4 D", "hxh_ica": 28}, + {"chave": "CHECK 3A", "tipo_ica": "CHECK 3A", "nivel_ica": "Base", "intervalo_horas_ica": 900, "intervalo_meses_ica": 24, "duracao_ica": "5 D", "hxh_ica": 76}, + {"chave": "CHECK 1C", "tipo_ica": "CHECK 1C", "nivel_ica": "Base", "intervalo_horas_ica": 2400, "intervalo_meses_ica": 48, "duracao_ica": "65 D", "hxh_ica": 526}, + {"chave": "CHECK 2C", "tipo_ica": "CHECK 2C", "nivel_ica": "Base", "intervalo_horas_ica": 4800, "intervalo_meses_ica": 96, "duracao_ica": "5 D", "hxh_ica": 17}, + {"chave": "CALENDARICA 2Y", "tipo_ica": "CALENDÁRICA 2Y", "nivel_ica": "Base", "intervalo_horas_ica": "", "intervalo_meses_ica": 24, "duracao_ica": "5 D", "hxh_ica": 30}, + {"chave": "CALENDARICA 4Y", "tipo_ica": "CALENDÁRICA 4Y", "nivel_ica": "Parque", "intervalo_horas_ica": "", "intervalo_meses_ica": 48, "duracao_ica": "10 D", "hxh_ica": 123}, + {"chave": "CALENDARICA 8Y", "tipo_ica": "CALENDÁRICA 8Y", "nivel_ica": "Parque", "intervalo_horas_ica": "", "intervalo_meses_ica": 96, "duracao_ica": "20 D", "hxh_ica": 336}, +] + + +RELATORIO_KEYS = { + "CHECK 1A": "CHECK 1A", + "CHECK 2A": "CHECK 2A", + "CHECK 3A": "CHECK 3A", + "CHECK 1C": "CHECK 1C", + "CHECK 2C": "CHECK 2C", + "CALENDÁRICA DE 2 YEARS": "CALENDARICA 2Y", + "CALENDÁRICA DE 4 YEARS": "CALENDARICA 4Y", + "CALENDÁRICA DE 8 YEARS": "CALENDARICA 8Y", + "OPERACIONAL DE 300FH": "OPERACIONAL 300FH", + "OPERACIONAL DE 400FH": "OPERACIONAL 400FH", +} + + +def key_from_relatorio(row): + descricao = row["descricao_mnt"].upper() + for needle, key in RELATORIO_KEYS.items(): + if needle in descricao: + return key + return "" + + +def equal_or_blank(left, right): + return left == "" or right == "" or left == right + + +def compare_row(ica, rel): + if rel is None: + return "somente_ica", ["Não encontrada no relatório de ciclo"] + + issues = [] + if not equal_or_blank(ica["nivel_ica"], rel["nivel_descricao"]): + issues.append(f"nível ICA={ica['nivel_ica']} relatório={rel['nivel_descricao']}") + if not equal_or_blank(ica["intervalo_horas_ica"], rel["intervalo_horas_voo_valor"]): + issues.append(f"horas ICA={ica['intervalo_horas_ica']} relatório={rel['intervalo_horas_voo_valor']}") + if not equal_or_blank(ica["intervalo_meses_ica"], rel["intervalo_meses_continuos_valor"]): + issues.append(f"meses ICA={ica['intervalo_meses_ica']} relatório={rel['intervalo_meses_continuos_valor']}") + if not equal_or_blank(ica["duracao_ica"], rel["duracao"]): + issues.append(f"duração ICA={ica['duracao_ica']} relatório={rel['duracao']}") + + return ("divergente" if issues else "compatível"), issues + + +def main(): + payload = json.loads(RELATORIO_JSON.read_text(encoding="utf-8")) + relatorio_by_key = {} + relatorio_unmatched = [] + + for row in payload["inspecoes"]: + key = key_from_relatorio(row) + if key: + relatorio_by_key[key] = row + else: + relatorio_unmatched.append(row) + + rows = [] + for ica in ICA_C105: + rel = relatorio_by_key.get(ica["chave"]) + status, issues = compare_row(ica, rel) + rows.append( + { + "chave": ica["chave"], + "status": status, + "tipo_ica": ica["tipo_ica"], + "tipo_relatorio": rel["descricao_mnt"] if rel else "", + "nivel_ica": ica["nivel_ica"], + "nivel_relatorio": rel["nivel_descricao"] if rel else "", + "intervalo_horas_ica": ica["intervalo_horas_ica"], + "intervalo_horas_relatorio": rel["intervalo_horas_voo_valor"] if rel else "", + "intervalo_meses_ica": ica["intervalo_meses_ica"], + "intervalo_meses_relatorio": rel["intervalo_meses_continuos_valor"] if rel else "", + "duracao_ica": ica["duracao_ica"], + "duracao_relatorio": rel["duracao"] if rel else "", + "hxh_ica": ica["hxh_ica"], + "seq_relatorio": rel["seq"] if rel else "", + "observacoes": "; ".join(issues), + } + ) + + for rel in relatorio_unmatched: + rows.append( + { + "chave": "", + "status": "somente_relatorio", + "tipo_ica": "", + "tipo_relatorio": rel["descricao_mnt"], + "nivel_ica": "", + "nivel_relatorio": rel["nivel_descricao"], + "intervalo_horas_ica": "", + "intervalo_horas_relatorio": rel["intervalo_horas_voo_valor"], + "intervalo_meses_ica": "", + "intervalo_meses_relatorio": rel["intervalo_meses_continuos_valor"], + "duracao_ica": "", + "duracao_relatorio": rel["duracao"], + "hxh_ica": "", + "seq_relatorio": rel["seq"], + "observacoes": "Não encontrada na tabela C/SC-105 da ICA 66-31/2023 usada nesta comparação", + } + ) + + fields = list(rows[0].keys()) + with CSV_PATH.open("w", newline="", encoding="utf-8-sig") as csv_file: + writer = csv.DictWriter(csv_file, fieldnames=fields, delimiter=";") + writer.writeheader() + writer.writerows(rows) + + counts = {status: sum(1 for row in rows if row["status"] == status) for status in sorted({row["status"] for row in rows})} + lines = [ + "# Comparação ICA 66-31/2023 x Relatório de Ciclo C-105 2805", + "", + "Fonte ICA: `raw/ICA 66-31 2023.pdf`, Anexo D - Projeto C/SC-105.", + "", + "Observação: a comparação foi feita com o Anexo D textual do PDF completo da ICA.", + "", + "## Resumo", + "", + ] + for status, count in counts.items(): + lines.append(f"- `{status}`: {count}") + lines.extend( + [ + "", + "## Principais Achados", + "", + "- `CHECK 1A`, `CHECK 2A`, `CHECK 3A`, `CALENDÁRICA 2Y`, `CALENDÁRICA 4Y` e `CALENDÁRICA 8Y` estão compatíveis nos intervalos e durações.", + "- `CHECK 1C` bate em intervalo e duração, mas diverge no nível: ICA indica Base na tabela D.2, enquanto o relatório de ciclo indica Parque.", + "- `CHECK 2C` diverge em nível e duração: ICA indica Base e 5 D; relatório de ciclo indica Parque e 10 D.", + "- `OPERACIONAL 300FH` e `OPERACIONAL 400FH` batem no intervalo de horas, mas divergem em nível e duração: ICA indica Base e 1 D; relatório de ciclo indica Orgânico e 6 H.", + "- `OPERACIONAL 600FH`, `PRÉ VOO`, `TRÂNSITO`, `DIÁRIA` e `SERV 72H` aparecem na ICA, mas não apareceram no relatório de ciclo processado.", + "- Inspeções como AOL, 50FH, 100FH, 1000FH, 2400FH e 3000FH aparecem no relatório de ciclo, mas não na tabela C/SC-105 da ICA usada na comparação.", + "", + "## Arquivo Detalhado", + "", + f"- `{CSV_PATH.relative_to(ROOT)}`", + "", + ] + ) + MD_PATH.write_text("\n".join(lines) + "\n", encoding="utf-8") + + print(f"Gerado: {CSV_PATH.relative_to(ROOT)}") + print(f"Gerado: {MD_PATH.relative_to(ROOT)}") + print(counts) + + +if __name__ == "__main__": + main() diff --git a/raw/ICA 66-31 2023.pdf b/raw/ICA 66-31 2023.pdf new file mode 100644 index 0000000..6358c9a Binary files /dev/null and b/raw/ICA 66-31 2023.pdf differ