######################################################################
# SKRIPT ZUR AUFBEREITUNG DES RENTENREGISTERS DER 1.SÄULE FÜR DELFIN #
##########################################################################################

sapply(c("haven", "tidyverse", "data.table", "dtplyr"), library, char = TRUE)

# Pfad zur Speicherung des konsolidierten Rentenregisters.
path <-
  "~/data/appl-wb/01_raw_data/allgemein/go/RR/RR_AVS/2024/"

# Kontrolliert ob kombiniertes Rentenregister aus SAS Files neu eingelesen werden muss.
# Andernfalls wird der hinterlegte prozessierte File benutzt (siehe Pfad unten).
raw <- FALSE

if (raw) {

  # Auflistung aller jährlichen Rentenregister-Auszüge im .sas7bdat Format.
  sas.files <- list.files(path, pattern = "\\.sas7bdat$", full.names = TRUE)

  # Einlesung der SAS Files.
  dta <- lapply(sas.files, function(file) {

    message("Converting ", basename(file), appendLF = FALSE)
    read_sas(file)

    })

  # Abspeicherung der kombinierten Files als CSV via 'data.table' (Performance-Gründe).
  data.table::fwrite(bind_rows(dta),
    file = "~/data/appl-wb/01_raw_data/allgemein/go/RR/RR_AVS/2024/sas_files_combined.csv")
}

# Aufbereitung der Registerdaten für Delfin. -----------------------------------------

RR_AVS <-
  read_delim(
    "~/data/appl-wb/01_raw_data/allgemein/go/RR/RR_AVS/2024/sas_files_combined.csv") %>%
  # Implizite Konvertierung zu 'data.table' für schnellere Prozessierung.
  lazy_dt() %>%
  rename(
    # Alter der Leistungsbeziehenden im Dezember.
    "alt" = lage,
    # "korr_faktor" = corr,
    # Rentenskala, falls anwendbar.
    "skala" = cech,
    # # Revenu annuel moyen déterminant (RAM) par rapport à la rente minimale mrev*minimalrente_abr/minimalrente_jahr
    # "ram_corr" = mrev_corr,
    # # Montant de la prestation par rapport à la rente minimale mpr*minimalrente_abr/minimalrente_jahr
    # "monatliche_rente_corr" = mpr_corr,
    # Massgebliches Durchschnittseinkommen.
    "ram" = mrev,
    "monatliche_rente" = mpr,
    "sex" = csex,
    "zv"  = ceciv,
    "gpr" = cgpr) %>%
  # Vermeidung von NA Resultaten bei Summierung, weil "kein Vorbezug bzw. Aufschub" via NA
  # kodiert wird.
  replace_na(list(lant = 0, lajo = 0)) %>%
  mutate(

    sex = case_when(
      sex == "1" ~ "m",
      sex == "2" ~ "f"),

    nat = if_else(cnat <= 100, "ch", "au"),
    dom = if_else(cdom <= 100, "ch", "au"),

    # Zivilstand.
    zv = case_when(
      zv == "1"                     ~ "ledig",
      zv %in% c("2", "6")           ~ "verheiratet",
      zv %in% c("3", "8")           ~ "verwitwet",
      zv %in% c("4", "5", "7", "9") ~ "geschieden"),

    # Leistungsart (ordentliche + ausserordentliche Ansprüche).
    gpr = case_when(
      # Altersrenten.
      gpr %in% c("10", "20") ~ "rvieillesse",
      # Verwitwetenrenten.
      gpr %in% c("13", "23") ~ "rveuve",
      # Waisenrenten (ohne Unterscheidung nach Mutter/Vater/doppelt).
      gpr %in% c("14", "24", "15", "25", "16", "26") ~ "rorphelin",
      # Ehegattenzusatzrenten.
      gpr == "33" ~ "rcompl_femme",
      # Kinderzusatzrenten (ohne Unterscheidung nach Mutter/Vater).
      gpr %in% c("34", "35", "45") ~ "renfant"),

    # ID für die Geburtskohorte.
    coh = jahr - alt,

    # Bestimmung des Renteneintrittsalters nach Geburtskohorte.
    age_ret = case_when(

      sex == "m" &
        gpr == "rvieillesse"
        ~ floor(65    + (lajo - lant) / 12),

      sex == "f" &
        coh <= 1938 &
        gpr == "rvieillesse"
        ~ floor(62    + (lajo - lant) / 12),

      sex == "f" &
        coh %in% 1939:1941 &
        gpr == "rvieillesse"
        ~ floor(63    + (lajo - lant) / 12),

      sex == "f" &
        coh %in% 1942:1960 &
        gpr == "rvieillesse"
        ~ floor(64    + (lajo - lant) / 12),

      # Sukzessive Referenzaltererhöhung aufgrund der Reform AHV 21.
      sex == "f" &
        coh == 1961 &
        gpr == "rvieillesse"
        ~ floor(64.25 + (lajo - lant) / 12),

      sex == "f" &
        coh == 1962 &
        gpr == "rvieillesse"
        ~ floor(64.50 + (lajo - lant) / 12),

      sex == "f" &
        coh == 1963 &
        gpr == "rvieillesse"
        ~ floor(64.75 + (lajo - lant) / 12),

      sex == "f" &
        coh >= 1964 &
        gpr == "rvieillesse"
        ~ floor(65    + (lajo - lant) / 12))
  ) %>%

  # Konsolidierung der Altersgruppen 99+.
  mutate(alt = pmin(99, alt)) %>%

  # Vorbezug um ein Jahr bzw. mehr als ein Jahr ist für Männer erst seit 1997
  # respektive 2001 möglich (10. AHV Revision). Zusätzlich Ausschliessung von Ehegatten-
  # zusatzrenten, da diese seit 1997 nicht mehr ausgeprochen werden (und daher zukünftig
  # keine Rolle mehr für die Projektionen spielen). Die Justierung auf die letzte
  # Abrechnung berücksichtigt Restbestände implizit.
  filter(!(sex == "m" & coh <= 1937 & age_ret <= 63), gpr != "rcompl_femme") %>%

  # Aufsummierung relevanter Kennzahlen nach Gruppe und Jahr.
  group_by(sex, nat, dom, zv, gpr, age_ret, jahr, alt) %>%
  dplyr::summarize(
    monatliche_rentensumme = sum(monatliche_rente, na.rm = TRUE),
    durchschnitt_monatliche_renten = mean(monatliche_rente, na.rm = TRUE),
    median_monatliche_renten = median(monatliche_rente, na.rm = TRUE),
    summe_ram = sum(ram, na.rm = TRUE),
    median_ram = median(ram, na.rm = TRUE),
    durchschnitt_ram = mean(ram, na.rm = TRUE),
    eprc = sum(skala / 44, na.rm = TRUE),
    bez_av = n()) %>%

  # Separate Ausweisung der Anzahl Personen pro Gruppe, konsolidiert über den Renten-
  # eintrittszeitpunkt.
  group_by(sex, nat, dom, zv, gpr, jahr, alt) %>%
  mutate(n_alt = sum(bez_av)) %>%
  ungroup() %>%

  # Filtrierung inkohärenter Fälle (Annahme: Datenfehler).
  filter(age_ret <= alt | is.na(age_ret),
         !(gpr == "rvieillesse" & eprc == 0),
         !(gpr == "rvieillesse" & sex == "f" & age_ret < 62),
         !(gpr == "rvieillesse" & sex == "m" & age_ret < 63)) %>%

  # Re-Konvertierung von 'data.table' zu 'tibble'.
  as_tibble()

save(RR_AVS, file = paste0(path, "RR_AVS.RData"))

