Compare ICA 66-31 with cycle report
This commit is contained in:
1
LOG.md
1
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 | 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 | 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: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. |
|
||||||
|
|||||||
@@ -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
|
||||||
|
@@ -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`
|
||||||
|
|
||||||
@@ -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
BIN
raw/ICA 66-31 2023.pdf
Normal file
Binary file not shown.
Reference in New Issue
Block a user