Gestion de médicaments
Publié : lun. 23/mai/2016 15:13
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