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 }