Files
dashboard-cpsp/backend/apps/operations/services/kpi_formulas.py
T

69 lines
2.0 KiB
Python

"""Pure KPI / FCR / EEF formula helpers (Excel-correct)."""
from __future__ import annotations
def compute_chicken_life(doc_in_count: int, mortality_total: int) -> int:
return max(int(doc_in_count) - int(mortality_total), 0)
def compute_chicken_life_percentage(doc_in_count: int, chicken_life: int) -> float:
if not doc_in_count:
return 0.0
return (chicken_life / doc_in_count) * 100.0
def compute_stock_akhir(chicken_life: int, harvest_total: int) -> int:
return max(int(chicken_life) - int(harvest_total), 0)
def compute_fcr(
feed_total: int | float,
stock_akhir: int,
iot_weight: float,
harvest_weight_total_g: float,
) -> float:
"""FCR = (feed_total * 50 * 1000) / (stock_akhir * iot_weight + harvest_weight_total_g)."""
denom = (stock_akhir * iot_weight) + harvest_weight_total_g
if denom <= 0:
return 0.0
return (feed_total * 50 * 1000) / denom
def compute_average_harvest_weight(
harvest_weight_total_g: float,
stock_akhir: int,
iot_weight: float,
harvest_total: int,
) -> float:
"""Excel live-blend: (hwt_g + stock*iot) / (harvest_total + stock)."""
denom = harvest_total + stock_akhir
if denom <= 0:
return 0.0
return (harvest_weight_total_g + stock_akhir * iot_weight) / denom
def compute_average_harvest_day(
harvest_age_sum: float,
age: int,
stock_akhir: int,
harvest_total: int,
) -> float:
"""Excel live-blend: (Σ(age*harvest) + age*stock) / (harvest_total + stock)."""
denom = harvest_total + stock_akhir
if denom <= 0:
return 0.0
return (harvest_age_sum + age * stock_akhir) / denom
def compute_eef(
life_pct: float,
average_harvest_weight_g: float,
average_harvest_day: float,
fcr: float,
) -> float:
"""EEF = life_pct * (avg_bw_g/1000) / (avg_day * fcr) * 100."""
if average_harvest_day <= 0 or fcr <= 0:
return 0.0
return life_pct * (average_harvest_weight_g / 1000.0) / (average_harvest_day * fcr) * 100.0