teste_docs / backend /app /import_defaults.py
gui-sparim's picture
Publica gerador evolutivo e carrega modelos do repositório MESA
55d9355 verified
Raw History Blame Contribute Delete
4.04 kB
"""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"])),
}