Compare ICA 66-31 with cycle report

This commit is contained in:
Cesa-V
2026-06-15 18:34:45 -03:00
parent d2bf2883d7
commit 32ad7c9f23
5 changed files with 233 additions and 0 deletions

1
LOG.md
View File

@@ -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. |

View File

@@ -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
1 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
2 PRE VOO somente_ica PRÉ VOO Base 1 H 1 Não encontrada no relatório de ciclo
3 TRANSITO somente_ica TRÂNSITO Base 1 H 1 Não encontrada no relatório de ciclo
4 DIARIA somente_ica DIÁRIA Base 1 H 1 Não encontrada no relatório de ciclo
5 SERV 72H somente_ica SERV 72H Base 72 4 H 16 Não encontrada no relatório de ciclo
6 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
7 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
8 OPERACIONAL 600FH somente_ica OPERACIONAL 600FH Base 600 1 D 14 Não encontrada no relatório de ciclo
9 CHECK 1A compatível CHECK 1A INSPEÇÃO CHECK 1A Base Base 300 300 8 8 3 D 3 D 16 2
10 CHECK 2A compatível CHECK 2A INSPEÇÃO CHECK 2A Base Base 600 600 16 16 4 D 4 D 28 3
11 CHECK 3A compatível CHECK 3A INSPEÇÃO CHECK 3A Base Base 900 900 24 24 5 D 5 D 76 4
12 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
13 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
14 CALENDARICA 2Y compatível CALENDÁRICA 2Y INSPEÇÃO CALENDÁRICA DE 2 YEARS Base Base 24 24 5 D 5 D 30 5
15 CALENDARICA 4Y compatível CALENDÁRICA 4Y INSPEÇÃO CALENDÁRICA DE 4 YEARS Parque Parque 48 48 10 D 10 D 123 17
16 CALENDARICA 8Y compatível CALENDÁRICA 8Y INSPEÇÃO CALENDÁRICA DE 8 YEARS Parque Parque 96 96 20 D 20 D 336 14
17 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
18 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
19 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
20 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
21 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
22 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
23 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
24 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

View File

@@ -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`

View File

@@ -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()

BIN
raw/ICA 66-31 2023.pdf Normal file

Binary file not shown.