Skip to content
Extraits de code Groupes Projets
Valider 13cdb3cf rédigé par Stéphane - Enercoop's avatar Stéphane - Enercoop
Parcourir les fichiers

[FIX] un même compteur peut être présent dans deux groupes de priorité

parent 2ee8f07a
Aucune branche associée trouvée
Aucune étiquette associée trouvée
1 requête de fusion!2516.0 stephane
...@@ -24,7 +24,7 @@ def get_algo_description(algo): ...@@ -24,7 +24,7 @@ def get_algo_description(algo):
"dyn_perso_compute": "", "dyn_perso_compute": "",
} }
return desc.get(algo, f"Pas de descritpion associée a {algo}") return desc.get(algo, f"Pas de description associée a {algo}")
class AccOperation(models.Model): class AccOperation(models.Model):
...@@ -102,9 +102,7 @@ class AccOperation(models.Model): ...@@ -102,9 +102,7 @@ class AccOperation(models.Model):
def get_affect_sum(self, data_slot): def get_affect_sum(self, data_slot):
affect_sum = 0.0 affect_sum = 0.0
for counter in data_slot.get("affect"): for counter in data_slot.get("affect"):
affect_counter = data_slot.get("affect").get(counter) affect_sum += data_slot.get("affect").get(counter, 0)
if affect_counter:
affect_sum += affect_counter
return affect_sum return affect_sum
def generate(self): def generate(self):
...@@ -142,10 +140,10 @@ class AccOperation(models.Model): ...@@ -142,10 +140,10 @@ class AccOperation(models.Model):
item = data.get(slot) item = data.get(slot)
affect = item.get("affect") affect = item.get("affect")
if affect: if affect:
total_production = item.get("prod_initiale") total_prod = item.get("prod_initiale")
remaining_prod = item.get("prod_totale") remaining_prod = item.get("prod_totale")
affect_sum = self.get_affect_sum(item) affect_sum = self.get_affect_sum(item)
if abs(affect_sum + remaining_prod - total_production) > 1e-3: if abs(affect_sum + remaining_prod - total_prod) > 1e-3:
raise ValidationError( raise ValidationError(
_( _(
"Une erreur s'est produite lors de " "Une erreur s'est produite lors de "
...@@ -158,18 +156,18 @@ class AccOperation(models.Model): ...@@ -158,18 +156,18 @@ class AccOperation(models.Model):
item = data.get(slot) item = data.get(slot)
affect = item.get("affect") affect = item.get("affect")
if affect: if affect:
total_production = item.get("prod_initiale") total_prod = item.get("prod_initiale")
# calcul du pourcentage attribué à chaque # calcul du pourcentage attribué à chaque
# compteur par rapport à la production totale # compteur par rapport à la production totale
weights = {} weights = {}
for counter_id in affect: for counter_id in affect:
affecte_counter = affect.get(counter_id) affecte_counter = affect.get(counter_id)
if total_production == 0: if total_prod == 0:
weight = 0.0 weight = 0.0
else: else:
weight = ( weight = (
math.floor((affecte_counter * 100 / total_production) * 1e6) math.floor((affecte_counter * 100 / total_prod) * 1e6)
/ 1e6 / 1e6
) )
weights[counter_id] = weight weights[counter_id] = weight
......
...@@ -151,43 +151,40 @@ class AccPriorityGroup(models.Model): ...@@ -151,43 +151,40 @@ class AccPriorityGroup(models.Model):
return d return d
def get_conso_sum(self, data_slot): def get_conso_sum(self, data_slot):
conso = 0.0 conso_sum = 0.0
for counter in self.acc_priority_group_counter_ids.acc_counter_id.mapped( for counter in self.acc_priority_group_counter_ids.acc_counter_id.mapped(
"name" "name"
): ):
consok = data_slot.get("conso").get(counter) conso_sum += data_slot.get("conso").get(counter, 0)
if consok: return conso_sum
conso += consok
return conso
def _prorata(self, data): def _prorata(self, data):
for slot in data: for slot in data:
remaining_prod = data.get(slot).get("prod_totale") remaining_prod = data.get(slot).get("prod_totale")
priority_counters_conso_sum = self.get_conso_sum(data.get(slot)) total_conso = self.get_conso_sum(data.get(slot))
total_affecte = 0.0 total_affecte = 0.0
if not data.get(slot).get("affect"): if not data.get(slot).get("affect"):
data[slot]["affect"] = {} data[slot]["affect"] = {}
for counter in self.acc_priority_group_counter_ids.acc_counter_id: for counter in self.acc_priority_group_counter_ids.acc_counter_id:
# un compteur peut être présent dans deux groupes de priorité
already_affected = data.get(slot).get("affect").get(counter, 0)
conso_k = data.get(slot).get("conso").get(counter.name) conso_k = data.get(slot).get("conso").get(counter.name)
# si le compteur rentre en cours de periode il figure dans le # si le compteur rentre en cours de periode il figure dans le
# groupe de repartition mais pas dans les données brutes conso_k = None # groupe de repartition mais pas dans les données brutes conso_k = None
# dans ce cas on affecte 0 # dans ce cas on affecte 0
if ( if remaining_prod <= 0 or total_conso == 0 or conso_k is None:
remaining_prod < 0 newly_affected = 0
or priority_counters_conso_sum == 0 sum_affected = already_affected + 0.0
or conso_k is None
):
part_a_affecter = 0.0
else: else:
part_a_affecter = ( part_a_affecter = (remaining_prod * conso_k) / total_conso
remaining_prod * conso_k sum_affected = min(conso_k, (already_affected + part_a_affecter))
) / priority_counters_conso_sum newly_affected = sum_affected - already_affected
part_a_affecter = min(conso_k, part_a_affecter) data[slot]["affect"][counter] = sum_affected
data[slot]["affect"][counter] = part_a_affecter total_affecte += newly_affected
total_affecte += part_a_affecter
# on met à jour la prod restant à affecter
data[slot]["prod_totale"] = remaining_prod - total_affecte data[slot]["prod_totale"] = remaining_prod - total_affecte
# possiblement on peut avoir affecté plus que la p # possiblement on peut avoir affecté plus que la p
# roduction total_affecte=496.00000000000006 # roduction total_affecte=496.00000000000006
...@@ -203,19 +200,23 @@ class AccPriorityGroup(models.Model): ...@@ -203,19 +200,23 @@ class AccPriorityGroup(models.Model):
data[slot]["affect"] = {} data[slot]["affect"] = {}
for priority_group_counter in self.acc_priority_group_counter_ids: for priority_group_counter in self.acc_priority_group_counter_ids:
counter = priority_group_counter.acc_counter_id counter = priority_group_counter.acc_counter_id
already_affected = data.get(slot).get("affect").get(counter, 0)
counter_share = priority_group_counter.acc_counter_share counter_share = priority_group_counter.acc_counter_share
conso_k = data.get(slot).get("conso").get(counter.name) conso_k = data.get(slot).get("conso").get(counter.name)
if ( if (
remaining_prod < 0 remaining_prod <= 0
or total_share == 0 or total_share == 0
or conso_k is None or conso_k is None
or counter_share == 0 or counter_share == 0
): ):
part_a_affecter = 0.0 newly_affected = 0
sum_affected = already_affected + 0.0
else: else:
part_a_affecter = (remaining_prod * counter_share) / total_share part_a_affecter = (remaining_prod * counter_share) / total_share
part_a_affecter = min(conso_k, part_a_affecter) sum_affected = min(conso_k, (already_affected + part_a_affecter))
data[slot]["affect"][counter] = part_a_affecter newly_affected = sum_affected - already_affected
total_affecte += part_a_affecter
data[slot]["affect"][counter] = sum_affected
total_affecte += newly_affected
data[slot]["prod_totale"] = remaining_prod - total_affecte data[slot]["prod_totale"] = remaining_prod - total_affecte
return data return data
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter