"""Sugestões documentais a partir das condições registradas nas avaliações.""" from functools import lru_cache import json from pathlib import Path from config.constants import METODO_COMPARATIVO, METODO_EVOLUTIVO def record(value): return value if isinstance(value, dict) else {} @lru_cache(maxsize=1) def catalogo_mesa(): path = Path(__file__).resolve().parents[2] / "config/mesa_redutores.json" return json.loads(path.read_text(encoding="utf-8"))["catalogo"] def positivo(value): try: return float(value) > 0 except (TypeError, ValueError): return False def motivos_da_avaliacao(item, evaluation, catalog=None): catalog = record(catalog) or catalogo_mesa() ajuste = record(record(evaluation).get("ajuste_territorial")) config = record(ajuste.get("configuracao")) or ajuste redutores = record(ajuste.get("redutores")) reasons = {} def add(description, alleged=False, confirmed=True): description = str(description or "").strip() if not description: return key = description.casefold() previous = reasons.get(key, {}) reasons[key] = {"descricao": description, "alegado": bool(alleged or previous.get("alegado")), "confirmado": bool(confirmed or previous.get("confirmado"))} for reason in item.get("motivos_desvalorizantes", []) if isinstance(item.get("motivos_desvalorizantes"), list) else []: if isinstance(reason, dict): add(reason.get("descricao"), reason.get("alegado", False), reason.get("confirmado", False)) def selected(group, codes, subkey="condicoes"): if not isinstance(codes, (list, tuple, set)): return for condition in record(catalog.get(group)).get(subkey, []): if condition.get("codigo") in codes: add(condition.get("rotulo")) conditions = record(record(config.get("art_88_i")).get("condicoes")) details = record(record(redutores.get("art_88")).get("condicoes_inciso_i")) for condition in record(catalog.get("art_88_i")).get("condicoes", []): code = condition["codigo"] values = record(conditions.get(code)) detail = record(details.get(code)) if any(positivo(value) for value in [values.get("percentual_area"), values.get("percentual_area_considerada"), values.get("percentual_area_bruta"), detail.get("percentual_area_informado")]): add(condition.get("rotulo")) selected("art_88_ii", record(config.get("art_88_ii")).get("selecionados", record(redutores.get("art_88")).get("selecionados_inciso_ii_informados", []))) selected("art_60_61", record(config.get("art_60_61")).get("selecionados", record(redutores.get("art_60_61")).get("selecionados", []))) topography = record(config.get("topografia")) or record(redutores.get("topografia")) for key in ("relevo", "nivel_rua"): selected("topografia", [topography.get(key)], key) water = record(config.get("agua")) or record(redutores.get("agua")) selected("agua", [water.get("situacao")]) apan = record(config.get("apan")) or record(redutores.get("apan")) if positivo(apan.get("percentual_area")): add("APAN") return list(reasons.values()) def sugestoes_documentais(rows, kind): reasons = {} for row in rows: for reason in row.get("motivos_desvalorizantes", []): key = reason["descricao"].casefold() previous = reasons.get(key, {}) reasons[key] = {**reason, "alegado": reason["alegado"] or previous.get("alegado", False), "confirmado": reason["confirmado"] or previous.get("confirmado", False)} return { "motivos_desvalorizantes": list(reasons.values()), "metodo_avaliacao": METODO_EVOLUTIVO if kind == "evolutivo" else METODO_COMPARATIVO, "modelo_avaliacao": ", ".join(dict.fromkeys(row["modelo"] for row in rows if row["modelo"])), }