Page 1 sur 1

Medocostock - Gestion de prise de médicament

Publié : ven. 21/févr./2025 12:31
par Ar-S
Voilà Medocostock
Suite au topic de Micoute ici : viewtopic.php?t=19320
J'ai fait un petit gestionnaire autonome de prise de médicaments et de stock.

Démo vidéo ici : https://www.youtube.com/shorts/BcmbRaJQnIk

V1
- Ajout de médicament
- Modification d'un médicament existant
- Suppression d'un médicament
- Bouton "Prise de médicament" qui va gérer le nouveau stock

Tout Fonctionne avec un simple fichier pref donc le logiciel et portable

ça faisait un moment que j'avais pas fais de PB ça fait plaisir.
EnJoYeZ

Code : Tout sélectionner

; Medocostock - Gestion de stock de médicaments
; Codé par Ar-S // LDV MULTIMEDIA - feb 2025
; V1.0
;GNU GENERAL PUBLIC LICENSE Version 3
;Copyright (C) 2025 LDVMULTIMEDIA
;Ce programme est un logiciel libre : vous pouvez le redistribuer et/ou le modifier selon les termes de la GNU General Public License publiée par la Free Software Foundation,
;soit la version 3 de la licence, soit (à votre choix) toute version ultérieure.
;Ce programme est distribué dans l'espoir qu'il sera utile, mais sans aucune garantie, sans même la garantie implicite de commercialisation ou d'adéquation à un besoin particulier.
;Consultez la GNU General Public License pour plus de détails. (voir https://www.gnu.org/licenses/)


;  ============================================================================
;-   =========================== INITIALISATION =============================
;  ============================================================================

Enumeration 
  #LDVMULTIMEDIA
  #FRAME_EDIT
  #STRING_NOM
  #STRING_STOCK
  #STRING_NPP
  #TEXT_NOM
  #TEXT_NPP
  #TEXT_STOCK
  #BUTTON_AJOUTER
  #BUTTON_SUPPRIMER
  #BUTTON_MODIFIER
  #LIST_MEDOCS
  #BUTTON_PRISE
  #STRING_INFO
  #T
EndEnumeration


Structure medocinfo
  Nom.s
  NombreParPrise.i
  NombreEnStock.i
EndStructure

Global NewList medoc.medocinfo()
Global Pref$ = GetCurrentDirectory()+"medoc.pref"
Global.i NbrDeMedocDifferents
; Taille ide
Global L = 400 ,H = 625, Lframe1 = L-20
Global NOM$, NPP$, STOCK$
Global message$ = "Bienvenue sur Medocostock"
Global G,UP ; Gestion pour le timer

Declare.s Message(MessageInfo.s)
Declare LirePref(FichierPref.s)
Declare InitPref(FichierPref.s)   
Declare SauvePref(FichierPref.s)
Declare UpdatePref(FichierPref.s)
Declare RefreshList()

;  ============================================================================
;-   ============================ PROCEDURES ===============================
;  ============================================================================

Procedure.s Message(MessageInfo.s)
  SetGadgetText(#STRING_INFO,MessageInfo)  
EndProcedure


Procedure LirePref(FichierPref.s)
  ; Chargement des préférences
  Protected preference
  ResetList(medoc())
  preference =  OpenPreferences(Pref$)
  ExaminePreferenceGroups()
  While NextPreferenceGroup() ; Tant qu'il existe un groupe à afficher
    AddElement(medoc())
    With medoc()
      \Nom = PreferenceGroupName()
      \NombreParPrise = ReadPreferenceLong ("NPP", 0)
      \NombreEnStock  = ReadPreferenceLong ("TOTAL", 0)
    EndWith 
  Wend
  ClosePreferences()
  ProcedureReturn preference  
EndProcedure


Procedure InitPref(FichierPref.s)   
  ; Création d'un fichier pref vide
  Protected preference  
  If FileSize(FichierPref.s) = -1
    CreatePreferences(FichierPref.s)
    ClosePreferences()
  Else
    preference = LirePref(Pref$)
  EndIf
EndProcedure


Procedure SauvePref(FichierPref.s)
  ; Sauvegarde des préférences
  Protected preference
  SortStructuredList(medoc(), #PB_Sort_Ascending, OffsetOf(medocinfo\Nom),TypeOf(medocinfo\Nom))
  CreatePreferences(FichierPref.s)
  ForEach medoc()
    PreferenceGroup(medoc()\Nom)
    WritePreferenceLong("NPP",medoc()\NombreParPrise)
    WritePreferenceLong("TOTAL",medoc()\NombreEnStock)
  Next
  ClosePreferences()
EndProcedure


Procedure UpdatePref(FichierPref.s)
  ; Sauvegarde des préférences
  Protected preference
  
  ForEach medoc()
    If GetGadgetText(#STRING_NOM) = medoc()\Nom
      medoc()\NombreParPrise  = Val(GetGadgetText(#STRING_NPP))
      medoc()\NombreEnStock   = Val(GetGadgetText(#STRING_STOCK))
    EndIf
  Next
  SauvePref(FichierPref.s)
EndProcedure


Procedure RefreshList()
  Protected id, alerte, N
  SortStructuredList(medoc(), #PB_Sort_Ascending, OffsetOf(medocinfo\Nom),TypeOf(medocinfo\Nom))
  ClearGadgetItems(#LIST_MEDOCS)
  id = 0 : alerte = 0
  ForEach medoc()
    AddGadgetItem (#LIST_MEDOCS,-1,medoc()\Nom + Chr(10) + medoc()\NombreEnStock + Chr(10) + medoc()\NombreParPrise)
    N = medoc()\NombreEnStock
    If N < 6 Or medoc()\NombreEnStock <= medoc()\NombreParPrise
      SetGadgetItemColor(#LIST_MEDOCS,  id, #PB_Gadget_BackColor,  #Red,  1)  
      alerte + 1
    EndIf
    id+1
  Next
  
  If alerte > 1
    message$ = "Des médicaments vont manquer"  
  EndIf
    
  For i = #STRING_NOM To #STRING_NPP
    SetGadgetColor(i,#PB_Gadget_BackColor,#White)
    SetGadgetColor(i,#PB_Gadget_FrontColor,$0)
    SetGadgetText(i,"")
  Next
  NOM$ = "" : NPP$ = "" : STOCK$ = ""
  ProcedureReturn 
EndProcedure

;  ============================================================================
;-   =========================== LE PROGRAMME =============================
;  ============================================================================

If Not LirePref(Pref$)
  InitPref(Pref$) 
EndIf

If ListSize(medoc()) = 0
  MessageRequester("Bienvenue sur Medocostock","Aucun médicament n'est répertorié (1er lancement ?)"+Chr(10)+"Une fois l'interface ouverte, merci de créer votre base.",#PB_MessageRequester_Info)  
EndIf


; Ouverture de la fenêtre principale
If OpenWindow(#LDVMULTIMEDIA, 0, 0, L, H, "Medocostock", #PB_Window_SystemMenu | #PB_Window_ScreenCentered |#PB_Window_MinimizeGadget)
;   SetWindowColor(#LDVMULTIMEDIA, $cbcbcb)
  ; Partie édition
  FrameGadget(#FRAME_EDIT, 10, 10, Lframe1, H-45, "Création/Édition de médicament")
  TextGadget(#TEXT_NOM, 20,45,90,25,"Médicament",#PB_Text_Right)
  StringGadget(#STRING_NOM, Lframe1-260, 40, 260, 25, "",#PB_String_UpperCase)
  TextGadget(#TEXT_STOCK, 20,75,90,25,"Stock Total",#PB_Text_Right)
  StringGadget(#STRING_STOCK, Lframe1-260, 70, 260, 25, "",#PB_String_Numeric)
  TextGadget(#TEXT_NPP, 20,105,90,25,"Nbr par Prise",#PB_Text_Right)
  StringGadget(#STRING_NPP, Lframe1-260, 100, 260, 25, "",#PB_String_Numeric)
  
  ButtonGadget(#BUTTON_AJOUTER, 20, 140, 110, 30, "Ajouter")
  ButtonGadget(#BUTTON_SUPPRIMER, 145, 140, 110, 30, "Supprimer")
  ButtonGadget(#BUTTON_MODIFIER, 270, 140, 110, 30, "Modifier")
  DisableGadget(#BUTTON_MODIFIER,1)
  DisableGadget(#BUTTON_SUPPRIMER,1)
  
  ; Liste des médicaments
  ListIconGadget(#LIST_MEDOCS, 20, 190, Lframe1-20, 390, "Médicament", 220, #PB_ListIcon_GridLines)
  AddGadgetColumn(#LIST_MEDOCS,1, "Stock",60)
  AddGadgetColumn(#LIST_MEDOCS,2, "Prise",60)
  
  ; Prise de médoc
  ButtonGadget(#BUTTON_PRISE, 10, H-30, 100, 25,"Prise OK")
  GadgetToolTip(#BUTTON_PRISE, "En validant ce bouton, la prise de médicament est validée et les stocks mis à jours.")
  
  ; Info
  StringGadget(#STRING_INFO, 115, H-30, 280, 25, "",  #ES_CENTER | #PB_String_ReadOnly)
  SetGadgetColor(#STRING_INFO, #PB_Gadget_BackColor, $0)
  SetGadgetColor(#STRING_INFO, #PB_Gadget_FrontColor, #Green)
  
  
  If ListSize(medoc()) > 0
    RefreshList()
  EndIf
  
  
  AddWindowTimer(#LDVMULTIMEDIA, #T, 20)
  
  ;- OoOo Boucle principale oOoO
  Repeat
    event = WaitWindowEvent()
    
    Select event
        
      Case #PB_Event_Timer  
        
        If G < 5
          UP = 5
        ElseIf G > 250
          UP = -5
        EndIf
        SetGadgetColor(#STRING_INFO, #PB_Gadget_FrontColor, RGB(0,G,0) )
        Message(message$)
        G+UP
        
        
        
            
            
      Case #PB_Event_CloseWindow
        quit = 1
        
      Case #PB_Event_Gadget
        Select EventGadget()
            
            ;- >>> Ajouter un médicament 
          Case #BUTTON_AJOUTER
            ; Code pour ajouter un médicament
            
            NOM$  = GetGadgetText(#STRING_NOM)
            NPP$  = GetGadgetText(#STRING_NPP)
            STOCK$= GetGadgetText(#STRING_STOCK)
            
            If ListSize(medoc())>0
              ForEach medoc()
                If NOM$ =   medoc()\Nom
                  doublon = #True
                  MessageRequester("Doublon","Un médicament du même nom existe déjà, vous pouvez modifier son stock ou les prises en le selectionnant"+Chr(10)+"dans la liste et en cliquant sur le bouton modifier.",#PB_MessageRequester_Error)
                  Break
                EndIf  
              Next
            EndIf
            
            If doublon = #False
              
              If Val(STOCK$) >= Val(NPP$)
                
                If NOM$ = "" Or NOM$ = "DONNÉE MANQUANTE"
                  BGcolor = #Red
                  FColor  = $111111
                  SetGadgetText(#STRING_NOM,"DONNÉE MANQUANTE")
                Else 
                  BGcolor = #Green
                  FColor  = $0
                EndIf
                
                SetGadgetColor(#STRING_NOM,#PB_Gadget_BackColor,BGcolor)
                SetGadgetColor(#STRING_NOM,#PB_Gadget_FrontColor,FColor)
                
                
                If NPP$ = "" Or NPP$ = "DONNÉE MANQUANTE"
                  BGcolor = #Red
                  FColor  = $111111
                  SetGadgetText(#STRING_NPP,"DONNÉE MANQUANTE")
                Else 
                  BGcolor = #Green
                  FColor  = $0
                EndIf
                
                SetGadgetColor(#STRING_NPP,#PB_Gadget_BackColor,BGcolor)
                SetGadgetColor(#STRING_NPP,#PB_Gadget_FrontColor,FColor)
                
                If STOCK$ = "" Or STOCK$ = "DONNÉE MANQUANTE"
                  BGcolor = #Red
                  FColor  = $111111
                  SetGadgetText(#STRING_STOCK,"DONNÉE MANQUANTE")
                Else 
                  BGcolor = #Green
                  FColor  = $0
                EndIf
                
                SetGadgetColor(#STRING_STOCK,#PB_Gadget_BackColor,BGcolor)
                SetGadgetColor(#STRING_STOCK,#PB_Gadget_FrontColor,FColor)
                
                
                If NOM$ <> "" And NOM$ <> "DONNÉE MANQUANTE" And NPP$ <> "" And NPP$ <> "DONNÉE MANQUANTE" And STOCK$ <> "" And STOCK$ <> "DONNÉE MANQUANTE"
                  
                  AddElement(medoc())
                  medoc()\Nom = NOM$
                  medoc()\NombreParPrise  = Val(NPP$)
                  medoc()\NombreEnStock   = Val(STOCK$)
                  
                  SauvePref(Pref$)
                  RefreshList()
                  message$ = "Medicament ajouté !"
                  
                EndIf
                
              Else
                BGcolor = #Red
                FColor  = $111111
                SetGadgetColor(#STRING_STOCK,#PB_Gadget_BackColor,BGcolor)
                SetGadgetColor(#STRING_STOCK,#PB_Gadget_FrontColor,FColor)
                SetGadgetColor(#STRING_NPP,#PB_Gadget_BackColor,BGcolor)
                SetGadgetColor(#STRING_NPP,#PB_Gadget_FrontColor,FColor)
                MessageRequester("Erreur","Le nombre en stock ne peux pas être plus petit que le nombre de médicament à prendre",#PB_MessageRequester_Warning)
                
              EndIf
            EndIf    
            
            
          Case #BUTTON_SUPPRIMER
            ;- >>> Supprimer un médicament 
            Efface = MessageRequester("Supprimer ?","Souhaitez vous vraiment supprimer "+ medoc()\nom +" de la liste des médicaments ?"+Chr(10)+"Cette action est irreversible",#PB_MessageRequester_YesNo|#MB_ICONQUESTION)
            HideWindow(#LDVMULTIMEDIA,1)
            Select Efface
              Case #PB_MessageRequester_Yes
                DeleteElement(medoc(),1)
                HideWindow(#LDVMULTIMEDIA,0)
                SauvePref(Pref$)
                RefreshList()
                message$ = "Médicament supprimé !"
                
              Case #PB_MessageRequester_No
                HideWindow(#LDVMULTIMEDIA,0)
                
            EndSelect
            
            
            ;- >>> Modifier un médicament  
          Case #BUTTON_MODIFIER
            ; Code pour Modifier un médicament
            If GetGadgetText(#BUTTON_MODIFIER) = "Modifier"
              For i = #STRING_NOM To #STRING_NPP
                SetGadgetColor(i,#PB_Gadget_BackColor,#White)
                SetGadgetColor(i,#PB_Gadget_FrontColor,$0)
              Next
              
              DisableGadget(#STRING_NOM,1)
              DisableGadget(#BUTTON_AJOUTER,1)
              DisableGadget(#BUTTON_SUPPRIMER,1)
              DisableGadget(#BUTTON_PRISE,1)
              SetGadgetText(#BUTTON_MODIFIER, "Valider")
              SetGadgetText(#STRING_NOM,medoc()\Nom)
              SetGadgetText(#STRING_STOCK,Str(medoc()\NombreEnStock))
              SetGadgetText(#STRING_NPP,Str(medoc()\NombreParPrise))
            ElseIf GetGadgetText(#BUTTON_MODIFIER) = "Valider"
              
              NOM$  = GetGadgetText(#STRING_NOM)
              NPP$  = GetGadgetText(#STRING_NPP)
              STOCK$= GetGadgetText(#STRING_STOCK)
              
              If NPP$ = ""
                BGcolor = #Red
                FColor  = $111111
                SetGadgetText(#STRING_NPP,"DONNÉE MANQUANTE")
              Else 
                BGcolor = #Green
                FColor  = $0
              EndIf
              
              SetGadgetColor(#STRING_NPP,#PB_Gadget_BackColor,BGcolor)
              SetGadgetColor(#STRING_NPP,#PB_Gadget_FrontColor,FColor)
              
              If STOCK$ = ""
                BGcolor = #Red
                FColor  = $111111
                SetGadgetText(#STRING_STOCK,"DONNÉE MANQUANTE")
              Else 
                BGcolor = #Green
                FColor  = $0
              EndIf
              
              SetGadgetColor(#STRING_STOCK,#PB_Gadget_BackColor,BGcolor)
              SetGadgetColor(#STRING_STOCK,#PB_Gadget_FrontColor,FColor)
              
              If NOM$ <> "" And NOM$ <> "DONNÉE MANQUANTE" And NPP$ <> "" And NPP$ <> "DONNÉE MANQUANTE" And STOCK$ <> "" And STOCK$ <> "DONNÉE MANQUANTE"
                
                If Val(NPP$) < Val(STOCK$)
                  medoc()\Nom             = NOM$
                  medoc()\NombreParPrise  = Val(NPP$)
                  medoc()\NombreEnStock   = Val(STOCK$)
                  
                  SauvePref(Pref$)
                  
                  SetGadgetText(#BUTTON_MODIFIER,"Modifier")
                  DisableGadget(#STRING_NOM,0)
                  DisableGadget(#BUTTON_AJOUTER,0)
                  DisableGadget(#BUTTON_PRISE,0)
                  DisableGadget(#BUTTON_MODIFIER,1)
                  DisableGadget(#BUTTON_SUPPRIMER,1)
                  RefreshList()
                  Message$ = "Stock mis à jour"
                  
                ElseIf Val(NPP$) > Val(STOCK$)
                  BGcolor = #Red
                  FColor  = $111111
                  SetGadgetColor(#STRING_STOCK,#PB_Gadget_BackColor,BGcolor)
                  SetGadgetColor(#STRING_STOCK,#PB_Gadget_FrontColor,FColor)
                  SetGadgetColor(#STRING_NPP,#PB_Gadget_BackColor,BGcolor)
                  SetGadgetColor(#STRING_NPP,#PB_Gadget_FrontColor,FColor)
                  MessageRequester("Erreur","Le nombre en stock ne peux pas être plus petit que le nombre de médicament à prendre",#PB_MessageRequester_Warning)
                  Message$ = "Problème de stock!"
                EndIf
                
                
              EndIf
              
            EndIf

            ;- >>> Autres gadgets 
          Case #STRING_NOM, #STRING_NPP, #STRING_STOCK
            gadget = EventGadget()
            If GetGadgetText(gadget) = "DONNÉE MANQUANTE" And EventType() = #PB_EventType_Focus
              SetGadgetText(gadget,"")
              SetGadgetColor(gadget,#PB_Gadget_BackColor,#White)
              SetGadgetColor(gadget,#PB_Gadget_FrontColor,$0)
            EndIf
            
            If GetGadgetText(#BUTTON_MODIFIER) <> "Valider"
              DisableGadget(#BUTTON_AJOUTER,0)
              DisableGadget(#BUTTON_MODIFIER,1)
            EndIf
            
            ;- Liste des Médicaments
          Case #LIST_MEDOCS
            Choix = GetGadgetState(#LIST_MEDOCS)
            If choix <> -1 
              ; vérification
              SelectElement(medoc(),choix)
              If GetGadgetItemText(#LIST_MEDOCS,choix,0) = medoc()\nom
                DisableGadget(#BUTTON_MODIFIER,0)
                DisableGadget(#BUTTON_AJOUTER,1)
              EndIf
              
              DisableGadget(#BUTTON_SUPPRIMER,0)
              
              If GetGadgetText(#BUTTON_MODIFIER) = "Valider" And GetGadgetText(#STRING_NOM) <> medoc()\Nom
                DisableGadget(#BUTTON_SUPPRIMER,1)
                DisableGadget(#STRING_NOM,0)
                DisableGadget(#BUTTON_AJOUTER,0)
                DisableGadget(#BUTTON_PRISE,0)
                DisableGadget(#BUTTON_MODIFIER,1)
                SetGadgetText(#BUTTON_MODIFIER,"Modifier")
                RefreshList()
              EndIf
              
              
            Else
              DisableGadget(#BUTTON_MODIFIER,1)
              DisableGadget(#BUTTON_SUPPRIMER,1)
              DisableGadget(#BUTTON_PRISE,0)
              DisableGadget(#BUTTON_AJOUTER,0)
            EndIf
            
            
          Case #BUTTON_PRISE
            Prise = MessageRequester("Valider la prise du jour ?","Êtes vous sur d'avoir pris tous les médicaments de la journée ? "+Chr(10)+"Cette action entrainera la mise à jour des stocks de tous les médicaments et est irreversible.",#PB_MessageRequester_YesNo|#MB_ICONQUESTION)

            Select Prise
              Case #PB_MessageRequester_Yes
                avertissement = 0
                ForEach medoc()
                  NouveauStock = medoc()\NombreEnStock - medoc()\NombreParPrise
                  If NouveauStock < 6
                    avertissement +1
                  EndIf
                    medoc()\NombreEnStock - medoc()\NombreParPrise
                Next

                SauvePref(Pref$)
                RefreshList()
                If avertissement > 0
                  Message$ = "Des medicaments se font rares"
                Else
                  Message$ = "Stock mis à jour"
                EndIf
                
              Case #PB_MessageRequester_No
                HideWindow(#LDVMULTIMEDIA,0)
                
            EndSelect
            
        EndSelect
    EndSelect
    
  Until quit
  
  ; Fermeture de la fenêtre
  CloseWindow(#LDVMULTIMEDIA)
EndIf

Re: Medocostock - Gestion de prise de médicament

Publié : ven. 21/févr./2025 18:31
par Micoute
Moi j'ai fait comme ça:

Code : Tout sélectionner

;GESMED JSON V1 par Micoute 21 février - PB 6.20 (x64)

EnableExplicit
;{ Enumérations
Enumeration Fichiers
  #FichierJSON
EndEnumeration

Enumeration Fenetres
  #Fenetre_principale
  #Fenetre_saisies
EndEnumeration

Enumeration Gadgets
  #Txt_Nom
  #Txt_Coche
  #Txt_Type
  #Txt_Dosage
  #Txt_Unite
  #Txt_Matin
  #Txt_Midi
  #Txt_Soir
  #Txt_QteParBoite
  #Txt_DteDeb
  #Txt_DteFin
  #Txt_QteJour
  #Txt_QteMois
  #Txt_BtesMois
  #Txt_DoseJour
  #Txt_DoseMois
  #Txt_FinStock
  #Txt_StockActuel
  #Txt_Signature
  #Nom
  #Coche
  #Type
  #Dosage
  #Unite
  #Matin
  #Midi
  #Soir
  #QteParBoite
  #DteDeb
  #DteFin  
  #QteJour
  #QteMois
  #BtesMois
  #DoseJour
  #DoseMois
  #FinStock
  #StockActuel
  
  #ListeMedicaments
  
  #Ctn_Boutons
  #Ctn_Boutons_Principal
  
  #Btn_Nouveau
  #Btn_Maj
  #Btn_Supprimer
  #Btn_Sauvegarde
  #Btn_Quitter
  #Btn_Edition
EndEnumeration

#NbJour = 28
;}
;{ Structures
Structure Med
  Nom.s             ;Nom du médicament
  Coche.s           ;Le médicament doit-il être imprimer ?
  Type.b            ;0 = matériel ou 1 = médicament
  DoseUnite.d       ;Dosage médicament
  Unite.s           ;Unité de dosage
                    ;Conditionnement.s ;Comprimés ou autre
  QteMat.d          ;Quantité matin
  QteMid.d          ;Quantité midi
  QteSoir.d         ;Quantité soir
  QteParBoite.i     ;Nombre par boite
  DebutTraitement.s ;Date début du traitement
  FinTraitement.s   ;Date fin du traitement
  Qtejour.q         ;Qte journalière
  Qtemois.q         ;Qte mensuelle  
  Dosejour.q        ;Nombre par jour
  Dosemois.q        ;Nombre par mois
  NbBoites.i        ;Nombre de boites
  FinStock.s        ;Date fin de stock
  StockActuel.q
EndStructure

Structure Liste
  Titre.s
  Largeur.i
EndStructure
;}
;{ Variables
Global.s Rep$ = GetPathPart(ProgramFilename()) : SetCurrentDirectory(Rep$) ;pour compiler dans le bon répertoire
Global NewList Medicaments.Med()
Global FichierJSON$ =  "GESMED JSON V1.JSON"
Global Rouge, Orange, Jaune, Vert, Bleu, Violet, Noir, Blanc, Entete, i, Drapeaux
Global Nom.s,Coche.s,Type.b,DoseUnite.d,Unite.s,QteMat.d,QteMid.d,QteSoir.d,QteParBoite.i,DebutTraitement.s,FinTraitement.s,NbBoites.i,FinStock.s, QuantiteParJour.i, NombreDeJours.i
Global QteJour.q,QteMois.q,DoseJour.q,DoseMois.q, StockExistant.q, StockActuel.q, StockActuelExistant
       
Global Evenement
;}
;{ Définition des couleurs
Rouge = $BB3EFB ;Rose barbie
Orange = $3E7BFB;orange
Jaune = $3EFBFB ;Vert citron
Vert = $BBFB3E  ;Vert d'eau
Bleu = $FBBB3E  ;Bleu lagon
Violet = $FB3EFB;Mauve
Noir = $000000
Blanc = $FFFFFF
;}
;{ Déclaration des procédures
Declare JustifierColonne(Gadget.i, Colonne.i, Format.i)
Declare Programme_principal()
Declare Quitter()
Declare ChargerMedicaments()
Declare GestionEvenements()
Declare NouveauMedicament()
Declare SelectionMedicament()
Declare SupprimerMedicament()
Declare MajMedicaments()
Declare SauvegardeMedicaments()
Declare Imprimer()
;}
;{ Plugins
UsePNGImageDecoder()
;}
;{ Lancement du programme principal
Programme_principal()
;}
Procedure JustifierColonne(Gadget.i, Colonne.i, Format.i)
  Protected Lvc.LVCOLUMN
  Lvc\mask = #LVCF_FMT
  Select Format
    Case 0
      Lvc\fmt = #LVCFMT_LEFT
    Case 1
      Lvc\fmt = #LVCFMT_CENTER
    Case 2
      Lvc\fmt = #LVCFMT_RIGHT
  EndSelect
  SendMessage_(GadgetID(Gadget), #LVM_SETCOLUMN, Colonne, @Lvc)
EndProcedure

Procedure Saisies()
  If GetGadgetState(#Btn_Edition) = #True
    
  If OpenWindow(#Fenetre_saisies, WindowX(#Fenetre_principale) - 3, WindowY(#Fenetre_principale) - 125, 1540, 100, "Saisie",#PB_Window_SystemMenu)
  ; Ligne de saisie
    ;===========
    
    StringGadget(#Nom, 10, 10, 190, 30, "")    
    GadgetToolTip(#Nom, "Nom du médicament/matériel")
    CheckBoxGadget(#Coche, 205, 10, 15, 30, "")
    GadgetToolTip(#coche, "Cocher l'élément que l'on veut imprimer")
    StringGadget(#Type, 225, 10, 30, 30, "")
    GadgetToolTip(#Type, "0 matériel / 1 médicament")
    StringGadget(#Dosage, 260, 10, 90, 30, "")
    GadgetToolTip(#Dosage, "Nombre d'unités dans le médicament")
    StringGadget(#Unite, 355, 10, 70, 30, "")
    GadgetToolTip(#Unite, "Type d'unité : mg, ui, etc")
    StringGadget(#Matin, 430, 10, 50, 30, "")
    GadgetToolTip(#Matin, "Qté prise le matin")
    StringGadget(#Midi, 485, 10, 50, 30, "")
    GadgetToolTip(#Midi, "Qté prise le midi")
    StringGadget(#Soir, 540, 10, 50, 30, "")
    GadgetToolTip(#Soir, "Qté prise le soir")
    StringGadget(#QteParBoite, 595, 10, 75, 30, "")
    GadgetToolTip(#QteParBoite, "Quantité par boîte")
    DateGadget(#DteDeb, 675, 10, 110, 30, "%dd/%mm/%yyyy", Date())
    GadgetToolTip(#DteDeb, "Début du traitement")
    StringGadget(#DteFin, 790, 10, 110, 30, "")
    GadgetToolTip(#DteFin, "Fin du traitement mensuel")
    StringGadget(#QteJour, 905, 10, 70, 30, "")
    GadgetToolTip(#QteJour, "Quantité journalière")
    StringGadget(#QteMois, 980, 10, 85, 30, "")
    GadgetToolTip(#QteMois, "Quantité mensuelle")
    StringGadget(#BtesMois, 1070, 10, 100, 30, "")
    GadgetToolTip(#BtesMois, "Nombre de boîtes par mois")
    StringGadget(#DoseJour, 1175, 10, 120, 30, "")
    GadgetToolTip(#DoseJour, "Dose journalière")
    StringGadget(#DoseMois, 1300, 10, 120, 30, "")
    GadgetToolTip(#DoseMois, "Dose mensuelle")
    StringGadget(#FinStock, 1425, 10, 110, 30, "")
    GadgetToolTip(#FinStock , "Date limite de provision")
    StringGadget(#StockActuel, 1540, 10, 120, 30, "")
    GadgetToolTip(#StockActuel, "Stock actuel")
    ;Boutons de commandes
    ;==================
    ContainerGadget(#Ctn_Boutons, 10, 40, 1890, 60)
    ButtonGadget(#Btn_Nouveau, 0, 10, 100, 40, Chr($F0F6) + " Nouveau")
    GadgetToolTip(#Btn_Nouveau, "Nouveau")
    ButtonGadget(#Btn_Maj, 250, 10, 100, 40, Chr($F067) + " Ajouter")
    GadgetToolTip(#Btn_Maj, "Ajouter")
    ButtonGadget(#Btn_Supprimer,500, 10, 120, 40, Chr($F014) + " Supprimer", #PB_Button_Toggle)
    GadgetToolTip(#Btn_Supprimer, "Supprimer")
    ButtonGadget(#Btn_Sauvegarde,800,10,140,40, Chr($F0C7) + " Sauvegarder")
    GadgetToolTip(#Btn_Sauvegarde, "Quitter avec sauvegarde")
    CloseGadgetList()
    
    SetWindowColor(#Fenetre_saisies, Bleu)
    SetGadgetColor(#Ctn_Boutons, #PB_Gadget_BackColor, GetWindowColor(#Fenetre_saisies))
    
    For i = #Btn_Nouveau To #Btn_Edition
      SetGadgetFont(i, FontID(LoadFont(#PB_Any, "FontAwesome", 16, #PB_Font_Bold|#PB_Font_HighQuality)))
    Next i
    
    For i = #Nom To #StockActuel
      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
    BindGadgetEvent(#Btn_Sauvegarde, @SauvegardeMedicaments())
    ;L'impreesion est-elle autorisée ?
    ;L'application est prête pour la saisie d'un médicament
    NouveauMedicament()
    
    SetGadgetText(#Btn_Edition, "Finir la saisie")
  EndIf
Else
  SetGadgetText(#Btn_Edition, "Faire une saisie")
  CloseWindow(#Fenetre_saisies)
  EndIf
EndProcedure
Procedure Programme_principal()
  Drapeaux = #PB_Window_BorderLess | #PB_Window_ScreenCentered
  If OpenWindow(#Fenetre_principale, 0, 0, 1540, 480, "", Drapeaux)
    ;{ Entête
    TextGadget(#Txt_Coche,         5,  5, 175, 20, "Imprimer", #SS_CENTERIMAGE|#SS_RIGHT)
    TextGadget(#Txt_Dosage,      180,  5, 175, 20, "     Dosage")
    TextGadget(#Txt_Matin,       355,  5, 120, 20, "  Matin")
    TextGadget(#Txt_Soir,        475,  5, 135, 20, "  Soir")
    TextGadget(#Txt_DteDeb,      610,  5, 190, 20, "    Date début")
    TextGadget(#Txt_QteJour,     800,  5, 165, 20, "Qté par jour")
    TextGadget(#Txt_BtesMois,    965,  5, 220, 20, "Nbre de boites")
    TextGadget(#Txt_DoseMois,   1185,  5, 225, 20, "Doses par mois")
    TextGadget(#Txt_Nom,           5, 25, 190, 20, "Nom du médicament")
    TextGadget(#Txt_Type,        165, 25, 120, 20, "Type")
    TextGadget(#Txt_Unite,       285, 25, 130, 20, "  Unité")
    TextGadget(#Txt_Midi,        415, 25, 120, 20, "  Midi")
    TextGadget(#Txt_QteParBoite, 535, 25, 175, 20, "Qté par boîte")
    TextGadget(#Txt_DteFin,      710, 25, 170, 20, "  Date fin")
    TextGadget(#Txt_QteMois,     880, 25, 185, 20, "Qté par mois")
    TextGadget(#Txt_DoseJour,   1065, 25, 240, 20, "  Dose par jour")
    TextGadget(#Txt_FinStock,   1305, 25, 105, 20, "     Fin stock")
    TextGadget(#Txt_StockActuel,1410, 5, 120, 40, " Stock actuel")
    ;}
    
    ;Liste de médicaments
    ;====================
    
    ListIconGadget(#ListeMedicaments, 5, 45, 1530, 365, "Nom", 135, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#LVS_NOCOLUMNHEADER)
    AddGadgetColumn(#ListeMedicaments, 1, "Coche", 25)
    AddGadgetColumn(#ListeMedicaments, 2, "Type", 30)
    AddGadgetColumn(#ListeMedicaments, 3, "Dosage", 90)
    AddGadgetColumn(#ListeMedicaments, 4, "Unité", 70)
    AddGadgetColumn(#ListeMedicaments, 5, "Mat", 60)
    AddGadgetColumn(#ListeMedicaments, 6, "Midi", 60)
    AddGadgetColumn(#ListeMedicaments, 7, "Soir", 60)
    AddGadgetColumn(#ListeMedicaments, 8, "Qte/b", 75)
    AddGadgetColumn(#ListeMedicaments, 9, "Date début", 100)
    AddGadgetColumn(#ListeMedicaments, 10, "Date fin", 100)
    AddGadgetColumn(#ListeMedicaments, 11, "Qte/J", 70)
    AddGadgetColumn(#ListeMedicaments, 12, "Qte/M", 85)
    AddGadgetColumn(#ListeMedicaments, 13, "Nbre Btes", 100)
    AddGadgetColumn(#ListeMedicaments, 14, "Dose/J", 120)
    AddGadgetColumn(#ListeMedicaments, 15, "Dose/M", 120)
    AddGadgetColumn(#ListeMedicaments, 16, "Fin stock", 100)
    AddGadgetColumn(#ListeMedicaments, 17, "Stock actuel", 120)
    
    For i = 1 To CountGadgetItems(#ListeMedicaments)
      JustifierColonne(#ListeMedicaments, i, 2)
    Next i  
    
    ContainerGadget(#Ctn_Boutons_Principal, 10, 30, 1530, 60)
    TextGadget(#Txt_Signature, 10, 10, 1270, 40, UCase("Gestion de stock de médicaments par Micoute "+ Chr($F1F9) + " 21 février 2025"), #SS_CENTERIMAGE|#SS_CENTER)
    ButtonGadget(#Btn_Edition, 1280, 10,140,40, "Faire une saisie", #PB_Button_Toggle)
    GadgetToolTip(#Btn_Edition, "Ouvrir ou fermer la fenêtre d'édition")
    ButtonGadget(#Btn_Quitter, 1430, 10, 90, 40, Chr($F011) + " Sortir")
    GadgetToolTip(#Btn_Quitter, "Quitter sans sauvegarde")
    CloseGadgetList()
    
    ; Couleurs
    ;=========
    
    SetWindowColor(#Fenetre_principale, Bleu)
    i = #Txt_Nom
    While i <= #Txt_StockActuel
      SetGadgetColor(i, #PB_Gadget_BackColor, Orange)
      SetGadgetColor(i, #PB_Gadget_FrontColor, Jaune)
      i + 1
    Wend
    SetGadgetColor(#Txt_Signature, #PB_Gadget_BackColor, Bleu)
    SetGadgetColor(#Txt_Signature, #PB_Gadget_FrontColor, Jaune)
    
    ;Lecture des médicaments
    ;=======================
    ChargerMedicaments()
    
    For i = 0 To CountGadgetItems(#ListeMedicaments) ;ListIconGadget
      If i%2 = 1                                     ; si notre compteur est pair
        SetGadgetItemColor(#ListeMedicaments, i, #PB_Gadget_FrontColor, Noir)
        SetGadgetItemColor(#ListeMedicaments, i, #PB_Gadget_BackColor, Bleu)
      Else ; sinon, s'il est impair
        SetGadgetItemColor(#ListeMedicaments, i, #PB_Gadget_FrontColor, Noir)
        SetGadgetItemColor(#ListeMedicaments, i, #PB_Gadget_BackColor, Vert)
      EndIf  
    Next i  
    
    SetGadgetColor(#ListeMedicaments, #PB_Gadget_BackColor, Bleu)
    SetGadgetColor(#Ctn_Boutons_Principal, #PB_Gadget_BackColor, GetWindowColor(#Fenetre_principale))
    
    ResizeGadget(#ListeMedicaments, #PB_Ignore, #PB_Ignore, #PB_Ignore, CountGadgetItems(#ListeMedicaments) * 20.4)
    ResizeGadget(#Ctn_Boutons_Principal, #PB_Ignore, GadgetY(#ListeMedicaments) + CountGadgetItems(#ListeMedicaments) * 20.4, #PB_Ignore, #PB_Ignore)
    ResizeWindow(#Fenetre_principale, #PB_Ignore, #PB_Ignore, #PB_Ignore, GadgetY(#Ctn_Boutons_Principal) + 60)
    
    ; Polices
    ;========
    
    SetGadgetFont(#ListeMedicaments, FontID(LoadFont(#PB_Any, "FontAwesome", 12, #PB_Font_Bold|#PB_Font_HighQuality)))
    For i = #Txt_Nom To #Txt_StockActuel
      SetGadgetFont(i, FontID(LoadFont(#PB_Any, "FontAwesome", 12, #PB_Font_Bold|#PB_Font_HighQuality)))
    Next i 
    
    For i = #Btn_Nouveau To #Btn_Edition
      SetGadgetFont(i, FontID(LoadFont(#PB_Any, "FontAwesome", 16, #PB_Font_Bold|#PB_Font_HighQuality)))
    Next i
    
    For i = #Nom To #StockActuel
      SetGadgetFont(i, FontID(LoadFont(#PB_Any, "FontAwesome", 16, #PB_Font_Bold|#PB_Font_HighQuality)))
    Next i
    
    SetGadgetFont(#Txt_Signature, FontID(LoadFont(#PB_Any, "FontAwesome", 20, #PB_Font_Bold|#PB_Font_HighQuality)))
    
    ; Faire une saisie
    ; ================
    BindGadgetEvent(#Btn_Edition, @Saisies())
    ; Quitter l'application
    BindGadgetEvent(#Btn_Quitter, @Quitter())
    
    Repeat
      Evenement = WaitWindowEvent()
      Select Evenement
        Case #PB_Event_CloseWindow
          Select EventWindow()
            Case #Fenetre_saisies
              CloseWindow(#Fenetre_saisies)
          EndSelect
      EndSelect
    ForEver
  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$+\Coche+#LF$+Str(\Type)+#LF$+Str(\DoseUnite)+#LF$+\Unite+#LF$+\QteMat+#LF$+\QteMid+#LF$+\QteSoir+#LF$+\QteParBoite+#LF$+
                                             \DebutTraitement+#LF$+\FinTraitement+#LF$+\QteJour+#LF$+\QteMois+#LF$+\NbBoites+#LF$+Str(\DoseJour)+#LF$+Str(\DoseMois)+#LF$+\FinStock+#LF$+\StockActuel)
        SetGadgetItemData(#ListeMedicaments, CountGadgetItems(#ListeMedicaments)-1, ListIndex(Medicaments()))
        ; Initialiser la variable StockActuelExistant avec la valeur actuelle
        StockExistant = StockActuel
        ; Vérification pour réinitialiser le stock existant si le stock actuel est égal à la quantité par boîte
        If StockActuelExistant = \Qtemois
          StockActuelExistant = 0
          ; Afficher un message indiquant qu'une boîte de moins est nécessaire
          MessageRequester("Alerte Stock", "Commandez une boîte de " + \Nom + " en moins !", #PB_MessageRequester_Ok)
        EndIf
      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(#Coche, "")
  SetGadgetText(#Type, "")
  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, "")
  SetGadgetText(#StockActuel, "")
  
  DisableGadget(#Btn_Nouveau, #True)
  DisableGadget(#Btn_Maj, #True)
  DisableGadget(#Btn_Supprimer, #True)
  
  SetGadgetText(#Btn_Maj, Chr($F067) + " Ajouter")
  GadgetToolTip(#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(#Coche, \Coche)
      SetGadgetText(#Type, Str(\Type))
      SetGadgetText(#Dosage, StrD(\DoseUnite))
      If Val(GetGadgetText(#Type)) = 1
        SetGadgetText(#Unite, \Unite)
      Else
        SetGadgetText(#Unite, "")
      EndIf  
      SetGadgetText(#Matin, StrD(\QteMat))
      SetGadgetText(#Midi, StrD(\QteMid))
      SetGadgetText(#Soir, StrD(\QteSoir))
      SetGadgetText(#QteParBoite, Str(\QteParBoite))
      SetGadgetText(#DteDeb, \DebutTraitement)
      SetGadgetText(#DteFin, \FinTraitement)      
      SetGadgetText(#QteJour, StrD(\Qtejour))
      SetGadgetText(#QteMois, StrD(\Qtemois))
      If Val(GetGadgetText(#Type)) = 1
        SetGadgetText(#DoseJour, StrD(\Dosejour))
        SetGadgetText(#DoseMois, StrD(\Dosemois))
      Else
        SetGadgetText(#DoseJour, "")
        SetGadgetText(#DoseMois, "")
      EndIf
      SetGadgetText(#BtesMois, Str(\NbBoites))
      SetGadgetText(#FinStock, \FinStock)
      SetGadgetText(#StockActuel, Str(\StockActuel))
    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, Chr($F040) + " Modifier")
  GadgetToolTip(#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()
  Nom = GetGadgetText(#Nom)
  If GetGadgetState(#Coche) = 1
    Coche = Chr($F00C)
  Else
    Coche = ""
  EndIf  
  Type = Val(GetGadgetText(#Type))
  DoseUnite = ValD(GetGadgetText(#Dosage))
  Unite = GetGadgetText(#Unite)
  QteMat = ValD(GetGadgetText(#Matin))
  QteMid = ValD(GetGadgetText(#Midi))
  QteSoir = ValD(GetGadgetText(#Soir))
  QteParBoite = Val(GetGadgetText(#QteParBoite))
  DebutTraitement = FormatDate("%dd/%mm/%yyyy", GetGadgetState(#DteDeb))
  
  Debug "Valeurs lues"
  Debug "Nom : " + Nom
  Debug "DebutTraitement : " + DebutTraitement
  Debug "QteMat : " + StrD(QteMat)
  Debug "QteMid : " + StrD(QteMid)
  Debug "QteSoir : " + StrD(QteSoir)
  
  FinTraitement = FormatDate("%dd/%mm/%yyyy", AddDate(GetGadgetState(#DteDeb), #PB_Date_Day, #NbJour))  
  QteJour = QteMat + QteMid + QteSoir
  
  Debug "QteJour : " + StrD(QteJour)
  
  QteMois = Abs(Round(QteJour * #NbJour, #PB_Round_Nearest))
  DoseJour = Abs(Round(DoseUnite * QteJour, #PB_Round_Nearest))
  DoseMois = Abs(Round(DoseJour * #NbJour, #PB_Round_Nearest))
  NbBoites = Abs(Round(QteMois / QteParBoite, #PB_Round_Up))
  FinStock = FormatDate("%dd/%mm/%yyyy",AddDate(GetGadgetState(#DteDeb), #PB_Date_Day, #NbJour + (NbBoites * QteParBoite) - QteMois))
  StockActuel = (NbBoites * QteParBoite) - QteMois
  
  Debug "Fin de calculs"
  Debug "DoseJour : " + Str(DoseJour)
  Debug "DoseMois : " + Str(DoseMois)
  Debug "NbBoites : " + Str(NbBoites)
  Debug "FinStock : " + FinStock
  Debug "StockActuel : " + Str(StockActuel)
  
  SetGadgetText(#StockActuel, Str(StockActuel+StockExistant))
  
  DisableGadget(#Btn_Sauvegarde, #False)
  
  Select GetWindowData(#Fenetre_principale)
    Case 0 ;Création d'un médicament
      AddElement(Medicaments())
      With Medicaments()
        \Nom = Nom
        \Coche = Coche
        \Type = Type
        \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
        \StockActuel = StockActuel
        
        If type = 1
          \Unite = ""
        EndIf
        
        AddGadgetItem(#ListeMedicaments, -1, \Nom+#LF$+\Coche+#LF$+\Type+#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+#LF$+\StockActuel)
        SetGadgetItemData(#ListeMedicaments, CountGadgetItems(#ListeMedicaments)-1, ListIndex(Medicaments()))
      EndWith
      
    Case 1 ;Modification d'un médicament
      With Medicaments()
        \Nom = Nom
        \Coche = Coche
        \Type = Type
        \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
        \StockActuel = StockActuel
        SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), \Nom,0)
        SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), \Coche,1)
        SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), Str(\Type),2)
        SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), StrD(\DoseUnite),3)
        If Val(GetGadgetItemText(#ListeMedicaments, 2)) = 0
          SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), \Unite,4)
        Else
          SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), "",4)
        EndIf  
        SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), StrD(\QteMat),5)
        SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), StrD(\QteMid),6)
        SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), StrD(\QteSoir),7)        
        SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), Str(\QteParBoite),8)
        SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), \DebutTraitement,9)
        SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), \FinTraitement,10)        
        SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), StrD(\Qtejour),11)
        SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), StrD(\Qtemois),12)
        SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), Str(\NbBoites),13)
        If Val(GetGadgetItemText(#ListeMedicaments, 2)) = 0
          SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), StrD(\Dosejour),14)
          SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), StrD(\Dosemois),15)
        Else
          SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), "",14)
          SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), "",15)
        EndIf
        SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), \FinStock,16)
        SetGadgetItemText(#ListeMedicaments, ListIndex(Medicaments()), Str(\StockActuel), 17)
      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)
  
  MessageRequester("Information", "Le fichier " + FichierJSON$ + " a été sauvegardé avec succès."+ #LF$+#LF$+ "Maintenent le programme va se fermer.", #PB_MessageRequester_Info|#PB_MessageRequester_Ok)
  
  Quitter()
EndProcedure

Re: Medocostock - Gestion de prise de médicament

Publié : ven. 21/févr./2025 18:43
par Micoute
Pour créer une base de données, il faut entrer le nom du médicament, son type 0 matériel / 1 médicament, le dosage, l'unité de poids, la quantité prise le matin, le midi ,ou le soir, la quantité dans la boite et la date de départ et sauvegarder.