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  }