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  }