Gestion de médicaments

Programmation d'applications complexes
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Gestion de médicaments

Message par Micoute »

Bonjour à tous, conscient qu'avec l'âge, on est fatalement obligé de se soigner et que plus on est vieux et plus on en prend, j'ai donc fabriqué ce logiciel de gestion de médicaments et si ça vous intéresse, je vous l'offre gracieusement, je remercie tout particulièrement Ar-s qui m'a donné l'idée de la structure et de falsam qui a construit le squelette de ce programme pour un tout autre usage.

Code : Tout sélectionner


Enumeration Fichiers
  #FichierJSON
EndEnumeration

Enumeration Fenetres
  #Fenetre_principale
EndEnumeration

Enumeration Gadgets
  #Nom
  #Dosage
  #Unite
  #Matin
  #Midi
  #Soir
  #QteParBoite
  #DteDeb
  #DteFin  
  #QteJour
  #QteMois
  #BtesMois
  #DoseJour
  #DoseMois
  #FinStock
  
  #ListeMedicaments
  
  #Btn_Nouveau
  #Btn_Maj
  #Btn_Supprimer
  #Btn_Quitter
EndEnumeration

;-Structure
Structure Med
  Nom.s             ;Nom du médicament
  DoseUnite.f       ;Dosage médicament
  Unite.s           ;Unité de dosage
                    ;Conditionnement.s ;Comprimés ou autre
  QteMat.f          ;Quantité matin
  QteMid.f          ;Quantité midi
  QteSoir.f         ;Quantité soir
  QteParBoite.i     ;Nombre par boite
  DebutTraitement.s ;Date début du traitement
  FinTraitement.s   ;Date fin du traitement
  Qtejour.f         ;Qte journalière
  Qtemois.f         ;Qte mensuelle  
  Dosejour.f        ;Nombre par jour
  Dosemois.f        ;Nombre par mois
  NbBoites.i        ;Nombre de boites
  FinStock.s        ;Date fin de stock
EndStructure

Global NewList Medicaments.Med()
Global FichierJSON$ = "GESMED JSON V1. JSON"

Declare Ouvrir_Fenetre_principale()
Declare ChargerMedicaments()
Declare GestionEvenements()
Declare NouveauMedicament()
Declare SelectionMedicament()
Declare SupprimerMedicament()
Declare MajMedicaments()
Declare SauvegardeMedicaments()
Declare Quitter()

Ouvrir_Fenetre_principale()

Procedure Ouvrir_Fenetre_principale()
  If OpenWindow(#Fenetre_principale, 425, 186, 1070, 680, "GESMED JSON V1 avec sauvegarde automatique Micoute 23/05/2016", #PB_Window_SystemMenu|#PB_Window_TitleBar|#PB_Window_ScreenCentered)
    StringGadget(#Nom, 5, 5, 145, 30, "")
    StringGadget(#Dosage, 155, 5, 50, 30, "")
    StringGadget(#Unite, 210, 5, 45, 30, "")
    StringGadget(#Matin, 260, 5, 35, 30, "")
    StringGadget(#Midi, 300, 5, 35, 30, "")
    StringGadget(#Soir, 340, 5, 35, 30, "")    
    StringGadget(#QteParBoite, 380, 5, 40, 30, "")
    DateGadget(#DteDeb, 425, 5, 150, 30)
    StringGadget(#DteFin, 580, 5, 96, 30, "")
    StringGadget(#BtesMois, 775, 5, 70, 30, "")
    StringGadget(#QteJour, 680, 5, 40, 30, "")
    StringGadget(#QteMois, 725, 5, 45, 30, "")
    StringGadget(#DoseJour, 850, 5, 50, 30, "")
    StringGadget(#DoseMois, 905, 5, 60, 30, "")
    StringGadget(#FinStock, 970, 5, 96, 30, "")
    ListIconGadget(#ListeMedicaments, 5, 40, 1060, 560, "Nom", 145, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
    AddGadgetColumn(#ListeMedicaments, 1, "Dosage", 60)
    AddGadgetColumn(#ListeMedicaments, 2, "Unité", 40)
    AddGadgetColumn(#ListeMedicaments, 3, "Matin", 40)
    AddGadgetColumn(#ListeMedicaments, 4, "Midi", 40)
    AddGadgetColumn(#ListeMedicaments, 5, "Soir", 40)
    AddGadgetColumn(#ListeMedicaments, 6, "Qte/b", 50)
    AddGadgetColumn(#ListeMedicaments, 7, "Date début", 155)
    AddGadgetColumn(#ListeMedicaments, 8, "Date fin", 105)
    AddGadgetColumn(#ListeMedicaments, 9, "Qte/J", 45)
    AddGadgetColumn(#ListeMedicaments, 10, "Qte/M", 45)
    AddGadgetColumn(#ListeMedicaments, 11, "Btes/M", 75)
    AddGadgetColumn(#ListeMedicaments, 12, "Dose/J", 55)
    AddGadgetColumn(#ListeMedicaments, 13, "Dose/M", 65)
    AddGadgetColumn(#ListeMedicaments, 14, "Fin stock", 100)
    ButtonGadget(#Btn_Nouveau, 10, 620, 140, 40, "Nouveau")
    ButtonGadget(#Btn_Maj, 330, 620, 140, 40, "Ajouter")
    ButtonGadget(#Btn_Supprimer, 635, 620, 140, 40, "Supprimer", #PB_Button_Toggle)
    ButtonGadget(#Btn_Quitter, 840, 620, 220, 40, "Quitter sans sauvegarder")
    For i = #DteFin To #FinStock
      DisableGadget(i, 1)
    Next i  
    ; Polices    
    For i = #Btn_Nouveau To #Btn_Quitter
      SetGadgetFont(i, FontID(LoadFont(#PB_Any, "FontAwesome", 16, #PB_Font_Bold|#PB_Font_HighQuality)))
    Next i
    
    For i = #Nom To #FinStock
      SetGadgetFont(i, FontID(LoadFont(#PB_Any, "FontAwesome", 16, #PB_Font_Bold|#PB_Font_HighQuality)))
    Next i
    
    ;Contrôle de la saisie (le nom est obligatoire)
    BindGadgetEvent(#nom, @GestionEvenements())
    ;Mise en place d'un nouveau médicament
    BindGadgetEvent(#Btn_Nouveau, @NouveauMedicament())
    ;Un médicament est sélectionné dans la liste
    BindGadgetEvent(#ListeMedicaments, @SelectionMedicament())
    ;Ajout ou modification d'un médicament
    BindGadgetEvent(#Btn_Maj, @MajMedicaments())
    ;Suppression d'un médicament
    BindGadgetEvent(#Btn_Supprimer, @SupprimerMedicament())
    ;Fermeture de l'application et sauvegarde des médicaments
    BindEvent(#PB_Event_CloseWindow, @SauvegardeMedicaments())
    BindGadgetEvent(#Btn_Quitter, @Quitter())
    ;Lecture des médicaments
    ChargerMedicaments()
    ;L'application est prête pour la saisie d'un médicament
    NouveauMedicament()
    
    Repeat
    Until WaitWindowEvent(10) = #PB_Event_CloseWindow
  EndIf
EndProcedure

Procedure Quitter()
  CloseWindow(#Fenetre_principale)
  End
EndProcedure
;Chargement des médicaments enregistrés
Procedure ChargerMedicaments()
  If ReadFile(#FichierJSON, FichierJSON$)
    CloseFile(#FichierJSON)
    
    ;Lecture du fichier JSON
    LoadJSON(#FichierJSON, FichierJSON$, #PB_JSON_NoCase)
    
    ;Extraction de la chaine JSON vers la liste de médicaments
    ExtractJSONList(JSONValue(#FichierJSON), Medicaments())
    
    ;Affichage de la liste des médicaments
    ForEach Medicaments()
      With Medicaments()
        AddGadgetItem(#ListeMedicaments, -1, \Nom+#LF$+\DoseUnite+#LF$+\Unite+#LF$+\QteMat+#LF$+\QteMid+#LF$+\QteSoir+#LF$+\QteParBoite+#LF$+\DebutTraitement+#LF$+
                                             \FinTraitement+#LF$+\QteJour+#LF$+\QteMois+#LF$+\NbBoites+#LF$+\DoseJour+#LF$+\DoseMois+#LF$+\FinStock)
        SetGadgetItemData(#ListeMedicaments, CountGadgetItems(#ListeMedicaments)-1, ListIndex(Medicaments()))
      EndWith
    Next
  EndIf  
EndProcedure

;Gestionnaire de contrôle de la saisie
Procedure GestionEvenements()
  Protected Evenement = EventType()
  
  Select Evenement
    Case #PB_EventType_Change
      If Trim(GetGadgetText(#Nom)) <> ""
        DisableGadget(#Btn_Nouveau, #False)
        DisableGadget(#Btn_Maj, #False)
      Else
        DisableGadget(#Btn_Nouveau, #True)
        DisableGadget(#Btn_Maj, #True)
      EndIf
  EndSelect  
EndProcedure

;Nouveau médicament (Raz des champs de saisie)
Procedure NouveauMedicament()
  SetWindowData(#Fenetre_principale, 0) ;C'est une création
  
  SetGadgetText(#nom, "")
  SetGadgetText(#Dosage, "")
  SetGadgetText(#Unite, "")
  SetGadgetText(#Matin, "")
  SetGadgetText(#Midi, "")
  SetGadgetText(#Soir, "")
  SetGadgetText(#QteParBoite, "")
  SetGadgetText(#DteDeb, "")
  SetGadgetText(#DteFin, "")  
  SetGadgetText(#QteJour, "")
  SetGadgetText(#QteMois, "")
  SetGadgetText(#DoseJour, "")
  SetGadgetText(#DoseMois, "")
  SetGadgetText(#BtesMois, "")
  SetGadgetText(#FinStock, "")
  
  DisableGadget(#Btn_Nouveau, #True)
  DisableGadget(#Btn_Maj, #True)
  DisableGadget(#Btn_Supprimer, #True)
  
  SetGadgetText(#Btn_Maj, "Ajouter")
  SetActiveGadget(#Nom)
EndProcedure

;Un médicament est sélectionné dans la liste
Procedure SelectionMedicament()
  Protected Item = GetGadgetState(#ListeMedicaments)
  
  If Item <> -1
    SelectElement(Medicaments(), GetGadgetItemData(#ListeMedicaments, Item))
    With Medicaments()
      SetGadgetText(#nom, \Nom)
      SetGadgetText(#Dosage, StrF(\DoseUnite))
      SetGadgetText(#Unite, \Unite)
      SetGadgetText(#Matin, StrF(\QteMat))
      SetGadgetText(#Midi, StrF(\QteMid))
      SetGadgetText(#Soir, StrF(\QteSoir))
      SetGadgetText(#QteParBoite, Str(\QteParBoite))
      SetGadgetText(#DteDeb, \DebutTraitement)
      SetGadgetText(#DteFin, \FinTraitement)      
      SetGadgetText(#QteJour, StrF(\Qtejour))
      SetGadgetText(#QteMois, StrF(\Qtemois))
      SetGadgetText(#DoseJour, StrF(\Dosejour))
      SetGadgetText(#DoseMois, StrF(\Dosemois))
      SetGadgetText(#BtesMois, Str(\NbBoites))
      SetGadgetText(#FinStock, \FinStock)
    EndWith
  EndIf
  
  ;C'est une modification de médicament
  SetWindowData(#Fenetre_principale, 1)
  
  DisableGadget(#Btn_Nouveau, #False)
  DisableGadget(#Btn_Maj, #False)
  DisableGadget(#Btn_Supprimer, #False)
  
  SetGadgetText(#Btn_Maj, "Modifier")
  SetActiveGadget(#Nom)
EndProcedure

;Suppression d'un médicament
Procedure SupprimerMedicament()
  If MessageRequester("Information", "Etes-vous sûr de vouloir supprimer un médicament ?" + #CRLF$ +
                                     "Cette action est irrémédiable !", #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
    SetWindowData(#Fenetre_principale, 3) ;C'est une suppression
    MajMedicaments()
  EndIf  
EndProcedure

;Gestionnaire de mise à jour des médicaments
Procedure MajMedicaments()
  Protected.s Nom = GetGadgetText(#Nom)
  Protected.f DoseUnite = ValF(GetGadgetText(#Dosage))
  Protected.s Unite = GetGadgetText(#Unite)
  Protected.f QteMat = ValF(GetGadgetText(#Matin))
  Protected.f QteMid = ValF(GetGadgetText(#Midi))
  Protected.f QteSoir = ValF(GetGadgetText(#Soir))
  Protected.i QteParBoite = Val(GetGadgetText(#QteParBoite))
  Protected.s DebutTraitement = GetGadgetText(#DteDeb)
  Protected.s FinTraitement = FormatDate("%dd/%mm/%yyyy", AddDate(GetGadgetState(#DteDeb), #PB_Date_Day, 30))  
  Protected.f QteJour = QteMat + QteMid + QteSoir
  Protected.f QteMois = QteJour * 30
  Protected.f DoseJour = DoseUnite * QteJour
  Protected.f DoseMois = DoseJour * 30
  Protected.i NbBoites = Round(QteMois / QteParBoite, #PB_Round_Up)
  Protected.s FinStock = FormatDate("%dd/%mm/%yyyy",AddDate(GetGadgetState(#DteDeb), #PB_Date_Day, 30 + (NbBoites * QteParBoite) - QteMois))
  ;Debug "Début "+FormatDate("%dd/%mm/%yyyy",GetGadgetState(#DteDeb)) + " Fin " + FormatDate("%dd/%mm/%yyyy", AddDate(GetGadgetState(#DteDeb), #PB_Date_Day, 30)) + 
  ;      " Stock "+ FormatDate("%dd/%mm/%yyyy", AddDate(GetGadgetState(#DteDeb), #PB_Date_Day, 30 + (NbBoites * QteParBoite) - QteMois))
  ;Debug "Nbre boites " + NbBoites + " Qte/boite " + QteParBoite + " Qte/mois " + QteMois + " = " + Str((NbBoites * QteParBoite) - QteMois)

  Select GetWindowData(#Fenetre_principale)
    Case 0 ;Création d'un médicament
      AddElement(Medicaments())
      With Medicaments()
        \Nom = Nom
        \DoseUnite = DoseUnite
        \Unite = Unite
        \QteMat = QteMat
        \QteMid = QteMid
        \QteSoir = QteSoir
        \QteParBoite = QteParBoite
        \DebutTraitement = DebutTraitement
        \FinTraitement = FinTraitement        
        \Qtejour = QteJour
        \Qtemois = QteMois
        \Dosejour = DoseJour
        \Dosemois = DoseMois
        \NbBoites = NbBoites
        \FinStock = FinStock
        AddGadgetItem(#ListeMedicaments, -1, \Nom+#LF$+\DoseUnite+#LF$+\Unite+#LF$+\QteMat+#LF$+\QteMid+#LF$+\QteSoir+#LF$+\QteParBoite+#LF$+\DebutTraitement+#LF$+                                             
                                             \FinTraitement+#LF$+\QteJour+#LF$+\QteMois+#LF$+\NbBoites+#LF$+\DoseJour+#LF$+\DoseMois+#LF$+\FinStock)
        SetGadgetItemData(#ListeMedicaments, CountGadgetItems(#ListeMedicaments)-1, ListIndex(Medicaments()))
      EndWith
      
    Case 1 ;Modification d'un médicament
      With Medicaments()
        \Nom = Nom
        \DoseUnite = DoseUnite
        \Unite = Unite
        \QteMat = QteMat
        \QteMid = QteMid
        \QteSoir = QteSoir
        \QteParBoite = QteParBoite
        \DebutTraitement = DebutTraitement
        \FinTraitement = FinTraitement        
        \Qtejour = QteJour
        \Qtemois = QteMois
        \Dosejour = DoseJour
        \Dosemois = DoseMois
        \NbBoites = NbBoites
        \FinStock = FinStock
        SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), \Nom,0)
        SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), StrF(\DoseUnite),1)
        SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), \Unite,2)
        SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), StrF(\QteMat),3)
        SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), StrF(\QteMid),4)
        SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), StrF(\QteSoir),5)        
        SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), Str(\QteParBoite),6)
        SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), \DebutTraitement,7)
        SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), \FinTraitement,8)        
        SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), StrF(\Qtejour),9)
        SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), StrF(\Qtemois),10)
        SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), StrF(\Dosejour),11)
        SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), StrF(\Dosemois),12)
        SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), Str(\NbBoites),13)
        SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), \FinStock,14)
      EndWith
      NouveauMedicament()
      
    Case 3 ;Suppression d'un médicament
      RemoveGadgetItem(#ListeMedicaments, ListIndex(Medicaments()))
      DeleteElement(Medicaments())
      
      ;Mise à jour des index de liaison ListiconGadget <-> Medicaments()
      ForEach Medicaments()
        SetGadgetItemData(#ListeMedicaments, ListIndex(Medicaments()), ListIndex(Medicaments()))
      Next
      
  EndSelect  
  
EndProcedure

;Sauvegarde automatique des médicaments à la fermeture de l'application
Procedure SauvegardeMedicaments()
  
  ;Création d'un objet JSON
  CreateJSON(#FichierJSON)
  
  ;Insertion de la liste chainée "Medicaments" dans l'objet JSON
  InsertJSONList(JSONValue(#FichierJSON), Medicaments())
  
  ;Sauvegarde du fichier
  SaveJSON(#FichierJSON, FichierJSON$, #PB_JSON_PrettyPrint)
EndProcedure
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !