github.com/benoitkugler/goacve@v0.0.0-20201217100549-151ce6e55dc8/server/recufiscal/main.go (about)

     1  package recufiscal
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"sort"
     7  	"time"
     8  
     9  	dm "github.com/benoitkugler/goACVE/server/core/datamodel"
    10  	"github.com/benoitkugler/goACVE/server/core/documents"
    11  	rd "github.com/benoitkugler/goACVE/server/core/rawdata"
    12  	"github.com/benoitkugler/goACVE/server/core/utils/table"
    13  	"github.com/lib/pq"
    14  )
    15  
    16  // GenereRecuFiscaux :
    17  // 	- rassemble les dons (donateurs : personnes)
    18  // 	- crée les étiquettes et les reçus fiscaux
    19  //	- génère les adresses mails dans un CSV
    20  // 	- met à jour les dons
    21  //	- renvoie les dons mis à jour et l'archive des documents créés
    22  func GenereRecuFiscaux(db rd.DB, params dm.OptionsRecuFiscal) (dons rd.Dons, zipArchive *bytes.Buffer, err error) {
    23  	dons, err = rd.SelectAllDons(db)
    24  	if err != nil {
    25  		return
    26  	}
    27  	donateurs, err := rd.SelectAllDonDonateurs(db)
    28  	if err != nil {
    29  		return
    30  	}
    31  	selection := params.Select(dons, donateurs.ByIdDon())
    32  	var idsPersonnes pq.Int64Array
    33  	for id := range selection.Recus {
    34  		idsPersonnes = append(idsPersonnes, id)
    35  	}
    36  	rows, err := db.Query("SELECT * FROM personnes WHERE id = ANY($1)", idsPersonnes)
    37  	if err != nil {
    38  		return
    39  	}
    40  	personnes, err := rd.ScanPersonnes(rows)
    41  	if err != nil {
    42  		return
    43  	}
    44  	archive := documents.NewArchiveZip()
    45  	etiquettes := make([]rd.BasePersonne, 0, len(selection.Recus))
    46  	var pdfBytes []byte
    47  	for idDonateur, r := range selection.Recus {
    48  		donateur := personnes[idDonateur]
    49  		pdfBytes, err = RempliPdf(RecuFiscal{RecuFiscal: r, Donateur: donateur})
    50  		if err != nil {
    51  			return
    52  		}
    53  		archive.AddFile(fmt.Sprintf("recu_%s.pdf", donateur.NomPrenom()), bytes.NewReader(pdfBytes))
    54  		etiquettes = append(etiquettes, donateur.BasePersonne)
    55  	}
    56  
    57  	// etiquettes
    58  	sort.Slice(etiquettes, func(i, j int) bool { // par ordre alphabétique
    59  		return etiquettes[i].NomPrenom() < etiquettes[j].NomPrenom()
    60  	})
    61  	bytesEtiquette, err := GenereEtiquettes(etiquettes)
    62  	if err != nil {
    63  		return
    64  	}
    65  	archive.AddFile("etiquettes.pdf", bytes.NewReader(bytesEtiquette))
    66  
    67  	// mails
    68  	liste := make(rd.Table, len(etiquettes))
    69  	for i, e := range etiquettes {
    70  		liste[i] = e.MailItem()
    71  	}
    72  	outMails := new(bytes.Buffer)
    73  	if err = table.GenerateCsv(rd.HeadersMails, liste, outMails); err != nil {
    74  		return
    75  	}
    76  	archive.AddFile("mails.csv", outMails)
    77  
    78  	zipArchive, err = archive.Close()
    79  	if err != nil {
    80  		return
    81  	}
    82  
    83  	rows, err = db.Query("UPDATE dons SET recu_emis = $1 WHERE id = ANY($2) RETURNING *",
    84  		time.Now(), selection.IdsDons.AsSQL())
    85  	if err != nil {
    86  		return
    87  	}
    88  	dons, err = rd.ScanDons(rows)
    89  	if err != nil {
    90  		return
    91  	}
    92  
    93  	return
    94  }