"""% 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)