portal_publico/portal_api/indicadores/entregas.py

42 lines
1.6 KiB
Python

"""% de entregas no prazo de um responsável, pro cálculo automático dos 3
critérios individuais (Balancete/Liberação Fiscal/Conciliação Financeira) —
replica a lógica da aba "5-RESULTADO META" da planilha antiga."""
from __future__ import annotations
from dataclasses import dataclass
from decimal import Decimal
from .leiaute import STATUS_CANCELADO, LinhaTareffa
@dataclass
class PercentualEntrega:
total: int
atrasados: int
em_branco: int
percentual: Decimal | None # None quando total == 0 (responsável não presta esse serviço)
def calcula_percentual_entrega(linhas: list[LinhaTareffa], responsavel: str, servicos: set[str]) -> PercentualEntrega:
"""Atrasado = entregue depois da data meta; em branco = ainda sem data de
entrega (serviço aberto). `percentual = (total - atrasados - em_branco) / total`."""
relevantes = [
linha
for linha in linhas
if linha.responsavel == responsavel and linha.servico in servicos and linha.status != STATUS_CANCELADO
]
total = len(relevantes)
if total == 0:
return PercentualEntrega(total=0, atrasados=0, em_branco=0, percentual=None)
em_branco = sum(1 for linha in relevantes if linha.data_entrega is None)
atrasados = sum(
1
for linha in relevantes
if linha.data_entrega is not None and linha.data_meta is not None and linha.data_entrega > linha.data_meta
)
no_prazo = total - atrasados - em_branco
percentual = (Decimal(no_prazo) / Decimal(total)) * Decimal(100)
return PercentualEntrega(total=total, atrasados=atrasados, em_branco=em_branco, percentual=percentual)