github.com/benoitkugler/goacve@v0.0.0-20201217100549-151ce6e55dc8/client/controllers/cont_aides.go (about) 1 package controllers 2 3 import ( 4 "fmt" 5 "net/http" 6 "strconv" 7 "strings" 8 9 "errors" 10 11 "github.com/benoitkugler/goACVE/server/core/apiserver" 12 "github.com/benoitkugler/goACVE/server/core/utils/table" 13 14 dm "github.com/benoitkugler/goACVE/server/core/datamodel" 15 rd "github.com/benoitkugler/goACVE/server/core/rawdata" 16 ) 17 18 type ButtonsAides struct { 19 Creer, AfficherStructures, Supprimer, Documents, Exporter EtatSideButton 20 } 21 22 type OngletAides interface { 23 baseOnglet 24 25 ConfirmeSupprimeAide(dm.AccesAide) bool 26 ConfirmeSupprimeStructureaide(msg string) bool 27 } 28 29 type EtatAides struct { 30 AideCurrent rd.IId 31 Recherche string 32 CritereCamp rd.OptionnalId 33 CritereValide rd.OptionnalBool 34 } 35 36 type Aides struct { 37 Onglet OngletAides 38 main *MainController 39 Liste rd.Table 40 Header []rd.Header 41 Base *dm.BaseLocale 42 Etat EtatAides 43 EditRight bool // Droit d'édition/ajout/suppression 44 } 45 46 func NewAides(main *MainController, permission int) *Aides { 47 a := Aides{main: main, Base: main.Base, EditRight: permission >= 2, 48 Header: []rd.Header{ 49 {Field: dm.AideStructure, Label: "Organisme"}, 50 {Field: dm.AideNomPrenom, Label: "Participant"}, 51 {Field: dm.AideCamp, Label: "Camp"}, 52 {Field: dm.AideValide, Label: "Valide"}, 53 {Field: dm.AideMontant, Label: "Montant"}, 54 {Field: dm.AideNbJoursMax, Label: "Limite"}, 55 {Field: dm.AideAnnee, Label: "Année"}, 56 }} 57 a.resetData() 58 return &a 59 } 60 61 func (c *Aides) resetData() { 62 c.Liste = make(rd.Table, 0, len(c.Base.Aides)) 63 cValide, cCamp := c.Etat.CritereValide, c.Etat.CritereCamp 64 for id, aide := range c.Base.Aides { 65 ac := c.Base.NewAide(id) 66 match := cValide == 0 || cValide.Bool() == bool(aide.Valide) // critère de validité 67 match = match && (cCamp.IsNil() || cCamp.Int64 == ac.GetParticipant().GetCamp().Id) // critère de camp 68 if match { 69 c.Liste = append(c.Liste, ac.AsItem()) 70 } 71 } 72 if strings.TrimSpace(c.Etat.Recherche) != "" { 73 c.Liste = dm.RechercheDetaillee(c.Liste, c.Etat.Recherche, c.Header) 74 } 75 76 // besoin de déselectionner si absent de la recherche : 77 if c.Etat.AideCurrent != nil && !HasId(c.Liste, c.Etat.AideCurrent) { 78 c.Etat.AideCurrent = nil 79 } 80 } 81 82 func (c *Aides) SideButtons() ButtonsAides { 83 bs := ButtonsAides{} 84 bs.Documents = ButtonActivated 85 bs.AfficherStructures = ButtonActivated 86 bs.Exporter = ButtonPresent 87 if len(c.Liste) > 0 { 88 bs.Exporter = ButtonActivated 89 } 90 if c.EditRight { 91 bs.Creer = ButtonActivated 92 if c.Etat.AideCurrent != nil { 93 bs.Supprimer = ButtonActivated 94 } else { 95 bs.Supprimer = ButtonPresent 96 } 97 } 98 return bs 99 } 100 101 // StatsAides renvoi les statistiques courantes 102 func (c *Aides) GetStats() []Stat { 103 return []Stat{ 104 {Label: "Nombre d'aides", Value: strconv.Itoa(len(c.Base.Aides))}, 105 {Label: "Nombre d'organismes", Value: strconv.Itoa(len(c.Base.Structureaides))}, 106 } 107 } 108 109 // JobCreeAide demande au serveur l'ajout de l'aide. 110 // Peut être utilisé de manière synchrone. 111 // Sinon, préférer `CreeAide` 112 func JobCreeAide(aide rd.Aide) (rd.Aide, error) { 113 var out rd.Aide 114 err := requete(apiserver.UrlAides, http.MethodPut, aide, &out) 115 return out, err 116 } 117 118 // CreeAide crée une nouvelle aide de manière asynchrone, sur le serveur 119 func (c *Aides) CreeAide(aide rd.Aide) { 120 job := func() (interface{}, error) { 121 return JobCreeAide(aide) 122 } 123 onSuccess := func(_out interface{}) { 124 out := _out.(rd.Aide) 125 c.Base.Aides[out.Id] = out 126 c.main.ShowStandard("Aide ajoutée avec succès.", false) 127 c.Reset() 128 } 129 c.main.ShowStandard("Création de l'aide...", true) 130 c.main.Background.Run(job, onSuccess) 131 } 132 133 // UpdateAide met à jour de manière synchrone l'aide transmise sur le serveur 134 func (c *Aides) UpdateAide(aide rd.Aide) { 135 job := func() (interface{}, error) { 136 var out rd.Aide 137 err := requete(apiserver.UrlAides, http.MethodPost, aide, &out) 138 return out, err 139 } 140 onSuccess := func(_out interface{}) { 141 out := _out.(rd.Aide) 142 c.Base.Aides[out.Id] = out 143 c.main.ShowStandard("Aide mise à jour avec succès.", false) 144 c.main.ResetAllControllers() 145 } 146 c.main.ShowStandard("Mise à jour de l'aide...", true) 147 c.main.Background.Run(job, onSuccess) 148 } 149 150 // SupprimeAide supprime l'aide de manière asynchrone, sans confirmation 151 func (c *Aides) SupprimeAide(idAide int64) { 152 job := func() (interface{}, error) { 153 var out []int64 154 err := requete(apiserver.UrlAides, http.MethodDelete, IdAsParams(idAide), &out) 155 return out, err 156 } 157 onSuccess := func(_out interface{}) { 158 out := _out.([]int64) 159 delete(c.Base.Aides, idAide) 160 msg := "Aide supprimée avec succès." 161 for _, idDoc := range out { 162 delete(c.Base.Documents, idDoc) 163 } 164 if len(out) > 0 { 165 msg += " %d document(s) associés supprimés." 166 } 167 c.main.ShowStandard(msg, false) 168 c.main.ResetAllControllers() 169 } 170 c.main.ShowStandard("Suppression de l'aide...", true) 171 c.main.Background.Run(job, onSuccess) 172 } 173 174 // SupprimeAideCourante supprime l'aide courante, après confirmation 175 func (c *Aides) SupprimeAideCourante() { 176 if c.Etat.AideCurrent == nil { 177 return 178 } 179 idAide := c.Etat.AideCurrent.Int64() 180 if !c.Onglet.ConfirmeSupprimeAide(c.Base.NewAide(idAide)) { 181 c.main.ShowStandard("Suppression annulée.", false) 182 return 183 } 184 185 c.Etat.AideCurrent = nil 186 c.SupprimeAide(idAide) 187 } 188 189 // -------------------------- Structures -------------------------- 190 191 // CreeStructureaide crée une nouvelle structure sur le serveur, SYNCHRONE 192 func (c *Aides) CreeStructureaide(strucAide rd.Structureaide) (dm.AccesStructureaide, bool) { 193 c.main.ShowStandard("Création de la structure d'aide...", true) 194 var out rd.Structureaide 195 err := requete(apiserver.UrlStructureaides, http.MethodPut, strucAide, &out) 196 if err != nil { 197 c.main.ShowError(err) 198 return dm.AccesStructureaide{}, false 199 } 200 c.Base.Structureaides[out.Id] = out 201 c.main.ShowStandard("Structure ajoutée avec succès.", false) 202 c.Reset() 203 return c.Base.NewStructureaide(out.Id), true 204 } 205 206 // UpdateStructureaide met à jour la structure transmise sur le serveur 207 func (c *Aides) UpdateStructureaide(structAide rd.Structureaide) { 208 job := func() (interface{}, error) { 209 var out rd.Structureaide 210 err := requete(apiserver.UrlStructureaides, http.MethodPost, structAide, &out) 211 return out, err 212 } 213 onSuccess := func(_out interface{}) { 214 out := _out.(rd.Structureaide) 215 c.Base.Structureaides[out.Id] = out 216 c.main.ShowStandard("Structure mise à jour avec succès.", false) 217 c.main.ResetAllControllers() 218 219 } 220 c.main.ShowStandard("Mise à jour de la structure d'aide...", true) 221 c.main.Background.Run(job, onSuccess) 222 } 223 224 // SupprimeStructureaide supprime la structure, après confirmation 225 func (c *Aides) SupprimeStructureaide(idStructure int64) bool { 226 var nbAides int 227 for _, aide := range c.Base.Aides { 228 if aide.IdStructureaide == idStructure { 229 nbAides += 1 230 } 231 } 232 msg := "Voulez-vous vraiment <b>supprimer</b> la structure ?" 233 if nbAides > 0 { 234 msg += fmt.Sprintf("<br/>Attention, <b>%d</b> aides liées seront supprimées !", nbAides) 235 } 236 if !c.Onglet.ConfirmeSupprimeStructureaide(msg) { 237 c.main.ShowStandard("Suppression annulée", false) 238 return false 239 } 240 241 var out apiserver.DeleteStructureaideOut 242 err := requete(apiserver.UrlStructureaides, http.MethodDelete, IdAsParams(idStructure), &out) 243 if err != nil { 244 c.main.ShowError(err) 245 return false 246 } 247 delete(c.Base.Structureaides, idStructure) 248 msg = "Structure supprimée avec succès." 249 for _, idAide := range out.IdsAides { 250 delete(c.Base.Aides, idAide) 251 } 252 c.Base.CleanupDocuments(out.IdsDocuments) 253 if L := len(out.IdsAides); L > 0 { 254 msg += fmt.Sprintf(" %d aides(s) associées supprimées.", L) 255 } 256 c.main.ShowStandard(msg, false) 257 c.main.ResetAllControllers() 258 return true 259 } 260 261 func (c *Aides) ExportAides() string { 262 if len(c.Liste) == 0 { 263 c.main.ShowError(errors.New("Aucune aide choisie !")) 264 return "" 265 } 266 path, err := table.GenereListeAides(c.Header, c.Liste, LocalFolder) 267 if err != nil { 268 c.main.ShowError(fmt.Errorf("Impossible de générer la liste des aides : %s", err)) 269 return "" 270 } 271 c.main.ShowStandard(fmt.Sprintf("Liste générée dans %s", path), false) 272 return path 273 } 274 275 // SelectAide sélectionne l'aide donnée, en remettant à zéro la recherche 276 // si nécessaire. 277 func (c *Aides) SelectAide(aide dm.AccesAide) { 278 if _, in := c.Base.Aides[aide.Id]; !in { 279 c.main.ShowError(fmt.Errorf("L'aide demandée (id %d) n'est pas dans la base !", aide.Id)) 280 return 281 } 282 c.Etat.AideCurrent = rd.Id(aide.Id) 283 284 if !HasId(c.Liste, rd.Id(aide.Id)) { 285 c.Etat = EtatAides{} // remet à zéro les critères 286 c.resetData() 287 } 288 c.Onglet.GrabFocus() 289 c.ResetRender() 290 }