diff --git a/database/structure.sql b/database/structure.sql index d853b5a..59c0d4d 100644 --- a/database/structure.sql +++ b/database/structure.sql @@ -100,7 +100,7 @@ LEFT JOIN recettes ON "xAssociationRecette-Vol".recetteId = recettes.recetteId LEFT JOIN demandeRemboursementSoumises ON recettes.identifiantFormulaireSoumissionCe = demandeRemboursementSoumises.demandeId LEFT JOIN sortie ON vol.sortie = sortie.sortieId WHERE vol.typeDeVol != "Entrainement" -ORDER BY idSortie, idRecette, volId; +ORDER BY idSortie, volId, idRecette; -- View: factures CREATE VIEW IF NOT EXISTS factures AS SELECT diff --git a/src/AeroDmsTypes.h b/src/AeroDmsTypes.h index 30b0fc2..abc241b 100644 --- a/src/AeroDmsTypes.h +++ b/src/AeroDmsTypes.h @@ -412,6 +412,20 @@ class AeroDmsTypes }; static const DetailsBaladesEtSorties K_INIT_DETAILS_BALADES_ET_SORTIES; typedef QList ListeDetailsBaladesEtSorties; + + struct GroupeBaladesEtSortiesAssociees + { + QVector volsUniques; + QVector recettesUniques; + }; + + struct BaladesEtSortiesParId + { + int idSortie; + int nombreDeLignes; + QVector baladesEtSortiesAssociees; + }; + typedef QVector ListeBaladesEtSortiesParIdSortie; }; #endif // AERODMSTYPES_H diff --git a/src/PdfRenderer.cpp b/src/PdfRenderer.cpp index a6ff88f..3ec9d08 100644 --- a/src/PdfRenderer.cpp +++ b/src/PdfRenderer.cpp @@ -709,190 +709,178 @@ QString PdfRenderer::genererHtmlRecapBaladesSorties(const int p_annee) const AeroDmsTypes::ListeDetailsBaladesEtSorties listeDetails = db->recupererListeDetailsBaladesEtSorties(p_annee); - int nbSortiesRestantesDeMemeTypeQueSortieCourante = 0; - int nbItem = 0; - int compteurLignesDansGroupe = 0; - int identifiantFinBoucle = 0; - QVector listeVolId; - listeVolId.clear(); - QVector idsVolsEnCours; - QVector idsRecettesEnCours; + AeroDmsTypes::ListeBaladesEtSortiesParIdSortie listesParIdSortie; - QVector idsVolsDejaAjoute; - QVector idsRecettesDejaAjoute; - - QVector volsUniques; - QVector recettesUniques; - - QFile tableBaladesSorties(QString(ressourcesHtml.toLocalFile()).append("TableauRecapBaladesSorties.html")); - if (tableBaladesSorties.open(QFile::ReadOnly | QFile::Text)) - { - QTextStream inTableBaladesSorties(&tableBaladesSorties); - html = inTableBaladesSorties.readAll(); - } - else + //On ajoute le premier item, si la liste retournée par la requete n'est pas vide... + if (listeDetails.size() > 0) { - qDebug() << "Erreur ouverture fichier"; - } + AeroDmsTypes::BaladesEtSortiesParId baladeParId; + baladeParId.nombreDeLignes = 0; + baladeParId.idSortie = listeDetails.at(0).idSortie; + AeroDmsTypes::GroupeBaladesEtSortiesAssociees baladesEtSortiesAssociees; + baladesEtSortiesAssociees.recettesUniques.append(listeDetails.at(0)); + baladesEtSortiesAssociees.volsUniques.append(listeDetails.at(0)); + baladeParId.baladesEtSortiesAssociees.append(baladesEtSortiesAssociees); + listesParIdSortie.push_back(baladeParId); - for (int i = 0; i < listeDetails.size(); i++) - { - AeroDmsTypes::DetailsBaladesEtSorties details = listeDetails.at(i); - html = html + ""; + QVector idsVolsDejaAjoute; + QVector idsRecettesDejaAjoute; + idsVolsDejaAjoute.clear(); + idsRecettesDejaAjoute.clear(); + idsVolsDejaAjoute.append(listeDetails.at(0).volId); + idsRecettesDejaAjoute.append(listeDetails.at(0).idRecette); - if (nbSortiesRestantesDeMemeTypeQueSortieCourante == 0) + //1) on parcours la liste des listeDetails pour élaborer listesParIdSortie + for (int i = 0; i < listeDetails.size(); i++) { - for (int j = i; j < listeDetails.size(); j++) - { - if (listeDetails.at(i).idSortie == listeDetails.at(j).idSortie) - { - nbSortiesRestantesDeMemeTypeQueSortieCourante++; - } - } - html = html + ""+details.nomSortie+""; - } - - if (compteurLignesDansGroupe == 0) - { - nbItem++; - - idsVolsDejaAjoute.clear(); - idsRecettesDejaAjoute.clear(); + AeroDmsTypes::DetailsBaladesEtSorties details = listeDetails.at(i); - idsVolsEnCours.clear(); - idsRecettesEnCours.clear(); - idsVolsEnCours.append(listeDetails.at(i).volId); - idsRecettesEnCours.append(listeDetails.at(i).idRecette); + //Si le nouvel idSortie est différent de celui en cours de traitement, on ajoute un nouvel item dans listesParIdSortie + if (details.idSortie != listesParIdSortie.last().idSortie) + { + //On finalise le groupe N-1 + const int nombreItemVol = listesParIdSortie.last().baladesEtSortiesAssociees.last().volsUniques.size(); + const int nombreItemRecette = std::max(int(listesParIdSortie.last().baladesEtSortiesAssociees.last().recettesUniques.size()), 1); + listesParIdSortie.last().nombreDeLignes = listesParIdSortie.last().nombreDeLignes + nombreItemVol * nombreItemRecette; + + AeroDmsTypes::BaladesEtSortiesParId balade; + AeroDmsTypes::GroupeBaladesEtSortiesAssociees baladesEtSortiesAssociees; + baladesEtSortiesAssociees.recettesUniques.append(details); + baladesEtSortiesAssociees.volsUniques.append(details); + balade.idSortie = details.idSortie; + balade.nombreDeLignes = 0; + balade.baladesEtSortiesAssociees.append(baladesEtSortiesAssociees); + listesParIdSortie.push_back(balade); + + idsVolsDejaAjoute.clear(); + idsRecettesDejaAjoute.clear(); - volsUniques.clear(); - recettesUniques.clear(); - volsUniques.append(listeDetails.at(i)); - recettesUniques.append(listeDetails.at(i)); + idsVolsDejaAjoute.append(details.volId); + idsRecettesDejaAjoute.append(details.idRecette); + } - int j = i + 1; - bool sortieBoucle = false; - while (j < listeDetails.size() && !sortieBoucle) + //Dans tous les cas on effectue les traitements + if (idsVolsDejaAjoute.contains(details.volId) + || idsRecettesDejaAjoute.contains(details.idRecette)) { - if (idsVolsEnCours.contains(listeDetails.at(j).volId) - || idsRecettesEnCours.contains(listeDetails.at(j).idRecette)) + //Sî l'une des 2 listes contient déjà l'identifiant associé, alors on ajoute l'identifiant à l'autre liste, s'il ne s'y trouve pas déjà + if (!idsVolsDejaAjoute.contains(details.volId)) { - //Sî l'une des 2 listes contient déjà l'identifiant associé, alors on ajoute l'identifiant à l'autre liste, s'il ne s'y trouve pas déjà - if (!idsVolsEnCours.contains(listeDetails.at(j).volId)) - { - idsVolsEnCours.append(listeDetails.at(j).volId); - volsUniques.append(listeDetails.at(j)); - } - if (!idsRecettesEnCours.contains(listeDetails.at(j).idRecette)) - { - idsRecettesEnCours.append(listeDetails.at(j).idRecette); - recettesUniques.append(listeDetails.at(j)); - } - identifiantFinBoucle = j; + idsVolsDejaAjoute.append(details.volId); + listesParIdSortie.last().baladesEtSortiesAssociees.last().volsUniques.append(details); } - else + if (!idsRecettesDejaAjoute.contains(details.idRecette)) { - //Sinon, aucun des 2 identifiant ne se trouve déjà dans la liste => on est sur une nouvelle série de vols/recettes, on sort - sortieBoucle = true; + idsRecettesDejaAjoute.append(details.idRecette); + listesParIdSortie.last().baladesEtSortiesAssociees.last().recettesUniques.append(details); } - j++; } - } + else + { + const int nombreItemVol = listesParIdSortie.last().baladesEtSortiesAssociees.last().volsUniques.size(); + const int nombreItemRecette = std::max(int(listesParIdSortie.last().baladesEtSortiesAssociees.last().recettesUniques.size()), 1); + listesParIdSortie.last().nombreDeLignes = listesParIdSortie.last().nombreDeLignes + nombreItemVol * nombreItemRecette; - if ( compteurLignesDansGroupe == 0) - { - compteurLignesDansGroupe = std::max(idsVolsEnCours.size(), idsRecettesEnCours.size()); - html = html + "" + "#" + QString::number(nbItem) + " " + ""; - } + AeroDmsTypes::GroupeBaladesEtSortiesAssociees baladesEtSortiesAssociees; + listesParIdSortie.last().baladesEtSortiesAssociees.append(baladesEtSortiesAssociees); + + idsVolsDejaAjoute.clear(); + idsRecettesDejaAjoute.clear(); - if (idsVolsEnCours.size() == 1) - { - if (idsVolsDejaAjoute.size() == 0) - { idsVolsDejaAjoute.append(details.volId); - html = html + "" + details.dateVol.toString("dd/MM/yyyy") + ""; - html = html + "" + details.nomPassagers + ""; - html = html + "" + AeroDmsServices::convertirMinutesEnHeuresMinutes(details.dureeVol) + ""; - html = html + "" + QString::number(details.coutVol) + " €"; - html = html + "" + QString::number(details.montantRembouse) + " €"; - } - } - else - { - if (volsUniques.size() > 0) - { - const AeroDmsTypes::DetailsBaladesEtSorties element = volsUniques.first(); - volsUniques.pop_front(); - html = html + "" + element.dateVol.toString("dd/MM/yyyy") + ""; - html = html + "" + element.nomPassagers + ""; - html = html + "" + AeroDmsServices::convertirMinutesEnHeuresMinutes(element.dureeVol) + ""; - html = html + "" + QString::number(element.coutVol) + " €"; - html = html + "" + QString::number(element.montantRembouse) + " €"; - } - else - { - //On ajoute une ligne vide - html = html + "" + ""; - html = html + "" + ""; - html = html + "" + ""; - html = html + "" + ""; - html = html + "" + ""; + idsRecettesDejaAjoute.append(details.idRecette); + listesParIdSortie.last().baladesEtSortiesAssociees.last().volsUniques.append(details); + listesParIdSortie.last().baladesEtSortiesAssociees.last().recettesUniques.append(details); } + } - if (idsRecettesEnCours.size() == 1) + //On finalise le groupe N-1 + const int nombreItemVol = listesParIdSortie.last().baladesEtSortiesAssociees.last().volsUniques.size(); + const int nombreItemRecette = std::max(int(listesParIdSortie.last().baladesEtSortiesAssociees.last().recettesUniques.size()), 1); + listesParIdSortie.last().nombreDeLignes = listesParIdSortie.last().nombreDeLignes + nombreItemVol * nombreItemRecette; + + + //Phase de génération HTML + + QFile tableBaladesSorties(QString(ressourcesHtml.toLocalFile()).append("TableauRecapBaladesSorties.html")); + if (tableBaladesSorties.open(QFile::ReadOnly | QFile::Text)) { - if (idsRecettesDejaAjoute.size() == 0) - { - idsRecettesDejaAjoute.append(details.idRecette); - if (details.montantRecette != 0.0) - { - html = html + "" + details.intituleRecette + ""; - html = html + "" + QString::number(details.montantRecette) + " €"; - } - else - { - html = html + "Paiement non encore reçu"; - } - } + QTextStream inTableBaladesSorties(&tableBaladesSorties); + html = inTableBaladesSorties.readAll(); } else { - if (recettesUniques.size() > 0) + qDebug() << "Erreur ouverture fichier"; + } + + int nbItem = 0; + + for (int i = 0; i < listesParIdSortie.size(); i++) + { + html = html + ""; + html = html + "" + listesParIdSortie.at(i).baladesEtSortiesAssociees.at(0).volsUniques.at(0).nomSortie + ""; + + for (int j = 0; j < listesParIdSortie.at(i).baladesEtSortiesAssociees.size(); j++) { - const AeroDmsTypes::DetailsBaladesEtSorties element = recettesUniques.first(); - recettesUniques.pop_front(); - if (element.montantRecette != 0.0) - { - html = html + "" + element.intituleRecette + ""; - html = html + "" + QString::number(element.montantRecette) + " €"; - } - else + nbItem++; + const int nombreLignes = listesParIdSortie.at(i).baladesEtSortiesAssociees.at(j).volsUniques.size() * std::max(1, int(listesParIdSortie.at(i).baladesEtSortiesAssociees.at(j).recettesUniques.size())); + + if (j != 0) + html = html + ""; + html = html + "" + "#" + QString::number(nbItem) + " " + ""; + + int compteurLignesPourVol = 0; + int compteurLignesPourRecette = 0; + + int compteurVol = 0; + int compteurRecettes = 0; + + for (int k = 0; k < nombreLignes; k++) { - html = html + "Paiement non encore reçu"; + + if (k != 0) + html = html + ""; + if (compteurLignesPourVol == 0) + { + compteurLignesPourVol = std::max(1, int(listesParIdSortie.at(i).baladesEtSortiesAssociees.at(j).recettesUniques.size())); + + html = html + "" + listesParIdSortie.at(i).baladesEtSortiesAssociees.at(j).volsUniques.at(compteurVol).dateVol.toString("dd/MM/yyyy") + ""; + html = html + "" + listesParIdSortie.at(i).baladesEtSortiesAssociees.at(j).volsUniques.at(compteurVol).nomPassagers + ""; + html = html + "" + AeroDmsServices::convertirMinutesEnHeuresMinutes(listesParIdSortie.at(i).baladesEtSortiesAssociees.at(j).volsUniques.at(compteurVol).dureeVol) + ""; + html = html + "" + QString::number(listesParIdSortie.at(i).baladesEtSortiesAssociees.at(j).volsUniques.at(compteurVol).coutVol) + " €"; + html = html + "" + QString::number(listesParIdSortie.at(i).baladesEtSortiesAssociees.at(j).volsUniques.at(compteurVol).montantRembouse) + " €"; + compteurVol++; + } + if (compteurLignesPourRecette == 0) + { + compteurLignesPourRecette = std::max(1, int(listesParIdSortie.at(i).baladesEtSortiesAssociees.at(j).volsUniques.size())); + + if (listesParIdSortie.at(i).baladesEtSortiesAssociees.at(j).recettesUniques.at(compteurRecettes).montantRecette != 0) + { + html = html + "" + listesParIdSortie.at(i).baladesEtSortiesAssociees.at(j).recettesUniques.at(compteurRecettes).intituleRecette + ""; + html = html + "" + QString::number(listesParIdSortie.at(i).baladesEtSortiesAssociees.at(j).recettesUniques.at(compteurRecettes).montantRecette) + " €"; + } + else + { + html = html + "Paiement non encore reçu"; + } + + compteurRecettes++; + } + + html = html + ""; + + compteurLignesPourVol--; + compteurLignesPourRecette--; } - } - else - { - //On ajoute une ligne vide - html = html + "" + ""; - html = html + "" + ""; - } - } - html = html + ""; - compteurLignesDansGroupe--; - nbSortiesRestantesDeMemeTypeQueSortieCourante--; - if ( volsUniques.isEmpty() - && recettesUniques.isEmpty()) - { - i = identifiantFinBoucle; + listesParIdSortie.at(i).baladesEtSortiesAssociees.at(j); + } } - } - - html = html + ""; - return html; } +