Suivi mensuel des effectifs

Bonjour,

Je cherche à effectuer un suivi de mes effectifs dans Grist, et je n’arrive pas à calculer mes totaux. J’ai

  • une table « Praticiens » (Nom, email…)
  • une table « Contrats » (Praticien = référence à la table Praticiens, Début = date, Fin = date)
    Je voudrais avoir pour chaque mois le nombre de praticiens ayant un contrat actif (Début < mois considéré ET Fin > mois considéré).

J’ai pensé faire une table de totaux avec une ligne par mois, et des colonnes calculées, dont le nombre de Praticien ayant un contrat actif, mais ça ne fonctionne pas.

1ère question : est-ce la bonne manière de faire ?
2ème question : si oui, comment faire ?
J’ai essayé de débuter avec Contrats.lookupRecords(Debut<$Debut) mais je comprends qu’on ne peut pas utiliser les opérateurs <> simplement dans un lookupRecords ?
Ensuite il faudra faire une boucle for j’imagine pour regarder pour chaque praticien s’il a un contrat actif, j’ai essayé des choses mais je n’y arrive pas.

debut = $Debut
contrats_actifs = [
    contrat for contrat in Contrats.all()
    if contrat.$Debut <= debut
]
praticiens_uniques = set(contrat.Praticien for contrat in contrats_actifs)
len(praticiens_uniques)

mais ça me dit que j’ai une erreur de syntaxe.
L’IA n’arrive pas à me fournir une formule qui fonctionne.

Est-ce que quelqu’un arriverait à me mettre sur la piste ?

J’ai réussi à calculer le nombre de praticien avec

contrats = Contrats.all
debut_mois = $Debut.replace(day=1)
praticiens_uniques = set()
contrats_actifs = [
  r for r in contrats if
  r.Debut and 
  r.Debut <= debut_mois and
  r.Fin and
  r.Fin > debut_mois
  ]

praticiens_uniques = set(contrat.Praticien for contrat in contrats_actifs)
  

len(praticiens_uniques)

Maintenant j’essaye de compter le nombre de médecins, de dentistes et de pharmaciens parmi ceux-ci mais je n’arrive pas à ajouter une condition portant sur une table différente. En plus, j’aurais aimé qu’en l’absence de date le contrat soit considéré comme actif.

Finalement j’arrive en bidouillant à trouver le nombre de médecins en faisant une intersection de deux ensembles :

contrats = Contrats.all
praticiens = Praticiens.all
debut_mois = $Debut.replace(day=1)
prat = set()
contrats_actifs = [
  r for r in contrats if
  r.Debut and 
  r.Debut <= debut_mois and
  r.Fin and
  r.Fin > debut_mois
  ]

prof = set([r for r in praticiens if r.Profession.Profession == "Médecin"])

prat = set(contrat.Praticien for contrat in contrats_actifs)

len(prat & prof)

Mais je n’ai pas l’impression que ce soir très propre comme code.
Ensuite je calcule les vacations consommées :

contrats = Contrats.all
praticiens = Praticiens.all
debut_mois = $Debut.replace(day=1)
vac_conso = [
  r.Vac for r in contrats if
  r.Debut and 
  r.Debut <= debut_mois and
  r.Fin and
  r.Fin > debut_mois
  ]
SUM(vac_conso)

Par contre je bloque encore sur le calcul des vacations consommées par profession. Ca doit se faire en combinant les codes précédents mais j’ai l’impression d’avoir de plus en plus une usine à gaz. Il n’y aurait pas moyen de faire ça plus proprement ?