bool operator ==(const Evenement& e1, const Evenement& e2){ return(e1.getDate()==e2.getDate() && e1.getEcheance()==e2.getEcheance() && e1.getId()==e2.getId() && e1.getTitre()==e2.getTitre()); }
int Pret::calculerEcheancier() { double capitalRestantDu = this->capitalEmprunte; double capitalRembourse, interets = 0, mensualiteEcheance = this->mensualite; double assurance = getCoutMensuelAssurance(); QDate dateMensualite = this->dateDebloquage; bool evenementTraite = true; // Créer l'échéancier int echeancierId = creerEcheancier("Echéancier prêt", QDate::currentDate(), 1); std::cout << "Echeancier id : " << echeancierId << "\n"; if (echeancierId != -1) { // Récupérer les événements relatifs au prêt QList<Evenement> evts = getEvenements(this->id); QListIterator<Evenement> evtsIterator(evts); std::cout << "evts size = " << evts.count() << std::endl; Evenement event; // Calculer les échéances while (capitalRestantDu > 0) { if ( !evenementTraite || (evenementTraite && evtsIterator.hasNext()) ) { // Si evenement traité, passer au suivant if ( evenementTraite ) { event = evtsIterator.next(); evenementTraite = false; } // Si la date de mensualité est antérieure à la date de l'évènement, rien à faire : on attend l'échéance suivante. if (dateMensualite >= event.getDate()) { std::cout << "evenement a traiter : " << event.getType() << " " << event.getDate().toString().toStdString() << std::endl; switch(event.getType()) { case Evenement::DIFFERE_TOTAL : std::cout << "differe total" << std::endl; for (int nbReports = event.getValeur(); nbReports > 0; nbReports--) { // capital restant du est augmenté des frais intercalaires générés par le différé total capitalRestantDu += calculerInteretsMensuels(capitalRestantDu, this->tauxInteret); // mensualite = assurance ajouterEcheance(echeancierId, dateMensualite, capitalRestantDu, assurance, 0, interets, assurance); dateMensualite = dateMensualite.addMonths(1); } break; case Evenement::DIFFERE_PARTIEL : std::cout << "differe partiel" << std::endl; interets = calculerInteretsMensuels(capitalRestantDu, this->tauxInteret); for (int nbReports = event.getValeur(); nbReports > 0; nbReports--) { // mensualite = cout des frais intercalaires + assurance ajouterEcheance(echeancierId, dateMensualite, capitalRestantDu, interets + assurance, 0, interets, assurance); dateMensualite = dateMensualite.addMonths(1); } break; case Evenement::MAJ_MENSUALITE : std::cout << "maj mensualite" << std::endl; mensualiteEcheance = event.getValeur() - getCoutMensuelAssurance(); this->duree = calculerDureeRemboursement(mensualiteEcheance); break; case Evenement::MAJ_TAUX : std::cout << "maj taux" << std::endl; break; case Evenement::RBT_ANTICIPE : std::cout << "rbt anticipe" << std::endl; capitalRestantDu -= event.getValeur(); break; case Evenement::REPORT_MENSUALITE : // utile? utiliser report partiel/total? std::cout << "report mensualite" << std::endl; break; } evenementTraite = true; } } interets = calculerInteretsMensuels(capitalRestantDu, this->tauxInteret); if ( (capitalRestantDu+interets) >= mensualiteEcheance) { capitalRembourse = mensualiteEcheance - interets; } else { capitalRembourse = capitalRestantDu; mensualiteEcheance = capitalRestantDu+interets; } capitalRestantDu -= capitalRembourse; ajouterEcheance(echeancierId, dateMensualite, capitalRestantDu, mensualiteEcheance + assurance, capitalRembourse, interets, assurance); dateMensualite = dateMensualite.addMonths(1); } } // std::cout.flush(); return echeancierId; }