File size: 4,037 Bytes
55d9355
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
"""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"])),
    }