42 lines
1.6 KiB
Python
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)
|