Skip to content

Commit

Permalink
Amélioration algo génération tableau balades/sorties
Browse files Browse the repository at this point in the history
  • Loading branch information
cvermot committed Jul 22, 2024
1 parent 039420f commit 5a67b9e
Show file tree
Hide file tree
Showing 3 changed files with 156 additions and 154 deletions.
2 changes: 1 addition & 1 deletion database/structure.sql
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
14 changes: 14 additions & 0 deletions src/AeroDmsTypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,20 @@ class AeroDmsTypes
};
static const DetailsBaladesEtSorties K_INIT_DETAILS_BALADES_ET_SORTIES;
typedef QList<DetailsBaladesEtSorties> ListeDetailsBaladesEtSorties;

struct GroupeBaladesEtSortiesAssociees
{
QVector<AeroDmsTypes::DetailsBaladesEtSorties> volsUniques;
QVector<AeroDmsTypes::DetailsBaladesEtSorties> recettesUniques;
};

struct BaladesEtSortiesParId
{
int idSortie;
int nombreDeLignes;
QVector<GroupeBaladesEtSortiesAssociees> baladesEtSortiesAssociees;
};
typedef QVector<BaladesEtSortiesParId> ListeBaladesEtSortiesParIdSortie;
};

#endif // AERODMSTYPES_H
294 changes: 141 additions & 153 deletions src/PdfRenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<int> listeVolId;
listeVolId.clear();

QVector<int> idsVolsEnCours;
QVector<int> idsRecettesEnCours;
AeroDmsTypes::ListeBaladesEtSortiesParIdSortie listesParIdSortie;

QVector<int> idsVolsDejaAjoute;
QVector<int> idsRecettesDejaAjoute;

QVector<AeroDmsTypes::DetailsBaladesEtSorties> volsUniques;
QVector<AeroDmsTypes::DetailsBaladesEtSorties> 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 + "<tr>";
QVector<int> idsVolsDejaAjoute;
QVector<int> 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 + "<td class = 'tg-lboi' rowspan = '" + QString::number(nbSortiesRestantesDeMemeTypeQueSortieCourante) + "'>"+details.nomSortie+"</td>";
}

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 + "<td class = 'tg-lboi' rowspan = '" + QString::number(compteurLignesDansGroupe) + "'>" + "#" + QString::number(nbItem) + " " + "</td >";
}
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 + "<td class = 'tg-lboi' rowspan = '" + QString::number(idsRecettesEnCours.size()) + "'>" + details.dateVol.toString("dd/MM/yyyy") + "</td >";
html = html + "<td class = 'tg-lboi' rowspan = '" + QString::number(idsRecettesEnCours.size()) + "'>" + details.nomPassagers + "</td>";
html = html + "<td class = 'tg-lboi' rowspan = '" + QString::number(idsRecettesEnCours.size()) + "'>" + AeroDmsServices::convertirMinutesEnHeuresMinutes(details.dureeVol) + "</td>";
html = html + "<td class = 'tg-lboi' rowspan = '" + QString::number(idsRecettesEnCours.size()) + "'>" + QString::number(details.coutVol) + " €</td>";
html = html + "<td class = 'tg-lboi' rowspan = '" + QString::number(idsRecettesEnCours.size()) + "'>" + QString::number(details.montantRembouse) + " €</td>";
}
}
else
{
if (volsUniques.size() > 0)
{
const AeroDmsTypes::DetailsBaladesEtSorties element = volsUniques.first();
volsUniques.pop_front();
html = html + "<td class = 'tg-lboi'>" + element.dateVol.toString("dd/MM/yyyy") + "</td >";
html = html + "<td class = 'tg-lboi'>" + element.nomPassagers + "</td>";
html = html + "<td class = 'tg-lboi'>" + AeroDmsServices::convertirMinutesEnHeuresMinutes(element.dureeVol) + "</td>";
html = html + "<td class = 'tg-lboi'>" + QString::number(element.coutVol) + " €</td>";
html = html + "<td class = 'tg-lboi'>" + QString::number(element.montantRembouse) + " €</td>";
}
else
{
//On ajoute une ligne vide
html = html + "<td class = 'tg-lboi'>" + "</td >";
html = html + "<td class = 'tg-lboi'>" + "</td>";
html = html + "<td class = 'tg-lboi'>" + "</td>";
html = html + "<td class = 'tg-lboi'>" + "</td>";
html = html + "<td class = 'tg-lboi'>" + "</td>";
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 + "<td class = 'tg-lboi' rowspan = '" + QString::number(idsVolsEnCours.size()) + "'>" + details.intituleRecette + "</td >";
html = html + "<td class = 'tg-lboi' rowspan = '" + QString::number(idsVolsEnCours.size()) + "'>" + QString::number(details.montantRecette) + " €</td>";
}
else
{
html = html + "<td class = 'tg-1zu3' colspan='2' rowspan = '" + QString::number(idsVolsEnCours.size()) + "'>Paiement non encore reçu</td >";
}
}
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 + "<tr>";
html = html + "<td class = 'tg-lboi' rowspan = '" + QString::number(listesParIdSortie.at(i).nombreDeLignes) + "'>" + listesParIdSortie.at(i).baladesEtSortiesAssociees.at(0).volsUniques.at(0).nomSortie + "</td>";

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 + "<td class = 'tg-lboi'>" + element.intituleRecette + "</td >";
html = html + "<td class = 'tg-lboi'>" + QString::number(element.montantRecette) + " €</td>";
}
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 + "<tr>";
html = html + "<td class = 'tg-lboi' rowspan = '" + QString::number(nombreLignes) + "'>" + "#" + QString::number(nbItem) + " " + "</td >";

int compteurLignesPourVol = 0;
int compteurLignesPourRecette = 0;

int compteurVol = 0;
int compteurRecettes = 0;

for (int k = 0; k < nombreLignes; k++)
{
html = html + "<td class = 'tg-1zu3' colspan='2'>Paiement non encore reçu</td >";

if (k != 0)
html = html + "<tr>";
if (compteurLignesPourVol == 0)
{
compteurLignesPourVol = std::max(1, int(listesParIdSortie.at(i).baladesEtSortiesAssociees.at(j).recettesUniques.size()));

html = html + "<td class = 'tg-lboi' rowspan = '" + QString::number(compteurLignesPourVol) + "'>" + listesParIdSortie.at(i).baladesEtSortiesAssociees.at(j).volsUniques.at(compteurVol).dateVol.toString("dd/MM/yyyy") + "</td >";
html = html + "<td class = 'tg-lboi' rowspan = '" + QString::number(compteurLignesPourVol) + "'>" + listesParIdSortie.at(i).baladesEtSortiesAssociees.at(j).volsUniques.at(compteurVol).nomPassagers + "</td>";
html = html + "<td class = 'tg-lboi' rowspan = '" + QString::number(compteurLignesPourVol) + "'>" + AeroDmsServices::convertirMinutesEnHeuresMinutes(listesParIdSortie.at(i).baladesEtSortiesAssociees.at(j).volsUniques.at(compteurVol).dureeVol) + "</td>";
html = html + "<td class = 'tg-lboi' rowspan = '" + QString::number(compteurLignesPourVol) + "'>" + QString::number(listesParIdSortie.at(i).baladesEtSortiesAssociees.at(j).volsUniques.at(compteurVol).coutVol) + " €</td>";
html = html + "<td class = 'tg-lboi' rowspan = '" + QString::number(compteurLignesPourVol) + "'>" + QString::number(listesParIdSortie.at(i).baladesEtSortiesAssociees.at(j).volsUniques.at(compteurVol).montantRembouse) + " €</td>";
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 + "<td class = 'tg-lboi' rowspan = '" + QString::number(compteurLignesPourRecette) + "'>" + listesParIdSortie.at(i).baladesEtSortiesAssociees.at(j).recettesUniques.at(compteurRecettes).intituleRecette + "</td >";
html = html + "<td class = 'tg-lboi' rowspan = '" + QString::number(compteurLignesPourRecette) + "'>" + QString::number(listesParIdSortie.at(i).baladesEtSortiesAssociees.at(j).recettesUniques.at(compteurRecettes).montantRecette) + " €</td>";
}
else
{
html = html + "<td class = 'tg-1zu3' colspan='2' rowspan = '" + QString::number(compteurLignesPourRecette) + "'>Paiement non encore reçu</td >";
}

compteurRecettes++;
}

html = html + "</tr>";

compteurLignesPourVol--;
compteurLignesPourRecette--;
}
}
else
{
//On ajoute une ligne vide
html = html + "<td class = 'tg-lboi'>" + "</td >";
html = html + "<td class = 'tg-lboi'>" + "</td>";
}
}
html = html + "</tr>";
compteurLignesDansGroupe--;
nbSortiesRestantesDeMemeTypeQueSortieCourante--;

if ( volsUniques.isEmpty()
&& recettesUniques.isEmpty())
{
i = identifiantFinBoucle;
listesParIdSortie.at(i).baladesEtSortiesAssociees.at(j);
}
}

}

html = html + "</tbody></table>";

return html;
}

0 comments on commit 5a67b9e

Please sign in to comment.