Bonjour,
je bute depuis plusieurs semaines sur un algorithme permettant d'éditer une liste de médicaments à expédier.
2 types de pharmacie :
- pharmacie site
- pharmacie pays qui réapprovisionne les pharmacies site du pays
2 catégories de médicaments à réapprovisionner :
- placebo (P)
- médicament de l'étude (M)
objectif :
- permettre à une pharmacie pays d'éditer une liste de médicaments à expédier dans un site en se basant sur (1) un seuil défini pour le site dans une table de paramétrages et (2) les stocks actuellement disponibles sur le site
contraintes :
- toujours respecter l'équilibre 50/50 placebo/médicament de l'étude
- les pharmacies sont en 'aveugle' -> commande des quantité globales (médicament + placebo)
- on défini des quantités à commander calculées comme valeurs par défaut mais l'utilisateur peut modifier cette valeur
j'ai essayé de définir les différents cas de figures mais je m'y perd
une des difficultés est le fait que l'utilisateur est en aveugle et peut modifier la quantité calculée par défaut (il commande une quantité globale)
ci-dessous, la fonction que j'ai commencé à écrire
Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 # site : site a reapprovisionner # pays : pays du site à réapprovisionner # quantite : quantite demandee (peut être égale à la valeur par défaut calculée à partir des stocks disponibles sur site et du seuil de confort) def liste_medicaments_a_expedier(pays,site,quantite): # liste des médicaments à retourner medicaments = [] # seuil du site seuil = Parametrage.objects.get(asp_par_loc = site).asp_par_con # Medicaments disponibles sur le site a réapprovisionner medicament_disponible_site = [m.med_num for m in Medicament.objects.filter(Q(med_dru = 1) & Q(med_sit = site) & Q(med_eta=1))] placebo_disponible_site = [m.med_num for m in Medicament.objects.filter(Q(med_dru = 2) & Q(med_sit = site) & Q(med_eta=1))] # Medicaments disponibles dans le pays du site a réapprovisionner medicament_disponible_pays = [m.med_num for m in Medicament.objects.filter(Q(med_dru = 1) & Q(med_sit = pays) & Q(med_eta=1))] placebo_disponible_pays = [m.med_num for m in Medicament.objects.filter(Q(med_dru = 2) & Q(med_sit = pays) & Q(med_eta=1))] # quantités à commander calculées en fonction du seuil quantite_medicament_a_commander = seuil - len(medicament_disponible_site) quantite_placebo_a_commander = seuil - len(placebo_disponible_site) # si les stocks sont suffisants if quantite_medicament_a_commander<=len(medicament_disponible_pays) and quantite_placebo_a_commander<=len(placebo_disponible_pays): medicaments = medicament_disponible_pays[:int(quantite_medicament_a_commander)] + placebo_disponible_pays[:int(quantite_placebo_a_commander)] # si les stocks sont insuffisants -> nouveau calcul des quantités à expédier else: if len(medicament_disponible_pays) < len(placebo_disponible_pays): quantite_equilibre = len(medicament_disponible_pays) + len(medicament_disponible_site) elif len(medicament_disponible_pays) > len(placebo_disponible_pays): quantite_equilibre = len(placebo_disponible_pays) + len(placebo_disponible_site) else: quantite_equilibre = len(placebo_disponible_pays) + min(len(medicament_disponible_site),len(placebo_disponible_site)) medicaments = medicament_disponible_pays[:int(quantite_equilibre - len(medicament_disponible_site))] + placebo_disponible_pays[:int(quantite_equilibre - len(placebo_disponible_site))] return medicaments
Partager