Skip to content
Extraits de code Groupes Projets
Valider 6cf61b96 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 b91be7ca
Branches
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -24,7 +24,7 @@ def get_algo_description(algo):
"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):
......@@ -102,9 +102,7 @@ class AccOperation(models.Model):
def get_affect_sum(self, data_slot):
affect_sum = 0.0
for counter in data_slot.get("affect"):
affect_counter = data_slot.get("affect").get(counter)
if affect_counter:
affect_sum += affect_counter
affect_sum += data_slot.get("affect").get(counter, 0)
return affect_sum
def generate(self):
......@@ -141,10 +139,10 @@ class AccOperation(models.Model):
item = data.get(slot)
affect = item.get("affect")
if affect:
total_production = item.get("prod_initiale")
total_prod = item.get("prod_initiale")
remaining_prod = item.get("prod_totale")
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(
_(
"Une erreur s'est produite lors de l'affectation de l'auto-consommation"
......@@ -156,16 +154,18 @@ class AccOperation(models.Model):
item = data.get(slot)
affect = item.get("affect")
if affect:
total_production = item.get("prod_initiale")
total_prod = item.get("prod_initiale")
# calcul du pourcentage attribué à chaque compteur par rapport à la production totale
weights = {}
for counter_id in affect:
affecte_counter = affect.get(counter_id)
if total_production == 0:
if total_prod == 0:
weight = 0.0
else:
weight = math.floor((affecte_counter * 100 / total_production) * 1e+6) / 1e+6
weight = (
math.floor((affecte_counter * 100 / total_prod) * 1e6) / 1e6
)
weights[counter_id] = weight
slot_line = []
......
......@@ -151,43 +151,40 @@ class AccPriorityGroup(models.Model):
return d
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(
"name"
):
consok = data_slot.get("conso").get(counter)
if consok:
conso += consok
return conso
conso_sum += data_slot.get("conso").get(counter, 0)
return conso_sum
def _prorata(self, data):
for slot in data:
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
if not data.get(slot).get("affect"):
data[slot]["affect"] = {}
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)
# 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
# dans ce cas on affecte 0
if (
remaining_prod < 0
or priority_counters_conso_sum == 0
or conso_k is None
):
part_a_affecter = 0.0
if remaining_prod <= 0 or total_conso == 0 or conso_k is None:
newly_affected = 0
sum_affected = already_affected + 0.0
else:
part_a_affecter = (
remaining_prod * conso_k
) / priority_counters_conso_sum
part_a_affecter = min(conso_k, part_a_affecter)
data[slot]["affect"][counter] = part_a_affecter
total_affecte += part_a_affecter
part_a_affecter = (remaining_prod * conso_k) / total_conso
sum_affected = min(conso_k, (already_affected + part_a_affecter))
newly_affected = sum_affected - already_affected
data[slot]["affect"][counter] = sum_affected
total_affecte += newly_affected
# on met à jour la prod restant à affecter
data[slot]["prod_totale"] = remaining_prod - total_affecte
# possiblement on peut avoir affecté plus que la production total_affecte=496.00000000000006
......@@ -202,19 +199,23 @@ class AccPriorityGroup(models.Model):
data[slot]["affect"] = {}
for priority_group_counter in self.acc_priority_group_counter_ids:
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
conso_k = data.get(slot).get("conso").get(counter.name)
if (
remaining_prod < 0
remaining_prod <= 0
or total_share == 0
or conso_k is None
or counter_share == 0
):
part_a_affecter = 0.0
newly_affected = 0
sum_affected = already_affected + 0.0
else:
part_a_affecter = (remaining_prod * counter_share) / total_share
part_a_affecter = min(conso_k, part_a_affecter)
data[slot]["affect"][counter] = part_a_affecter
total_affecte += part_a_affecter
sum_affected = min(conso_k, (already_affected + part_a_affecter))
newly_affected = sum_affected - already_affected
data[slot]["affect"][counter] = sum_affected
total_affecte += newly_affected
data[slot]["prod_totale"] = remaining_prod - total_affecte
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