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

     1  package directeurs
     2  
     3  import (
     4  	"sort"
     5  
     6  	rd "github.com/benoitkugler/goACVE/server/core/rawdata"
     7  )
     8  
     9  func (dr DriverCampComplet) loadSondages() ([]SondageParts, error) {
    10  	sondages, err := rd.SelectSondagesByIdCamps(dr.DB, dr.camp.Id)
    11  	if err != nil {
    12  		return nil, err
    13  	}
    14  	// on ajoute du contexte : responsable et participants
    15  	rows, err := dr.DB.Query(`SELECT factures.* FROM factures 
    16  		JOIN sondages ON sondages.id_facture = factures.id 
    17  		WHERE sondages.id_camp = $1`, dr.camp.Id)
    18  	if err != nil {
    19  		return nil, err
    20  	}
    21  	factures, err := rd.ScanFactures(rows)
    22  	if err != nil {
    23  		return nil, err
    24  	}
    25  	rows, err = dr.DB.Query(`SELECT * FROM participants 
    26  		WHERE participants.id_facture = ANY($1) AND participants.id_camp = $2`,
    27  		factures.Ids().AsSQL(), dr.camp.Id)
    28  	if err != nil {
    29  		return nil, err
    30  	}
    31  	participants, err := rd.ScanParticipants(rows)
    32  	if err != nil {
    33  		return nil, err
    34  	}
    35  	rows, err = dr.DB.Query(`SELECT personnes.* FROM personnes 
    36  		JOIN factures ON factures.id_personne = personnes.id
    37  		WHERE factures.id = ANY($1)
    38  		UNION
    39  		SELECT personnes.* FROM personnes
    40  		JOIN participants ON participants.id_personne = personnes.id
    41  		WHERE participants.id = ANY($2)`, factures.Ids().AsSQL(), participants.Ids().AsSQL())
    42  	if err != nil {
    43  		return nil, err
    44  	}
    45  	personnes, err := rd.ScanPersonnes(rows)
    46  	if err != nil {
    47  		return nil, err
    48  	}
    49  	cache, _ := participants.Resoud()
    50  	var out []SondageParts
    51  	for _, sondage := range sondages {
    52  		var sd SondageParts
    53  		respo := personnes[factures[sondage.IdFacture].IdPersonne]
    54  		sd.Responsable = respo.NomPrenom()
    55  		sd.Mail = respo.Mail
    56  		for _, idPart := range cache[sondage.IdFacture] {
    57  			part := personnes[participants[idPart].IdPersonne]
    58  			sd.Participants = append(sd.Participants, part.NomPrenom())
    59  		}
    60  		sd.Sondage = sondage
    61  		out = append(out, sd)
    62  	}
    63  	sort.Slice(out, func(i, j int) bool {
    64  		return out[i].Modified.Before(out[j].Modified)
    65  	})
    66  	return out, nil
    67  }