github.com/benoitkugler/goacve@v0.0.0-20201217100549-151ce6e55dc8/client/GUI/onglets/paiements.go (about) 1 package onglets 2 3 import ( 4 "fmt" 5 "time" 6 7 "github.com/benoitkugler/goACVE/server/core/documents" 8 9 "github.com/benoitkugler/goACVE/client/GUI/fields" 10 11 "github.com/benoitkugler/goACVE/client/GUI/lists" 12 "github.com/therecipe/qt/core" 13 14 "github.com/benoitkugler/goACVE/client/GUI/basic" 15 "github.com/benoitkugler/goACVE/client/controllers" 16 "github.com/therecipe/qt/widgets" 17 18 "github.com/benoitkugler/goACVE/client/GUI/common" 19 20 rd "github.com/benoitkugler/goACVE/server/core/rawdata" 21 22 dm "github.com/benoitkugler/goACVE/server/core/datamodel" 23 ) 24 25 const valeurDefautAcompte = 45 26 27 func (p *Paiements) Render() { 28 p.paiements.Model().SetData(p.controller.ListePaiements) 29 p.factures.Model().SetData(p.controller.ListeFactures) 30 if p.controller.Etat.PaiementCurrent != nil { 31 p.paiements.SelectRow(p.controller.Etat.PaiementCurrent) 32 } 33 cFac, cB := p.controller.Etat.CriterePaiementFacture, p.controller.Etat.CriterePaiementBordereau 34 var lab string 35 if cFac.IsNotNil() { 36 fac := p.controller.Base.NewFacture(cFac.Int64) 37 lab = "Dossier " + fac.GetPersonne().RawData().NomPrenom().String() 38 } 39 if !cB.Time().IsZero() { 40 lab += " Emis le " + cB.String() 41 } 42 if lab == "" { 43 lab = "Aucun critère" 44 } 45 p.resets.SetChecked(lab != "") 46 p.resets.SetText(lab) 47 p.resets.SetEnabled(lab != "") 48 49 p.critereValide.SetData(p.controller.Etat.CriterePaiementValide) 50 p.critereAcquite.SetData(p.controller.Etat.CritereFactureAcquittee) 51 p.critereCamp.SetData(p.controller.Etat.CritereFactureCamp) 52 } 53 54 func (p *Paiements) ConfirmeSupprimePaiement(toSupp dm.AccesPaiement) bool { 55 _, camps := toSupp.GetFacture().Camps(nil) 56 msg := "Etes-vous sur de vouloir supprimer ce paiement ?<br/>" + 57 fmt.Sprintf("Il est lié au dossier de <b>%s</b> (%s)", 58 toSupp.GetFacture().GetPersonne().RawData().NomPrenom(), 59 camps) 60 return basic.Confirmation(msg, "Supprimer", basic.ONDelete) 61 } 62 63 func (p *Paiements) ConfirmeExportPaiements(alreadyExported []rd.Paiement, nb int) (keep bool, simpleHeader bool, marque bool) { 64 msg := fmt.Sprintf("Vous êtes sur le point d'exporter <b>%d</b> paiement(s).", nb) 65 if len(alreadyExported) > 0 { 66 msg += "<br/>Les paiements suivants ont déjà été émis en bordereau : <br/>" 67 for _, p := range alreadyExported { 68 s1, s2 := p.Description() 69 msg += fmt.Sprintf("%s de <b>%s</b><br/>", s1, s2) 70 } 71 } 72 header := widgets.NewQCheckBox2("Colonnes simplifiées", nil) 73 m := widgets.NewQCheckBox2("Marquer comme émis", nil) 74 valid := basic.Button("Exporter") 75 valid.SetObjectName(basic.ONAction) 76 dial := basic.Dialog("Exporter les paiements") 77 valid.ConnectClicked(func(_ bool) { 78 dial.Accept() 79 }) 80 s := widgets.NewQScrollArea(nil) 81 lab := basic.Label(msg) 82 s.SetWidget(lab) 83 s.SetMinimumSize2(450, 150) 84 dial.Layout().AddWidget(s) 85 dial.Layout().AddWidget(header) 86 dial.Layout().AddWidget(m) 87 dial.Layout().AddWidget(valid) 88 89 return dial.Exec() > 0, header.IsChecked(), m.IsChecked() 90 } 91 92 type Paiements struct { 93 *widgets.QFrame 94 controller *controllers.Paiements 95 parent *widgets.QTabWidget 96 toolbar *widgets.QToolBar 97 98 paiements lists.Table 99 factures lists.Table 100 101 critereValide fields.OptionnalBool 102 resets *widgets.QPushButton 103 critereCamp *fields.BoutonId 104 critereAcquite fields.OptionnalBool 105 } 106 107 func newPaiements(ct *controllers.Paiements) *Paiements { 108 p := Paiements{QFrame: basic.Frame(), controller: ct} 109 p.paiements = lists.Table{ 110 Liste: lists.Liste{ 111 Headers: ct.HeaderPaiements, 112 OnClick: func(acces rd.Item, _ int) { 113 ct.Etat.PaiementCurrent = acces.Id 114 p.UpdateToolbar() 115 }, 116 OnDoubleClick: func(acces rd.Item, index int) { 117 p.edit(acces) 118 }, 119 OnRightClick: func(acces rd.Item, pos *core.QPoint) { 120 acPaie := ct.Base.NewPaiement(acces.Id.Int64()) 121 menu := widgets.NewQMenu(p.paiements) 122 fac := acPaie.GetFacture() 123 ac := menu.AddAction("Aller à la facture") 124 ac.ConnectTriggered(func(_ bool) { 125 p.factures.SelectRow(rd.IdFacture(fac.Id)) 126 }) 127 ac = menu.AddAction("Afficher les paiements émis avec") 128 ac.ConnectTriggered(func(_ bool) { 129 ct.Etat.CriterePaiementBordereau = acPaie.RawData().InBordereau 130 ct.Reset() 131 }) 132 p.paiements.ShowContextMenu(menu, pos) 133 }, 134 OnSort: func(field rd.Field, reverse bool) { 135 lists.DefaultSort(p.paiements, field, reverse) 136 }, 137 }, 138 } 139 p.resets = basic.Button("") 140 p.resets.SetCheckable(true) 141 p.resets.ConnectClicked(func(checked bool) { 142 if !checked { 143 ct.Etat.CriterePaiementFacture = rd.OptionnalId{} 144 ct.Etat.CriterePaiementBordereau = rd.Time{} 145 ct.Reset() 146 } 147 }) 148 p.critereValide = fields.NewOptionnalBool(true, "Valide", "Invalide") 149 p.critereValide.ConnectCurrentIndexChanged(func(_ int) { 150 ct.Etat.CriterePaiementValide = p.critereValide.GetData() 151 ct.Reset() 152 }) 153 154 rh := widgets.NewQHBoxLayout() 155 rh.AddWidget(basic.Label("Etat :"), 1, 0) 156 rh.AddWidget(p.critereValide, 1, 0) 157 rh.AddWidget(p.resets, 0, 0) 158 p.paiements.RightHeader = rh 159 p.paiements.Init() 160 161 p.factures = lists.Table{ 162 Liste: lists.Liste{ 163 Headers: ct.HeaderFactures, 164 OnRightClick: func(acces rd.Item, pos *core.QPoint) { 165 menu := widgets.NewQMenu(p.factures) 166 ac := menu.AddAction("Sélectionner les paiements associés") 167 ac.ConnectTriggered(func(_ bool) { 168 ct.Etat.CriterePaiementFacture = rd.NewOptionnalId(acces.Id.Int64()) 169 ct.Reset() 170 }) 171 ac = menu.AddAction("Aller au responsable") 172 ac.ConnectTriggered(func(_ bool) { 173 pers := ct.Base.NewFacture(acces.Id.Int64()).GetPersonne() 174 ct.Main().Controllers.Personnes.SelectPersonne(pers) 175 }) 176 p.factures.ShowContextMenu(menu, pos) 177 }, 178 OnDoubleClick: func(acces rd.Item, index int) { 179 ac := ct.Base.NewFacture(acces.Id.Int64()) 180 meta := documents.Facture{ 181 Destinataire: ac.GetPersonne().RawData().ToDestinataire(), 182 Bilan: ac.EtatFinancier(dm.CacheEtatFinancier{}, true), 183 } 184 path := ct.Main().GenereExportDocument(meta) 185 if path != "" { 186 basic.ShowFile(path) 187 } 188 }, 189 OnSort: func(field rd.Field, reverse bool) { 190 lists.DefaultSort(p.factures, field, reverse) 191 }, 192 }, 193 } 194 p.factures.Init() 195 p.factures.HorizontalHeader().SetMinimumSectionSize(180) 196 p.critereCamp = fields.NewBoutonIdCamp(true, ct.Base) 197 p.critereCamp.DataChanged = func() { 198 ct.Etat.CritereFactureCamp = p.critereCamp.GetData() 199 ct.Reset() 200 } 201 tb := widgets.NewQToolButton(nil) 202 tb.SetIcon(basic.Icons.Delete) 203 tb.ConnectClicked(func(_ bool) { 204 p.critereCamp.SetData(nil) 205 ct.Etat.CritereFactureCamp = nil 206 ct.Reset() 207 }) 208 p.critereAcquite = fields.NewOptionnalBool(true, "Acquitté", "Non acquitté") 209 p.critereAcquite.ConnectCurrentIndexChanged(func(_ int) { 210 ct.Etat.CritereFactureAcquittee = p.critereAcquite.GetData() 211 ct.Reset() 212 }) 213 lay := widgets.NewQGridLayout(p) 214 lay.AddWidget3(p.paiements, 0, 0, 1, 4, 0) 215 lay.AddWidget2(basic.Label("Etat :"), 1, 0, 0) 216 lay.AddWidget2(p.critereAcquite, 1, 1, 0) 217 lay.AddWidget2(basic.Label("Camp :"), 2, 0, 0) 218 lay.AddWidget2(p.critereCamp, 2, 1, 0) 219 lay.AddWidget2(tb, 2, 2, core.Qt__AlignLeft) 220 lay.AddWidget3(p.factures, 1, 3, 3, 1, 0) 221 lay.SetRowStretch(0, 3) 222 lay.SetRowStretch(3, 2) 223 return &p 224 } 225 226 func (p *Paiements) cree() { 227 paie := CreePaiement(p.controller.Base, rd.OptionnalId{}, InitialPaiement{}) 228 if paie != nil { 229 p.controller.CreePaiement(*paie) 230 } 231 } 232 233 func (p *Paiements) creeFromVirement() { 234 d := basic.Dialog2("Ajouter un virement") 235 entry := fields.NewInt(true) 236 valid := basic.Button("Ajouter...") 237 valid.SetObjectName(basic.ONAdd) 238 valid.ConnectClicked(func(_ bool) { 239 d.Accept() 240 }) 241 layout := widgets.NewQFormLayout(d) 242 layout.AddRow5(basic.Label("<i>Recopier le numéro du virement (ACVE: XXXXXX)<i>")) 243 layout.AddRow3("Numéro", entry) 244 layout.AddRow5(valid) 245 basic.Delay(entry.SelectAll) 246 if d.Exec() == 0 { 247 return 248 } 249 250 fac, ok := p.controller.IdentifieVirement(int(entry.GetData())) 251 if !ok { 252 return 253 } 254 paie := CreePaiement(p.controller.Base, rd.NewOptionnalId(fac.Id), InitialPaiement{ 255 IsAcompte: false, IsVirement: true, LabelPayeur: fac.GetPersonne().RawData().NomPrenom().String(), 256 }) 257 if paie != nil { 258 p.controller.CreePaiement(*paie) 259 } 260 } 261 262 func (p *Paiements) supprimer() { 263 p.controller.SupprimePaiement() 264 } 265 266 func (p *Paiements) exportBordereau() { 267 path := p.controller.ExportPaiements(p.paiements.Selection()) 268 if path != "" { 269 basic.ShowFile(path) 270 } 271 } 272 273 func (p *Paiements) edit(acces rd.Item) { 274 paie := p.controller.Base.Paiements[acces.Id.Int64()] 275 modif := EditPaiement(p.controller.Base, p.controller.EditRight, paie, rd.NewOptionnalId(paie.IdFacture)) 276 if modif != nil { 277 p.controller.UpdatePaiement(*modif) 278 } 279 } 280 281 func EditPaiement(base *dm.BaseLocale, editable bool, paiement rd.Paiement, idFacture rd.OptionnalId) *rd.Paiement { 282 fiche := common.NewFichePaiement(base, editable) 283 fiche.SetData(paiement, idFacture) 284 det := common.NewDetails(&fiche, editable) 285 if det.Exec() == 0 { 286 return nil 287 } 288 paie := fiche.GetData() 289 return &paie 290 } 291 292 // InitialPaiement regroupe les champs 293 // qu'on peut pré-remplir lors de l'ajout d'un paiement. 294 type InitialPaiement struct { 295 IsAcompte bool 296 IsVirement bool 297 LabelPayeur string 298 } 299 300 func (ip InitialPaiement) Instancie() rd.Paiement { 301 now := time.Now() 302 paiement := rd.Paiement{ 303 IsAcompte: rd.Bool(ip.IsAcompte), 304 DateReglement: rd.Time(now), 305 LabelPayeur: rd.String(ip.LabelPayeur), 306 } 307 if ip.IsVirement { 308 paiement.ModePaiement = rd.MPVirement 309 } 310 if ip.IsAcompte { 311 paiement.Valeur = valeurDefautAcompte 312 } 313 return paiement 314 } 315 316 func CreePaiement(base *dm.BaseLocale, idFacture rd.OptionnalId, options InitialPaiement) *rd.Paiement { 317 initialPaiement := options.Instancie() 318 return EditPaiement(base, true, initialPaiement, idFacture) 319 }