69 lines
2.0 KiB
Python
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
|