#' @title Calcul des conséquences financières de l'attribution de taux préférentiels
#' aux femmes touchées par le relèvement de l'âge de la retraite par rapport aux
#' taux prévus par la réforme dans mod_opt_ah21_kurz_bei_vbz.
#'
#' @description Ce module projette les conséquences financières de l'attribution
#' de taux préférentiels aux femmes touchées par le relèvement de l'âge de la
#' retraite par rapport aux taux prévus par la réforme dans mod_opt_ah21_kurz_bei_vbz.
#' Une troisième année de retraite est créée pour les femmes de 64 ans avec les
#' taux préférentiels. Si les hommes sont inclus, une 3ème année de retraite est
#' créée pour eux aussi (62 ans).
#'
#' @param PARAM_GLOBAL un dataframe d'une seule ligne, dont nous utilisons les
#'   paramètres suivants:
#'  - `jahr_rr`: Année du registre des rentes analysé
#'  - `jahr_ende` : Année de fin de la projection
#'  - `ra_m`: âge légal de la retraite des hommes selon le droit en vigueur
#'  - `min_age_retraite`: âge minimal de retraite (62 selon le droit en vigueur)
#'  - `max_age`: âge maximal selon le scénario de la population
#'
#' @param PARAM_MASSNAHMEN un dataframe d'une seule ligne, dont nous utilisons les
#'   paramètres suivants:
#'  - `guillotine_femmes_uniquement`: si TRUE, modèle pour les femmes uniquement.
#'  - `guillotine`: montant de RAMD correspondant à la guillotine.
#'  - `guillotine_hommes_femmes`: si TRUE, modèle pour les femmes et les hommes.
#'  - `m_ahv_ausgleichsmassn_guillotine_beginn`: année de l'entrée en vigueur de
#'  la mesure.
#'  - `m_ahv_ausgleichsmassn_guillotine_vb_qte`: proportion de f/h prenant
#'  une année/3 ans de retraite anticipée qui doit être multiplié par
#'  m_ahv_ausgleichsmassn_guillotine_vb_qte_fakt_1vb_basrev, par
#'  m_ahv_ausgleichsmassn_guillotine_vb_qte_fakt_3vb_basrev ou par
#'  m_ahv_ausgleichsmassn_guillotine_vb_qte_fakt_1vb_hauts_rev.
#'  - `m_ahv_ausgleichsmassn_guillotine_vb_qte_fakt_1vb_basrev`: proportion de f
#'  prenant une année de retraite anticipée qui doit être multiplié par
#'  m_ahv_ausgleichsmassn_guillotine_vb_qte, avec bas revenus.
#'  - `m_ahv_ausgleichsmassn_guillotine_vb_qte_fakt_1vb_hauts_rev`: proportion de f
#'  prenant une année de retraite anticipée qui doit être multiplié par
#'  m_ahv_ausgleichsmassn_guillotine_vb_qte, avec hauts revenus.
#'  - `m_ahv_ausgleichsmassn_guillotine_vb_qte_fakt_3vb_basrev`: proportion de h
#'  prenant 3 ans de retraite anticipée qui doit être multiplié par
#'  m_ahv_ausgleichsmassn_guillotine_vb_qte.
#'  - `max_annees_anticip_ausgleichsmassn_guillotine`: nombre d'année maximal
#'  d'anticipation pour le modèle de la guillotine.
#'  - `befrist_ende_ausgleichsmassn_guillotine`: année de fin de la mesure.
#'  - `ohne_62schicht_f_krzbeivbz`: sans la couche des femmes qui prennent la
#'  retraite à 62 ans.
#'  - `ohne_3vbz`: si TRUE, sans 3ème année d'anticipation.
#'  - `ra_f_t`: âge légal de retraite de femmes prévu par la réforme
#'  - `m_ahv_ausgleichsmassn_en_dessous_guillotine_taux_red_ajuste_j3_vbz_m`:
#'  taux de réduction pour la 3ème année d'anticipation des hommes en dessous de
#'  la guillotine (62).
#'  - `m_ahv_ausgleichsmassn_en_dessous_guillotine_taux_red_ajuste_j2_vbz_m`:
#'  taux de réduction pour la 2ème année d'anticipation des hommes en dessous de
#'  la guillotine (63).
#'  - `m_ahv_ausgleichsmassn_en_dessous_guillotine_taux_red_ajuste_j1_vbz_m`:
#'  taux de réduction pour la première année d'anticipation des hommes en dessous de
#'  la guillotine (64).
#'  - `m_ahv_ausgleichsmassn_en_dessous_guillotine_taux_red_ajuste_j3_vbz_f`:
#'  taux de réduction pour la 3ème année d'anticipation des femmes en dessous de
#'  la guillotine (62).
#'  - `m_ahv_ausgleichsmassn_en_dessous_guillotine_taux_red_ajuste_j2_vbz_f`:
#'  taux de réduction pour la 2ème année d'anticipation des femmes en dessous de
#'  la guillotine (63).
#'  - `m_ahv_ausgleichsmassn_en_dessous_guillotine_taux_red_ajuste_j1_vbz_f`:
#'  taux de réduction pour la première année d'anticipation des femmes en dessous de
#'  la guillotine (64).
#'  - `m_ahv_ausgleichsmassn_en_dessus_guillotine_taux_red_ajuste_j3_vbz_f`:
#'  taux de réduction pour la 3ème année d'anticipation des femmes en dessus de
#'  la guillotine (62).
#'  - `m_ahv_ausgleichsmassn_en_dessus_guillotine_taux_red_ajuste_j2_vbz_f`:
#'  taux de réduction pour la 2ème année d'anticipation des femmes en dessus de
#'  la guillotine (63).
#'  - `m_ahv_ausgleichsmassn_en_dessus_guillotine_taux_red_ajuste_j1_vbz_f`:
#'  taux de réduction pour la première année d'anticipation des femmes en dessus de
#'  la guillotine (64).
#'  - `annee_transition`
#'  - `facteur_corr_vbz_quote_ageret62_basmoyrev_f`: Facteur de correction pour
#'  la proportion des femmes retraitées bas/moyens revenus à 62 ans;
#'  - `facteur_corr_vbz_quote_ageret63_basmoyrev_f`: Facteur de correction pour
#'  la proportion des femmes retraitées bas/moyens revenus à 63 ans;
#'  - `facteur_corr_vbz_quote_ageret63_basmoyrev_m`: Facteur de correction pour
#'  la proportion des hommes retraités bas/moyens revenus à 63 ans;
#'  - `facteur_corr_vbz_quote_ageret64_basmoyrev_m`: Facteur de correction pour
#'  la proportion des hommes retraités bas/moyens revenus à 64 ans;
#'  - `facteur_corr_vbz_quote_ageret62_hautrev_f`  : Facteur de correction pour
#'  la proportion des femmes retraitées hauts revenus à 62 ans;
#'  - `facteur_corr_vbz_quote_ageret63_hautrev_f`  : Facteur de correction pour
#'  la proportion des femmes retraitées hauts revenus à 63 ans;
#'  - `facteur_corr_vbz_quote_ageret63_hautrev_m`  : Facteur de correction pour
#'  la proportion des hommes retraités hauts revenus à 63 ans;
#'  - `facteur_corr_vbz_quote_ageret64_hautrev_m`  : Facteur de correction pour
#'  la proportion des hommes retraités hauts revenus à 64 ans;
#'  - `max_annees_anticip_t`: Nombre d'années maximum d'anticipation prévu par
#'  la réforme;
#'  - `m_drittes_vb_jahr_vbz_quote_m`: Proportion supposée d'hommes partant à
#'  la retraite pour 3 ans d'anticipation;
#'  - `m_drittes_vb_jahr_vbz_quote_f` : Proportion supposée de femmes partant à
#'  la retraite pour 1 an d'anticipation;
#'  - `scenario_reforme_not_hardcoded`:  Scénario des taux d'anticipation prévus
#'  par la réforme AVS 21 dans le fichier ant_ajo_flex.xlsx;
#'
#'
#' @param PARAM_AHV21_3VORBJAHR un dataframe d'une seule ligne, qui permet de
#' d'avoir les même chiffres pour la mesure de compensation guillotine que sur
#' le budget du message en cas de suppression des personnes qui prennent une
#' retraite anticipé de trois ans.
#'
#' @param PARAM_MISC_13RENTEAVS un dataframe d'une seule ligne retravaillé dans
#' \code{\link{wrap_ahv_massnahmen}}, dont nous utilisons les paramètres suivants:
#'  - `flag_mesure_13renteavs`: dummy, si TRUE, la mesure avec le supplément de
#'  rente proportionnel doit être calculé.
#'  - `annee_debut`: Année de l'entrée en vigueur de la mesure
#'  - `annee_fin`: Année de la fin de la mesure
#'  - `facteur`: Facteur de la somme des rentes (1/12 = 8.33% correspond à
#'  une rente mensuelle complète supplémentaire si denominateur = 12).
#'
#' @param FACTEUR_CONV_EPRC tibble pour convertir les EPRC en nombre d'individus
#'
#' @param MORTALITE tibble des taux de mortalité pour créer une année de retraite
#' supplémentaire pour les femmes de 64 ans (et les hommes de 62 ans si besoin).
#' Voir fonction \code{\link{mod_input_mortalite}}.
#'
#' @param ANT_AJO_FLEX tibble avec les taux de réduction en cas d'anticipation
#' pour calculer les effets d'une modification de ceux-ci selon le droit en vigueur
#' et selon la réforme. Voir fonction \code{\link{mod_input_ant_ajo_flex}}.
#'
#' @param RR_BASMOYREV_HF Extrait du registre des rentes avec les données individuelles
#' incluant le plafonnement (cplaf) <= 72 fois Rente Minimale.
#'
#' @param RR_HAUTSREV_HF Extrait du registre des rentes avec les données individuelles
#' incluant le plafonnement (cplaf) > 48 fois Rente Minimale.
#'
#' @param RENTENZYKLUS data frame contenant les facteurs de
#' correction du niveau des premières rentes calculés dans la fonction
#' \code{\link{mod_rentenzyklus}}.
#'
#' @param EPRC_ESTIMATION_MASSNAHMEN data frame contenant les EPRC calculés dans la
#' fonction \code{\link{mod_ahv21_eprc}} pour un âge de retraite des femmes
#' de 65 ans grâce aux données de la population et aux taux de mortalité de l'OFS.
#'
#' @param FACTEUR_CORR_ANT_AJO data frame contenant les taux d'anticipation ou
#' d'ajournement selon le droit en vigueur et les scénarios de réformes, ainsi
#' que les facteurs de correction servant à ajuster in fine les sommes de rentes.
#' Il est calculé dans la fonction \code{\link{mod_facteur_corr_ant_ajo_go}}
#' selon le droit en vigueur.
#'
#' @param ANT_TOTAL data frame contenant des valeurs fictives pour les rentiers
#' qui auraient la possibilité de prendre une 3ème année d'anticipation (à 62
#' ans), calculé p.ex. dans \code{\link{mod_facteur_corr_ant_ajo_go}} selon le
#' droit en vigueur.
#'
#' @param AJO_TOTAL data frame contenant des valeurs fictives pour les  rentières
#' qui peuvent ajourner leur retraite jusqu'à l'âge de 70 ans étant donné un
#' relèvement de leur âge légal de la retraite d'une année , calculé p.ex. dans
#' \code{\link{mod_facteur_corr_ant_ajo_go}} selon le droit en vigueur.
#'
#' @param RAMPE_M data frame contenant la rampe pour les hommes non touchés par
#' certaines mesures pour la première année (facteur 0.5) à la suite de
#' l'introduction d'une mesure, étant donné que les anniversaires sont supposés
#' uniformément distribués.
#'
#' @param RAMPE_F data frame contenant la rampe pour les femmes non touchés par
#' certaines mesures pour la première année (facteur 0.5) à la suite de
#' l'introduction d'une mesure, étant donné que les anniversaires sont supposés
#' uniformément distribués.
#'
#' @param RAMPE data frame contenant la rampe pour le relèvement par 3 mois de
#' l'âge de la retraite et pour la première année (facteur 0.5) à la suite de
#' l'introduction d'une mesure, étant donné que les anniversaires sont supposés
#' uniformément distribués.
#'
#' @param RR_AVS data frame contenant les données des assurés du registre des
#' rentes sous forme agrégée.
#'
#' @param INPUT_3VBZJAHR OPT_INPUT_3VBZJAHR..ahv21_3vorbjahr:
#' Input de 3vorbjahr nécessaire pour calculer l'effet des taux préférentiels
#' sur la 3ème année d'anticipation.
#'
#' @param RENTENENTWICKLUNG data frame contenant l'évolution de la rente
#' minimale AVS.
#'
#' @param AHV_ABRECHNUNG data frame contenant le décompte de la CdC présentant
#' les chiffres de l'AVS de 2011 à jahr_abr, cf. fonction
#' \code{\link{mod_input_ahv_abrechnung}}.
#'
#' @param WF_EPRC_BAS_ET_HAUTS_REV facteurs de
#' croissance des EPRC pour les hauts et bas revenus (type_rev). Voir fonction
#' \code{\link{mod_ahv_rs_frauen_hauts_et_bas_rev}}.
#'
#' @param WF_EPRC_BASMOY_REV facteurs de
#' croissance des EPRC pour les bas et moyens revenus (type_rev). Voir fonction
#' \code{\link{mod_ahv_rentensumme_bas_moyens_rev}}.
#'
#' @param RS_3VBZ_BASMOY_REV  =  tbd
#'
#' @param list `tidylist`. Elément obligatoire dans tous les modules. Au lieu de
#' fournir des dataframes au module, il est possible de l'alimenter uniquement
#' avec une`tidylist` qui contient les tidy dataframes. Tous les datframes
#' listés doivent être présents dans la tidylist, avec le même nom. De plus,
#' la `tidylist` peut aussi contenir des dataframes qui ne sont pas utilisés
#' par le module.
#'
#' @return a `tidylist` containing the following tidy data frames:
#'  - `NOUVELLES_VBZ_QUOTEN_DELTA_ANT`
#'  - `POPU_VORB3JAHR`
#'  - `DELTA_AUSGL_MASSN`
#'  - `TAUX_RED_AUSGLEICHSMASSN_GUILLOTINE`
#'  - `NBRE_EPRC_ANT_MODIF`
#'  - `POURCENT_BASMOY_REV`
#'  - `NBRE_EPRC_NOUVEAUX_RENTIERS`
#'  - `DELTA_AUSGL_MASSN_TYPE_REV`
#'  - `PROP_BMH_REV`
#'  - `POPU_VORB3JAHR_NEW`
#'  - `POPU_VORB3JAHR_CUM`
#'
#' @author [MAS BSV](mailto:sekretariat.mas@bsv.admin.ch)
#'
#' @export
#'

#
mod_ahv_ausgleichsmassnahmen_guillotine <- function(PARAM_GLOBAL,
                                                    FACTEUR_CONV_EPRC,
                                                    PARAM_MASSNAHMEN,
                                                    PARAM_MISC_13RENTEAVS,
                                                    ANT_AJO_FLEX,
                                                    TAUX_MORTALITE,
                                                    INPUT_3VBZJAHR,
                                                    EPRC_ESTIMATION_MASSNAHMEN,
                                                    FACTEUR_CORR_ANT_AJO,
                                                    ANT_TOTAL,
                                                    AJO_TOTAL,
                                                    RENTENENTWICKLUNG,
                                                    RR_AVS,
                                                    RENTENZYKLUS,
                                                    RAMPE,
                                                    WF_EPRC_BASMOY_REV,
                                                    RR_HAUTSREV_HF,
                                                    RR_BASMOYREV_HF,
                                                    RAMPE_F,
                                                    RAMPE_M,
                                                    WF_EPRC_BAS_ET_HAUTS_REV,
                                                    RS_3VBZ_BASMOY_REV,
                                                    PARAM_AHV21_3VORBJAHR,
                                                    AHV_ABRECHNUNG
                                                    ) {

    print("Run module: mod_ahv_ausgleichsmassnahmen_guillotine")
    
  #-------Berechnungen----------------

  ### solution provisoire qui permet de d'avoir les même chiffres pour la mesure de compensation guillotine
  ### que sur le budget du message en cas de suppression des personnes qui prennent une retraite anticipé de trois ans

  if (PARAM_AHV21_3VORBJAHR$m_drittes_vb_jahr_vbz_quote_m == 0 &
    PARAM_AHV21_3VORBJAHR$m_drittes_vb_jahr_vbz_quote_f == 0) {
    PARAM_AHV21_3VORBJAHR$m_drittes_vb_jahr_vbz_quote_m <- 6
    PARAM_AHV21_3VORBJAHR$m_drittes_vb_jahr_vbz_quote_f <- 18

    tl <- mod_vorb_drittes_jahr(
      PARAM_GLOBAL = PARAM_GLOBAL,
      PARAM_MISC_13RENTEAVS = PARAM_MISC_13RENTEAVS,
      FACTEUR_CONV_EPRC = FACTEUR_CONV_EPRC,
      PARAM_MASSNAHMEN = PARAM_AHV21_3VORBJAHR,
      EPRC_ESTIMATION_MASSNAHMEN = EPRC_ESTIMATION_MASSNAHMEN,
      TAUX_MORTALITE = TAUX_MORTALITE,
      FACTEUR_CORR_ANT_AJO = FACTEUR_CORR_ANT_AJO,
      ANT_TOTAL = ANT_TOTAL,
      AJO_TOTAL = AJO_TOTAL,
      AHV_ABRECHNUNG = AHV_ABRECHNUNG,
      RENTENENTWICKLUNG = RENTENENTWICKLUNG,
      RR_AVS = RR_AVS,
      RENTENZYKLUS = RENTENZYKLUS,
      RAMPE_F = RAMPE_F,
      RAMPE_M = RAMPE_M
    )

    # Cet input a déjà été adapté pour la 13ème rente AVS si
    # PARAM_MISC_13RENTEAVS$flag_mesure_13renteavs est TRUE
    INPUT_3VBZJAHR <- tl$INPUT_3VBZJAHR
  }

    # combiner les deux types de revenus pour les femmes
    RR_1 <- RR_HAUTSREV_HF[RR_HAUTSREV_HF$sex == "f" &
      RR_HAUTSREV_HF$ram > PARAM_MASSNAHMEN$guillotine, ] %>%
      bind_rows(RR_BASMOYREV_HF[RR_BASMOYREV_HF$sex == "f" &
        RR_BASMOYREV_HF$ram <= PARAM_MASSNAHMEN$guillotine, ],
      .id = "type_rev"
      ) %>%
      mutate(type_rev = if_else(type_rev == 1, "haut_rev", "basmoy_rev")) %>%
      mutate(gpr = "rvieillesse_simple")

  #--- Proportions bas, moyens et hauts revenus --------------------------------
  # pour la 1ère annnée d'anticipation (64 ans)
  # pour les femmes

  # Rente minmale selon le RR et les paramètres
  rente_min_rr <- PARAM_MASSNAHMEN$guillotine / 48

  # Nombre total de nouvelles rentières parties à l'âge de 64 ans à la retraite
  CHECK_TOTAL <- RR_1 %>%
    filter(
      sex == "f",
      alt == age_ret,
      age_ret == 64,
      gpr == "rvieillesse_simple"
    )

  # Nombre total de nouvelles rentières parties à l'âge de 64 ans à la retraite
  # ayant un bas revenu
  CHECK_BAS <- RR_1 %>%
    filter(
      sex == "f",
      alt == age_ret,
      age_ret == 64,
      gpr == "rvieillesse_simple",
      type_rev == "basmoy_rev"
    ) %>%
    mutate(
      n_total = n(),
      type_rev_corr = case_when(
        ram <= 4 * 12 * rente_min_rr ~ "bas",
        ram > 4 * 12 * rente_min_rr &
          ram <= 5 * 12 * rente_min_rr ~ "moy",
        TRUE ~ "haut"
      )
    )


  RR_ASSURANCE_VIEILLESSE_RENTES_FILTERED_FLEX_RR_1 <- RR_1 %>%
    # grouper en plus par le type de revenus
    group_by(jahr, alt, sex, nat, zv, dom, age_ret, gpr, type_rev) %>%
    summarise(
      monatliche_rentensumme = sum(monatliche_altersrente),
      durchschnitt_monatliche_renten = mean(monatliche_altersrente),
      median_monatliche_renten = median(monatliche_altersrente),
      summe_ram = sum(ram),
      median_ram = median(ram),
      durchschnitt_ram = mean(ram),
      eprc = sum(skala / 44),
      bez_av = n()
    ) %>%
    group_by(jahr, alt, sex, nat, zv, dom, gpr) %>%
    mutate(n_alt = sum(bez_av)) %>%
    ungroup() %>%
    filter(age_ret <= alt |
      is.na(age_ret)) %>%
    # Filtrer pour l'auswertungsjahr uniquement
    filter(jahr == PARAM_GLOBAL$jahr_rr) %>%
    # Version simplifiée (par groupe d'age_ret)
    group_by(sex, nat, dom, zv, alt, age_ret, gpr) %>%
    mutate(rentensumme_ref = sum(monatliche_rentensumme * 12 / 1e6)) %>%
    dplyr::select(sex, nat, dom, zv, alt, age_ret, gpr, bez_av, n_alt, type_rev, rentensumme_ref)


  SURV <- TAUX_MORTALITE  %>%
    filter(sex == "f") %>%
    filter(alt >= 69) %>%
    filter(jahr == 2030) %>%
    filter(nat == "ch") %>%
    mutate(surv = 1 - quotients_mortalite) %>%
    dplyr::select(alt, surv)


  #-------------VORBEZUG 3. JAHR POUR LES NOUVEAUX ECHANTILLONS-------------------
  #--------------Procédure normale de projection des rentes-----------------
  # But: extraire les rentes moyennes des femmes et hommes de 64 et 65 ans resp.
  RR_0 <- RR_AVS %>%
    filter(!is.na(gpr))


  RR_ASSURANCE_VIEILLESSE_RENTES_FILTERED_FLEX <- RR_0 %>%
    # Filtrer pour l'auswertungsjahr uniquement
    filter(jahr == PARAM_GLOBAL$jahr_rr) %>%
    # Version simplifiée (par groupe d'age_ret)
    group_by(sex, nat, dom, zv, alt, age_ret, gpr) %>%
    mutate(rentensumme_ref = sum(monatliche_rentensumme * 12 / 1e6)) %>%
    dplyr::select(sex, nat, dom, zv, alt, age_ret, gpr, bez_av, n_alt, rentensumme_ref)

  all.zv <- unique(RR_ASSURANCE_VIEILLESSE_RENTES_FILTERED_FLEX$zv)



  RENTENSUMME_PROJECTION_1_FLEX_0 <- FACTEUR_CORR_ANT_AJO %>%
    left_join(RR_ASSURANCE_VIEILLESSE_RENTES_FILTERED_FLEX,
      by = c("sex", "nat", "dom", "alt", "age_ret", "zv", "gpr")
    ) %>%
    filter(jahr >= PARAM_GLOBAL$jahr_rr) %>%
    arrange(sex, nat, dom, alt, age_ret, zv, gpr, jahr) %>%
    ungroup()


  RENTENSUMME_PROJECTION_1_FLEX <- RENTENSUMME_PROJECTION_1_FLEX_0 %>%
    left_join(RENTENZYKLUS, by = c("jahr", "alt", "age_ret")) %>%
    # compléter pour les autres rentes: hypo = ne varient pas
    mutate(wf_rentenzyklus = if_else(is.na(wf_rentenzyklus),
      1, wf_rentenzyklus
    )) %>%
    arrange(sex, nat, dom, zv, age_ret, alt, gpr, jahr) %>%
    # Version simplifiée (par groupe d'age_ret)
    group_by(sex, nat, dom, alt, age_ret, zv, gpr) %>%
    mutate(
      cumprod_fakt = cumprod(wachstumsfaktor),
      rentensumme = rentensumme_ref *
        # facteur de correction des rentes en cas de nouvelle réforme
        facteur_corr_taux_flex *
        # facteurs de croissance annuels des EPRC projetés par âge
        cumprod_fakt *
        # adaptation des premières rentes
        wf_rentenzyklus
    ) %>%
    dplyr::select(jahr, alt, age_ret, nat, dom, sex, zv, gpr, rentensumme, bez_av, eprc) %>%
    ungroup()


  #--------%  en dessous et au dessus de la guillotine par catégories-----------------------
 
    POURCENT_BASMOY_REV_1 <- RR_1 %>%
      group_by(jahr, sex, alt, age_ret) %>%
      summarise(
        somme_totale_eprc = sum(eprc, na.rm = TRUE),
        somme_totale_ind = n()
      ) %>%
      ungroup() %>%
      dplyr::select(-jahr) %>%
      dplyr::select(sex, alt, age_ret, somme_totale_eprc, somme_totale_ind)

    POURCENT_BASMOY_REV <- RR_1 %>%
      group_by(jahr, sex, alt, age_ret, type_rev) %>%
      summarise(
        somme_totale_eprc_type_rev = sum(eprc, na.rm = TRUE),
        somme_totale_ind_type_rev = n()
      ) %>%
      ungroup() %>%
      dplyr::select(-jahr) %>%
      left_join(POURCENT_BASMOY_REV_1,
        by = c("alt", "age_ret", "sex")
      ) %>%
      # pourcent des eprc par type de revenus
      mutate(
        pourcent_eprc = somme_totale_eprc_type_rev / somme_totale_eprc,
        pourcent_ind = somme_totale_ind_type_rev / somme_totale_ind
      ) %>%
      ungroup()


  ######################## 3. Jahr VBZ######################################
  #------------- Konstruktion VBZ_QUOTE----------------
  # template cumprod vector
  jahr0 <- (PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_guillotine_beginn - 1):PARAM_GLOBAL$jahr_ende

  # Calcul
  v <- rep(PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_guillotine_vb_qte / 100, length(jahr0) + 1)
  # plot(v, cumprod(rep(param_erstrente, length(jahr0) + 1)))

  vn <- length(v)
  # .age_ret =64
  # df par age ret

  param_age_ret <- function(.age_ret) {
    jahr0 <- (PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_guillotine_beginn - 1):PARAM_GLOBAL$jahr_ende
    alt0 <- .age_ret:PARAM_GLOBAL$max_age

    col_i <- function(x) c(rep(1, x), v[-((vn - x):vn)])

    tibble(
      jahr = rep(jahr0, length(alt0)),
      alt = rep(alt0, each = length(jahr0)),
      vbz_quote = unlist(lapply(seq(alt0), col_i))
    )
  }

  VBZ_QUOTE_HAUTS_REV_FEMMES <- tibble(age_ret = PARAM_GLOBAL$min_age_retraite:PARAM_GLOBAL$max_age_retraite) %>%
    rowwise() %>%
    mutate(data = list(param_age_ret(age_ret))) %>%
    unnest(cols= c(data)) %>%
    filter(jahr >= PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_guillotine_beginn) %>%
    mutate(
      cum_vbz_quote1 = case_when(
        alt >= age_ret &
          vbz_quote != 1 ~ vbz_quote,
        # ~ vbz_quote * (alt - age_ret + 1),
        vbz_quote == 1 ~ 0
      ),
      annee_retraite = jahr - (alt - age_ret),
      annee_naissance = jahr - alt
    ) %>%
    dplyr::select(-vbz_quote) %>%
    mutate(cum_vbz_quote = case_when(

      # % de femmes hauts revenus de 64 qui prennent la retraite à 64 ans
      cum_vbz_quote1 != 0 &
        (PARAM_GLOBAL$ra_m - age_ret) == (PARAM_MASSNAHMEN$max_annees_anticip_ausgleichsmassn_guillotine - 2) ~
        as.numeric(PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_guillotine_vb_qte_fakt_1vb_hauts_rev *
          PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_guillotine_vb_qte) /
          100,
      TRUE ~ 0
    )) %>%
    mutate(
      sex = "f",
      type_rev = "haut_rev"
    ) %>%
    left_join(POURCENT_BASMOY_REV %>%
      dplyr::select(sex, alt, age_ret, type_rev, pourcent_eprc) %>%
      filter(
        sex == "f",
        type_rev == "haut_rev"
      ),
    by = c("age_ret", "alt", "sex", "type_rev")
    ) %>%
    # quand on a l'information sur le pourcentage de haut/bas revenus, on le prend, sinon, on suppose que c'est 50/50
    mutate(cum_vbz_quote = cum_vbz_quote * if_else(is.na(pourcent_eprc), 0.5, pourcent_eprc)) %>%
    filter(age_ret == PARAM_GLOBAL$min_age_retraite + 2 * (sex == "f")) %>%
    filter(annee_retraite >= PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_guillotine_beginn) %>%
    mutate(cum_vbz_quote = case_when(
      annee_retraite > PARAM_MASSNAHMEN$befrist_ende_ausgleichsmassn_guillotine ~ 0,
      TRUE ~ cum_vbz_quote
    ))


  VBZ_QUOTE_BAS_REV <- tibble(age_ret = PARAM_GLOBAL$min_age_retraite:PARAM_GLOBAL$max_age_retraite) %>%
    rowwise() %>%
    mutate(data = list(param_age_ret(age_ret))) %>%
    unnest(cols = c(data)) %>%
    filter(jahr >= PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_guillotine_beginn) %>%
    mutate(
      cum_vbz_quote1 = case_when(
        alt >= age_ret &
          vbz_quote != 1 ~ vbz_quote,
        # ~ vbz_quote * (alt - age_ret + 1),
        vbz_quote == 1 ~ 0
      ),
      annee_retraite = jahr - (alt - age_ret),
      annee_naissance = jahr - alt
    ) %>%
    dplyr::select(-vbz_quote) %>%
    crossing(sex = c("m", "f")) %>%
    mutate(cum_vbz_quote = case_when(

      # %HOMMES de 62 qui prennent la retraite à 62 ans
      cum_vbz_quote1 != 0 &
        sex == "m" &
        (PARAM_GLOBAL$ra_m - age_ret) == PARAM_MASSNAHMEN$max_annees_anticip_ausgleichsmassn_guillotine ~
        as.numeric(PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_guillotine_vb_qte_fakt_3vb_basrev *
          PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_guillotine_vb_qte) / 100,

      # % de femmes bas à moyens revenus de 64 qui prennent la retraite à 64 ans

      cum_vbz_quote1 != 0 &
        sex == "f" &
        (PARAM_GLOBAL$ra_m - age_ret) == (PARAM_MASSNAHMEN$max_annees_anticip_ausgleichsmassn_guillotine - 2) ~
        as.numeric(PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_guillotine_vb_qte_fakt_1vb_basrev *
          PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_guillotine_vb_qte) / 100,
      TRUE ~ 0
    )) %>%
    mutate(type_rev = "basmoy_rev") %>%
    left_join(POURCENT_BASMOY_REV %>%
      dplyr::select(sex, alt, age_ret, type_rev, pourcent_eprc) %>%
      filter(type_rev == "basmoy_rev"),
    by = c("age_ret", "alt", "sex", "type_rev")
    ) %>%
    # quand on a l'information sur le pourcentage de haut/bas revenus, on le prend, sinon, on suppose que c'est 50/50
    mutate(cum_vbz_quote = cum_vbz_quote * if_else(is.na(pourcent_eprc), 0.5, pourcent_eprc)) %>%
    filter(age_ret == PARAM_GLOBAL$min_age_retraite + 2 * (sex == "f")) %>%
    filter(annee_retraite >= PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_guillotine_beginn) %>%
    mutate(cum_vbz_quote = case_when(
      annee_retraite > PARAM_MASSNAHMEN$befrist_ende_ausgleichsmassn_guillotine ~ 0,
      TRUE ~ cum_vbz_quote
    ))



  # Calcul des eprc
    VBZ_QUOTE_MERGE <- VBZ_QUOTE_HAUTS_REV_FEMMES %>%
      dplyr::select(jahr, alt, annee_naissance, annee_retraite, age_ret, sex, type_rev, cum_vbz_quote) %>%
      rename(cum_vbz_quote_hautrev_femmes = cum_vbz_quote) %>%
      bind_rows(VBZ_QUOTE_BAS_REV %>%
        filter(sex == "f") %>%
        dplyr::select(
          jahr, alt, annee_naissance, annee_retraite, age_ret, sex, type_rev,
          cum_vbz_quote
        ) %>%
        rename(cum_vbz_quote_basmoyrev_femmes = cum_vbz_quote))

    EPRC_ESTIMATION_EXT <- EPRC_ESTIMATION_MASSNAHMEN %>%
      # au lieu de EPRC_ESTIMATION
      filter(sex == "f") %>%
      filter(alt >= PARAM_GLOBAL$min_age_retraite + 2 * (sex == "f")) %>%
      rename(eprc_vorb = eprc) %>%
      mutate(annee_naissance = jahr - alt) %>%
      # pour chaque age_ret
      crossing(age_ret = PARAM_GLOBAL$min_age_retraite:PARAM_GLOBAL$max_age_retraite) %>%
      filter(age_ret == PARAM_GLOBAL$min_age_retraite + 2 * (sex == "f")) %>%
      crossing(type_rev = c("basmoy_rev", "haut_rev")) %>%
      left_join(VBZ_QUOTE_MERGE,
        by = c("jahr", "alt", "annee_naissance", "age_ret", "sex", "type_rev")
      ) %>%
      mutate(
        cum_vbz_quote = if_else(is.na(cum_vbz_quote_hautrev_femmes), 0, cum_vbz_quote_hautrev_femmes) +
          if_else(is.na(cum_vbz_quote_basmoyrev_femmes), 0, cum_vbz_quote_basmoyrev_femmes),
        eprc_adj = eprc_vorb * cum_vbz_quote,
        gpr = "rvieillesse_simple"
      ) %>%
      left_join(TAUX_MORTALITE,
                by = c("sex", "jahr", "alt", "nat")
      )
  
  
  dta_age_ret <- function(.age_ret) {

    # Nouveaux rentiers projetés de PARAM_GLOBAL$jahr_rr à jahr_ende (1ère colonne)
    PROJ <- EPRC_ESTIMATION_EXT %>%
      dplyr::select(sex, nat, dom, jahr, alt, gpr, type_rev, age_ret, eprc_adj) %>%
      filter(alt == age_ret) %>%
      filter(alt == .age_ret)

  
    PROJ %>%
      rename(eprc = eprc_adj) %>%
      dplyr::select(sex, nat, dom, jahr, alt, gpr, type_rev, eprc) %>%
      # Ajouter les quotients de mortalité
      right_join(
        dplyr::select(
          filter(EPRC_ESTIMATION_EXT, age_ret == .age_ret),
          sex, nat, dom, jahr, alt, gpr, type_rev, quotients_mortalite
        ),
        by = c("sex", "nat", "dom", "jahr", "alt", "gpr", "type_rev")
      ) %>%
      mutate(age_ret = .age_ret)
  }

   #
  # Projection DES EPRC : Fonction de calcul des EPRC en fonction des quotients de mortalité
  calculate_eprc_vorb_projection <- function(DTA) {

    # Jahr und Alter
    jahr <- unique(DTA$jahr)
    alt <- unique(DTA$alt)
    # age_ret <- as.vector(na.omit(unique(DTA$age_ret)))

    # Taux de mortalité
    Q <- tibble_to_matrix(dplyr::select(DTA, jahr, alt, quotients_mortalite))

    # Equivalents pleine rente projetés cumulés projetés avec le facteur de croissance wr

    K <- tibble_to_matrix(dplyr::select(DTA, jahr, alt, eprc))

    for (i in (seq_along(jahr[-1]) + 1)) {
      for (j in (seq_along(alt[-1]) + 1)) {
        # 2ème étape: calculer les données en les multipliant par les quotients de mortalité pour x != age_ret:
        # \hat{K}_{x, age_ret}^t = \hat{K}_{x-1, age_ret}^{t - 1} * (1-q_x^t)
        K[i, j] <- (1 - Q[i - 1, j - 1]) * K[i - 1, j - 1]
      }
    }

    matrix_to_tibble(K, dplyr::select(DTA, jahr, alt, eprc))
  }


  EPRC_PROJECTION_FLEX_VORB <- dplyr::select(EPRC_ESTIMATION_EXT, age_ret, sex, nat, dom, gpr, type_rev) %>%
    distinct() %>%
    rename_all(list(~paste0(".", .))) %>%
    rowwise() %>%
    mutate(data = list(filter(
      dta_age_ret(.age_ret),
      sex == .sex,
      nat == .nat,
      dom == .dom,
      gpr == .gpr,
      type_rev == .type_rev
    ))) %>%
    mutate(data = list(calculate_eprc_vorb_projection(data))) %>%
    # Punkte zu Beginn entfernen
    rename_all(list(~gsub("^\\.", "", .))) %>%
    unnest(cols = c(data))

  #--------------------Etape 4: rente moyenne "pure"-----------------------------------

  # Calcul de la rente moyenne "pure" pour celles qui prennent la retraite à 64 ans (femmes)
  RENTENSUMME_PROJECTION_1_FLEX_EXT <- RENTENSUMME_PROJECTION_1_FLEX %>%
    filter(
      age_ret == PARAM_GLOBAL$ra_m - 1 * (sex == "f"),
      alt == PARAM_GLOBAL$ra_m - 1 * (sex == "f"),
      gpr == "rvieillesse_simple"
    ) %>%
    group_by(jahr, sex, nat, dom) %>%
    summarise(
      rente_moy = sum(rentensumme, na.rm = TRUE) / sum(eprc, na.rm = TRUE),
      sum_rentes = sum(rentensumme, na.rm = TRUE)
    ) %>%
    ungroup()


  # Join des eprc
  RENTENSUMME_PROJECTION_1_FLEX_EXT_1 <- RENTENSUMME_PROJECTION_1_FLEX_EXT %>%
    right_join(EPRC_PROJECTION_FLEX_VORB,
      by = c("jahr", "sex", "nat", "dom")
    ) %>%
    mutate(eprc = if_else(is.na(eprc), 0, eprc))

  #--------TRAITEMENT DES TAUX D'ANTICIPATION-------------------------
  # Fonction pour arrondir aux 0.5 plus haut
  round2 <- function(x, n) {
    posneg <- sign(x)
    z <- abs(x) * 10^n
    z <- z + 0.5
    z <- trunc(z)
    z <- z / 10^n
    z * posneg
  }

  TAUX_RED_AUSGLEICHSMASSN_GUILLOTINE <- crossing(
    type_rev = c("basmoy_rev", "haut_rev"),
    age_ret = 62:64,
    sex = c("m", "f")
  ) %>%
    mutate(taux_red = case_when(
      age_ret == 62 &
        sex == "m" &
        type_rev == "basmoy_rev" ~ as.numeric(PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_en_dessous_guillotine_taux_red_ajuste_j3_vbz_m),
      age_ret == 63 &
        sex == "m" &
        type_rev == "basmoy_rev" ~ as.numeric(PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_en_dessous_guillotine_taux_red_ajuste_j2_vbz_m),
      age_ret == 64 &
        sex == "m" &
        type_rev == "basmoy_rev" ~ as.numeric(PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_en_dessous_guillotine_taux_red_ajuste_j1_vbz_m),
      age_ret == 62 &
        sex == "f" &
        type_rev == "basmoy_rev" ~ as.numeric(PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_en_dessous_guillotine_taux_red_ajuste_j3_vbz_f),
      age_ret == 63 &
        sex == "f" &
        type_rev == "basmoy_rev" ~ as.numeric(PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_en_dessous_guillotine_taux_red_ajuste_j2_vbz_f),
      age_ret == 64 &
        sex == "f" &
        type_rev == "basmoy_rev" ~ as.numeric(PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_en_dessous_guillotine_taux_red_ajuste_j1_vbz_f),
      age_ret == 62 &
        sex == "f" &
        type_rev == "haut_rev" ~ as.numeric(PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_en_dessus_guillotine_taux_red_ajuste_j3_vbz_f),
      age_ret == 63 &
        sex == "f" &
        type_rev == "haut_rev" ~ as.numeric(PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_en_dessus_guillotine_taux_red_ajuste_j2_vbz_f),
      age_ret == 64 &
        sex == "f" &
        type_rev == "haut_rev" ~ as.numeric(PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_en_dessus_guillotine_taux_red_ajuste_j1_vbz_f),
      TRUE ~ 0
    ))


  #------------- Konstruktion KRZ_SATZ----------------
  # template cumprod vector
  jahr0 <- (PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_guillotine_beginn - 1):PARAM_GLOBAL$jahr_ende

  # Calcul
  v <- rep(1, length(jahr0) + 1)
  # plot(v, cumprod(rep(param_erstrente, length(jahr0) + 1)))

  vn <- length(v)
  # .age_ret =64
  # df par age ret
  param_age_ret <- function(.age_ret) {
    jahr0 <- (PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_guillotine_beginn - 1):PARAM_GLOBAL$jahr_ende
    alt0 <- .age_ret:PARAM_GLOBAL$max_age

    col_i <- function(x) c(rep(1, x), v[-((vn - x):vn)])

    tibble(
      jahr = rep(jahr0, length(alt0)),
      alt = rep(alt0, each = length(jahr0)),
      vbz_quote = unlist(lapply(seq(alt0), col_i))
    )
  }

  # les femmes qui prennent à 64 ans une retraite anticipée
  KRZ_SATZ <- tibble(age_ret = (PARAM_MASSNAHMEN$ra_f_t - 3):(PARAM_MASSNAHMEN$ra_f_t - 1)) %>%
    rowwise() %>%
    mutate(data = list(param_age_ret(age_ret))) %>%
    unnest(cols = c(data)) %>%
    filter(jahr >= PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_guillotine_beginn) %>%
    mutate(
      krz_satz1 = case_when(
        alt >= age_ret &
          vbz_quote != 1
        ~ vbz_quote,
        vbz_quote == 1 ~ 0
      ),
      annee_retraite = jahr - (alt - age_ret),
      annee_naissance = jahr - alt
    ) %>%
    dplyr::select(-vbz_quote) %>%
    crossing(
      sex = c("m", "f"),
      type_rev = c("basmoy_rev", "haut_rev")
    ) %>%
    filter(annee_retraite >= PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_guillotine_beginn) %>%
    mutate(krz_satz = case_when(

      # HAUTS_REVENUS FEMMES
      # Femmes de 64 ans qui partent en retraite anticipée à 64 ans : frais en plus (100 - 4% rente payée)
      sex == "f" &
        !is.na(krz_satz1) &
        age_ret == (PARAM_MASSNAHMEN$ra_f_t - 1) &
        (PARAM_MASSNAHMEN$ra_f_t - 1) == alt &
        type_rev == "haut_rev" ~ (1 +
        as.numeric(PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_en_dessus_guillotine_taux_red_ajuste_j1_vbz_f)),

      # Femmes de 65 ans et plus qui sont parties à la retraite anticipée à 64 ans
      sex == "f" &
        !is.na(krz_satz1) &
        age_ret == (PARAM_MASSNAHMEN$ra_f_t - 1) &
        (PARAM_MASSNAHMEN$ra_f_t - 1) < alt &
        type_rev == "haut_rev" ~
        as.numeric(PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_en_dessus_guillotine_taux_red_ajuste_j1_vbz_f),



      # BAS REVENUS FEMMES
      # Femmes de 64 ans qui partent en retraite anticipée à 64 ans
      sex == "f" &
        !is.na(krz_satz1) &
        age_ret == (PARAM_MASSNAHMEN$ra_f_t - 1) &
        (PARAM_MASSNAHMEN$ra_f_t - 1) == alt &
        type_rev == "basmoy_rev" ~ (1 + as.numeric(PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_en_dessous_guillotine_taux_red_ajuste_j1_vbz_f)),

      # Femmes de 65 ans et plus qui sont parties à la retraite anticipée à 64 ans
      sex == "f" &
        !is.na(krz_satz1) &
        age_ret == (PARAM_MASSNAHMEN$ra_f_t - 1) &
        (PARAM_MASSNAHMEN$ra_f_t - 1) < alt &
        type_rev == "basmoy_rev" ~ as.numeric(PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_en_dessous_guillotine_taux_red_ajuste_j1_vbz_f),


      # BAS REVENUS HOMMES

      # HOMMES de 62 ans qui partent en retraite anticipée à 62 ans
      PARAM_MASSNAHMEN$guillotine_hommes_femmes == TRUE &
        sex == "m" &
        !is.na(krz_satz1) &
        age_ret == (PARAM_GLOBAL$ra_m - 3) &
        (PARAM_GLOBAL$ra_m - 3) == alt &
        type_rev == "basmoy_rev" ~ (1 +
        as.numeric(PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_en_dessous_guillotine_taux_red_ajuste_j3_vbz_m)),

      # HOMMES de 63 ans et plus qui sont partis à la retraite anticipée à 62 ans
      PARAM_MASSNAHMEN$guillotine_hommes_femmes == TRUE &
        sex == "m" &
        !is.na(krz_satz1) &
        age_ret == (PARAM_GLOBAL$ra_m - 3) &
        (PARAM_GLOBAL$ra_m - 3) < alt &
        type_rev == "basmoy_rev" ~ as.numeric(PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_en_dessous_guillotine_taux_red_ajuste_j3_vbz_m),


      # HOMMES de 62 ans qui partent en retraite anticipée à 62 ans
      PARAM_MASSNAHMEN$guillotine_hommes_femmes == FALSE &
        sex == "m" &
        !is.na(krz_satz1) &
        age_ret == (PARAM_GLOBAL$ra_m - 3) &
        (PARAM_GLOBAL$ra_m - 3) == alt &
        type_rev == "basmoy_rev" ~ 0,

      # HOMMES de 63 ans et plus qui sont partis à la retraite anticipée à 62 ans
      PARAM_MASSNAHMEN$guillotine_hommes_femmes == FALSE &
        sex == "m" &
        !is.na(krz_satz1) &
        age_ret == (PARAM_GLOBAL$ra_m - 3) &
        (PARAM_GLOBAL$ra_m - 3) < alt &
        type_rev == "basmoy_rev" ~ 0,

      # ON NE S'OCCUPE PAS DU RESTE
      TRUE ~ 0
    )) %>%
    dplyr::select(-krz_satz1)

    if ("ohne_3vbz" %in% colnames(PARAM_MASSNAHMEN)) {
      if (PARAM_MASSNAHMEN$ohne_3vbz) {
        KRZ_SATZ <- KRZ_SATZ %>%
          filter(
            age_ret != (PARAM_MASSNAHMEN$ra_f_t - 1) * (sex == "f"),
            age_ret != (PARAM_GLOBAL$ra_m - 3) * (sex == "m")
          )
      }
    }


  #--------------------Etape 5:calcul de la rentensumme pour la 3. VBZ Jahr des -----------------------------------

  RS_3VBZ_BASMOY_REV_AUSGLEICHSMASS_INIT <- RENTENSUMME_PROJECTION_1_FLEX_EXT_1 %>%
    inner_join(KRZ_SATZ,
      by = c("jahr", "sex", "age_ret", "type_rev", "alt")
    ) %>%
    mutate(rs_3vbz_basmoy_rev_ausgleichsmass = rente_moy * eprc * krz_satz)

  #--- supplément de rente AVS proportionnel -----------------------------------

  if (PARAM_MISC_13RENTEAVS$flag_mesure_13renteavs) {
    # Rajouter un supplément de rente AVS proportionnel pour tous les rentiers
    RS_3VBZ_BASMOY_REV_AUSGLEICHSMASS <- RS_3VBZ_BASMOY_REV_AUSGLEICHSMASS_INIT %>%
      # Rajouter un supplément de rente AVS proportionnel
      mutate(
        rs_3vbz_basmoy_rev_ausgleichsmass = case_when(
          gpr == "rvieillesse_simple" &
            # Entrée en vigueur de la mesure et fin de la mesure
            jahr >= PARAM_MISC_13RENTEAVS$annee_debut &
            jahr <= PARAM_MISC_13RENTEAVS$annee_fin ~ rs_3vbz_basmoy_rev_ausgleichsmass *
            (1 + eval(parse(text = PARAM_MISC_13RENTEAVS$facteur))),
          TRUE ~ rs_3vbz_basmoy_rev_ausgleichsmass
        )
      )
  } else {
    RS_3VBZ_BASMOY_REV_AUSGLEICHSMASS <- RS_3VBZ_BASMOY_REV_AUSGLEICHSMASS_INIT
  }

 

    EFFET_NET_3VBZ_JAHR <- RS_3VBZ_BASMOY_REV_AUSGLEICHSMASS %>%
      group_by(jahr, sex, nat, dom, age_ret, gpr, alt) %>%
      summarise(wert_3vbzjahr = sum(rs_3vbz_basmoy_rev_ausgleichsmass, na.rm = TRUE)) %>%
      left_join(INPUT_3VBZJAHR, by = c("jahr", "sex", "nat", "dom", "age_ret", "gpr", "alt")) %>%
      mutate(annee_retraite = jahr - (alt - age_ret)) %>%
      filter(sex == "f") %>%
      mutate(wert_net_3vbz_jahr = (wert_3vbzjahr - rs_vorb)) %>%
      mutate(effet_net_3vbz_jahr = case_when(
        # Si la mesure est appliquée entre befrist_beginn_ausgleichsmassn_guillotine
        # et befrist_ende_ausgleichsmassn_guillotine
        annee_retraite >= PARAM_MASSNAHMEN$befrist_beginn_ausgleichsmassn_guillotine &
          annee_retraite <= PARAM_MASSNAHMEN$befrist_ende_ausgleichsmassn_guillotine ~ wert_net_3vbz_jahr,
        TRUE ~ 0
      )) %>%
      group_by(jahr) %>%
      summarise(wert_3vbzjahr_effet_annuel_1 = sum(effet_net_3vbz_jahr, na.rm = TRUE)) %>%
      left_join(RAMPE, by = "jahr") %>%
      mutate(wert_3vbzjahr_effet_annuel = wert_3vbzjahr_effet_annuel_1 * rampe) %>%
      dplyr::select(jahr, wert_3vbzjahr_effet_annuel)

    EFFET_NET_3VBZ_JAHR_REV <- RS_3VBZ_BASMOY_REV_AUSGLEICHSMASS %>%
      group_by(jahr, sex, nat, dom, age_ret, gpr, alt, type_rev) %>%
      summarise(wert_3vbzjahr = sum(rs_3vbz_basmoy_rev_ausgleichsmass, na.rm = TRUE)) %>%
      left_join(INPUT_3VBZJAHR, by = c("jahr", "sex", "nat", "dom", "age_ret", "gpr", "alt")) %>%
      mutate(annee_retraite = jahr - (alt - age_ret)) %>%
      filter(sex == "f") %>%
      mutate(wert_net_3vbz_jahr = (wert_3vbzjahr - rs_vorb / 2)) %>%
      mutate(effet_net_3vbz_jahr = case_when(
        # Si la mesure est appliquée entre befrist_beginn_ausgleichsmassn_guillotine
        # et befrist_ende_ausgleichsmassn_guillotine
        annee_retraite >= PARAM_MASSNAHMEN$befrist_beginn_ausgleichsmassn_guillotine &
          annee_retraite <= PARAM_MASSNAHMEN$befrist_ende_ausgleichsmassn_guillotine ~ wert_net_3vbz_jahr,
        TRUE ~ 0
      )) %>%
      group_by(jahr, type_rev) %>%
      summarise(wert_3vbzjahr_effet_annuel_1 = sum(effet_net_3vbz_jahr, na.rm = TRUE)) %>%
      left_join(RAMPE, by = "jahr") %>%
      mutate(wert_3vbzjahr_effet_annuel = wert_3vbzjahr_effet_annuel_1 * rampe) %>%
      dplyr::select(jahr, type_rev, wert_3vbzjahr_effet_annuel)


    POPU_VORB3JAHR <- RS_3VBZ_BASMOY_REV_AUSGLEICHSMASS %>%
      group_by(jahr, sex, nat, dom, age_ret, gpr, alt) %>%
      mutate(wert_3vbzjahr = sum(rs_3vbz_basmoy_rev_ausgleichsmass, na.rm = TRUE)) %>%
      left_join(INPUT_3VBZJAHR, by = c("jahr", "sex", "nat", "dom", "age_ret", "gpr", "alt")) %>%
      filter(sex == "f") %>%
      mutate(effet_net_3vbz_jahr = (wert_3vbzjahr - rs_vorb)) %>%
      # filter(alt == age_ret) %>%
      group_by(jahr, sex, type_rev) %>%
      mutate(sum_eprc_nouveaux_rentiers_1 = sum(eprc, na.rm = TRUE)) %>%
      ungroup() %>%
      left_join(RAMPE_M, by = c("jahr")) %>%
      left_join(RAMPE_F, by = c("jahr")) %>%
      mutate(sum_eprc_nouveaux_rentiers = (1 - ((1 - (rampe_m * rampe_f)) / 2)) * sum_eprc_nouveaux_rentiers_1) %>%
      dplyr::select(jahr, sex, type_rev, alt, age_ret, sum_eprc_nouveaux_rentiers)


  ##############################################################################
  #--- calculer l'anticipation modifiée ----------------------------------------
  ##############################################################################

  #--- 1ère étape: calculer les facteurs de correction avec les nouveaux taux d'anticipation-------------------
  jahr_rr <- PARAM_GLOBAL$jahr_rr
  jahr_ende <- PARAM_GLOBAL$jahr_ende
  max_annees_anticip_t <- PARAM_MASSNAHMEN$max_annees_anticip_t
  ra_m <- PARAM_GLOBAL$ra_m
  ra_f_t <- PARAM_MASSNAHMEN$ra_f_t
  annee_transition <- PARAM_MASSNAHMEN$annee_transition

  # Flexibiliser le scénario réforme (Llc, 29.04.2021)
  # Correction avec if pour des raisons historiques
  if("scenario_reforme_not_hardcoded" %in% colnames(PARAM_MASSNAHMEN) == FALSE) {
      scenario_reforme_not_hardcoded <- "modification_taux_ant_general"
    } else {
      scenario_reforme_not_hardcoded <- PARAM_MASSNAHMEN$scenario_reforme_not_hardcoded

      # Cas où le scenario_reforme_not_hardcoded est geltende_ordnung mais le régime
      # est à 0 et on veut que les taux ne changent que dans la mesure de compensation

      if (scenario_reforme_not_hardcoded == "geltende_ordnung") {
        ANT_AJO_FLEX <- ANT_AJO_FLEX %>%
          # Choisir le scénario voulu
          filter(scenario_reforme == scenario_reforme_not_hardcoded) %>%
          # Mettre le régime à 1 dès befrist_beginn_ausgleichsmassn_guillotine car
          # on veut un changement des taux uniquement dans la mesure de comp. et
          # donc on doit comparer au geltende_ordnung qui est codé avec regime = 0.
          mutate(regime = case_when(
            jahr >= PARAM_MASSNAHMEN$befrist_beginn_ausgleichsmassn_guillotine ~ 1,
            TRUE ~ 0
          ))
      }
    }
  

  ANT_AJO_EXT_1 <- ANT_AJO_FLEX %>%
    # Choisir le scénario voulu
    filter(jahr == jahr_rr &
      scenario_reforme == scenario_reforme_not_hardcoded) %>%
    dplyr::select(jahr, sex, age_ret, taux_ant_ajo) %>%
    rename(taux_ant_ajo_ref = taux_ant_ajo) %>%
    dplyr::select(-jahr)


  ANT_AJO_EXT <- ANT_AJO_FLEX %>%
    # Choisir le scénario voulu
    # Sélectionner à partir de 2022
    filter(jahr > annee_transition &
      scenario_reforme == scenario_reforme_not_hardcoded) %>%
    rename(taux_ant_ajo_reforme = taux_ant_ajo) %>%
    left_join(ANT_AJO_EXT_1, by = c("sex", "age_ret")) %>%
    crossing(type_rev = c("basmoy_rev", "haut_rev")) %>%
    mutate(taux_ant_ajo = case_when(

      # HAUTS_REVENUS FEMMES : réduction de moins que la moitié des taux normaux (4%, 7.7%, 11.1%)

      # 62 ans
      age_ret == as.numeric(PARAM_MASSNAHMEN$ra_f_t) - as.numeric(PARAM_MASSNAHMEN$max_annees_anticip_t) &
        type_rev == "haut_rev" &
        sex == "f"
      ~ as.numeric(PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_en_dessus_guillotine_taux_red_ajuste_j3_vbz_f),

      # 63 ans
      age_ret == as.numeric(PARAM_MASSNAHMEN$ra_f_t) - as.numeric(PARAM_MASSNAHMEN$max_annees_anticip_t) + 1 &
        type_rev == "haut_rev" &
        sex == "f"
      ~ as.numeric(PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_en_dessus_guillotine_taux_red_ajuste_j2_vbz_f),


      # BAS MOYENS REVENUS FEMMES : aucune réduction pour les femmes de  64 ans qui prennent la retraite à 64 ans

      # 62 ans
      age_ret == as.numeric(PARAM_MASSNAHMEN$ra_f_t) - as.numeric(PARAM_MASSNAHMEN$max_annees_anticip_t) &
        type_rev == "basmoy_rev" &
        sex == "f"
      ~ as.numeric(PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_en_dessous_guillotine_taux_red_ajuste_j3_vbz_f),

      # 63 ans
      age_ret == as.numeric(PARAM_MASSNAHMEN$ra_f_t) - as.numeric(PARAM_MASSNAHMEN$max_annees_anticip_t) + 1 &
        type_rev == "basmoy_rev" &
        sex == "f"
      ~ as.numeric(PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_en_dessous_guillotine_taux_red_ajuste_j2_vbz_f),

      # BAS MOYENS REVENUS HOMMES aucune réduction pour les hommes de  64 ans qui prennent la retraite à 64 ans

      # 63 ans
      age_ret == as.numeric(PARAM_GLOBAL$ra_m) - as.numeric(PARAM_MASSNAHMEN$max_annees_anticip_t) + 1 &
        type_rev == "basmoy_rev" &
        sex == "m"
      ~ as.numeric(PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_en_dessous_guillotine_taux_red_ajuste_j2_vbz_m),

      # 64 ans
      age_ret == as.numeric(PARAM_GLOBAL$ra_m) - as.numeric(PARAM_MASSNAHMEN$max_annees_anticip_t) + 2 &
        type_rev == "basmoy_rev" &
        sex == "m"
      ~ as.numeric(PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_en_dessous_guillotine_taux_red_ajuste_j1_vbz_m),
      TRUE ~ as.numeric(taux_ant_ajo_reforme)
    ))


  # Calcul des facteurs de correction

    WF_EPRC <- WF_EPRC_BAS_ET_HAUTS_REV %>%
      filter(sex == "f") # But: différencier les hauts des bas revenus chez les femmes


  FACTEUR_CORR_ANT_AJO_1 <- WF_EPRC %>%
    filter(
      gpr == "rvieillesse_simple",
      jahr >= PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_guillotine_beginn
    ) %>%
    left_join(ANT_AJO_EXT, by = c("age_ret", "sex", "jahr", "type_rev")) %>%
    mutate(
      annee_retraite = jahr - (alt - age_ret),
      annee_naissance = jahr - alt
    ) %>%
    filter(annee_retraite >= PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_guillotine_beginn) %>%
    # 1) calculer le facteur de correction pour passer des rentes de GO à celles si Ausgleichsmassnahmen
    mutate(facteur_corr_taux_flex_0 = case_when(



      # standard, affecté par la réforme

      # Hommes => 3. Jahr depuis 2022
      annee_retraite >= annee_debut &
        annee_retraite <= annee_fin &
        sex == "m" &
        regime == 1 ~ (1 + taux_ant_ajo) / (1 + if_else(is.na(taux_ant_ajo_ref), 0, taux_ant_ajo_ref)),


      # Femmes => 3. Jahr depuis 2022
      annee_retraite >= (annee_debut) &
        annee_retraite <= annee_fin &
        sex == "f" &
        regime == 1 ~ (1 + taux_ant_ajo) / (1 + if_else(is.na(taux_ant_ajo_ref), 0, taux_ant_ajo_ref)),

      # Cas spéciaux
      # 1. Hommes
      annee_retraite < annee_debut &
        sex == "m" &
        age_ret >= 63 &
        regime == 1 ~ 1,

      # 2. Femmes
      annee_retraite < (annee_debut + 1) &
        sex == "f" &
        age_ret <= 69 &
        regime == 1 ~ 1,



      # pas affecté par la réforme
      regime == 0 ~ if_else(!is.na(taux_ant_ajo_ref), 1, 0)
    )) %>%
    rename(facteur_corr_taux_flex = facteur_corr_taux_flex_0) %>%
    # 2) calculer le facteur de correction pour passer des rentes de GO à celles si réforme

    mutate(facteur_corr_taux_flex_reforme = case_when(



      # standard, affecté par la réforme

      # Hommes => 3. Jahr depuis 2022
      annee_retraite >= annee_debut &
        annee_retraite <= annee_fin &
        sex == "m" &
        regime == 1 ~ (1 + taux_ant_ajo_reforme) / (1 + if_else(is.na(taux_ant_ajo_ref), 0, taux_ant_ajo_ref)),


      # Femmes => 3. Jahr depuis 2022
      annee_retraite >= (annee_debut) &
        annee_retraite <= annee_fin &
        sex == "f" &
        regime == 1 ~ (1 + taux_ant_ajo_reforme) / (1 + if_else(is.na(taux_ant_ajo_ref), 0, taux_ant_ajo_ref)),

      # Cas spéciaux
      # 1. Hommes
      annee_retraite < annee_debut &
        sex == "m" &
        age_ret >= 63 &
        regime == 1 ~ 1,

      # 2. Femmes
      annee_retraite < (annee_debut + 1) &
        sex == "f" &
        age_ret <= 69 &
        regime == 1 ~ 1,



      # pas affecté par la réforme
      regime == 0 ~ if_else(!is.na(taux_ant_ajo_reforme), 1, 0)
    )) %>%
    dplyr::select(
      jahr, sex, nat, dom, alt, age_ret, zv, gpr, eprc, regime, ra,
      type_rev, annee_retraite, taux_ant_ajo, taux_ant_ajo_ref,
      taux_ant_ajo_reforme, facteur_corr_taux_flex,
      facteur_corr_taux_flex_reforme, wachstumsfaktor
    ) %>%
    ungroup()



  ############# étude des proportions de femmes retraitées à 62-63 ans###############################


    # But: calculer les proportions de retraités

    # ici: calculer le marché des femmes de 63 ans et des hommes de 64 qui n'ont pas pris la retraite une année plus tôt
    EPRC_ANCIENNES_RENTIERES_63 <- RR_1 %>%
      filter(
        jahr == PARAM_GLOBAL$jahr_rr,
        alt == 63 + 1 * (sex == "m"),
        age_ret == 62 + 1 * (sex == "m")
      ) %>%
      group_by(
        jahr,
        sex,
        alt,
        gpr,
        type_rev
      ) %>%
      # NOMBRE de femmes qui ont 63 ans mais qui sont à la retraite depuis 62 ans
      summarise(eprc_rr0_anciennes_rentieres = sum(eprc, na.rm = TRUE)) %>%
      # population de l'OFS des femmes de 63 ans
      left_join(EPRC_ESTIMATION_MASSNAHMEN %>%
        filter(
          jahr == PARAM_GLOBAL$jahr_rr,
          alt == 63 + 1 * (sex == "m")
        ) %>%
        group_by(
          jahr,
          sex,
          alt
        ) %>%
        summarise(eprc_ofs = sum(eprc, na.rm = TRUE)),
      by = c(
        "jahr",
        "sex",
        "alt"
      )
      ) %>%
      # nombre de femmes de 63 ans RENTENSUMME_PROJECTION_2_FLEX
      mutate(nbre_eprc_non_rentieres_de_62_a_63 = eprc_ofs - eprc_rr0_anciennes_rentieres)

    POURCENT_VBZ_OBSERVE_1 <- RR_1 %>%
      filter(
        jahr == PARAM_GLOBAL$jahr_rr,
        alt == age_ret, # nouvelles rentières et nouveaux rentiers
        # filtrer les préretraités
        age_ret < PARAM_MASSNAHMEN$ra_f_t - 1 + 1 * (sex == "m")
      ) %>%
      group_by(
        jahr,
        sex,
        alt,
        gpr,
        type_rev
      ) %>%
      summarise(eprc_rr0 = sum(eprc, na.rm = TRUE)) %>%
      left_join(EPRC_ESTIMATION_MASSNAHMEN %>%
        group_by(
          jahr, sex,
          # nat, dom,
          alt
        ) %>%
        summarise(eprc_ofs = sum(eprc, na.rm = TRUE)),
      by = c(
        "jahr",
        "sex",
        "alt"
      )
      ) %>%
      left_join(EPRC_ANCIENNES_RENTIERES_63 %>%
        dplyr::select(
          jahr,
          sex,
          alt,
          gpr,
          type_rev,
          nbre_eprc_non_rentieres_de_62_a_63,
          eprc_rr0_anciennes_rentieres
        ),
      by = c("jahr", "sex", "alt", "gpr", "type_rev")
      ) %>%
      mutate(
        pourcent_neues_vbz = eprc_rr0 / if_else(alt == 63 + 1 * (sex == "m"),
          nbre_eprc_non_rentieres_de_62_a_63, # diviser par le nombre corrigé de femmes de 63 ans qui n'ont pas pris la retraite à 62 ans
          eprc_ofs
        ),
        pourcent_anciens_rentiers = if_else(alt == 62 + 1 * (sex == "m"), 0,
          eprc_rr0_anciennes_rentieres
        ) / eprc_ofs
      ) # x% des femmes de 63 ans on pris la retraite à 62 ans

    POURCENT_VBZ_OBSERVE_NEU_VBZ <- POURCENT_VBZ_OBSERVE_1 %>%
      dplyr::select(jahr, sex, alt, gpr, type_rev, pourcent_neues_vbz) %>%
      mutate(age_ret = alt) %>%
      ungroup()

    POURCENT_VBZ_OBSERVE_ALT_VBZ <- POURCENT_VBZ_OBSERVE_1 %>%
      dplyr::select(jahr, sex, alt, gpr, type_rev, pourcent_anciens_rentiers) %>%
      mutate(age_ret = alt - 1) %>%
      filter(pourcent_anciens_rentiers != 0)

    FACTEUR_CORR_VBZ_QUOTE <- crossing(
      alt = PARAM_GLOBAL$min_age_retraite:PARAM_GLOBAL$max_age,
      sex = "f",
      age_ret = c(62, 63),
      type_rev = c("basmoy_rev", "haut_rev")
    ) %>%
      bind_rows(crossing(
        alt = PARAM_GLOBAL$min_age_retraite:PARAM_GLOBAL$max_age,
        sex = "m",
        age_ret = c(63, 64),
        type_rev = "basmoy_rev"
      )) %>%
      filter(alt >= age_ret) %>%
      left_join(POURCENT_VBZ_OBSERVE_NEU_VBZ %>%
        dplyr::select(sex, age_ret, type_rev, pourcent_neues_vbz),
      by = c("sex", "age_ret", "type_rev")
      ) %>%
      rename(pourcent_obs = pourcent_neues_vbz) %>%
      mutate(
        facteur_corr_vbz_quote_observe = case_when(
          # VBZ quoten pour les bas à moyens revenus
          sex == "f" &
            type_rev == "basmoy_rev" &
            age_ret == 62 ~ as.numeric(PARAM_MASSNAHMEN$facteur_corr_vbz_quote_ageret62_basmoyrev_f),
          sex == "f" &
            type_rev == "basmoy_rev" &
            age_ret == 63 ~ as.numeric(PARAM_MASSNAHMEN$facteur_corr_vbz_quote_ageret63_basmoyrev_f),
          sex == "m" &
            type_rev == "basmoy_rev" &
            age_ret == 63 ~ as.numeric(PARAM_MASSNAHMEN$facteur_corr_vbz_quote_ageret63_basmoyrev_m),
          sex == "m" &
            type_rev == "basmoy_rev" &
            age_ret == 64 ~ as.numeric(PARAM_MASSNAHMEN$facteur_corr_vbz_quote_ageret64_basmoyrev_m),

          # VBZ quoten pour les hauts revenus
          sex == "f" &
            type_rev == "haut_rev" &
            age_ret == 62 ~ as.numeric(PARAM_MASSNAHMEN$facteur_corr_vbz_quote_ageret62_hautrev_f),
          sex == "f" &
            type_rev == "haut_rev" &
            age_ret == 63 ~ as.numeric(PARAM_MASSNAHMEN$facteur_corr_vbz_quote_ageret63_hautrev_f)
        ),
        nouvelle_vbz_quote = facteur_corr_vbz_quote_observe * pourcent_obs,
        # facteur_corr_vbz_quote_observe = nouvelle_vbz_quote/pourcent_obs,
        jahr = PARAM_GLOBAL$jahr_rr,
        # sex  = "f",
        gpr = "rvieillesse_simple"
      ) %>%
      filter(sex == "f")

    NOUVELLES_VBZ_QUOTEN_DELTA_ANT <- FACTEUR_CORR_VBZ_QUOTE %>%
      distinct(sex, age_ret, type_rev, pourcent_obs, facteur_corr_vbz_quote_observe, nouvelle_vbz_quote)
  

  # Projection des rentes avec les nouveaux taux

  RENTENSUMME_PROJECTION_1_FLEX_SOUS_POPU_INIT <- FACTEUR_CORR_ANT_AJO_1 %>%
    # on prend le RR de la sous-population respective vu que ce n'est qu'au sein de cette sous-pop que les taux changent
    left_join(RR_ASSURANCE_VIEILLESSE_RENTES_FILTERED_FLEX_RR_1,
      by = c("sex", "nat", "dom", "alt", "age_ret", "zv", "gpr", "type_rev")
    ) %>%
    filter(jahr >= PARAM_GLOBAL$jahr_rr) %>%
    left_join(RENTENZYKLUS, by = c("jahr", "alt", "age_ret")) %>%
    # compléter pour les autres rentes: hypo = ne varient pas
    mutate(wf_rentenzyklus = if_else(is.na(wf_rentenzyklus),
      1, wf_rentenzyklus
    )) %>%
    left_join(FACTEUR_CORR_VBZ_QUOTE %>%
      dplyr::select(-jahr),
    by = c("sex", "alt", "age_ret", "gpr", "type_rev")
    ) %>%
    arrange(sex, nat, dom, zv, age_ret, alt, gpr, type_rev, jahr) %>%
    # Version simplifiée (par groupe d'age_ret)
    group_by(sex, nat, dom, alt, age_ret, zv, gpr, type_rev) %>%
    mutate(
      cumprod_fakt = cumprod(wachstumsfaktor),

      # 1) calculer les rs avec les taux de la réforme
      rentensumme_reforme = rentensumme_ref *
        # facteur de correction des rentes en cas de nouvelle réforme
        facteur_corr_taux_flex_reforme *
        # facteurs de croissance annuels des EPRC projetés par âge
        cumprod_fakt *
        # adaptation des premières rentes
        wf_rentenzyklus *
        # facteur de correction de la vorbezugsquote (si 2x plus de préretraites, 2x plus de rentes à verser
        facteur_corr_vbz_quote_observe,

      # 2) calculer les rs avec les taux des Ausgleichsmassnahmen
      rentensumme_ausgleich = rentensumme_ref *
        # facteur de correction des rentes en cas de nouvelle réforme
        facteur_corr_taux_flex *
        # facteurs de croissance annuels des EPRC projetés par âge
        cumprod_fakt *
        # adaptation des premières rentes
        wf_rentenzyklus *
        # facteur de correction de la vorbezugsquote (si 2x plus de préretraites, 2x plus de rentes à verser
        facteur_corr_vbz_quote_observe,

      # 3) calculer l'effet du changement de la VBZ_QUOTE et des changements de taux
      effet_net_modif_taux_ant = rentensumme_ausgleich - rentensumme_reforme,

      # 4) EPRC
      eprc_nbre = eprc * facteur_corr_vbz_quote_observe
    ) %>%
    mutate(
      annee_naissance = jahr - alt,
      annee_retraite = jahr - (alt - age_ret)
    ) %>%
    dplyr::select(
      jahr, alt, age_ret, nat, dom, sex, zv, gpr, type_rev, facteur_corr_taux_flex,
      facteur_corr_vbz_quote_observe, rentensumme_ref,
      rentensumme_reforme, rentensumme_ausgleich, effet_net_modif_taux_ant,
      bez_av, eprc, eprc_nbre, annee_retraite, annee_naissance
    ) %>%
    ungroup()

  #--- supplément de rente AVS proportionnel -----------------------------------

  if (PARAM_MISC_13RENTEAVS$flag_mesure_13renteavs) {
    # Rajouter un supplément de rente AVS proportionnel pour tous les rentiers
    RENTENSUMME_PROJECTION_1_FLEX_SOUS_POPU <- RENTENSUMME_PROJECTION_1_FLEX_SOUS_POPU_INIT %>%
      # Rajouter un supplément de rente AVS proportionnel
      mutate(
        # la rentensumme_reforme doit aussi être augmentée car doit correspondre
        # à la mesure kuerz_bei_guillotine
        rentensumme_reforme = case_when(
          gpr == "rvieillesse_simple" &
            # Entrée en vigueur de la mesure et fin de la mesure
            jahr >= PARAM_MISC_13RENTEAVS$annee_debut &
            jahr <= PARAM_MISC_13RENTEAVS$annee_fin ~ rentensumme_reforme *
            (1 + eval(parse(text = PARAM_MISC_13RENTEAVS$facteur))),
          TRUE ~ rentensumme_reforme
        ),
        rentensumme_ausgleich = case_when(
          gpr == "rvieillesse_simple" &
            # Entrée en vigueur de la mesure et fin de la mesure
            jahr >= PARAM_MISC_13RENTEAVS$annee_debut &
            jahr <= PARAM_MISC_13RENTEAVS$annee_fin ~ rentensumme_ausgleich *
            (1 + eval(parse(text = PARAM_MISC_13RENTEAVS$facteur))),
          TRUE ~ rentensumme_ausgleich
        ),
        # 3) recalculer l'effet du changement de la VBZ_QUOTE et des changements de taux
        # avec les nouvelles rentensummen adaptées pour le supplément de rente AVS
        effet_net_modif_taux_ant = rentensumme_ausgleich - rentensumme_reforme,
      )
  } else {
    RENTENSUMME_PROJECTION_1_FLEX_SOUS_POPU <- RENTENSUMME_PROJECTION_1_FLEX_SOUS_POPU_INIT
  }
  # --- Effet net de la modification des taux d'anticipation -------------------
  # RENTENSUMME_PROJECTION_1_FLEX_SOUS_POPU %>% filter(age_ret <=63 & age_ret>=62 & sex == "f")

  if (PARAM_MASSNAHMEN$guillotine_femmes_uniquement == TRUE) {
    EFFET_NET_MODIF_ANT <- RENTENSUMME_PROJECTION_1_FLEX_SOUS_POPU %>%
      filter(
        # hypothèse: on n'a toujours que deux ans d'anticipation => 62 et 63 ans
        sex == "f",
        age_ret <= (PARAM_MASSNAHMEN$ra_f_t - 2),
        # les taux changent dès m_modif_ant_debut pour tout le monde
        annee_retraite >= PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_guillotine_beginn,
        gpr == "rvieillesse_simple"
      ) %>%
      mutate(wert_modif_ant = case_when(

        # Si la mesure est appliquée entre befrist_beginn_erl et befrist_ende_var_f1
        annee_retraite >= PARAM_MASSNAHMEN$befrist_beginn_ausgleichsmassn_guillotine &
          annee_retraite <= PARAM_MASSNAHMEN$befrist_ende_ausgleichsmassn_guillotine ~ effet_net_modif_taux_ant,
        annee_retraite > PARAM_MASSNAHMEN$befrist_ende_ausgleichsmassn_guillotine ~ 0
      ))
  } else if (PARAM_MASSNAHMEN$guillotine_hommes_femmes == TRUE) {
    EFFET_NET_MODIF_ANT <- RENTENSUMME_PROJECTION_1_FLEX_SOUS_POPU %>%
      filter(
        # hypothèse: on n'a toujours que deux ans d'anticipation => 62 et 63 ans
        sex == "f",
        type_rev == "basmoy_rev",
        # FEMMES QUI PARTENT A LA RETRAITE A 62 et 63 ans
        age_ret <= (PARAM_MASSNAHMEN$ra_f_t - 2),
        # les taux changent dès m_modif_ant_debut pour tout le monde
        annee_retraite >= PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_guillotine_beginn,
        # les taux changent dès m_modif_ant_debut + 1 pour les femmes
        # annee_retraite >= (m_modif_ant_debut + 1),
        gpr == "rvieillesse_simple"
      ) %>%
      bind_rows(RENTENSUMME_PROJECTION_1_FLEX_SOUS_POPU %>%
        filter(
          # hypothèse: on n'a toujours que deux ans d'anticipation => 63 et 64 ans
          sex == "m",
          type_rev == "basmoy_rev",
          # hommes QUI PARTENT A LA RETRAITE A 63 et 64 ans
          age_ret >= (PARAM_GLOBAL$ra_m - 2),
          age_ret < PARAM_GLOBAL$ra_m,
          # les taux changent dès m_modif_ant_debut pour tout le monde
          annee_retraite >= PARAM_MASSNAHMEN$m_ahv_ausgleichsmassn_guillotine_beginn,
          gpr == "rvieillesse_simple"
        )) %>%
      mutate(wert_modif_ant = case_when(

        # Si la mesure est appliquée entre befrist_beginn_erl et befrist_ende_var_f1
        annee_retraite >= PARAM_MASSNAHMEN$befrist_beginn_ausgleichsmassn_guillotine &
          annee_retraite <= PARAM_MASSNAHMEN$befrist_ende_ausgleichsmassn_guillotine ~ effet_net_modif_taux_ant,
        annee_retraite > PARAM_MASSNAHMEN$befrist_ende_ausgleichsmassn_guillotine ~ 0
      ))
  }

  # Option si on veut calculer sans la tranche des hommes retraités à 62 ans (cf. rapport Kuprecht 2020)
    if ("ohne_3vbz_m" %in% colnames(PARAM_MASSNAHMEN)) {
      if (PARAM_MASSNAHMEN$ohne_3vbz_m) {
        # unique(as.factor((RENTENSUMME_PROJECTION_1_FLEX_EXT_1 %>% filter(age_ret== 62))$sex))
        # unique(as.factor((RENTENSUMME_PROJECTION_1_FLEX_EXT_1 %>% filter(age_ret== 64))$sex))

        EFFET_NET_MODIF_ANT <- EFFET_NET_MODIF_ANT %>%
          filter(age_ret != 62 * (sex == "m"))
      }
    }


  # Option si on veut calculer sans la tranche des femmes retraitées à 62 ans (cf. rapport Kuprecht 2020)
    if ("ohne_62schicht_f_krzbeivbz" %in% colnames(PARAM_MASSNAHMEN)) {
      if (PARAM_MASSNAHMEN$ohne_62schicht_f_krzbeivbz) {
        EFFET_NET_MODIF_ANT <- EFFET_NET_MODIF_ANT %>%
          filter(age_ret != 62 * (sex == "f"))
      }
    }

  EFFET_NET_MODIF_ANT_ANNUEL <- EFFET_NET_MODIF_ANT %>%
    group_by(jahr) %>%
    summarise(wert_modif_ant_annuel = sum(wert_modif_ant, na.rm = TRUE))

  EFFET_REV_NET_MODIF <- EFFET_NET_MODIF_ANT %>%
    group_by(jahr, type_rev) %>%
    summarise(wert_modif_ant_annuel = sum(wert_modif_ant, na.rm = TRUE))


  EFFET_NET_MODIF_TEST <- EFFET_NET_MODIF_ANT %>%
    group_by(jahr, age_ret) %>%
    summarise(wert_modif_ant_annuel = sum(wert_modif_ant, na.rm = TRUE))

  # Addition des deux effets
  DELTA_AUSGL_MASSN_1 <- EFFET_NET_MODIF_ANT_ANNUEL %>%
    left_join(EFFET_NET_3VBZ_JAHR, by = "jahr") %>%
    left_join(dplyr::select(RENTENENTWICKLUNG, jahr, rentenentwicklung), by = "jahr") %>%
    transmute(jahr, wert = (wert_modif_ant_annuel +
      # si PARAM_MASSNAHMEN$ohne_3vbz = TRUE
      if_else(!is.na(wert_3vbzjahr_effet_annuel),
        wert_3vbzjahr_effet_annuel,
        0
      )) * rentenentwicklung)

  DELTA_AUSGL_MASSN_REV_1 <- EFFET_REV_NET_MODIF %>%
    left_join(EFFET_NET_3VBZ_JAHR_REV, by = c("jahr", "type_rev")) %>%
    left_join(dplyr::select(RENTENENTWICKLUNG, jahr, rentenentwicklung), by = "jahr") %>%
    mutate(
      wert = (wert_modif_ant_annuel +
        if_else(!is.na(wert_3vbzjahr_effet_annuel),
          wert_3vbzjahr_effet_annuel,
          0
        )) * rentenentwicklung
    ) %>%
    dplyr::select(jahr, type_rev, wert)


  # Delta total
  DELTA_AUSGL_MASSN <- bind_rows(tibble(alt = 68, surv = 1), SURV) %>%
    mutate(jahr = alt + (PARAM_MASSNAHMEN$befrist_ende_ausgleichsmassn_guillotine - 68)) %>%
    mutate(wert = surv * filter(DELTA_AUSGL_MASSN_1, jahr == PARAM_MASSNAHMEN$befrist_ende_ausgleichsmassn_guillotine)$wert) %>%
    dplyr::select(-alt, -surv) %>%
    bind_rows(filter(DELTA_AUSGL_MASSN_1, jahr < PARAM_MASSNAHMEN$befrist_ende_ausgleichsmassn_guillotine)) %>%
    arrange(jahr)

  # Delta pour les bas-moyens revenus
  DELTA_AUSGL_MASSN_REV_1_BAS <- DELTA_AUSGL_MASSN_REV_1 %>%
    filter(type_rev == "basmoy_rev") %>%
    dplyr::select(jahr, wert)

  # Delta pour les hauts revenus
  DELTA_AUSGL_MASSN_REV_1_MOYHAUT <- DELTA_AUSGL_MASSN_REV_1 %>%
    filter(type_rev == "haut_rev") %>%
    dplyr::select(jahr, wert)

  # Delta pour les bas-moyens revenus par année
  DELTA_AUSGL_MASSN_TYPE_REV_BAS <- bind_rows(tibble(alt = 68, surv = 1), SURV) %>%
    mutate(jahr = alt + (PARAM_MASSNAHMEN$befrist_ende_ausgleichsmassn_guillotine - 68)) %>%
    mutate(wert = surv * filter(DELTA_AUSGL_MASSN_REV_1_BAS, jahr == PARAM_MASSNAHMEN$befrist_ende_ausgleichsmassn_guillotine)$wert) %>%
    dplyr::select(-alt, -surv) %>%
    bind_rows(filter(DELTA_AUSGL_MASSN_REV_1_BAS, jahr < PARAM_MASSNAHMEN$befrist_ende_ausgleichsmassn_guillotine)) %>%
    arrange(jahr) %>%
    mutate(
      wert_bas = wert
    ) %>%
    dplyr::select(jahr, wert_bas)

  # Delta pour les hauts revenus pour les hauts revenus
  DELTA_AUSGL_MASSN_TYPE_REV_MOYENHAUT <- bind_rows(tibble(alt = 68, surv = 1), SURV) %>%
    mutate(jahr = alt + (PARAM_MASSNAHMEN$befrist_ende_ausgleichsmassn_guillotine - 68)) %>%
    mutate(wert = surv * filter(DELTA_AUSGL_MASSN_REV_1_MOYHAUT, jahr == PARAM_MASSNAHMEN$befrist_ende_ausgleichsmassn_guillotine)$wert) %>%
    dplyr::select(-alt, -surv) %>%
    bind_rows(filter(DELTA_AUSGL_MASSN_REV_1_MOYHAUT, jahr < PARAM_MASSNAHMEN$befrist_ende_ausgleichsmassn_guillotine)) %>%
    arrange(jahr) %>%
    mutate(
      wert_moyenhaut = wert
    ) %>%
    dplyr::select(jahr, wert_moyenhaut)

  # Join les bas/moyen/haut revenus
  DELTA_AUSGL_MASSN_TYPE_REV <- DELTA_AUSGL_MASSN_TYPE_REV_BAS %>%
    left_join(DELTA_AUSGL_MASSN_TYPE_REV_MOYENHAUT, by = "jahr")


   

  return(
      list(
        DELTA_AUSGL_MASSN = DELTA_AUSGL_MASSN,
        DELTA_AUSGL_MASSN_TYPE_REV = DELTA_AUSGL_MASSN_TYPE_REV,
        NOUVELLES_VBZ_QUOTEN_DELTA_ANT = NOUVELLES_VBZ_QUOTEN_DELTA_ANT,
        DELTA_AUSGL_MASSN_TYPE_REV = DELTA_AUSGL_MASSN_TYPE_REV

      )
  )
  
}
