diff --git a/bilan.go b/bilan.go index 319efc2..018dab8 100644 --- a/bilan.go +++ b/bilan.go @@ -30,7 +30,11 @@ func (infos InfosUser) sansRelevé() bool { func main() { // Interroge l'utilisateur log.Debugln("Demande des informations : start") - userData, _ := interrogerUtilisateur() + userData, err := interrogerUtilisateur() + if err != nil { + log.Errorf("Données incorrectes, le bilan ne peut être généré, essayez à nouveau...") + os.Exit(-1) + } log.Debugln("Demande des informations : ok! ", userData.Naissance, userData.DateRelevé, userData.TrimestresCotisés) // Calcule les données de départ en retraite @@ -48,10 +52,46 @@ func main() { log.Debugln("Génération du bilan : ok!") } - // Première implémentation statique +// Demande à l'utilisateur sa date de naissance à minima, ainsi que qq informations de son relevé de carrière +// Une erreur est retournée si aucune date de naissance n'est proposée func interrogerUtilisateur() (InfosUser, error) { + // Banner + fmt.Println(` +******************************************************************************** +Ce bilan vous est proposé gratuitement, sans publicité ni exploitation des données renseignées. +Il a pour objectif de vous aider à appréhender les enjeux principaux de votre future pension. +Nous vous souhaitons de vivre de beaux moments professionnels jusqu'à votre départ en retraite. + +Si vous êtes un conseiller Retraite, n'hésitez pas à soumettre vos idées (améliorations, correctifs...) : https://github.com/ObjectIsAdvantag/retraite/issues/1 +Si vous êtes développeur, n'hésitez pas à contribuer au projet https://github.com/ObjectIsAdvantag/retraite + +Copyright 2016, Stève Sfartz - @ObjectIsAdvantag - License MIT +******************************************************************************** + `) + + // Date de naissance + var naissance string + essai, essaiMax := 1, 3 + for { + fmt.Printf("Votre date de naissance (JJ/MM/YYYY): ") + fmt.Scanf("%s\n", &naissance) + _, err := depart.StringToTime(naissance) + if err == nil { + log.Debugf("Date saisie : %v", naissance) + break + } + if essai >= essaiMax { + return InfosUser{}, fmt.Errorf("Impossible de récupérer la date de naissance") + } + + essai++ + fmt.Printf("Saisie incorrecte, nouvel essai %d/%d", essai, essaiMax) + } + + // TODO Relevé de carrière //return InfosUser{Naissance:"24/12/1971", TrimestresCotisés:87, DateReleve:2014}, nil - return InfosUser{Naissance: "24/12/1971", TrimestresCotisés: 0, DateRelevé: 0}, nil + + return InfosUser{Naissance: naissance, TrimestresCotisés: 0, DateRelevé: 0}, nil } func init() { @@ -62,7 +102,7 @@ func init() { // Only log the warning severity or above. // [PENDING] - log.SetLevel(log.DebugLevel) + log.SetLevel(log.WarnLevel) } func genererBilanSimple(userData InfosUser, infos depart.InfosDepartEnRetraite) { @@ -73,20 +113,28 @@ func genererBilanSimple(userData InfosUser, infos depart.InfosDepartEnRetraite) }).Parse(BilanDateDeNaissance) decote := pension.DécotePourTrimestresManquants(infos.TrimestresTauxPlein - pension.DECOTE_MAX_TRIMESTRES, userData.Naissance) - simu := Simulation { + simuDec := Simulation { // la décôte est limitée à 20 trimestres Trimestres:infos.TrimestresTauxPlein - pension.DECOTE_MAX_TRIMESTRES, DeltaTrimestres:pension.DECOTE_MAX_TRIMESTRES, - DecoteParTrimestre:fmt.Sprintf("%.3f", decote.Decote.Diminution), + EvolParTrimestre:fmt.Sprintf("%.3f", decote.Decote.Diminution), TauxPension:decote.TauxPension, - TrimestresCotisés:infos.TrimestresTauxPlein - pension.DECOTE_MAX_TRIMESTRES, - TrimestresManquants:pension.DECOTE_MAX_TRIMESTRES, + } + + deltaTrimestres := 8 + simuSur := Simulation { + // la surcote n'est pas limitée + Trimestres:infos.TrimestresTauxPlein + deltaTrimestres, + DeltaTrimestres:deltaTrimestres, + EvolParTrimestre:fmt.Sprintf("%.3f", pension.SurcotePourTrimestreSupplementaire()), + TauxPension:50.0 + float32(deltaTrimestres) * pension.SurcotePourTrimestreSupplementaire(), } data := TemplateSimpleData{ User:userData, Infos:infos, - Simu:simu, + SimuDecote:simuDec, + SimuSurcote:simuSur, } if err := t.Execute(os.Stdout, data); err != nil { diff --git a/depart/converter.go b/depart/converter.go index d75a1ce..cda225c 100644 --- a/depart/converter.go +++ b/depart/converter.go @@ -9,7 +9,7 @@ import ( "time" ) -const JJMMAAADateFormat = "2/1/2006" +const JJMMAAADateFormat = "02/01/2006" var ErrDateVide = errors.New("la date n'est pas renseignée") var ErrDateFormatInvalide = errors.New("le format de date n'est pas valide") diff --git a/pension/decote.go b/pension/decote.go index bd24d66..0407ca4 100644 --- a/pension/decote.go +++ b/pension/decote.go @@ -49,7 +49,7 @@ func init() { Default.Diminution = 0.625 Default.Taux[0] = 50 - Default.Taux[1] = 49.3125 + Default.Taux[1] = 49.375 Default.Taux[2] = 48.750 Default.Taux[3] = 48.125 Default.Taux[4] = 47.500 diff --git a/pension/surcote.go b/pension/surcote.go index 8a26aba..f90bbc2 100644 --- a/pension/surcote.go +++ b/pension/surcote.go @@ -5,7 +5,7 @@ package pension -func SurCotePourTrimestreSupplementaire() float32 { +func SurcotePourTrimestreSupplementaire() float32 { // Taux unique depuis 2008 - return 1.25 + return 0.625 } diff --git a/template-naissance.go b/template-naissance.go index 08ee90e..6b64744 100644 --- a/template-naissance.go +++ b/template-naissance.go @@ -13,49 +13,38 @@ import ( type TemplateSimpleData struct { User InfosUser Infos depart.InfosDepartEnRetraite - Simu Simulation + SimuDecote Simulation + SimuSurcote Simulation } type Simulation struct { Trimestres int // .Infos.TrimestresTauxPlein - 20 DeltaTrimestres int // ex : 20 - DecoteParTrimestre string // le taux de décote par trimestre - TrimestresCotisés int - TrimestresManquants int + EvolParTrimestre string // le taux de décote par trimestre TauxPension float32 } var BilanDateDeNaissance = ` -******************************************************************************** -Ce bilan vous est proposé gratuitement, sans publicité ni exploitation des données renseignées. -Il a pour objectif de vous aider à appréhender les enjeux principaux de votre future pension. -Nous vous souhaitons de vivre de beaux moments professionnels jusqu'à votre départ en retraite. - -Si vous êtes un conseiller Retraite, n'hésitez pas à soumettre vos idées (améliorations, correctifs...) : https://github.com/ObjectIsAdvantag/retraite/issues/1 -Si vous êtes développeur, n'hésitez pas à contribuer au projet https://github.com/ObjectIsAdvantag/retraite - -Copyright 2016, Stève Sfartz - @ObjectIsAdvantag - License MIT -******************************************************************************** - - -Vos données personnelles : -- vous êtes né le {{ .User.Naissance }} -- vous ne disposez pas de relevé de carrière. - - Votre bilan retraite simplifié suite à la réforme 2010 : -- vous devez cotiser {{ .Infos.TrimestresTauxPlein }} trimestres pour une retraite à taux plein - - une retraite à taux plein correspondant à une pension de l'ordre de 50% de vos 25 meilleurs années. +- vous devrez cotiser {{ .Infos.TrimestresTauxPlein }} trimestres pour toucher une retraite à taux plein + - une retraite à taux plein correspond à une pension de l'ordre de 50% de vos 25 meilleurs années. - vous partirez partir en retraite au plus tôt à {{ .Infos.AgeDépartMin.AgeEnAnneesMois }}, soit le {{ .Infos.DateDépartMin | timeToString }} - - vous devrez alors avoir cotisé un minmum de {{ .Simu.Trimestres }} trimestres soient {{ .Simu.DeltaTrimestres }} trimestres manquants par rapport à votre taux plein, - - sans quoi vous devriez repousser votre demande de départ en retraite jusqu'à atteindre ce minimum de {{ .Simu.Trimestres }} trimestres + - date à laquelle vous devrez avoir cotisé un minmum de {{ .SimuDecote.Trimestres }} trimestres + - sans quoi vous devriez repousser votre demande de départ en retraite - - décote : votre pension est diminuée de {{ .Simu.DecoteParTrimestre }}% par trimestre manquant par rapport aux taux plein - - ex: vous demandez à partir en retraite après le {{ .Infos.DateDépartMin | timeToString }} et avez cotisé {{ .Simu.TrimestresCotisés }} trimestres, - - soient {{ .Simu.TrimestresManquants }} trimestres manquants par rapport à un taux plein, - - votre pension serait alors de l'ordre de {{ .Simu.TauxPension }}% de vos 25 meilleures années + - principe de la décote : + - votre pension est diminuée de {{ .SimuDecote.EvolParTrimestre }} points par trimestre manquant par rapport aux taux plein + - ex: vous demandez à partir en retraite après le {{ .Infos.DateDépartMin | timeToString }} et avez cotisé {{ .SimuDecote.Trimestres }} trimestres, + soient {{ .SimuDecote.DeltaTrimestres }} trimestres manquants par rapport au taux plein, + votre pension serait alors de l'ordre de {{ .SimuDecote.TauxPension }}% de vos 25 meilleures années + + - principe de la surcote : + - votre pension est augmentée de {{ .SimuSurcote.EvolParTrimestre }} points par trimestre supplémentaire cotisé + - ex: vous demandez à partir en retraite après le {{ .Infos.DateDépartMin | timeToString }} et avez cotisé {{ .SimuSurcote.Trimestres }} trimestres, + soient {{ .SimuSurcote.DeltaTrimestres }} trimestres supplémentaires par rapport au taux plein, + votre pension serait alors de l'ordre de {{ .SimuSurcote.TauxPension }}% de vos 25 meilleures années - à partir du {{ .Infos.DateTauxPleinAuto | timeToString }}, vous pourrez automatiquement bénéficier d'une retraite à taux plein, - et ce, quelque soit votre nombre de trimestres cotisés, @@ -65,12 +54,6 @@ Votre bilan retraite simplifié suite à la réforme 2010 : - votre employeur serait en droit de contraindre ce départ, - et vous auriez alors {{ .Infos.AgeDépartExigible.AgeEnAnneesMois }} -- pour un bilan complet, relancer le calculateur avec les données de votre relevé de carrière - - des relevés de situation vous sont transmis par courrier à partir de vos 40 ans, et tous les 5 ans, - - ces relevés font un point sur vos trimestres cotisés, - - vous pouvez aussi télécharger votre relevé après avoir créé votre espace depuis https://www.lassuranceretraite.fr/ - - à partir de 55 ans, il est aussi possible de prendre rendez-vous avec votre caisse. - Pour en savoir plus : - https://www.lassuranceretraite.fr/ par la sécurité sociale - CNAV - http://www.info-retraite.fr/ par le GIP des organismes de retraite de base et complémentaires