github.com/benoitkugler/goacve@v0.0.0-20201217100549-151ce6e55dc8/client/GUI/onglets/aides.go (about)

     1  package onglets
     2  
     3  import (
     4  	"fmt"
     5  
     6  	dm "github.com/benoitkugler/goACVE/server/core/datamodel"
     7  	rd "github.com/benoitkugler/goACVE/server/core/rawdata"
     8  
     9  	"github.com/therecipe/qt/core"
    10  
    11  	"github.com/benoitkugler/goACVE/client/GUI/fields"
    12  
    13  	"github.com/benoitkugler/goACVE/client/GUI/basic"
    14  	"github.com/benoitkugler/goACVE/client/GUI/common"
    15  	"github.com/benoitkugler/goACVE/client/GUI/lists"
    16  	"github.com/benoitkugler/goACVE/client/controllers"
    17  	"github.com/therecipe/qt/widgets"
    18  )
    19  
    20  func (t *Aides) Render() {
    21  	t.liste.Model().SetData(t.controller.Liste)
    22  	t.liste.SetSearch(t.controller.Etat.Recherche)
    23  	if t.controller.Etat.AideCurrent != nil {
    24  		t.liste.SelectRow(t.controller.Etat.AideCurrent)
    25  	}
    26  	t.stats.SetData(t.controller.GetStats())
    27  	t.valide.SetData(t.controller.Etat.CritereValide)
    28  	t.camp.SetData(t.controller.Etat.CritereCamp)
    29  }
    30  
    31  func (t *Aides) ConfirmeSupprimeAide(aide dm.AccesAide) bool {
    32  	doc := aide.GetDocuments()
    33  	msg := fmt.Sprintf("Confirmez-vous la suppression de l'aide attribuée par <i>%s</i> à <b>%s</b> ?",
    34  		aide.GetStructureaide().RawData().Nom, aide.GetParticipant().GetPersonne().RawData().NomPrenom())
    35  	if len(doc) == 1 {
    36  		msg += "<br/><i>une</i> pièce justificative sera aussi supprimée."
    37  	} else if len(doc) > 1 {
    38  		msg += fmt.Sprintf("<br/><i>%d</i> pièces justificatives seront aussi supprimées.", len(doc))
    39  	}
    40  	return basic.Confirmation(msg, "Supprimer", basic.ONDelete)
    41  }
    42  
    43  func (t *Aides) ConfirmeSupprimeStructureaide(msg string) bool {
    44  	return basic.Confirmation(msg, "Supprimer", basic.ONDelete)
    45  }
    46  
    47  type Aides struct {
    48  	*widgets.QFrame
    49  	controller *controllers.Aides
    50  	parent     *widgets.QTabWidget
    51  	toolbar    *widgets.QToolBar
    52  
    53  	liste  lists.Table
    54  	stats  common.Statistics
    55  	valide fields.OptionnalBool
    56  	camp   fields.Camp
    57  }
    58  
    59  func newAides(ct *controllers.Aides) *Aides {
    60  	p := Aides{QFrame: basic.Frame(), controller: ct}
    61  
    62  	p.liste = lists.Table{
    63  		Liste: lists.Liste{
    64  			Headers: ct.Header,
    65  			OnClick: func(acces rd.Item, _ int) {
    66  				ct.Etat.AideCurrent = acces.Id
    67  				p.UpdateToolbar()
    68  			},
    69  			OnDoubleClick: func(acces rd.Item, _ int) {
    70  				p.editAide(acces.Id.Int64())
    71  			},
    72  			OnRightClick: func(acces rd.Item, pos *core.QPoint) {
    73  				aide := ct.Base.NewAide(acces.Id.Int64())
    74  				if fac, has := aide.GetParticipant().GetFacture(); has {
    75  					menu := widgets.NewQMenu(p.liste)
    76  					menu.AddAction("Aller au dossier").ConnectTriggered(func(bool) {
    77  						ct.Main().Controllers.SuiviDossiers.SelectFacture(fac)
    78  					})
    79  					p.liste.ShowContextMenu(menu, pos)
    80  				}
    81  			},
    82  			OnSearch: func(pattern string) {
    83  				ct.Etat.Recherche = pattern
    84  				ct.Reset()
    85  			},
    86  			OnSort: func(field rd.Field, reverse bool) {
    87  				lists.DefaultSort(p.liste, field, reverse)
    88  			},
    89  		},
    90  	}
    91  	p.liste.Init()
    92  	p.liste.HorizontalHeader().SetMinimumSectionSize(200)
    93  	p.stats = common.NewStatistics(true)
    94  	p.valide = fields.NewOptionnalBool(true, "Validées", "Non validées")
    95  	p.valide.ConnectActivated(func(_ int) {
    96  		ct.Etat.CritereValide = p.valide.GetData()
    97  		ct.Reset()
    98  	})
    99  
   100  	p.camp = fields.NewCamp(true, ct.Base, true)
   101  	p.camp.ShowTerminated(false)
   102  	p.camp.ConnectActivated(func(_ int) {
   103  		ac := p.camp.GetData()
   104  		var optId rd.OptionnalId
   105  		if ac != nil {
   106  			optId = rd.NewOptionnalId(ac.Id)
   107  		}
   108  		ct.Etat.CritereCamp = optId
   109  		ct.Reset()
   110  	})
   111  	showTerminated := widgets.NewQCheckBox2("Afficher les camps terminés", nil)
   112  	showTerminated.ConnectClicked(p.camp.ShowTerminated)
   113  
   114  	butons := widgets.NewQHBoxLayout()
   115  	butons.AddWidget(basic.Label("Choix du camp :"), 1, 0)
   116  	butons.AddWidget(p.camp, 1, core.Qt__AlignLeft)
   117  	butons.AddWidget(showTerminated, 1, core.Qt__AlignLeft)
   118  	butons.AddStretch(5)
   119  	butons.AddWidget(basic.Label("Etat des aides"), 1, core.Qt__AlignRight)
   120  	butons.AddWidget(p.valide, 1, 0)
   121  	lay := widgets.NewQVBoxLayout2(p)
   122  	lay.AddWidget(p.stats, 0, 0)
   123  	lay.AddLayout(butons, 0)
   124  	lay.AddWidget(p.liste, 2, 0)
   125  	return &p
   126  }
   127  
   128  func (t *Aides) creer() {
   129  	aide := CreeAide(t.controller.Base, rd.OptionnalId{})
   130  	if aide == nil {
   131  		return
   132  	}
   133  	t.controller.CreeAide(*aide)
   134  }
   135  func (t *Aides) afficherStructures() {
   136  	f := newListeStructures(t.controller)
   137  	dial := basic.Dialog("Structures d'aide")
   138  	dial.Layout().AddWidget(f)
   139  	dial.Exec()
   140  }
   141  
   142  func (t *Aides) afficherDocuments() {
   143  	d := common.NewDocuments(t.controller.Main(), t.controller.EditRight, true)
   144  	d.SetModal(true)
   145  	d.Show()
   146  	d.RenderDocuments()
   147  }
   148  
   149  func (t *Aides) supprimer() {
   150  	t.controller.SupprimeAideCourante()
   151  }
   152  
   153  func (t *Aides) exporter() {
   154  	path := t.controller.ExportAides()
   155  	if path == "" {
   156  		return
   157  	}
   158  	basic.ShowFile(path)
   159  }
   160  
   161  func (t *Aides) editAide(id int64) {
   162  	aide := t.controller.Base.Aides[id]
   163  	modif := EditAide(t.controller.Base, t.controller.EditRight, aide,
   164  		rd.NewOptionnalId(aide.IdParticipant),
   165  		rd.NewOptionnalId(aide.IdStructureaide),
   166  	)
   167  	if modif == nil {
   168  		return
   169  	}
   170  	t.controller.UpdateAide(*modif)
   171  }
   172  
   173  // CreeAide propose la création d'une aide.
   174  // En cas d'annulation, out vaut `nil`
   175  func CreeAide(base *dm.BaseLocale, idParticipant rd.OptionnalId) *rd.Aide {
   176  	return EditAide(base, true, rd.Aide{
   177  		Valide:  true,
   178  		ParJour: true,
   179  	}, idParticipant, rd.OptionnalId{})
   180  }
   181  
   182  func EditAide(base *dm.BaseLocale, editable bool, aide rd.Aide,
   183  	idParticipant rd.OptionnalId, idStructureaide rd.OptionnalId) *rd.Aide {
   184  	d := common.NewFicheAide(base, editable)
   185  	d.SetData(aide, idParticipant, idStructureaide)
   186  	dialog := common.NewDetails(&d, editable)
   187  	if dialog.Exec() == 0 {
   188  		return nil
   189  	}
   190  	aide = d.GetData()
   191  	return &aide
   192  }
   193  
   194  // ------------------- Structures -------------------
   195  
   196  func newListeStructures(ct *controllers.Aides) *lists.Table {
   197  	t := lists.Table{
   198  		Liste: lists.Liste{
   199  			Headers: []rd.Header{
   200  				{Field: dm.StructureaideNom, Label: "Nom"},
   201  				{Field: dm.StructureaideImmatriculation, Label: "Immatriculation"},
   202  			},
   203  			OnDoubleClick: func(acces rd.Item, _ int) {
   204  				s := editStructure(ct.Base.Structureaides[acces.Id.Int64()], ct.EditRight)
   205  				if s == nil {
   206  					return
   207  				}
   208  				ct.UpdateStructureaide(*s)
   209  			},
   210  		},
   211  	}
   212  	resetListe := func() {
   213  		t.Model().SetData(ct.Base.RechercheRapideStructureaides("*"))
   214  	}
   215  	if ct.EditRight {
   216  		t.OnAdd = func() {
   217  			ne := editStructure(rd.Structureaide{}, true)
   218  			if ne != nil {
   219  				ct.CreeStructureaide(*ne)
   220  				resetListe()
   221  			}
   222  		}
   223  		t.OnDelete = func(acces rd.Item, _ int) {
   224  			ct.SupprimeStructureaide(acces.Id.Int64())
   225  			resetListe()
   226  		}
   227  	}
   228  	t.Init()
   229  	resetListe()
   230  	return &t
   231  }
   232  
   233  func editStructure(s rd.Structureaide, editable bool) *rd.Structureaide {
   234  	f := common.NewFicheStructureaide(editable)
   235  	f.SetData(s)
   236  	det := common.NewDetails(&f, editable)
   237  	if det.Exec() == 0 {
   238  		return nil
   239  	}
   240  	s = f.GetData()
   241  	return &s
   242  }