/*************************************************** Classe retraite ***************************************************/ function Retraite( DateNaissance, DateSituation, DateProjection, DateLiquidation, TrimestresAvocatCNBF, TrimestresConseilJuridique, TrimestresAvoue, TrimestresAutres, TrimestresRachetesCNBF, TrimestresRachetesNonCNBF, PointsCAVOM, PointsCIPAV, PointsComplementairesCNBF, PointsSupplementairesCNBF, ClasseRegimeSupplementaire, RevenusProjetes) { //Variables this.DateNaissance = DateNaissance; this.DateSituation = DateSituation; this.DateProjection = DateProjection; this.DateLiquidation = DateLiquidation; this.TrimestresAvocatCNBF = TrimestresAvocatCNBF; this.TrimestresConseilJuridique = TrimestresConseilJuridique; this.TrimestresAvoue = TrimestresAvoue; this.TrimestresAutres = TrimestresAutres; this.TrimestresRachetesCNBF = TrimestresRachetesCNBF; this.TrimestresRachetesNonCNBF = TrimestresRachetesNonCNBF; this.PointsCAVOM = PointsCAVOM; this.PointsCIPAV = PointsCIPAV; this.PointsComplementairesCNBF = PointsComplementairesCNBF; this.PointsSupplementairesCNBF = PointsSupplementairesCNBF; this.ClasseRegimeSupplementaire = ClasseRegimeSupplementaire; this.RevenusProjetes = RevenusProjetes; // Constantes this.CONST_ValeurQuarantiemeCNBF = 392.525; this.CONST_ValeurAVTS = 3248.48; this.CONST_PlafondTranche1 = 39000; this.CONST_PlafondTranche2 = 156000; this.CONST_TauxNominalAppelTranche1 = 0.03; this.CONST_TauxNominalAppelTranche2 = 0.06; this.CONST_CoutAcquisitionPointRetraiteComplementaire = 7.9243; this.CONST_ValeurPointRetraiteComplementaire = 0.8860; this.CONST_CoefficientRetraiteSupplementaireClasse1 = 0.35; this.CONST_CoefficientRetraiteSupplementaireClasse2 = 0.85; this.CONST_CoefficientRetraiteSupplementaireClasse3 = 1.35; this.CONST_ValeurBonification = 1314; this.CONST_ValeurPointCAVOM = 33.1; if (DateNaissance.getFullYear() < 1949) this.CONST_NombreTrimestresMinimum = 160; if (DateNaissance.getFullYear() == 1949) this.CONST_NombreTrimestresMinimum = 161; if (DateNaissance.getFullYear() == 1950) this.CONST_NombreTrimestresMinimum = 162; if (DateNaissance.getFullYear() == 1951) this.CONST_NombreTrimestresMinimum = 163; if (DateNaissance.getFullYear() == 1952) this.CONST_NombreTrimestresMinimum = 164; if (DateNaissance.getFullYear() > 1952) this.CONST_NombreTrimestresMinimum = 164; } Retraite.prototype.AgeProjection = function () { var Age = this.DateProjection.getFullYear() - this.DateNaissance.getFullYear(); if (parseInt(this.DateProjection.getMonth()) < parseInt(this.DateNaissance.getMonth()) || parseInt(this.DateProjection.getMonth()) == parseInt(this.DateNaissance.getMonth()) && parseInt(this.DateProjection.getDate()) < parseInt(this.DateNaissance.getDate())) Age--; return Age; } Retraite.prototype.DateOuvertureDroit = function () { // On se cale au prochain début de trimestre le plus proche de la date de projection var Date60Ans = new Date(this.DateNaissance.getFullYear() + 60, this.DateNaissance.getMonth(), this.DateNaissance.getDate()); var DateAUtiliser = new Date(Math.max(Date60Ans, this.DateProjection)); var MoisProjection = DateAUtiliser.getMonth(); var MoisOuvertureDroit; if (MoisProjection<12) MoisOuvertureDroit = 0; if (MoisProjection<9) MoisOuvertureDroit = 9; if (MoisProjection<6) MoisOuvertureDroit = 6; if (MoisProjection<3) MoisOuvertureDroit = 3; return new Date(parseInt(DateAUtiliser.getFullYear()) + (MoisOuvertureDroit == 0 ? 1 : 0), MoisOuvertureDroit, 1); } Retraite.prototype.TrimestresProjetes = function() { // Nombre de trimestres entre la date de situation et la date de la retraite return (this.DateProjection.getFullYear() - this.DateSituation.getFullYear()) * 4 + parseInt(this.DateProjection.getMonth() / 3) + 1; } Retraite.prototype.DureeAssuranceTotale = function() { return (this.TrimestresAvocatCNBF + this.TrimestresConseilJuridique + this.TrimestresAvoue + this.TrimestresAutres + this.TrimestresRachetesCNBF + this.TrimestresRachetesNonCNBF + this.TrimestresProjetes()); } Retraite.prototype.DureeAssuranceAvocat = function() { return (this.TrimestresAvocatCNBF + this.TrimestresRachetesCNBF + this.TrimestresProjetes()); } Retraite.prototype.RetraiteBase = function() { if (this.TrimestresAvocatCNBF + this.TrimestresConseilJuridique + this.TrimestresAvoue + this.TrimestresRachetesCNBF + this.TrimestresProjetes() < 60) { // Droit AVTS return [Math.round(this.DureeAssuranceAvocat() * this.CONST_ValeurAVTS / 60), this.DureeAssuranceAvocat() + '/' + 60]; } else { // Droit CNBF, limité à 160 trimestres dans tous les cas var NombreTrimestresApplicables = Math.min(this.DureeAssuranceAvocat(), 160); return [Math.round(NombreTrimestresApplicables * this.CONST_ValeurQuarantiemeCNBF * 40 / 160), NombreTrimestresApplicables + '/160']; } } Retraite.prototype.RetraiteConseilJuridique = function() { // Droit AVTS, limité à 150 trimestres var NombreTrimestresApplicables = Math.min(this.TrimestresConseilJuridique, 150); return [Math.round(NombreTrimestresApplicables * this.CONST_ValeurAVTS / 60), NombreTrimestresApplicables + '/' + 60]; } Retraite.prototype.RetraiteAvoue = function() { var Resultat = 0; if (this.DureeAssuranceAvocat() + this.TrimestresAvoue) Resultat = Math.round(this.TrimestresAvoue / (this.DureeAssuranceAvocat() + this.TrimestresAvoue) * this.CONST_ValeurAVTS); return [Resultat, this.TrimestresAvoue + '/' + (this.DureeAssuranceAvocat() + this.TrimestresAvoue)]; } Retraite.prototype.PointsTranche1 = function () { var AssietteTranche1 = this.RevenusProjetes; if (this.RevenusProjetes > this.CONST_PlafondTranche2) AssietteTranche1 = this.CONST_PlafondTranche1; else if (this.RevenusProjetes > this.CONST_PlafondTranche1) AssietteTranche1 = this.CONST_PlafondTranche1; return Math.round(AssietteTranche1 * this.CONST_TauxNominalAppelTranche1 / this.CONST_CoutAcquisitionPointRetraiteComplementaire); } Retraite.prototype.PointsTranche2 = function () { var AssietteTranche2 = 0; if (this.RevenusProjetes > this.CONST_PlafondTranche2) AssietteTranche2 = this.CONST_PlafondTranche2 - this.CONST_PlafondTranche1; else if (this.RevenusProjetes > this.CONST_PlafondTranche1) AssietteTranche2 = this.RevenusProjetes - this.CONST_PlafondTranche1; return Math.round(AssietteTranche2 * this.CONST_TauxNominalAppelTranche2 / this.CONST_CoutAcquisitionPointRetraiteComplementaire); } Retraite.prototype.RetraiteComplementaire = function () { var PointsComplementairesCNBFProjetes = this.PointsTranche1() + this.PointsTranche2(); var PointsComplementairesCNBFTotaux = Math.round(this.PointsComplementairesCNBF + (this.TrimestresProjetes() / 4 * PointsComplementairesCNBFProjetes)); return [Math.round(PointsComplementairesCNBFTotaux * this.CONST_ValeurPointRetraiteComplementaire), PointsComplementairesCNBFTotaux + ' points CNBF']; } Retraite.prototype.RetraiteSupplementaire = function () { var PointsSupplementairesCNBFProjetes = 0; switch (this.ClasseRegimeSupplementaire) { case "1": PointsSupplementairesCNBFProjetes = Math.round(this.PointsTranche2() * this.CONST_CoefficientRetraiteSupplementaireClasse1); break; case "2": PointsSupplementairesCNBFProjetes = Math.round(this.PointsTranche2() * this.CONST_CoefficientRetraiteSupplementaireClasse2); break; case "3": PointsSupplementairesCNBFProjetes = Math.round(this.PointsTranche2() * this.CONST_CoefficientRetraiteSupplementaireClasse3); break; } var PointsSupplementairesCNBFTotaux = Math.round(this.PointsSupplementairesCNBF + (this.TrimestresProjetes() / 4 * PointsSupplementairesCNBFProjetes)); return [Math.round(PointsSupplementairesCNBFTotaux * this.CONST_ValeurPointRetraiteComplementaire), PointsSupplementairesCNBFTotaux + ' points CNBF']; } Retraite.prototype.RetraiteCIPAV = function () { return [Math.round(this.PointsCIPAV * this.CONST_ValeurPointRetraiteComplementaire), this.PointsCIPAV + ' points CIPAV convertis']; } Retraite.prototype.RetraiteCAVOM = function () { return [Math.round(this.PointsCAVOM * this.CONST_ValeurPointCAVOM), this.PointsCAVOM + ' points CAVOM']; } Retraite.prototype.Bonification = function () { var IndiceBonification = 0; var NombreTrimestresAvocat2003 = (this.TrimestresAvocatCNBF + this.TrimestresRachetesCNBF + (2003 - (this.DateSituation.getFullYear() - 1)) * 4); if (NombreTrimestresAvocat2003 >= 169) IndiceBonification = (this.DureeAssuranceAvocat() >= 220) ? 3 : ((this.DureeAssuranceAvocat() >= 200) ? 2 : ((this.DureeAssuranceAvocat() >= 180) ? 1 : 0)); return [Math.round(IndiceBonification * this.CONST_ValeurBonification), IndiceBonification]; } Retraite.prototype.DifferenceEnTrimestres = function (Date1, Date2) { var Mois = (Date1.getMonth() - Date2.getMonth()) / 3; Mois = Math.floor(Mois); var Trimestres = (Date1.getFullYear() - Date2.getFullYear()) * 4 + Mois; return Trimestres; } Retraite.prototype.Majoration = function () { if (this.DureeAssuranceTotale()>=this.CONST_NombreTrimestresMinimum && this.AgeProjection()>=60) { var NombreTrimestresDepuisJanvier2004 = this.DifferenceEnTrimestres(this.DateProjection, new Date(2004, 0, 1)) + 1; var Date60Ans = new Date(this.DateNaissance.getFullYear() + 60, this.DateNaissance.getMonth(), this.DateNaissance.getDate()); var NombreTrimestresDepuisJanvier2004_2 = this.DifferenceEnTrimestres(this.DateProjection, Date60Ans) + 1; // Trimestres avant 60 ans par rapport à la date de projection NombreTrimestresDepuisJanvier2004 = Math.min(NombreTrimestresDepuisJanvier2004, this.DureeAssuranceTotale() - this.CONST_NombreTrimestresMinimum); NombreTrimestresDepuisJanvier2004 = Math.min(NombreTrimestresDepuisJanvier2004, NombreTrimestresDepuisJanvier2004_2); if (NombreTrimestresDepuisJanvier2004!=0) return [100 + .75 * NombreTrimestresDepuisJanvier2004, 'majoration sur régime de base de ' + NombreTrimestresDepuisJanvier2004 * 0.75 + '%']; } return [100,'']; } Retraite.prototype.Minoration = function () { if (this.AgeProjection()<65 && this.DureeAssuranceTotale()0) ? Math.min(TrimestresAUtiliser, TrimestresManquant65Ans) : 0; } TrimestresAUtiliser = Math.min(TrimestresAUtiliser, 20); // limite de 20 trimestres if (TrimestresAUtiliser!=0) return [100 - 1.25 * TrimestresAUtiliser, 'minoration de ' + 1.25 * TrimestresAUtiliser + '%']; } return [100,'']; } Retraite.prototype.BonificationMeilleureQueMajoration = function () { return (this.Bonification()[0] + (this.RetraiteBase()[0] + this.RetraiteConseilJuridique()[0] + this.RetraiteAvoue()[0])) > Math.round((this.RetraiteBase()[0] + this.RetraiteConseilJuridique()[0] + this.RetraiteAvoue()[0]) * this.Majoration()[0] / 100); } Retraite.prototype.RetraiteTotaleTauxPlein = function () { return (this.RetraiteBase()[0] + this.RetraiteConseilJuridique()[0] + this.RetraiteAvoue()[0] + this.RetraiteComplementaire()[0] + this.RetraiteSupplementaire()[0] + this.RetraiteCIPAV()[0] + this.RetraiteCAVOM()[0] + parseInt(this.BonificationMeilleureQueMajoration() ? this.Bonification()[0] : 0)); } Retraite.prototype.RetraiteTotale = function () { return (Math.round((this.RetraiteBase()[0] + this.RetraiteConseilJuridique()[0] + this.RetraiteAvoue()[0]) * (this.BonificationMeilleureQueMajoration() ? 100 * 100 : this.Majoration()[0] * this.Minoration()[0]) / 100 / 100 + (this.RetraiteComplementaire()[0] + this.RetraiteSupplementaire()[0] + this.RetraiteCIPAV()[0] + this.RetraiteCAVOM()[0]) * this.Minoration()[0] / 100 + parseInt(this.BonificationMeilleureQueMajoration() ? this.Bonification()[0] : 0))); }