R/analisis_ppto.R

Defines functions sum_pef_tp id_part_esp_to_desc_part_esp id_part_gen_to_desc_part_gen id_concepto_to_desc_concepto id_capitulo_to_desc_capitulo deflactar_tp

Documented in deflactar_tp id_capitulo_to_desc_capitulo id_concepto_to_desc_concepto id_part_esp_to_desc_part_esp id_part_gen_to_desc_part_gen sum_pef_tp

#' Deflactar montos
#'
#' Esa función deflacta montos descargando la última versión de deflactores
#' publicada por Transparencia presupuestaria.
#'
#' @param monto monto que se quiere deflactar
#' @param year_monto año de origen del monto (para que funciones tiene que ser
#' entre 1994 y 2030)
#' @param year_out año del precio al que se quiere deflactar (para que funciones tiene que ser
#' entre 1994 y 2030)
#' @param fuente aquí se indica si se quiere tomar el deflactor actualizado 
#' por la SHCP para 2024 base 2018 ("local") o se descarga el último
#' archivo ("cargar"). También pueden ser "CP2021" o "CP2022" 
#' para utilizar los deflactores utilizados para las cuentas públicas
#' correspondientes. 
#'
#' @importFrom magrittr %>%
#' @return regresa un vector de los montos deflactados
#' @export
deflactar_tp <- function(monto, year_monto, year_out,
                         fuente = "local") {

  year_monto <- as.numeric(year_monto)

  year_out <- as.numeric(year_out)

  monto <- as.numeric(monto)

  if (fuente == "CP2021") {
    deflactor <- CP2021
  }
  
  if (fuente == "CP2022") {
    deflactor <- CP2022
  }

  if (fuente == "cargar" &
      (!exists("deflactor_desc") ||
      !(c("year") %in% colnames(deflactor)) ||
      !(c("deflactor_year") %in% colnames(deflactor)))) {


    assign("deflactor_desc",
           openxlsx::read.xlsx("https://www.transparenciapresupuestaria.gob.mx/work/models/PTP/Presupuesto/Programacion/Deflactores/Deflactores_PIB.xlsx",
                               rows = 4:40) %>%
             janitor::clean_names() %>%
             dplyr::rename(deflactor_year = dplyr::starts_with("deflactor_del_pib")) %>%
             dplyr::transmute(year = as.numeric(periodo),
                              deflactor_year) %>%
             dplyr::filter(!is.na(year)),
           envir = as.environment("package:presupuestoR"))

    deflactor <- deflactor_desc

  }
  if (fuente == "local") {
    deflactor <- deflactor_local

  }



  if (!all(c(year_monto, year_out) %in% deflactor$year)) {
    warning("A\u00f1o no incluido supera el rango de a\u00f1os disponible. La cifra no fue deflactada.")

    return(monto)

  }

  deflactor_out <- try(purrr::map_dbl(year_out,
                                      function(x)
                                        deflactor[deflactor$year %in% as.numeric(x),]$deflactor_year),
                       silent = T)

  if (inherits(class(deflactor_out), "try-error")) {

    warning("Error en el a\u00f1o del monto deflactado. La cifra no fue deflactada.")

    return(monto)
  }

  deflactor_monto <- try(purrr::map_dbl(year_monto,
                                        function(x)
                                          deflactor[deflactor$year %in% as.numeric(x),]$deflactor_year),
                         silent = T)

  if (inherits(class(deflactor_monto), "try-error")) {
    warning("Error en el a\u00f1o al que se va a deflactar. La cifra no fue deflactada.")

    return(monto)
  }

  monto_deflactado <- (monto * deflactor_out) / deflactor_monto

  return(monto_deflactado)

}

#' ID de capítulo a descripción de capítulo
#'
#' Esta función regresa la descripción del capítulo poniendo el capítulo correspondiente
#'
#' @param id_capitulo la colúmna con la id del capítulo.
#'
#' @return regresa una lista con la descripción del capitulo
#' @export

id_capitulo_to_desc_capitulo <- function(id_capitulo) {

  y <- substr(id_capitulo, 0,1)
  y <- as.numeric(y)

  dplyr::case_when(
    y == 1 ~ "Servicios personales",
    y == 2 ~ "Materiales y suministros",
    y == 3 ~ "Servicios generales",
    y == 4 ~ "Transferencias, asignaciones, subsidios y otras ayudas",
    y == 5 ~ "Bienes muebles, inmuebles e intangibles",
    y == 6 ~ "Inversi\u00f3n p\u00fablica",
    y == 7 ~ "Inversiones financieras y otras provisiones",
    y == 8 ~ "Participaciones y aportaciones",
    y == 9 ~ "Deuda p\u00fablica ",
    T ~ NA_character_
  )
}


#' ID de concepto a descripción de concepto
#'
#' Esta función regresa la descripción del concepto poniendo el concepto correspondiente
#'
#' @param id_concepto la colúmna con la id del concepto.
#'
#' @return regresa una lista con la descripción del concepto.
#' @export
id_concepto_to_desc_concepto <- function(id_concepto) {

  y <- substr(id_concepto, 0,2)
  y <- as.numeric(y)

  dplyr::case_when(
    y == 11 ~ 'Remuneraciones al personal de car\u00e1cter permanente',
    y == 12 ~ 'Remuneraciones al personal de car\u00e1cter transitorio',
    y == 13 ~ 'Remuneraciones adicionales y especiales',
    y == 14 ~ 'Seguridad social',
    y == 15 ~ 'Otras prestaciones sociales y econ\u00f3micas',
    y == 16 ~ 'Previsiones',
    y == 17 ~ 'Pago de est\u00edmulos a servidores p\u00fablicos',
    y == 21 ~ 'Materiales de administraci\u00f3n, emisi\u00f3n de documentos y art\u00edculos oficiales',
    y == 22 ~ 'Alimentos y utensilios',
    y == 23 ~ 'Materias primas y materiales de producci\u00f3n y comercializaci\u00f3n',
    y == 24 ~ 'Materiales y art\u00edculos de construcci\u00f3n y de reparaci\u00f3n',
    y == 25 ~ 'Productos qu\u00edmicos, farmac\u00e9uticos y de laboratorio',
    y == 26 ~ 'Combustibles, lubricantes y aditivos',
    y == 27 ~ 'Vestuario, blancos, prendas de protecci\u00f3n y art\u00edculos deportivos',
    y == 28 ~ 'Materiales y suministros para seguridad',
    y == 29 ~ 'Herramientas, refacciones y accesorios menores',
    y == 31 ~ 'Servicios b\u00e1sicos',
    y == 32 ~ 'Servicios de arrendamiento',
    y == 33 ~ 'Servicios profesionales, cient\u00edficos, t\u00e9cnicos y otros servicios',
    y == 34 ~ 'Servicios financieros, bancarios y comerciales',
    y == 35 ~ 'Servicios de instalaci\u00f3n, reparaci\u00f3n, mantenimiento y conservaci\u00f3n',
    y == 36 ~ 'Servicios de comunicaci\u00f3n social y publicidad',
    y == 37 ~ 'Servicios de traslado y vi\u00e1ticos',
    y == 38 ~ 'Servicios oficiales',
    y == 39 ~ 'Otros servicios generales',
    y == 41 ~ 'Transferencias internas y asignaciones al sector p\u00fablico',
    y == 43 ~ 'Subsidios y subvenciones',
    y == 44 ~ 'Ayudas sociales',
    y == 45 ~ 'Pensiones y jubilaciones',
    y == 46 ~ 'Transferencias a fideicomisos, mandatos y otros an\u00e1logos',
    y == 47 ~ 'Transferencias a la seguridad social',
    y == 48 ~ 'Donativos',
    y == 49 ~ 'Transferencias al exterior',
    y == 51 ~ 'Mobiliario y equipo de administraci\u00f3n',
    y == 52 ~ 'Mobiliario y equipo educacional y recreativo',
    y == 53 ~ 'Equipo e instrumental medico y de laboratorio',
    y == 53 ~ 'Equipo e instrumental m\u00e9dico y de laboratorio',
    y == 54 ~ 'Veh\u00edculos y equipo de transporte',
    y == 56 ~ 'Maquinaria, otros equipos y herramientas',
    y == 58 ~ 'Bienes inmuebles',
    y == 59 ~ 'Activos intangibles',
    y == 62 ~ 'Obra p\u00fablica en bienes propios',
    y == 72 ~ 'Acciones y participaciones de capital',
    y == 73 ~ 'Compra de t\u00edtulos y valores',
    y == 79 ~ 'Provisiones para contingencias y otras erogaciones especiales',
    y == 81 ~ 'Participaciones',
    y == 83 ~ 'Aportaciones',
    y == 85 ~ 'Convenios',
    y == 92 ~ 'Intereses de la deuda p\u00fablica',
    y == 93 ~ 'Comisiones de la deuda p\u00fablica',
    y == 94 ~ 'Gastos de la deuda p\u00fablica',
    y == 95 ~ 'Costo por coberturas',
    y == 96 ~ 'Apoyos financieros',
    y == 99 ~ 'Adeudos de ejercicios fiscales anteriores (ADEFAS)',
    T ~ NA_character_
  )
}


#' ID de partida genérica a descripción de partida genérica
#'
#' Esta función regresa la descripción del partida genérica poniendo el partida genérica correspondiente
#'
#' @param id_partida_generica la colúmna con la id del partida genérica.
#'
#' @return regresa una lista con la descripción del partida genérica.
#' @export
id_part_gen_to_desc_part_gen <- function(id_partida_generica) {

  y <- substr(id_partida_generica, 0,3)
  y <- as.numeric(y)

  dplyr::case_when(
    y == 111 ~ 'Dietas',
    y == 112 ~ 'Haberes',
    y == 113 ~ 'Sueldos base al personal permanente',
    y == 114 ~ 'Remuneraciones por adscripci\u00f3n laboral en el extranjero',
    y == 121 ~ 'Honorarios asimilables a salarios',
    y == 122 ~ 'Sueldos base al personal eventual',
    y == 123 ~ 'Retribuciones por servicios de car\u00e1cter social',
    y == 124 ~ 'Retribuci\u00f3n a los representantes de los trabajadores y de los patrones en la Junta de Conciliaci\u00f3n y Arbitraje',
    y == 131 ~ 'Primas por a\u00f1os de servicios efectivos prestados',
    y == 132 ~ 'Primas de vacaciones, dominical y gratificaci\u00f3n de fin de a\u00f1o',
    y == 133 ~ 'Horas extraordinarias',
    y == 134 ~ 'Compensaciones',
    y == 135 ~ 'Sobrehaberes',
    y == 136 ~ 'Asignaciones de t\u00e9cnico, de mando, por comisi\u00f3n, de vuelo y de t\u00e9cnico especial',
    y == 141 ~ 'Aportaciones de seguridad social',
    y == 142 ~ 'Aportaciones a fondos de vivienda',
    y == 143 ~ 'Aportaciones al sistema para el retiro',
    y == 144 ~ 'Aportaciones para seguros',
    y == 151 ~ 'Cuotas para el fondo de ahorro y fondo de trabajo',
    y == 152 ~ 'Indemnizaciones',
    y == 153 ~ 'Prestaciones y haberes de retiro',
    y == 154 ~ 'Prestaciones contractuales',
    y == 155 ~ 'Apoyos a la capacitaci\u00f3n de los servidores p\u00fablicos',
    y == 159 ~ 'Otras prestaciones sociales y econ\u00f3micas',
    y == 161 ~ 'Previsiones de car\u00e1cter laboral, econ\u00f3mica y de seguridad social',
    y == 171 ~ 'Est\u00edmulos',
    y == 211 ~ 'Materiales, \u00fatiles y equipos menores de oficina',
    y == 212 ~ 'Materiales y \u00fatiles de impresi\u00f3n y reproducci\u00f3n',
    y == 213 ~ 'Material estad\u00edstico y geogr\u00e1fico',
    y == 214 ~ 'Materiales, \u00fatiles y equipos menores de tecnolog\u00edas de la informaci\u00f3n y comunicaciones',
    y == 215 ~ 'Material impreso e informaci\u00f3n digital',
    y == 216 ~ 'Material de limpieza',
    y == 217 ~ 'Materiales y \u00fatiles de ense\u00f1anza',
    y == 218 ~ 'Materiales para el registro e identificaci\u00f3n de bienes y personas',
    y == 221 ~ 'Productos alimenticios para personas',
    y == 222 ~ 'Productos alimenticios para animales',
    y == 223 ~ 'Utensilios para el servicio de alimentaci\u00f3n',
    y == 231 ~ 'Productos alimenticios, agropecuarios y forestales adquiridos como materia prima',
    y == 232 ~ 'Insumos textiles adquiridos como materia prima',
    y == 233 ~ 'Productos de papel, cart\u00f3n e impresos adquiridos como materia prima',
    y == 234 ~ 'Combustibles, lubricantes, aditivos, carb\u00f3n y sus derivados adquiridos como materia prima',
    y == 235 ~ 'Productos qu\u00edmicos, farmac\u00e9uticos y de laboratorio adquiridos como materia prima',
    y == 236 ~ 'Productos met\u00e1licos y a base de minerales no met\u00e1licos adquiridos como materia prima',
    y == 237 ~ 'Productos de cuero, piel, pl\u00e1stico y hule adquiridos como materia prima',
    y == 238 ~ 'Mercanc\u00edas adquiridas para su comercializaci\u00f3n',
    y == 239 ~ 'Otros productos adquiridos como materia prima',
    y == 241 ~ 'Productos minerales no met\u00e1licos',
    y == 242 ~ 'Cemento y productos de concreto',
    y == 243 ~ 'Cal, yeso y productos de yeso',
    y == 244 ~ 'Madera y productos de madera',
    y == 245 ~ 'Vidrio y productos de vidrio',
    y == 246 ~ 'Material el\u00e9ctrico y electr\u00f3nico',
    y == 247 ~ 'Art\u00edculos met\u00e1licos para la construcci\u00f3n',
    y == 248 ~ 'Materiales complementarios',
    y == 249 ~ 'Otros materiales y art\u00edculos de construcci\u00f3n y reparaci\u00f3n',
    y == 251 ~ 'Productos qu\u00edmicos b\u00e1sicos',
    y == 252 ~ 'Fertilizantes, pesticidas y otros agroqu\u00edmicos',
    y == 253 ~ 'Medicinas y productos farmac\u00e9uticos',
    y == 254 ~ 'Materiales, accesorios y suministros m\u00e9dicos',
    y == 255 ~ 'Materiales, accesorios y suministros de laboratorio',
    y == 256 ~ 'Fibras sint\u00e9ticas, hules, pl\u00e1sticos y derivados',
    y == 259 ~ 'Otros productos qu\u00edmicos',
    y == 261 ~ 'Combustibles, lubricantes y aditivos',
    y == 271 ~ 'Vestuario y uniformes',
    y == 272 ~ 'Prendas de seguridad y protecci\u00f3n personal',
    y == 273 ~ 'Art\u00edculos deportivos',
    y == 274 ~ 'Productos textiles',
    y == 275 ~ 'Blancos y otros productos textiles, excepto prendas de vestir',
    y == 281 ~ 'Sustancias y materiales explosivos',
    y == 282 ~ 'Materiales de seguridad p\u00fablica',
    y == 283 ~ 'Prendas de protecci\u00f3n para seguridad p\u00fablica y nacional',
    y == 291 ~ 'Herramientas menores',
    y == 292 ~ 'Refacciones y accesorios menores de edificios',
    y == 293 ~ 'Refacciones y accesorios menores de mobiliario y equipo de administraci\u00f3n, educacional y recreativo',
    y == 294 ~ 'Refacciones y accesorios menores de equipo de c\u00f3mputo y tecnolog\u00edas de la informaci\u00f3n',
    y == 295 ~ 'Refacciones y accesorios menores de equipo e instrumental m\u00e9dico y de laboratorio',
    y == 296 ~ 'Refacciones y accesorios menores de equipo de transporte',
    y == 297 ~ 'Refacciones y accesorios menores de equipo de defensa y seguridad',
    y == 298 ~ 'Refacciones y accesorios menores de maquinaria y otros equipos',
    y == 299 ~ 'Refacciones y accesorios menores otros bienes muebles',
    y == 311 ~ 'Energ\u00eda el\u00e9ctrica',
    y == 312 ~ 'Gas',
    y == 313 ~ 'Agua',
    y == 314 ~ 'Telefon\u00eda tradicional',
    y == 315 ~ 'Telefon\u00eda celular',
    y == 316 ~ 'Servicios de telecomunicaciones y sat\u00e9lites',
    y == 317 ~ 'Servicios de acceso de Internet, redes y procesamiento de informaci\u00f3n',
    y == 318 ~ 'Servicios postales y telegr\u00e1ficos',
    y == 319 ~ 'Servicios integrales y otros servicios',
    y == 321 ~ 'Arrendamiento de terrenos',
    y == 322 ~ 'Arrendamiento de edificios',
    y == 323 ~ 'Arrendamiento de mobiliario y equipo de administraci\u00f3n, educacional y recreativo',
    y == 324 ~ 'Arrendamiento de equipo e instrumental m\u00e9dico y de laboratorio',
    y == 325 ~ 'Arrendamiento de equipo de transporte',
    y == 326 ~ 'Arrendamiento de maquinaria, otros equipos y herramientas',
    y == 327 ~ 'Arrendamiento de activos intangibles',
    y == 329 ~ 'Otros arrendamientos',
    y == 331 ~ 'Servicios legales, de contabilidad, auditor\u00eda y relacionados',
    y == 332 ~ 'Servicios de dise\u00f1o, arquitectura, ingenier\u00eda y actividades relacionadas',
    y == 333 ~ 'Servicios de consultor\u00eda administrativa, procesos, t\u00e9cnica y en tecnolog\u00edas de la informaci\u00f3n',
    y == 334 ~ 'Servicios de capacitaci\u00f3n',
    y == 335 ~ 'Servicios de investigaci\u00f3n cient\u00edfica y desarrollo',
    y == 336 ~ 'Servicios de apoyo administrativo, traducci\u00f3n, fotocopiado e impresi\u00f3n',
    y == 337 ~ 'Servicios de protecci\u00f3n y seguridad',
    y == 338 ~ 'Servicios de vigilancia',
    y == 339 ~ 'Servicios profesionales, cient\u00edficos y t\u00e9cnicos integrales',
    y == 341 ~ 'Servicios financieros y bancarios',
    y == 343 ~ 'Servicios de recaudaci\u00f3n, traslado y custodia de valores',
    y == 344 ~ 'Seguros de responsabilidad patrimonial y fianzas',
    y == 345 ~ 'Seguro de bienes patrimoniales',
    y == 346 ~ 'Almacenaje, envase y embalaje',
    y == 347 ~ 'Fletes y maniobras',
    y == 348 ~ 'Comisiones por ventas',
    y == 349 ~ 'Servicios financieros, bancarios y comerciales integrales',
    y == 351 ~ 'Conservaci\u00f3n y mantenimiento menor de inmuebles',
    y == 352 ~ 'Instalaci\u00f3n, reparaci\u00f3n y mantenimiento de mobiliario y equipo de administraci\u00f3n, educacional y recreativo',
    y == 353 ~ 'Instalaci\u00f3n, reparaci\u00f3n y mantenimiento de equipo de c\u00f3mputo y tecnolog\u00eda de la informaci\u00f3n',
    y == 354 ~ 'Instalaci\u00f3n, reparaci\u00f3n y mantenimiento de equipo e instrumental m\u00e9dico y de laboratorio',
    y == 355 ~ 'Reparaci\u00f3n y mantenimiento de equipo de transporte',
    y == 356 ~ 'Reparaci\u00f3n y mantenimiento de equipo de defensa y seguridad',
    y == 357 ~ 'Instalaci\u00f3n, reparaci\u00f3n y mantenimiento de maquinaria, otros equipos y herramienta',
    y == 358 ~ 'Servicios de limpieza y manejo de desechos',
    y == 359 ~ 'Servicios de jardiner\u00eda y fumigaci\u00f3n',
    y == 361 ~ 'Difusi\u00f3n por radio, televisi\u00f3n y otros medios de mensajes sobre programas y actividades gubernamentales',
    y == 362 ~ 'Difusi\u00f3n por radio, televisi\u00f3n y otros medios de mensajes comerciales para promover la venta de bienes o servicios',
    y == 363 ~ 'Servicios de creatividad, preproducci\u00f3n y producci\u00f3n de publicidad, excepto Internet',
    y == 366 ~ 'Servicio de creaci\u00f3n y difusi\u00f3n de contenido exclusivamente a trav\u00e9s de Internet',
    y == 369 ~ 'Otros servicios de informaci\u00f3n',
    y == 371 ~ 'Pasajes a\u00e9reos',
    y == 372 ~ 'Pasajes terrestres',
    y == 373 ~ 'Pasajes mar\u00edtimos, lacustres y fluviales',
    y == 375 ~ 'Vi\u00e1ticos en el pa\u00eds',
    y == 376 ~ 'Vi\u00e1ticos en el extranjero',
    y == 377 ~ 'Gastos de instalaci\u00f3n y traslado de menaje',
    y == 378 ~ 'Servicios integrales de traslado y vi\u00e1ticos',
    y == 379 ~ 'Otros servicios de traslado y hospedaje',
    y == 381 ~ 'Gastos de ceremonial',
    y == 382 ~ 'Gastos de orden social y cultural',
    y == 383 ~ 'Congresos y convenciones',
    y == 384 ~ 'Exposiciones',
    y == 385 ~ 'Gastos de representaci\u00f3n',
    y == 391 ~ 'Servicios funerarios y de cementerios',
    y == 392 ~ 'Impuestos y derechos',
    y == 393 ~ 'Impuestos y derechos de importaci\u00f3n',
    y == 394 ~ 'Sentencias y resoluciones por autoridad competente',
    y == 395 ~ 'Penas, multas, accesorios y actualizaciones',
    y == 396 ~ 'Otros gastos por responsabilidades',
    y == 398 ~ 'Impuesto sobre n\u00f3minas y otros que se deriven de una relaci\u00f3n laboral',
    y == 399 ~ 'Otros servicios generales',
    y == 415 ~ 'Transferencias internas otorgadas a entidades paraestatales no empresariales y no financieras',
    y == 431 ~ 'Subsidios a la producci\u00f3n',
    y == 433 ~ 'Subsidios a la inversi\u00f3n',
    y == 434 ~ 'Subsidios a la prestaci\u00f3n de servicios p\u00fablicos',
    y == 437 ~ 'Subvenciones al consumo',
    y == 438 ~ 'Subsidios a Entidades Federativas y Municipios',
    y == 439 ~ 'Otros Subsidios',
    y == 441 ~ 'Ayudas sociales a personas',
    y == 442 ~ 'Becas y otras ayudas para programas de capacitaci\u00f3n',
    y == 444 ~ 'Ayudas sociales a actividades cient\u00edficas o acad\u00e9micas',
    y == 445 ~ 'Ayudas sociales a instituciones sin fines de lucro',
    y == 448 ~ 'Ayudas por desastres naturales y otros siniestros',
    y == 452 ~ 'Jubilaciones',
    y == 459 ~ 'Otras pensiones y jubilaciones',
    y == 461 ~ 'Transferencias a fideicomisos del Poder Ejecutivo',
    y == 471 ~ 'Transferencias por obligaci\u00f3n de ley',
    y == 481 ~ 'Donativos a instituciones sin fines de lucro',
    y == 482 ~ 'Donativos a entidades federativas',
    y == 485 ~ 'Donativos internacionales',
    y == 491 ~ 'Transferencias para gobiernos extranjeros',
    y == 492 ~ 'Transferencias para organismos internacionales',
    y == 511 ~ 'Muebles de oficina y estanter\u00eda',
    y == 512 ~ 'Muebles, excepto de oficina y estanter\u00eda',
    y == 513 ~ 'Bienes art\u00edsticos, culturales y cient\u00edficos',
    y == 515 ~ 'Equipo de c\u00f3mputo y de tecnolog\u00edas de la informaci\u00f3n',
    y == 519 ~ 'Otros mobiliarios y equipos de administraci\u00f3n',
    y == 521 ~ 'Equipos y aparatos audiovisuales',
    y == 522 ~ 'Aparatos deportivos',
    y == 523 ~ 'C\u00e1maras fotogr\u00e1ficas y de video',
    y == 529 ~ 'Otro mobiliario y equipo educacional y recreativo',
    y == 531 ~ 'Equipo m\u00e9dico y de laboratorio',
    y == 532 ~ 'Instrumental m\u00e9dico y de laboratorio',
    y == 541 ~ 'Veh\u00edculos y Equipo Terrestre',
    y == 542 ~ 'Carrocer\u00edas y remolques',
    y == 544 ~ 'Equipo ferroviario',
    y == 545 ~ 'Embarcaciones',
    y == 561 ~ 'Maquinaria y equipo agropecuario',
    y == 562 ~ 'Maquinaria y equipo industrial',
    y == 563 ~ 'Maquinaria y equipo de construcci\u00f3n',
    y == 564 ~ 'Sistemas de aire acondicionado, calefacci\u00f3n y de refrigeraci\u00f3n industrial y comercial',
    y == 565 ~ 'Equipo de comunicaci\u00f3n y telecomunicaci\u00f3n',
    y == 566 ~ 'Equipos de generaci\u00f3n el\u00e9ctrica, aparatos y accesorios el\u00e9ctricos',
    y == 567 ~ 'Herramientas y m\u00e1quinas-herramienta',
    y == 569 ~ 'Otros equipos',
    y == 581 ~ 'Terrenos',
    y == 583 ~ 'Edificios no residenciales',
    y == 589 ~ 'Otros bienes inmuebles',
    y == 591 ~ 'Software',
    y == 597 ~ 'Licencias inform\u00e1ticas e intelectuales',
    y == 622 ~ 'Edificaci\u00f3n no habitacional',
    y == 623 ~ 'Construcci\u00f3n de obras para el abastecimiento de agua, petr\u00f3leo, gas, electricidad y telecomunicaciones',
    y == 624 ~ 'Divisi\u00f3n de terrenos y construcci\u00f3n de obras de urbanizaci\u00f3n',
    y == 625 ~ 'Construcci\u00f3n de v\u00edas de comunicaci\u00f3n',
    y == 626 ~ 'Otras construcciones de ingenier\u00eda civil u obra pesada',
    y == 627 ~ 'Instalaciones y equipamiento en construcciones',
    y == 629 ~ 'Trabajos de acabados en edificaciones y otros trabajos especializados',
    y == 725 ~ 'Acciones y participaciones de capital en organismos internacionales con fines de pol\u00edtica econ\u00f3mica',
    y == 739 ~ 'Otros valores',
    y == 799 ~ 'Otras erogaciones especiales',
    y == 811 ~ 'Fondo general de participaciones',
    y == 812 ~ 'Fondo de fomento municipal',
    y == 814 ~ 'Otros conceptos participables de la Federaci\u00f3n a entidades federativas',
    y == 831 ~ 'Aportaciones de la Federaci\u00f3n a las entidades federativas',
    y == 835 ~ 'Aportaciones previstas en leyes y decretos compensatorias a entidades federativas y municipios',
    y == 851 ~ 'Convenios de reasignaci\u00f3n',
    y == 921 ~ 'Intereses de la deuda interna con instituciones de cr\u00e9dito',
    y == 922 ~ 'Intereses derivados de la colocaci\u00f3n de t\u00edtulos y valores',
    y == 924 ~ 'Intereses de la deuda externa con instituciones de cr\u00e9dito',
    y == 925 ~ 'Intereses de la deuda con organismos financieros Internacionales',
    y == 926 ~ 'Intereses de la deuda bilateral',
    y == 927 ~ 'Intereses derivados de la colocaci\u00f3n de t\u00edtulos y valores en el exterior',
    y == 931 ~ 'Comisiones de la deuda p\u00fablica interna',
    y == 932 ~ 'Comisiones de la deuda p\u00fablica externa',
    y == 941 ~ 'Gastos de la deuda p\u00fablica interna',
    y == 942 ~ 'Gastos de la deuda p\u00fablica externa',
    y == 951 ~ 'Costos por coberturas',
    y == 962 ~ 'Apoyos a ahorradores y deudores del Sistema Financiero Nacional',
    y == 991 ~ 'ADEFAS',
    T ~ NA_character_
  )
}


#' ID de partida específica a descripción de partida específica
#'
#' Esta función regresa la descripción del partida específica poniendo el partida específica correspondiente
#'
#' @param id_partida_especifica la colúmna con la id del partida específica.
#'
#' @return regresa una lista con la descripción del partida específica.
#' @export
id_part_esp_to_desc_part_esp <- function(id_partida_especifica) {

  y <- as.numeric(id_partida_especifica)

  dplyr::case_when(
    y == 11101 ~ 'Dietas (Ramos Aut\u00f3nomos)',
    y == 11201 ~ 'Haberes',
    y == 11301 ~ 'Sueldos base',
    y == 11401 ~ 'Retribuciones por adscripci\u00f3n en el extranjero',
    y == 12101 ~ 'Honorarios',
    y == 12201 ~ 'Remuneraciones al personal eventual',
    y == 12201 ~ 'Sueldos base al personal eventual',
    y == 12202 ~ 'Compensaciones a sustitutos de profesores',
    y == 12301 ~ 'Retribuciones por servicios de car\u00e1cter social',
    y == 12301 ~ 'Retribuciones por servicios en per\u00edodo de formaci\u00f3n profesional',
    y == 12401 ~ 'Retribuci\u00f3n a los representantes de los trabajadores y de los patrones en la Junta Federal de Conciliaci\u00f3n y Arbitraje',


    y == 13101 ~ 'Prima quinquenal por a\u00f1os de servicios efectivos prestados',
    y == 13102 ~ 'Acreditaci\u00f3n por a\u00f1os de servicio en la docencia y al personal administrativo de las instituciones de educaci\u00f3n superior',
    y == 13103 ~ 'Prima de perseverancia por a\u00f1os de servicio activo en el Ej\u00e9rcito, Fuerza A\u00e9rea y Armada Mexicanos',
    y == 13104 ~ 'Antig\u00fcedad',
    y == 13201 ~ 'Primas de vacaciones y dominical',
    y == 13202 ~ 'Aguinaldo o gratificaci\u00f3n de fin de a\u00f1o',
    y == 13204 ~ 'Primas de vacaciones y dominical de \u00e1reas administrativas (Ramos Aut\u00f3nomos)',
    y == 13301 ~ 'Remuneraciones por horas extraordinarias',
    y == 13401 ~ 'Acreditaci\u00f3n por titulaci\u00f3n en la docencia',
    y == 13402 ~ 'Acreditaci\u00f3n al personal docente por a\u00f1os de estudio de licenciatura',
    y == 13402 ~ 'Compensaciones adicionales por servicios especiales',
    y == 13403 ~ 'Compensaciones por servicios especiales',
    y == 13404 ~ 'Compensaciones por servicios eventuales',
    y == 13405 ~ 'Compensaciones de retiro',
    y == 13406 ~ 'Compensaciones de servicios',
    y == 13407 ~ 'Compensaciones adicionales por servicios especiales',
    y == 13408 ~ 'Asignaciones docentes, pedag\u00f3gicas gen\u00e9ricas y espec\u00edficas',
    y == 13409 ~ 'Compensaci\u00f3n por adquisici\u00f3n de material did\u00e1ctico',
    y == 13410 ~ 'Compensaci\u00f3n por actualizaci\u00f3n y formaci\u00f3n acad\u00e9mica',
    y == 13411 ~ 'Compensaciones a m\u00e9dicos residentes',
    y == 13412 ~ 'Gastos contingentes para el personal radicado en el extranjero',
    y == 13413 ~ 'Asignaciones para la conclusi\u00f3n de servicios en la Administraci\u00f3n P\u00fablica Federal',
    y == 13414 ~ 'Asignaciones conforme al r\u00e9gimen laboral',
    y == 13501 ~ 'Sobrehaberes',
    y == 13601 ~ 'Asignaciones de t\u00e9cnico',
    y == 13602 ~ 'Asignaciones de mando',
    y == 13604 ~ 'Asignaciones de vuelo',
    y == 13605 ~ 'Asignaciones de t\u00e9cnico especial',


    y == 14101 ~ 'Aportaciones al ISSSTE',
    y == 14102 ~ 'Aportaciones al ISSFAM',
    y == 14103 ~ 'Aportaciones al IMSS',
    y == 14104 ~ 'Aportaciones de seguridad social contractuales',
    y == 14105 ~ 'Aportaciones al seguro de cesant\u00eda en edad avanzada y vejez',
    y == 14201 ~ 'Aportaciones al FOVISSSTE',
    y == 14202 ~ 'Aportaciones al INFONAVIT',
    y == 14301 ~ 'Aportaciones al Sistema de Ahorro para el Retiro',
    y == 14302 ~ 'Dep\u00f3sitos para el ahorro solidario',
    y == 14401 ~ 'Cuotas para el seguro de vida del personal civil',
    y == 14402 ~ 'Cuotas para el seguro de vida del personal militar',
    y == 14403 ~ 'Cuotas para el seguro de gastos m\u00e9dicos del personal civil',
    y == 14404 ~ 'Cuotas para el seguro de separaci\u00f3n individualizado',
    y == 14405 ~ 'Cuotas para el seguro colectivo de retiro',
    y == 14406 ~ 'Seguro de responsabilidad civil, asistencia legal y otros seguros',
    y == 15101 ~ 'Cuotas para el fondo de ahorro del personal civil',
    y == 15102 ~ 'Cuotas para el fondo de ahorro de generales, almirantes, jefes y oficiales',
    y == 15103 ~ 'Cuotas para el fondo de trabajo del personal del Ej\u00e9rcito, Fuerza A\u00e9rea y Armada Mexicanos',
    y == 15201 ~ 'Indemnizaciones por accidentes en el trabajo',
    y == 15202 ~ 'Pago de liquidaciones',
    y == 15301 ~ 'Prestaciones de retiro',
    y == 15401 ~ 'Prestaciones establecidas por condiciones generales de trabajo o contratos colectivos de trabajo',
    y == 15402 ~ 'Compensaci\u00f3n garantizada',
    y == 15403 ~ 'Asignaciones adicionales al sueldo',
    y == 15405 ~ 'Compensaci\u00f3n de Apoyo (Ramos Aut\u00f3nomos)',
    y == 15501 ~ 'Apoyos a la capacitaci\u00f3n de los servidores p\u00fablicos',
    y == 15901 ~ 'Otras prestaciones',
    y == 15902 ~ 'Pago extraordinario por riesgo',


    y == 16101 ~ 'Incrementos a las percepciones',
    y == 16102 ~ 'Creaci\u00f3n de plazas',
    y == 16103 ~ 'Otras medidas de car\u00e1cter laboral y econ\u00f3mico',
    y == 16104 ~ 'Previsiones para aportaciones al ISSSTE',
    y == 16105 ~ 'Previsiones para aportaciones al FOVISSSTE',
    y == 16106 ~ 'Previsiones para aportaciones al Sistema de Ahorro para el Retiro',
    y == 16107 ~ 'Previsiones para aportaciones al seguro de cesant\u00eda en edad avanzada y vejez',
    y == 16108 ~ 'Previsiones para los dep\u00f3sitos al ahorro solidario',
    y == 17101 ~ 'Est\u00edmulos por productividad y eficiencia',
    y == 17102 ~ 'Est\u00edmulos al personal operativo',
    y == 21101 ~ 'Materiales y \u00fatiles de oficina',
    y == 21102 ~ 'Material Electoral',
    y == 21199 ~ 'Materiales de administraci\u00f3n, emisi\u00f3n de documentos y art\u00edculos oficiales',
    y == 21201 ~ 'Materiales y \u00fatiles de impresi\u00f3n y reproducci\u00f3n',
    y == 21301 ~ 'Material estad\u00edstico y geogr\u00e1fico',
    y == 21401 ~ 'Materiales y \u00fatiles consumibles para el procesamiento en equipos y bienes inform\u00e1ticos',
    y == 21401 ~ 'Materiales y \u00fatiles para el procesamiento en equipos y bienes inform\u00e1ticos',
    y == 21501 ~ 'Material de apoyo informativo',
    y == 21502 ~ 'Material para informaci\u00f3n en actividades de investigaci\u00f3n cient\u00edfica y tecnol\u00f3gica',
    y == 21601 ~ 'Material de limpieza',
    y == 21701 ~ 'Materiales y suministros para planteles educativos',
    y == 21801 ~ 'Materiales para el registro e identificaci\u00f3n de bienes y personas (Ramos Aut\u00f3nomos)',
    y == 22101 ~ 'Productos alimenticios para el Ej\u00e9rcito, Fuerza A\u00e9rea y Armada Mexicanos, y para los efectivos que participen en programas de seguridad p\u00fablica',
    y == 22102 ~ 'Productos alimenticios para personas derivado de la prestaci\u00f3n de servicios p\u00fablicos en unidades de salud, educativas, de readaptaci\u00f3n social y otras',
    y == 22103 ~ 'Productos alimenticios para el personal que realiza labores en campo o de supervisi\u00f3n',
    y == 22104 ~ 'Productos alimenticios para el personal en las instalaciones de las dependencias y entidades',
    y == 22106 ~ 'Productos alimenticios para el personal derivado de actividades extraordinarias',
    y == 22199 ~ 'Alimentos y utensilios',
    y == 22201 ~ 'Productos alimenticios para animales',
    y == 22301 ~ 'Utensilios para el servicio de alimentaci\u00f3n',
    y == 23101 ~ 'Productos alimenticios, agropecuarios y forestales adquiridos como materia prima',
    y == 23201 ~ 'Insumos textiles adquiridos como materia prima',
    y == 23301 ~ 'Productos de papel, cart\u00f3n e impresos adquiridos como materia prima',
    y == 23401 ~ 'Combustibles, lubricantes, aditivos, carb\u00f3n y sus derivados adquiridos como materia prima',
    y == 23501 ~ 'Productos qu\u00edmicos, farmac\u00e9uticos y de laboratorio adquiridos como materia prima',
    y == 23601 ~ 'Productos met\u00e1licos y a base de minerales no met\u00e1licos adquiridos como materia prima',
    y == 23701 ~ 'Productos de cuero, piel, pl\u00e1stico y hule adquiridos como materia prima',
    y == 23801 ~ 'Mercanc\u00edas para su comercializaci\u00f3n en tiendas del sector p\u00fablico',
    y == 23901 ~ 'Otros productos adquiridos como materia prima',
    y == 23902 ~ 'Petr\u00f3leo, gas y sus derivados adquiridos como materia prima',
    y == 24101 ~ 'Productos minerales no met\u00e1licos',
    y == 24199 ~ 'Materiales y art\u00edculos de construcci\u00f3n y de reparaci\u00f3n',
    y == 24201 ~ 'Cemento y productos de concreto',
    y == 24301 ~ 'Cal, yeso y productos de yeso',
    y == 24401 ~ 'Madera y productos de madera',
    y == 24501 ~ 'Vidrio y productos de vidrio',
    y == 24601 ~ 'Material el\u00e9ctrico y electr\u00f3nico',
    y == 24701 ~ 'Art\u00edculos met\u00e1licos para la construcci\u00f3n',
    y == 24801 ~ 'Materiales complementarios',
    y == 24901 ~ 'Otros materiales y art\u00edculos de construcci\u00f3n y reparaci\u00f3n',
    y == 25101 ~ 'Productos qu\u00edmicos b\u00e1sicos',
    y == 25199 ~ 'Productos qu\u00edmicos, farmac\u00e9uticos y de laboratorio',
    y == 25201 ~ 'Plaguicidas, abonos y fertilizantes',
    y == 25301 ~ 'Medicinas y productos farmac\u00e9uticos',
    y == 25401 ~ 'Materiales, accesorios y suministros m\u00e9dicos',
    y == 25501 ~ 'Materiales, accesorios y suministros de laboratorio',
    y == 25601 ~ 'Fibras sint\u00e9ticas, hules, pl\u00e1sticos y derivados',
    y == 25601 ~ 'Fibras sint\u00e9ticas, hules, pl\u00e1sticos y derivados (Ramos Aut\u00f3nomos)',
    y == 25901 ~ 'Otros productos qu\u00edmicos',
    y == 26101 ~ 'Combustibles, lubricantes y aditivos para veh\u00edculos terrestres, a\u00e9reos, mar\u00edtimos, lacustres y fluviales destinados a la ejecuci\u00f3n de programas de seguridad p\u00fablica y nacional',
    y == 26102 ~ 'Combustibles, lubricantes y aditivos para veh\u00edculos terrestres, a\u00e9reos, mar\u00edtimos, lacustres y fluviales destinados a servicios p\u00fablicos y la operaci\u00f3n de programas p\u00fablicos',
    y == 26103 ~ 'Combustibles, lubricantes y aditivos para veh\u00edculos terrestres, a\u00e9reos, mar\u00edtimos, lacustres y fluviales destinados a servicios administrativos',
    y == 26104 ~ 'Combustibles, lubricantes y aditivos para veh\u00edculos terrestres, a\u00e9reos, mar\u00edtimos, lacustres y fluviales asignados a servidores p\u00fablicos',
    y == 26105 ~ 'Combustibles, lubricantes y aditivos para maquinaria, equipo de producci\u00f3n y servicios administrativos',
    y == 26106 ~ 'PIDIREGAS cargos variables',
    y == 26107 ~ 'Combustibles nacionales para plantas productivas',
    y == 26108 ~ 'Combustibles de importaci\u00f3n para plantas productivas',
    y == 26199 ~ 'Combustibles, lubricantes y aditivos',
    y == 27101 ~ 'Vestuario y uniformes',
    y == 27199 ~ 'Vestuario, blancos, prendas de protecci\u00f3n y art\u00edculos deportivos',
    y == 27201 ~ 'Prendas de protecci\u00f3n personal',
    y == 27301 ~ 'Art\u00edculos deportivos',
    y == 27401 ~ 'Productos textiles',
    y == 27501 ~ 'Blancos y otros productos textiles, excepto prendas de vestir',
    y == 28101 ~ 'Sustancias y materiales explosivos',
    y == 28201 ~ 'Materiales de seguridad p\u00fablica',
    y == 28301 ~ 'Prendas de protecci\u00f3n para seguridad p\u00fablica y nacional',
    y == 29101 ~ 'Herramientas menores',
    y == 29199 ~ 'Herramientas, refacciones y accesorios menores',
    y == 29201 ~ 'Refacciones y accesorios menores de edificios',
    y == 29301 ~ 'Refacciones y accesorios menores de mobiliario y equipo de administraci\u00f3n, educacional y recreativo',
    y == 29401 ~ 'Refacciones y accesorios para equipo de c\u00f3mputo',
    y == 29401 ~ 'Refacciones y accesorios para equipo de c\u00f3mputo y telecomunicaciones',
    y == 29501 ~ 'Refacciones y accesorios menores de equipo e instrumental m\u00e9dico y de laboratorio',
    y == 29601 ~ 'Refacciones y accesorios menores de equipo de transporte',
    y == 29701 ~ 'Refacciones y accesorios menores de equipo de defensa y seguridad',
    y == 29801 ~ 'Refacciones y accesorios menores de maquinaria y otros equipos',
    y == 29901 ~ 'Refacciones y accesorios menores otros bienes muebles',
    y == 31101 ~ 'Servicio de energ\u00eda el\u00e9ctrica',
    y == 31199 ~ 'Servicios b\u00e1sicos',
    y == 31201 ~ 'Servicio de gas',
    y == 31301 ~ 'Servicio de agua',
    y == 31401 ~ 'Servicio telef\u00f3nico convencional',
    y == 31501 ~ 'Servicio de telefon\u00eda celular',
    y == 31601 ~ 'Servicio de radiolocalizaci\u00f3n',
    y == 31602 ~ 'Servicios de telecomunicaciones',
    y == 31603 ~ 'Asignaciones destinadas a cubrir el pago de servicios de internet, requeridos en el desempe\u00f1o de funciones oficiales',
    y == 31603 ~ 'Servicios de internet',
    y == 31701 ~ 'Servicios de conducci\u00f3n de se\u00f1ales anal\u00f3gicas y digitales',
    y == 31801 ~ 'Servicio postal',
    y == 31802 ~ 'Servicio telegr\u00e1fico',
    y == 31901 ~ 'Servicios integrales de telecomunicaci\u00f3n',
    y == 31902 ~ 'Contrataci\u00f3n de otros servicios',
    y == 31903 ~ 'Servicios generales para planteles educativos',
    y == 31904 ~ 'Servicios integrales de infraestructura de c\u00f3mputo',
    y == 32101 ~ 'Arrendamiento de terrenos',
    y == 32199 ~ 'Servicios de arrendamiento',
    y == 32201 ~ 'Arrendamiento de edificios y locales',
    y == 32301 ~ 'Arrendamiento de equipo y bienes inform\u00e1ticos',
    y == 32302 ~ 'Arrendamiento de mobiliario',
    y == 32303 ~ 'Arrendamiento de equipo de telecomunicaciones',
    y == 32401 ~ 'Arrendamiento de equipo e instrumental m\u00e9dico y de laboratorio',
    y == 32501 ~ 'Arrendamiento de veh\u00edculos terrestres, a\u00e9reos, mar\u00edtimos, lacustres y fluviales para la ejecuci\u00f3n de programas de seguridad p\u00fablica y nacional',
    y == 32502 ~ 'Arrendamiento de veh\u00edculos terrestres, a\u00e9reos, mar\u00edtimos, lacustres y fluviales para servicios p\u00fablicos y la operaci\u00f3n de programas p\u00fablicos',
    y == 32503 ~ 'Arrendamiento de veh\u00edculos terrestres, a\u00e9reos, mar\u00edtimos, lacustres y fluviales para servicios administrativos',
    y == 32505 ~ 'Arrendamiento de veh\u00edculos terrestres, a\u00e9reos, mar\u00edtimos, lacustres y fluviales para servidores p\u00fablicos',
    y == 32601 ~ 'Arrendamiento de maquinaria y equipo',
    y == 32701 ~ 'Patentes, derechos de autor, regal\u00edas y otros',
    y == 32701 ~ 'Patentes, regal\u00edas y otros',
    y == 32901 ~ 'Arrendamiento de sustancias y productos qu\u00edmicos',
    y == 32902 ~ 'PIDIREGAS cargos fijos',
    y == 32903 ~ 'Otros Arrendamientos',
    y == 33101 ~ 'Asesor\u00edas asociadas a convenios, tratados o acuerdos',
    y == 33102 ~ 'Asesor\u00edas por controversias en el marco de los tratados internacionales',
    y == 33103 ~ 'Consultor\u00edas para programas o proyectos financiados por organismos internacionales',
    y == 33104 ~ 'Otras asesor\u00edas para la operaci\u00f3n de programas',
    y == 33105 ~ 'Servicios relacionados con procedimientos jurisdiccionales',
    y == 33106 ~ 'Servicios legales, de contabilidad, auditor\u00eda y relacionados (Ramos Aut\u00f3nomos)',
    y == 33199 ~ 'Servicios profesionales, cient\u00edficos, t\u00e9cnicos y otros servicios',
    y == 33201 ~ 'Servicios de dise\u00f1o, arquitectura, ingenier\u00eda y actividades relacionadas',
    y == 33201 ~ 'Servicios de dise\u00f1o, arquitectura, ingenier\u00eda y actividades relacionadas (Ramos Aut\u00f3nomos)',
    y == 33301 ~ 'Servicios de desarrollo de aplicaciones inform\u00e1ticas',
    y == 33301 ~ 'Servicios de inform\u00e1tica',
    y == 33302 ~ 'Servicios estad\u00edsticos y geogr\u00e1ficos',
    y == 33303 ~ 'Servicios relacionados con certificaci\u00f3n de procesos',
    y == 33304 ~ 'Servicios de consultor\u00eda administrativa, procesos, t\u00e9cnica y en tecnolog\u00edas de la informaci\u00f3n',
    y == 33304 ~ 'Servicios de mantenimiento de aplicaciones inform\u00e1ticas',
    y == 33401 ~ 'Servicios para capacitaci\u00f3n a servidores p\u00fablicos',
    y == 33501 ~ 'Estudios e investigaciones',
    y == 33601 ~ 'Servicios relacionados con traducciones',
    y == 33602 ~ 'Otros servicios comerciales',
    y == 33603 ~ 'Impresiones de documentos oficiales para la prestaci\u00f3n de servicios p\u00fablicos, identificaci\u00f3n, formatos administrativos y fiscales, formas valoradas, certificados y t\u00edtulos',
    y == 33604 ~ 'Impresi\u00f3n y elaboraci\u00f3n de material informativo derivado de la operaci\u00f3n y administraci\u00f3n de las dependencias y entidades',
    y == 33605 ~ 'Informaci\u00f3n en medios masivos derivada de la operaci\u00f3n y administraci\u00f3n de las dependencias y entidades',
    y == 33605 ~ 'Informaci\u00f3n en medios masivos derivada de la operaci\u00f3n y administraci\u00f3n de las Unidades Responsables',
    y == 33606 ~ 'Servicios de digitalizaci\u00f3n',
    y == 33701 ~ 'Gastos de seguridad p\u00fablica y nacional',
    y == 33801 ~ 'Servicios de vigilancia',
    y == 33901 ~ 'Subcontrataci\u00f3n de servicios con terceros',
    y == 33902 ~ 'Proyectos para prestaci\u00f3n de servicios',
    y == 33903 ~ 'Servicios integrales',
    y == 33904 ~ 'Asignaciones derivadas de proyectos de asociaci\u00f3n p\u00fablico privada',
    y == 33905 ~ 'Servicios integrales en materia de seguridad p\u00fablica y nacional',
    y == 34101 ~ 'Servicios bancarios y financieros',
    y == 34199 ~ 'Servicios financieros, bancarios y comerciales',
    y == 34301 ~ 'Gastos inherentes a la recaudaci\u00f3n',
    y == 34401 ~ 'Seguro de responsabilidad patrimonial del Estado',
    y == 34501 ~ 'Seguros de bienes patrimoniales',
    y == 34601 ~ 'Almacenaje, embalaje y envase',
    y == 34701 ~ 'Fletes y maniobras',
    y == 34801 ~ 'Comisiones por ventas',
    y == 34901 ~ 'Otros servicios financieros, bancarios y comerciales (Ramos Aut\u00f3nomos)',
    y == 35101 ~ 'Mantenimiento y conservaci\u00f3n de inmuebles para la prestaci\u00f3n de servicios administrativos',
    y == 35102 ~ 'Mantenimiento y conservaci\u00f3n de inmuebles para la prestaci\u00f3n de servicios p\u00fablicos',
    y == 35199 ~ 'Servicios de instalaci\u00f3n, reparaci\u00f3n, mantenimiento y conservaci\u00f3n',
    y == 35201 ~ 'Mantenimiento y conservaci\u00f3n de mobiliario y equipo de administraci\u00f3n',
    y == 35301 ~ 'Mantenimiento y conservaci\u00f3n de bienes inform\u00e1ticos',
    y == 35401 ~ 'Instalaci\u00f3n, reparaci\u00f3n y mantenimiento de equipo e instrumental m\u00e9dico y de laboratorio',
    y == 35501 ~ 'Mantenimiento y conservaci\u00f3n de veh\u00edculos terrestres, a\u00e9reos, mar\u00edtimos, lacustres y fluviales',
    y == 35601 ~ 'Reparaci\u00f3n y mantenimiento de equipo de defensa y seguridad',
    y == 35701 ~ 'Mantenimiento y conservaci\u00f3n de maquinaria y equipo',
    y == 35702 ~ 'Mantenimiento y conservaci\u00f3n de plantas e instalaciones productivas',
    y == 35801 ~ 'Servicios de lavander\u00eda, limpieza e higiene',
    y == 35901 ~ 'Servicios de jardiner\u00eda y fumigaci\u00f3n',
    y == 36101 ~ 'Difusi\u00f3n de mensajes sobre programas y actividades gubernamentales',
    y == 36101 ~ 'Difusi\u00f3n de mensajes sobre programas y actividades Institucionales',
    y == 36199 ~ 'Servicios de comunicaci\u00f3n social y publicidad',
    y == 36201 ~ 'Difusi\u00f3n de mensajes comerciales para promover la venta de productos o servicios',
    y == 36301 ~ 'Servicios de creatividad, preproducci\u00f3n y producci\u00f3n de publicidad, excepto internet (Ramos Aut\u00f3nomos)',
    y == 36601 ~ 'Servicio de creaci\u00f3n y difusi\u00f3n de contenido exclusivamente a trav\u00e9s de Internet',
    y == 36601 ~ 'Servicio de creaci\u00f3n y difusi\u00f3n de contenido exclusivamente a trav\u00e9s de Internet (Ramos Aut\u00f3nomos)',
    y == 36901 ~ 'Servicios relacionados con monitoreo de informaci\u00f3n en medios masivos',
    y == 37101 ~ 'Pasajes a\u00e9reos nacionales para labores en campo y de supervisi\u00f3n',
    y == 37102 ~ 'Pasajes a\u00e9reos nacionales asociados a los programas de seguridad p\u00fablica y nacional',
    y == 37103 ~ 'Pasajes a\u00e9reos nacionales asociados a desastres naturales',
    y == 37104 ~ 'Pasajes a\u00e9reos nacionales para servidores p\u00fablicos de mando en el desempe\u00f1o de comisiones y funciones oficiales',
    y == 37105 ~ 'Pasajes a\u00e9reos internacionales asociados a los programas de seguridad p\u00fablica y nacional',
    y == 37106 ~ 'Pasajes a\u00e9reos internacionales para servidores p\u00fablicos en el desempe\u00f1o de comisiones y funciones oficiales',
    y == 37199 ~ 'Servicios de traslado y vi\u00e1ticos',
    y == 37201 ~ 'Pasajes terrestres nacionales para labores en campo y de supervisi\u00f3n',
    y == 37202 ~ 'Pasajes terrestres nacionales asociados a los programas de seguridad p\u00fablica y nacional',
    y == 37203 ~ 'Pasajes terrestres nacionales asociados a desastres naturales',
    y == 37204 ~ 'Pasajes terrestres nacionales para servidores p\u00fablicos de mando en el desempe\u00f1o de comisiones y funciones oficiales',
    y == 37206 ~ 'Pasajes terrestres internacionales para servidores p\u00fablicos en el desempe\u00f1o de comisiones y funciones oficiales',
    y == 37207 ~ 'Pasajes terrestres nacionales por medio electr\u00f3nico',
    y == 37301 ~ 'Pasajes mar\u00edtimos, lacustres y fluviales para labores en campo y de supervisi\u00f3n',
    y == 37302 ~ 'Pasajes mar\u00edtimos, lacustres y fluviales asociados a los programas de seguridad p\u00fablica y nacional',
    y == 37304 ~ 'Pasajes mar\u00edtimos, lacustres y fluviales para servidores p\u00fablicos de mando en el desempe\u00f1o de comisiones y funciones oficiales',
    y == 37501 ~ 'Vi\u00e1ticos nacionales para labores en campo y de supervisi\u00f3n',
    y == 37502 ~ 'Vi\u00e1ticos nacionales asociados a los programas de seguridad p\u00fablica y nacional',
    y == 37503 ~ 'Vi\u00e1ticos nacionales asociados a desastres naturales',
    y == 37504 ~ 'Vi\u00e1ticos nacionales para servidores p\u00fablicos en el desempe\u00f1o de funciones oficiales',
    y == 37601 ~ 'Vi\u00e1ticos en el extranjero asociados a los programas de seguridad p\u00fablica y nacional',
    y == 37602 ~ 'Vi\u00e1ticos en el extranjero para servidores p\u00fablicos en el desempe\u00f1o de comisiones y funciones oficiales',
    y == 37701 ~ 'Instalaci\u00f3n del personal federal',
    y == 37801 ~ 'Servicios integrales nacionales para servidores p\u00fablicos en el desempe\u00f1o de comisiones y funciones oficiales',
    y == 37802 ~ 'Servicios integrales en el extranjero para servidores p\u00fablicos en el desempe\u00f1o de comisiones y funciones oficiales',
    y == 37901 ~ 'Gastos para operativos y trabajos de campo en \u00e1reas rurales',
    y == 38101 ~ 'Gastos de ceremonial del titular del Ejecutivo Federal',
    y == 38102 ~ 'Gastos de ceremonial de los titulares de las dependencias y entidades',
    y == 38199 ~ 'Servicios oficiales',
    y == 38201 ~ 'Gastos de orden social',
    y == 38301 ~ 'Congresos y convenciones',
    y == 38401 ~ 'Exposiciones',
    y == 38501 ~ 'Gastos para alimentaci\u00f3n de servidores p\u00fablicos de mando',
    y == 39101 ~ 'Funerales y pagas de defunci\u00f3n',
    y == 39199 ~ 'Otros servicios generales',
    y == 39201 ~ 'Impuestos y derechos de exportaci\u00f3n',
    y == 39202 ~ 'Enteros de los seguros de cesant\u00eda y vej\u00e9z, invalidez y vida y riesgos de trabajo',
    y == 39202 ~ 'Otros impuestos y derechos',
    y == 39301 ~ 'Impuestos y derechos de importaci\u00f3n',
    y == 39401 ~ 'Erogaciones por resoluciones emitidas por autoridad competente',
    y == 39401 ~ 'Erogaciones por resoluciones por autoridad competente',
    y == 39402 ~ 'Indemnizaciones por expropiaci\u00f3n de predios',
    y == 39501 ~ 'Penas, multas, accesorios y actualizaciones',
    y == 39601 ~ 'P\u00e9rdidas del erario federal',
    y == 39602 ~ 'Otros gastos por responsabilidades',
    y == 39801 ~ 'Impuesto sobre n\u00f3minas',
    y == 39901 ~ 'Gastos de las Comisiones Internacionales de L\u00edmites y Aguas',
    y == 39902 ~ 'Gastos de las oficinas del Servicio Exterior Mexicano',
    y == 39902 ~ 'Otros servicios generales',
    y == 39903 ~ 'Asignaciones a los grupos parlamentarios (Ramos Aut\u00f3nomos)',
    y == 39904 ~ 'Participaciones en \u00f3rganos de gobierno',
    y == 39908 ~ 'Erogaciones por cuenta de terceros',
    y == 39909 ~ 'Erogaciones recuperables',
    y == 39910 ~ 'Apertura de Fondo Rotatorio',
    y == 41501 ~ 'Transferencias para cubrir el d\u00e9ficit de operaci\u00f3n y los gastos de administraci\u00f3n asociados al otorgamiento de subsidios',
    y == 43101 ~ 'Subsidios a la producci\u00f3n',
    y == 43301 ~ 'Subsidios para inversi\u00f3n',
    y == 43401 ~ 'Subsidios a la prestaci\u00f3n de servicios p\u00fablicos',
    y == 43701 ~ 'Subsidios al consumo',
    y == 43801 ~ 'Subsidios a Entidades Federativas y Municipios',
    y == 43901 ~ 'Otros subsidios y subvenciones',
    y == 43901 ~ 'Subsidios para capacitaci\u00f3n y becas',
    y == 43902 ~ 'Subsidios a fideicomisos privados y estatales',
    y == 44101 ~ 'Gastos relacionados con actividades culturales, deportivas y de ayuda extraordinaria',
    y == 44102 ~ 'Gastos por servicios de traslado de personas',
    y == 44103 ~ 'Premios, recompensas, pensiones de gracia y pensi\u00f3n recreativa estudiantil',
    y == 44104 ~ 'Premios, est\u00edmulos, recompensas, becas y seguros a deportistas',
    y == 44105 ~ 'Apoyo a voluntarios que participan en diversos programas federales',
    y == 44106 ~ 'Compensaciones por servicios de car\u00e1cter social',
    y == 44107 ~ 'Apoyo a representantes del Poder Legislativo y partidos pol\u00edticos ante el Consejo General del IFE (Ramos Aut\u00f3nomos)',
    y == 44108 ~ 'Dietas a consejeros electorales locales y distritales en el a\u00f1o electoral federal (Ramos Aut\u00f3nomos)',
    y == 44109 ~ 'Apoyo para alimentos a funcionarios de casilla el d\u00eda de la jornada electoral federal (Ramos Aut\u00f3nomos)',
    y == 44110 ~ 'Apoyo financiero a consejeros electorales locales y distritales en a\u00f1o electoral federal (Ramos Aut\u00f3nomos)',
    y == 44199 ~ 'Ayudas sociales',
    y == 44201 ~ 'Otras ayudas para programas de capacitaci\u00f3n (Solo para el Ramo 03 Poder Judicial) (Ramos Aut\u00f3nomos)',
    y == 44401 ~ 'Apoyos a la investigaci\u00f3n cient\u00edfica y tecnol\u00f3gica de instituciones acad\u00e9micas y sector p\u00fablico',
    y == 44402 ~ 'Apoyos a la investigaci\u00f3n cient\u00edfica y tecnol\u00f3gica en instituciones sin fines de lucro',
    y == 44501 ~ 'Apoyo financiero al Comit\u00e9 Nacional de Supervisi\u00f3n y Evaluaci\u00f3n y a la Comisi\u00f3n Nacional de Vigilancia locales y distritales del Registro Federal de Electores (Ramos Aut\u00f3nomos)',
    y == 44502 ~ 'Financiamiento p\u00fablico a partidos pol\u00edticos y agrupaciones pol\u00edticas con registro autorizado (Ramos Aut\u00f3nomos)',
    y == 44801 ~ 'Mercanc\u00edas para su distribuci\u00f3n a la poblaci\u00f3n',
    y == 45201 ~ 'Pago de pensiones y jubilaciones',
    y == 45202 ~ 'Pago de pensiones y jubilaciones contractuales',
    y == 45203 ~ 'Transferencias para el pago de pensiones y jubilaciones',
    y == 45901 ~ 'Pago de sumas aseguradas',
    y == 45902 ~ 'Prestaciones econ\u00f3micas distintas de pensiones y jubilaciones',
    y == 46101 ~ 'Aportaciones a fideicomisos p\u00fablicos',
    y == 46102 ~ 'Aportaciones a mandatos p\u00fablicos',
    y == 47101 ~ 'Trasferencias para cuotas y aportaciones de seguridad social para el IMSS, ISSSTE e ISSFAM por obligaci\u00f3n del Estado',
    y == 47102 ~ 'Transferencias para cuotas y aportaciones a los seguros de retiro, cesant\u00eda en edad avanzada y vejez',
    y == 48101 ~ 'Donativos a instituciones sin fines de lucro',
    y == 48201 ~ 'Donativos a entidades federativas o municipios',
    y == 48501 ~ 'Donativos internacionales',
    y == 49199 ~ 'Transferencias al exterior',
    y == 49201 ~ 'Cuotas y aportaciones a organismos internacionales',
    y == 49202 ~ 'Otras aportaciones internacionales',
    y == 51101 ~ 'Mobiliario',
    y == 51199 ~ 'Mobiliario y equipo de administraci\u00f3n',
    y == 51201 ~ 'Muebles, excepto de oficina y estanter\u00eda (Ramos Aut\u00f3nomos)',
    y == 51301 ~ 'Bienes art\u00edsticos y culturales',
    y == 51501 ~ 'Bienes inform\u00e1ticos',
    y == 51901 ~ 'Equipo de administraci\u00f3n',
    y == 52101 ~ 'Equipos y aparatos audiovisuales',
    y == 52201 ~ 'Aparatos deportivos',
    y == 52301 ~ 'C\u00e1maras fotogr\u00e1ficas y de video',
    y == 52901 ~ 'Otro mobiliario y equipo educacional y recreativo',
    y == 53101 ~ 'Equipo m\u00e9dico y de laboratorio',
    y == 53201 ~ 'Instrumental m\u00e9dico y de laboratorio',
    y == 54103 ~ 'Veh\u00edculos y equipo terrestres, destinados a servicios p\u00fablicos y la operaci\u00f3n de programas p\u00fablicos',
    y == 54104 ~ 'Veh\u00edculos y equipo terrestres, destinados a servicios administrativos',
    y == 54201 ~ 'Carrocer\u00edas y remolques',
    y == 54401 ~ 'Equipo ferroviario',
    y == 54502 ~ 'Veh\u00edculos y equipo mar\u00edtimo, destinados a servicios p\u00fablicos y la operaci\u00f3n de programas p\u00fablicos',
    y == 56101 ~ 'Maquinaria y equipo agropecuario',
    y == 56201 ~ 'Maquinaria y equipo industrial',
    y == 56301 ~ 'Maquinaria y equipo de construcci\u00f3n',
    y == 56401 ~ 'Sistemas de aire acondicionado, calefacci\u00f3n y de refrigeraci\u00f3n industrial y comercial',
    y == 56401 ~ 'Sistemas de aire acondicionado, calefacci\u00f3n y de refrigeraci\u00f3n industrial y comercial (Ramos Aut\u00f3nomos)',
    y == 56501 ~ 'Equipos y aparatos de comunicaciones y telecomunicaciones',
    y == 56601 ~ 'Maquinaria y equipo el\u00e9ctrico y electr\u00f3nico',
    y == 56701 ~ 'Herramientas y m\u00e1quinas herramienta',
    y == 56901 ~ 'Bienes muebles por arrendamiento financiero',
    y == 56902 ~ 'Otros bienes muebles',
    y == 58101 ~ 'Terrenos',
    y == 58301 ~ 'Edificios y locales',
    y == 58901 ~ 'Adjudicaciones, expropiaciones e indemnizaciones de inmuebles',
    y == 58902 ~ 'Bienes inmuebles en la modalidad de proyectos de infraestructura productiva de largo plazo',
    y == 58903 ~ 'Bienes inmuebles por arrendamiento financiero',
    y == 59101 ~ 'Software',
    y == 59701 ~ 'Licencias inform\u00e1ticas e intelectuales (Ramos Aut\u00f3nomos)',
    y == 62201 ~ 'Obras de construcci\u00f3n para edificios no habitacionales',
    y == 62202 ~ 'Mantenimiento y rehabilitaci\u00f3n de edificaciones no habitacionales',
    y == 62301 ~ 'Construcci\u00f3n de obras para el abastecimiento de agua, petr\u00f3leo, gas, electricidad y telecomunicaciones',
    y == 62302 ~ 'Mantenimiento y rehabilitaci\u00f3n de obras para el abastecimiento de agua, petr\u00f3leo, gas, electricidad y telecomunicaciones',
    y == 62403 ~ 'Mantenimiento y rehabilitaci\u00f3n de obras de urbanizaci\u00f3n',
    y == 62501 ~ 'Construcci\u00f3n de v\u00edas de comunicaci\u00f3n',
    y == 62502 ~ 'Mantenimiento y rehabilitaci\u00f3n de las v\u00edas de comunicaci\u00f3n',
    y == 62601 ~ 'Otras construcciones de ingenier\u00eda civil u obra pesada',
    y == 62602 ~ 'Mantenimiento y rehabilitaci\u00f3n de otras obras de ingenier\u00eda civil u obras pesadas',
    y == 62701 ~ 'Instalaciones y obras de construcci\u00f3n especializada',
    y == 62903 ~ 'Servicios de supervisi\u00f3n de obras',
    y == 62904 ~ 'Servicios para la liberaci\u00f3n de derechos de v\u00eda',
    y == 62905 ~ 'Otros servicios relacionados con obras p\u00fablicas',
    y == 72501 ~ 'Adquisici\u00f3n de acciones de organismos internacionales',
    y == 73902 ~ 'Adquisici\u00f3n de acciones',
    y == 73903 ~ 'Adquisici\u00f3n de otros valores',
    y == 79902 ~ 'Provisiones para erogaciones especiales',
    y == 81101 ~ 'Fondo General de Participaciones',
    y == 81201 ~ 'Fondo de Fomento Municipal',
    y == 81401 ~ 'Otros conceptos participables de la Federaci\u00f3n a entidades federativas',
    y == 83101 ~ 'Aportaciones federales a las entidades federativas y municipios para servicios personales',
    y == 83102 ~ 'Aportaciones federales a las entidades federativas y municipios para aportaciones al ISSSTE',
    y == 83103 ~ 'Aportaciones federales a las entidades federativas y municipios para gastos de operaci\u00f3n',
    y == 83104 ~ 'Aportaciones federales a las entidades federativas y municipios para gastos de inversi\u00f3n',
    y == 83105 ~ 'Aportaciones federales a las entidades federativas y municipios',
    y == 83106 ~ 'Aportaciones federales a las entidades federativas y municipios para incrementos a las percepciones',
    y == 83107 ~ 'Aportaciones federales a las entidades federativas y municipios para creaci\u00f3n de plazas',
    y == 83108 ~ 'Aportaciones federales a las entidades federativas y municipios para otras medidas de car\u00e1cter laboral y econ\u00f3micas',
    y == 83109 ~ 'Aportaciones federales a las entidades federativas y municipios para aportaciones al FOVISSSTE',
    y == 83110 ~ 'Aportaciones federales a las entidades federativas y municipios por previsiones para aportaciones al ISSSTE',
    y == 83111 ~ 'Aportaciones federales a las entidades federativas y municipios por previsiones para aportaciones al FOVISSSTE',
    y == 83112 ~ 'Aportaciones federales a las entidades federativas y municipios para aportaciones al sistema de ahorro para el retiro',
    y == 83113 ~ 'Aportaciones federales a las entidades federativas y municipios para aportaciones al seguro de cesant\u00eda en edad avanzada y vejez',
    y == 83114 ~ 'Aportaciones federales a las entidades federativas y municipios para los dep\u00f3sitos al ahorro solidario',
    y == 83115 ~ 'Aportaciones federales a las entidades federativas y municipios por previsiones para aportaciones al sistema de ahorro para el retiro',
    y == 83116 ~ 'Aportaciones federales a las entidades federativas y municipios por previsiones para aportaciones al seguro de cesant\u00eda en edad avanzada y vejez',
    y == 83117 ~ 'Aportaciones federales a las entidades federativas y municipios por previsiones para los dep\u00f3sitos al ahorro solidario',
    y == 83118 ~ 'Aportaciones de la Federaci\u00f3n a los organismos del Sistema Nacional de Coordinaci\u00f3n Fiscal',
    y == 83501 ~ 'Asignaciones compensatorias a entidades federativas',
    y == 85101 ~ 'Convenios de reasignaci\u00f3n',
    y == 92101 ~ 'Intereses de la deuda interna con instituciones de cr\u00e9dito',
    y == 92102 ~ 'Intereses de la deuda interna derivada de proyectos de infraestructura productiva de largo plazo',
    y == 92201 ~ 'Intereses derivados de la colocaci\u00f3n de valores gubernamentales',
    y == 92401 ~ 'Intereses de la deuda externa con instituciones de cr\u00e9dito',
    y == 92402 ~ 'Intereses de la deuda externa derivada de proyectos de infraestructura productiva de largo plazo',
    y == 92501 ~ 'Intereses de la deuda con organismos financieros internacionales',
    y == 92601 ~ 'Intereses de la deuda bilateral',
    y == 92701 ~ 'Intereses derivados de la colocaci\u00f3n externa de bonos',
    y == 93101 ~ 'Comisiones de la deuda interna',
    y == 93201 ~ 'Comisiones de la deuda externa',
    y == 94101 ~ 'Gastos de la deuda interna',
    y == 94201 ~ 'Gastos de la deuda externa',
    y == 95101 ~ 'Costo por coberturas',
    y == 96201 ~ 'Apoyos a ahorradores y deudores de la banca',
    y == 99101 ~ 'Adeudos de ejercicios fiscales anteriores',
    T ~ NA_character_
  )
}

#' Agrupación del presupuesto
#'
#' Esta función permite agrupar las bases de datos abiertas del presupuesto
#' de Transparencia Presupuestaria con los principales niveles de agregación.
#' De esta manera, podemos generar resumenes presupuestales de acuerdo a su
#' clasificación administrativa, funcional o económica.
#' Por ejemplo, permite generar rápidamente un .xframe con el presupuesto
#' en todas sus categorías disponibles(aprobado, modificado, pagado y
#' ejercido) por ramo.
#' Nota 1: esta función siempre mantiene el periodo indicado y, en caso de no
#' tenerlo, toma el año fiscal como periodo.
#' Nota 2: esta función no distingue los cambios de claves y términos a lo
#' largo del tiempo. Por ejemplo, si un programa cambió de modalidad U a S,
#' e intentamos agrupar el programa con su modalidad y clave presupuestal,
#' la función la va distinguir como un programa diferente. Otro ejemplo es que
#' esta función no distingue  los cambios en el tiempo de la en la
#' clasificación por objeto del gasto. Si una misma categoría tiene una
#' clave o un nombre distinto a lo largo del tiempo y se clasifica el
#' presupuesto por estas categorías, la función lo clasificará como
#' categorías diferentes.
#'
#' @param .x data frame con la estructura de los archivos sobre presupuesto
#' de transparencia Presupuestaria
#' (https://www.transparenciapresupuestaria.gob.mx/es/PTP/Datos_Abiertos).
#' @param ... nombre de las variables por las cuales se quiere colapsar
#' la información. Estos nombre tienen que estar completamente en minúscula
#' sin caracteres especiales y separado por guiones bajos. Por ejemplo,
#' id_ramo, desc_ramo, id_modalidad, desc_modalidad, etc.
#' @param periodo_col agregar columna con el periodo correspondiente
#' @param keep_mensual indicador lógico para determinar si mantener la variables de aprobado
#' y modificado en el periodo (en caso de estar diponible)
#'
#' @importFrom magrittr %>%
#' @return data frame colapsado por las variables indicadas. En caso de no
#' indicarse ninguna variable, sólo se colapsará por año fiscal.
#' @export
sum_pef_tp <- function(.x, ...,
                       periodo_col = NA,
                       keep_mensual = T) {

  .x %>%
    janitor::clean_names() %>%
    {
      if ("id_ramo" %in% names(.))
        dplyr::mutate(.,
                      id_ramo = as.character(id_ramo))
      else
        .
    } %>%
    {
      if (!is.na(periodo_col) &
          !("periodo" %in% names(.)))
        dplyr::mutate(.,
                      periodo = periodo_col)
      else
        .
    } %>%
    {
      if ("ciclo" %in% names(.))
        dplyr::mutate(.,
                      ciclo = as.numeric(ciclo))
      else
        .
    } %>%
    {
      if (!("periodo" %in% names(.)) &
          ("ciclo" %in% names(.)))
        dplyr::mutate(.,
                      periodo = as.numeric(ciclo))
      else
        .
    } %>%
    {
      if (!("periodo" %in% names(.)) &
          !("ciclo" %in% names(.)))
        dplyr::mutate(.,
                      periodo = NA)
      else
        .
    } %>%
    {if (("id_capitulo" %in% names(.)))
        dplyr::mutate(.,
                      id_capitulo = as.numeric(substr(id_capitulo, 0, 1)) *
                        1000)
      else . } %>%
    {
      if (!("id_capitulo" %in% names(.)) &
          ("id_objeto_del_gasto" %in% names(.)))
        dplyr::mutate(.,
                      id_capitulo = as.numeric(substr(id_objeto_del_gasto, 0, 1)) *
                        1000)
      else . } %>%
    {
      if (("id_concepto" %in% names(.)) )
        dplyr::mutate(.,
                      id_concepto = as.numeric(substr(id_concepto, 0, 2)) *
                        100)
      else . } %>%
    {
      if (!("id_concepto" %in% names(.)) &
          ("id_objeto_del_gasto" %in% names(.)))
        dplyr::mutate(.,
                      id_concepto = as.numeric(substr(id_objeto_del_gasto, 0, 2)) *
                        100)
      else . } %>%
    {
      if (("id_partida_generica" %in% names(.)))
        dplyr::mutate(.,
                      id_partida_generica = as.numeric(substr(id_partida_generica, 0, 3)) *
                        10)
      else
        .
    } %>%
    {
      if (!("id_partida_generica" %in% names(.)) &
          ("id_objeto_del_gasto" %in% names(.)))
        dplyr::mutate(.,
                      id_partida_generica = as.numeric(substr(id_objeto_del_gasto, 0, 3)) *
                        10)
      else
        .
    } %>%
    {
      if (("id_objeto_del_gasto" %in% names(.)))
        dplyr::mutate(.,
                      id_objeto_del_gasto = as.numeric(id_objeto_del_gasto))
      else
        .
    } %>%
    {
      if (!("id_objeto_del_gasto" %in% names(.)) &
          ("id_partida_especifica" %in% names(.)))
        dplyr::mutate(.,
                      id_objeto_del_gasto = as.numeric(id_partida_especifica))
      else
        .
    } %>%
    {
      if (!("desc_objeto_del_gasto" %in% names(.)) &
          ("desc_partida_especifica" %in% names(.)))
        dplyr::mutate(.,
                      desc_objeto_del_gasto = desc_partida_especifica)
      else
        .
    } %>%
    {
      if ("id_ur" %in% names(.))
        dplyr::mutate(., id_ur = as.character(id_ur))
      else
        .
    } %>%
    {
      if (!("tipo_programable" %in% names(.)) &
          ("id_ramo" %in% names(.) &
           "id_capitulo" %in% names(.))) {
        dplyr::mutate(
          .,
          tipo_programable = dplyr::case_when(
            id_ramo %in% c(24, 28, 30, 34) ~ "No programable",
            id_ramo %in% c(52, 53) &
              id_capitulo == 9000 ~ "No programable",
            T ~ "Programable"
          )
        )
      } else
        .
    } %>%
    dplyr::group_by(..., periodo) %>%
    {
      if (keep_mensual)
        .
      else
        dplyr::select(.,
                      -dplyr::contains("mensual"))
    } %>%
    {
      if ("monto_aprobado_mensual" %in% names(.)) {
        dplyr::rename(.,
               monto_aprob_mes = monto_aprobado_mensual)
      } else
        .
    } %>%
    {
      if ("monto_modificado_mensual" %in% names(.)) {
        dplyr::rename(.,
               monto_modif_mes = monto_modificado_mensual)
      } else
        .
    } %>%
    dplyr::rename(
      proyecto = dplyr::contains(c("proyec")),
      aprobado = dplyr::contains(c("aprobado")),
      aprobado = dplyr::contains(c("monto_pef")),
      aprobado = dplyr::matches(c("^importe$")),
      modificado = dplyr::contains("modificado"),
      pagado = dplyr::contains("pagado"),
      ejercido = dplyr::contains(c("ejercido", "ejercicio"))
    ) %>%
    dplyr::summarise_if(is.numeric, sum, na.rm = T) %>%
    dplyr::select(..., periodo, dplyr::contains(
      c(
        "proyecto",
        "aprobado",
        "modificado",
        "pagado",
        "ejercido",
        "monto_aprob_mes",
        "monto_modif_mes"
      )
    )) %>%
    dplyr::ungroup()

}



#' Agrupar lista de data frames de presupuesto en formato long
#'
#' Esta función retoma la una función sum_pef (por lo cual le aplican las
#' mismas reglas) y la aplica a una lista de presupuesto. Esto ayuda cuando
#' se quiere generar datos históricos del presupuesto en formato long, los
#' cuales normalmente están en diferentes archivos.
#' Lo ideal es cargar todos los .xframes de presupuesto en una lista de
#' .xframes y seleccionar las variables por las que se quiere acumular la
#' información.
#' Por ejemplo. Si colocamos un vector de las cuentas públicas de cada año
#' fiscal sin señalar ninguna variable, esta función regresará el total
#' del presupuesto (sin neteo) de todos los ciclos fiscales incluídos.
#' Nota 1: si se acumulan dos .xframes del mismo año fiscal y no de le
#' distingue con una variable periodo, esta función sólo señalará el ciclo
#' fiscal sin distinguir si son de trimestress diferentes.
#' Nota 2: esta función no distingue los cambios de claves y términos a lo
#' largo del tiempo. Por ejemplo, si un programa cambió de modalidad U a S,
#' e intentamos agrupar el programa con su modalidad y clave presupuestal,
#' la función la va distinguir como un programa diferente. Otro ejemplo es que
#' esta función no distingue  los cambios en el tiempo de la en la
#' clasificación por objeto del gasto. Si una misma categoría tiene una
#' clave o un nombre distinto a lo largo del tiempo y se clasifica el
#' presupuesto por estas categorías, la función lo clasificará como
#' categorías diferentes.
#'
#' @param lista_df lista de .xframes con la estructura de los datos abiertos
#' de presupuesto de Transparencia Presupuestaria.
#' @param ... nombre de las variables por las cuales se quiere colapsar
#' la información. Estos nombre tienen que estar completamente en minúscula
#' sin caracteres especiales y separado por guiones bajos. Por ejemplo,
#' id_ramo, desc_ramo, id_modalidad, desc_modalidad, etc.
#'
#' @return .xframe colapsado por las variables indicadas. En caso de no
#' indicarse ninguna variable, sólo se colapsará por año fiscal.
#' @export
bind_pef_tp <- function(lista_df, ...) {

  purrr::map_dfr(lista_df, sum_pef_tp, ...)

}


#' Agrupar lista de .xframes de presupuesto en formato wide
#'
#' Esta función retoma la una función sum_pef_tp (por lo cual le aplican las
#' mismas reglas) y la aplica a una lista de presupuesto. Esto ayuda cuando
#' se quiere generar datos históricos del presupuesto en formato wide, los
#' cuales normalmente están en diferentes archivos.
#' Lo ideal es cargar todos los .xframes de presupuesto en una lista de
#' .xframes y seleccionar las variables por las que se quiere acumular la
#' información.
#' Por ejemplo. Si colocamos un vector de las cuentas públicas de cada año
#' fiscal sin señalar ninguna variable, esta función regresará el total
#' del presupuesto (sin neteo) de todos los ciclos fiscales incluídos.
#' Nota 1: si se acumulan dos .xframes del mismo año fiscal y no de le
#' distingue con una variable periodo, esta función sólo señalará el ciclo
#' fiscal sin distinguir si son de trimestress diferentes.
#' Nota 2: esta función no distingue los cambios de claves y términos a lo
#' largo del tiempo. Por ejemplo, si un programa cambió de modalidad U a S,
#' e intentamos agrupar el programa con su modalidad y clave presupuestal,
#' la función la va distinguir como un programa diferente. Otro ejemplo es que
#' esta función no distingue  los cambios en el tiempo de la en la
#' clasificación por objeto del gasto. Si una misma categoría tiene una
#' clave o un nombre distinto a lo largo del tiempo y se clasifica el
#' presupuesto por estas categorías, la función lo clasificará como
#' categorías diferentes.
#'
#' @param lista_df lista de .xframes con la estructura de los datos abiertos
#' de presupuesto de Transparencia Presupuestaria.
#' @param ... nombre de las variables por las cuales se quiere colapsar
#' la información. Estos nombre tienen que estar completamente en minúscula
#' sin caracteres especiales y separado por guiones bajos. Por ejemplo,
#' id_ramo, desc_ramo, id_modalidad, desc_modalidad, etc.
#'
#' @importFrom magrittr %>%
#' @return .xframe colapsado por las variables indicadas. En caso de no
#' indicarse ninguna variable, sólo se colapsará por año fiscal.
#' @export
bind_pef_tp_wide <- function(lista_df, ...) {
  purrr::map_dfr(lista_df, sum_pef_tp, ...) %>%
    tidyr::pivot_wider(
      names_from = periodo,
      values_from = dplyr::contains(
        c("proyecto", 
          "aprobado",
          "modificado",
          "pagado",
          "ejercido",
          "monto_aprob_mes",
          "monto_modif_mes"
        )
      ),
      names_glue = "{.value}_{periodo}"
    ) %>%
    janitor::clean_names() %>%
    # dplyr::rename(aprobado = dplyr::contains("aprobado")) %>%
    # dplyr::rename(aprobado = dplyr::contains("aprobado1")) %>%
    # dplyr::select(-dplyr::num_range("aprobado", 2:100)) %>%
    dplyr::select(function(x)
      any(!is.na(x)))
}


#' Netear
#'
#' Esta función pretende clasificar categoría del presupuesto que deben ser
#' neteadas en caso de realizarse un análisis del presupuesto neto. Esta
#' clasificación la realiza sobre archivos presupuestales con la estructura
#' de los datos de presupuesto abierto de Transparencia Presupuestaria.
#' Ojo: esta función aún está en desarrollo y, hasta ahora, el neteo sólo
#' es correcto aplicado al presupuesto aprobado.
#'
#' @param .x .xframe con la estructura de los datos abiertos de
#' presupuesto de Transparencia Presupuestaria.
#' @param ... modificación y creación de variables equivalente a dplyr::mutate
#' @param keep_mensual indicador lógico para determinar si mantener la variables de aprobado
#' y modificado en el periodo (en caso de estar diponible)
#'
#' @importFrom magrittr %>%
#' @return .xframe cuya descripción de ramo indica los casos en que esa
#' categoría del gasto debe ser neteada.
#' @export
netear_tp <- function(.x, ..., keep_mensual = T) {
  .x <- .x %>%
    janitor::clean_names() %>%
    {
      if (keep_mensual)
        .
      else
        dplyr::select(.,
                      -dplyr::contains("mensual"))
    } %>%
    {
      if ("monto_aprobado_mensual" %in% names(.)) {
        dplyr::rename(.,
                      monto_aprob_mes = monto_aprobado_mensual)
      } else
        .
    } %>%
    {
      if ("monto_modificado_mensual" %in% names(.)) {
        dplyr::rename(.,
                      monto_modif_mes = monto_modificado_mensual)
      } else
        .
    } %>%
    dplyr::rename(
      proyecto = dplyr::contains(c("proyec")),
      aprobado = dplyr::contains(c("aprobado")),
      modificado = dplyr::contains("modificado"),
      pagado = dplyr::contains("pagado"),
      ejercido = dplyr::contains(c("ejercido", "ejercicio"))
    )

  .x %>%
    {
      if ("id_objeto_del_gasto" %in% names(.)) {
        dplyr::mutate(
          .,
          id_capitulo = as.numeric(substr(id_objeto_del_gasto, 0, 1)) *
            1000,
          id_concepto = as.numeric(substr(id_objeto_del_gasto, 1, 2)) *
            100,
          id_partida_generica = as.numeric(substr(id_objeto_del_gasto, 1, 3)),
          id_partida_especifica = id_objeto_del_gasto,
          desc_partida_especifica = desc_objeto_del_gasto
        )
      } else
        .
    } %>%
    dplyr::bind_rows(.x %>%
                       {
                         if ("id_objeto_del_gasto" %in% names(.)) {
                           dplyr::mutate(
                             .,
                             id_capitulo = as.numeric(substr(id_objeto_del_gasto, 0, 1)) *
                               1000,
                             id_concepto = as.numeric(substr(id_objeto_del_gasto, 1, 2)) *
                               100,
                             id_partida_generica = as.numeric(substr(id_objeto_del_gasto,
                                                                     1, 3)),
                             id_partida_especifica = id_objeto_del_gasto,
                             desc_partida_especifica = desc_objeto_del_gasto
                           )
                         } else
                           .
                       } %>%
                       dplyr::mutate(
                         desc_ramo = dplyr::case_when(
                           id_partida_especifica %in% c(14101, 14105,
                                                        16104, 16107,
                                                        83102, 83110,
                                                        83113, 83116) &
                             id_ramo != 51 ~ "Neteo",
                           id_capitulo == 4000 &
                             id_ramo == 19 &
                             (
                               id_ur %in% c("GYR", "GYN") |
                                 desc_ur %in% c(
                                   "Instituto de Seguridad y Servicios Sociales de los Trabajadores del Estado",
                                   "Instituto Mexicano del Seguro Social"
                                 )
                             ) ~ "Neteo",
                           id_ramo == 23 &
                             id_modalidad == "U" &
                             id_pp == 129 ~ "Neteo",
                           # id_concepto %in% c(4700)  ~ "Neteo",

                           T ~ desc_ramo
                         ),
                         ...
                       ) %>%
                       dplyr::filter(desc_ramo == "Neteo"))
}



#' Presupuesto para neteo en negativo
#'
#' Esta función convierte aquellas categorías del presupuesto que tienen
#' "Neteo" como descripción del ramo en valores negativos. Normalmente se
#' debería usar después de la función de netear_tp.
#'
#' @param .x .xframe con la estructura de los datos abiertos de
#' presupuesto de Transparencia Presupuestaria.
#'
#' @importFrom magrittr %>%
#' @return .xframe cuyas categorías del gasto con descripción del ramo
#' como "Neteo" están en valores negativos.
#' @export
negative_neteo_tp <- function(.x) {
  .x %>%
    {
      if ("aprobado" %in% names(.)) {
        dplyr::mutate(.,
               aprobado = ifelse(stringr::str_detect(desc_ramo, "Neteo"),
                                 -aprobado,
                                 aprobado))
      } else
        .
    } %>%
    {
      if ("modificado" %in% names(.)) {
        dplyr::mutate(.,
               modificado = ifelse(stringr::str_detect(desc_ramo, "Neteo"),
                                   -modificado,
                                   modificado))
      } else
        .
    } %>%
    {
      if ("pagado" %in% names(.)) {
        dplyr::mutate(.,
               pagado = ifelse(stringr::str_detect(desc_ramo, "Neteo"),
                               -pagado,
                               pagado))
      } else
        .
    } %>%
    {
      if ("ejercido" %in% names(.)) {
        dplyr::mutate(.,
               ejercido = ifelse(stringr::str_detect(desc_ramo, "Neteo"),
                                 -ejercido,
                                 ejercido))
      } else
        .
    } %>%
    {
      if ("proyecto" %in% names(.)) {
        dplyr::mutate(.,
                      proyecto = ifelse(stringr::str_detect(desc_ramo, "Neteo"),
                                        -proyecto,
                                        proyecto))
      } else
        .
    } %>%
    {
      if ("monto_aprob_mes" %in% names(.)) {
        dplyr::mutate(.,
               monto_aprob_mes = ifelse(
                 stringr::str_detect(desc_ramo, "Neteo"),
                 -monto_aprob_mes,
                 monto_aprob_mes
               ))
      } else
        .
    } %>%
    {
      if ("monto_aprobado_mensual" %in% names(.)) {
        dplyr::mutate(
          .,
          monto_aprobado_mensual = ifelse(
            stringr::str_detect(desc_ramo, "Neteo"),
            -monto_aprobado_mensual,
            monto_aprobado_mensual
          )
        )
      } else
        .
    }  %>%
    {
      if ("monto_modif_mes" %in% names(.)) {
        dplyr::mutate(.,
               monto_modif_mes = ifelse(
                 stringr::str_detect(desc_ramo, "Neteo"),
                 -monto_modif_mes,
                 monto_modif_mes
               ))
      } else
        .
    } %>%
    {
      if ("monto_modificado_mensual" %in% names(.)) {
        dplyr::mutate(
          .,
          monto_modificado_mensual = ifelse(
            stringr::str_detect(desc_ramo, "Neteo"),
            -monto_modificado_mensual,
            monto_modificado_mensual
          )
        )
      } else
        .
    }

}

#' Convertir clave del ramo a la clasificación administrativa de los ramos
#'
#' Nota 1: esta clasificación a la última actualización del año fiscal.
#' Por ejemplo, en esta clasificación ya se considera al ramo 49 (FGR)
#' como parte de los ramos autónomos.
#'
#' @param id_ramo clave númerica del ramo
#'
#' @return character con la clasificación administrativa del ramo
#' @export
id_ramo_to_tipo_ramo <- function(id_ramo) {

  y <- as.character(id_ramo)

  dplyr::case_when(
    y %in% c("1", "3", "22", "35",
                   "41", "42", "43", "49", # TODO: cechar los casos en que el año hace variar la calsificacin.
                   "44", "40", "32") ~ "Ramos aut\u00f3nomos",
    y %in% c("2", "4", "5", "6",
                   "7", "8", "9", "10",
                   "11", "12", "13", "14",
                   "15", "16", "17", "18",
                   "20", "21", "27", "31",
                   "36", "37", "38", "45",
                   "46", "47", "48") ~ "Ramos administrativos",
    y %in% c("19", "23", "25", "33",
                   "24", "28", "29", "30", "34") ~ "Ramos generales",
    y %in% c("50", "51",
             "GYN", "GYR") ~ "Entidades sujetas a control presupuestario directo",
    y %in% c("52", "53",
             "TZZ", "TOQ") ~ "Empresas productivas del estado",
    T ~ NA_character_
  )
}

#' Convertir clave del ramo a descripción del ramo
#'
#' Nota 1: esta clasificación a la última actualización del año fiscal.
#' Por ejemplo, en esta clasificación ya se considera al ramo 49 (FGR)
#' como Fiscalía y no Procuraduría.
#'
#' @param id_ramo clave númerica del ramo
#'
#' @return character con la clasificación administrativa del ramo
#' @export
id_ramo_to_desc_ramo <- function(id_ramo) {

  y <- as.character(id_ramo)

  dplyr::case_when(
    y == "1" ~  "Poder Legislativo",
    y == "2" ~  "Oficina de la Presidencia de la Rep\u00fablica",
    y == "3" ~  "Poder Judicial",
    y == "4" ~  "Gobernaci\u00f3n",
    y == "5" ~  "Relaciones Exteriores",
    y == "6" ~  "Hacienda y Cr\u00e9dito P\u00fablico",
    y == "7" ~  "Defensa Nacional",
    y == "8" ~  "Agricultura y Desarrollo Rural",
    y == "9" ~  "Comunicaciones y Transportes",
    y == "10" ~	"Econom\u00eda",
    y == "11" ~	"Educaci\u00f3n P\u00fablica",
    y == "12" ~	"Salud",
    y == "13" ~	"Marina",
    y == "14" ~	"Trabajo y Previsi\u00f3n Social",
    y == "15" ~	"Desarrollo Agrario, Territorial y Urbano",
    y == "16" ~	"Medio Ambiente y Recursos Naturales",
    y == "17" ~	"Procuradur\u00eda General de la Rep\u00fablica",
    y == "18" ~	"Energ\u00eda",
    y == "19" ~	"Aportaciones a Seguridad Social",
    y == "20" ~	"Bienestar",
    y == "21" ~	"Turismo",
    y == "22" ~	"Instituto Nacional Electoral",
    y == "23" ~	"Provisiones Salariales y Econ\u00f3micas",
    y == "24" ~	"Deuda P\u00fablica",
    y == "25" ~	"Previsiones y Aportaciones para los Sistemas de Educaci\u00f3n B\u00e1sica, Normal, Tecnol\u00f3gica y de Adultos",
    y == "27" ~	"Funci\u00f3n P\u00fablica",
    y == "28" ~	"Participaciones a Entidades Federativas y Municipios",
    y == "30" ~	"Adeudos de Ejercicios Fiscales Anteriores",
    y == "31" ~	"Tribunales Agrarios",
    y == "32" ~	"Tribunal Federal de Justicia Administrativa",
    y == "33" ~	"Aportaciones Federales para Entidades Federativas y Municipios",
    y == "34" ~	"Erogaciones para los Programas de Apoyo a Ahorradores y Deudores de la Banca",
    y == "35" ~	"Comisi\u00f3n Nacional de los Derechos Humanos",
    y == "36" ~	"Seguridad y Protecci\u00f3n Ciudadana",
    y == "37" ~	"Consejer\u00eda Jur\u00eddica del Ejecutivo Federal",
    y == "38" ~	"Consejo Nacional de Ciencia y Tecnolog\u00eda",
    y == "40" ~	"Informaci\u00f3n Nacional Estad\u00edstica y Geogr\u00e1fica",
    y == "41" ~	"Comisi\u00f3n Federal de Competencia Econ\u00f3mica",
    y == "42" ~	"Instituto Nacional para la Evaluaci\u00f3n de la Educaci\u00f3n",
    y == "43" ~	"Instituto Federal de Telecomunicaciones",
    y == "44" ~	"Instituto Nacional de Transparencia, Acceso a la Informaci\u00f3n y Protecci\u00f3n de Datos Personales",
    y == "45" ~	"Comisi\u00f3n Reguladora de Energ\u00eda",
    y == "46" ~	"Comisi\u00f3n Nacional de Hidrocarburos",
    y == "47" ~	"Entidades no Sectorizadas",
    y == "48" ~	"Cultura",
    y == "49" ~	"Fiscal\u00eda General de la Rep\u00fablica",
    y == "50" ~	"Instituto Mexicano del Seguro Social",
    y == "GYR" ~	"Instituto Mexicano del Seguro Social",
    y == "51" ~	"Instituto de Seguridad y Servicios Sociales de los Trabajadores del Estado",
    y == "GYN" ~	"Instituto de Seguridad y Servicios Sociales de los Trabajadores del Estado",
    y == "52" ~	"Petr\u00f3leos Mexicanos",
    y == "TZZ" ~	"Petr\u00f3leos Mexicanos",
    y == "53" ~	"Comisi\u00f3n Federal de Electricidad",
    y == "TOQ" ~	"Comisi\u00f3n Federal de Electricidad",
    T ~ NA_character_
  )
}


#' Convertir clave del ramo a abreviatura del ramo
#'
#' Nota 1: esta clasificación a la última actualización del año fiscal.
#' Por ejemplo, en esta clasificación ya se considera al ramo 49 (FGR)
#' como Fiscalía y no Procuraduría.
#'
#' @param id_ramo clave númerica del ramo
#'
#' @return character con la clasificación administrativa del ramo
#' @export
id_ramo_to_abr_ramo <- function(id_ramo) {

  y <- as.character(id_ramo)

  dplyr::case_when(
    y == "1"	~ "P. Legislativo",
    y == "2"	~ "OPR",
    y == "3"	~ "P. Judicial",
    y == "4"	~ "Segob",
    y == "5"	~ "SRE",
    y == "6"	~ "SHCP",
    y == "7"	~ "Sedena",
    y == "8"	~ "Sader",
    y == "9"	~ "SICT",
    y == "10"	~ "SE",
    y == "11"	~ "SEP",
    y == "12"	~ "SSA",
    y == "13"	~ "Semar",
    y == "14"	~ "STPS",
    y == "15"	~ "Sedatu",
    y == "16"	~ "Semarnat",
    y == "17"	~ "PGR",
    y == "18"	~ "Sener",
    y == "19"	~ "Aport. a la SS.",
    y == "20"	~ "Bienestar",
    y == "21"	~ "Sectur",
    y == "22"	~ "INE",
    y == "23"	~ "Prov. Salariales y Econ.",
    y == "24"	~ "Deuda P\u00fablica",
    y == "25"	~ "Prev. y Aport. a la Educ.",
    y == "27"	~ "SFP",
    y == "28"	~ "Participaciones Fed. para Ent. y Mun.",
    y == "30"	~ "Adefas",
    y == "31"	~ "Trib. Agra.",
    y == "32"	~ "TFJA",
    y == "33"	~ "Aportaciones Fed. para Ent. y Mun.",
    y == "34"	~ "Erog. para Prog. de Apoyo a Ahorradores y Deudores de la Banca",
    y == "35"	~ "CNDH",
    y == "36"	~ "SSPC",
    y == "37"	~ "CJEF",
    y == "38"	~ "Conacyt",
    y == "40"	~ "INEGI",
    y == "41"	~ "Cofece",
    y == "42"	~ "INEE",
    y == "43"	~ "IFT",
    y == "44"	~ "INAI",
    y == "45"	~ "CRE",
    y == "46"	~ "CNH",
    y == "47"	~ "Ent. no sect.",
    y == "48"	~ "Cultura",
    y == "49"	~ "FGR",
    y == "50"	~ "IMSS",
    y == "GYR" ~ "IMSS",
    y == "51"	~ "ISSSTE",
    y == "GYN" ~ "ISSSTE",
    y == "52"	~ "Pemex",
    y == "TZZ" ~ "Pemex",
    y == "53"	~ "CFE",
    y == "TOQ" ~	"CFE",
    T ~ NA_character_
  )
}


#' Convertir nombre del ramo a abreviatura del ramo
#'
#' @param desc_ramo string con el nombre del ramo
#'
#' @return un string con la abreviatura del ramo
#' @export
desc_ramo_to_abr_ramo <- function(desc_ramo) {
  y <- stringi::stri_trans_general(desc_ramo,"Latin-ASCII")
  y <- stringi::stri_replace_all(y, regex = "[:punct:]", "")
  y <- stringr::str_to_upper(y)
  y <- stringi::stri_replace_all(y, regex = "SECRETARIA |SECRETARIA", "")

  dplyr::case_when(
    stringr::str_detect(y, "LEGISLATIVO|CONGRESO") ~ "P. Legislativo",
    stringr::str_detect(y, "PRESIDENCIA") ~ "OPR",
    stringr::str_detect(y, "JUDICIAL") ~ "P. Judicial",
    stringr::str_detect(y, "GOBERNACION") ~ "Segob",
    stringr::str_detect(y, "EXTERIORES") ~ "SRE",
    stringr::str_detect(y, "HACIENDA") ~ "SHCP",
    stringr::str_detect(y, "DEFENSA") ~ "Sedena",
    stringr::str_detect(y, "AGRICULTURA Y DESARROLLO RURAL") ~ "Sader",
    stringr::str_detect(y, "COMUNICACIONES Y TRANSPORTES") ~ "SICT",
    stringr::str_detect(y, "ECONOMIA") ~ "SE",
    stringr::str_detect(y, "EDUCACION PUBLICA") ~ "SEP",
    stringr::str_detect(y, "SALUD") ~ "SSA",
    stringr::str_detect(y, "MARINA") ~ "Semar",
    stringr::str_detect(y, "TRABAJO Y PREVISION SOCIAL") ~ "STPS",
    stringr::str_detect(y, "DESARROLLO AGRARIO TERRITORIAL Y URBANO") ~ "Sedatu",
    stringr::str_detect(y, "MEDIO AMBIENTE Y RECURSOS NATURALES") ~ "Semarnat",
    y == "ENERGIA" ~ "Sener", #PONER DESPU\u00e9S DE
    stringr::str_detect(y, "APORTACIONES A SEGURIDAD SOCIAL") ~ "Aport. a la SS.",
    stringr::str_detect(y, "BIENESTAR") ~ "Bienestar",
    stringr::str_detect(y, "TURISMO") ~ "Sectur",
    stringr::str_detect(y, "ELECTORAL") &
      stringr::str_detect(y, "NACIONAL") ~ "INE",
    stringr::str_detect(y, "ELECTORAL") &
      stringr::str_detect(y, "FEDERAL") ~ "IFE",
    stringr::str_detect(y, "PROVISIONES") &
      stringr::str_detect(y, "SALARIAL") ~ "Prov. Salariales y Econ.",
    stringr::str_detect(y, "DEUDA") &
      stringr::str_detect(y, "PUBLICA") ~ "Deuda P\u00fablica",
    stringr::str_detect(y, "PREVISIONES") &
      stringr::str_detect(y, "APORTACIONES") &
      stringr::str_detect(y, "EDUCA") ~ "Prev. y Aport. a la Educ.",
    stringr::str_detect(y, "FUNCION") &
      stringr::str_detect(y, "PUB") ~ "SFP",
    stringr::str_detect(y, "PARTICIPACIONES") &
      stringr::str_detect(y, "ENTIDA|ESTADO") ~ "Participaciones Fed. para Ent. y Mun.",
    stringr::str_detect(y, "ADEUDOS") &
      stringr::str_detect(y, "ANTERIOR") ~ "Adefas",
    stringr::str_detect(y, "TRIBUNALES") &
      stringr::str_detect(y, "AGRARIOS") ~ "Trib. Agra.",
    stringr::str_detect(y, "TRIBUNAL") &
      stringr::str_detect(y, "ADMINISTRATIV") ~ "TFJA",
    stringr::str_detect(y, "APORTACIONES") &
      stringr::str_detect(y, "ENTIDA|ESTADO") ~ "Aportaciones Fed. para Ent. y Mun.",
    stringr::str_detect(y, "EROGACION") &
      stringr::str_detect(y, "AHORRA|DEUDO") &
      stringr::str_detect(y, "BANCA") ~ "Erog. para Prog. de Apoyo a Ahorradores y Deudores de la Banca",
    stringr::str_detect(y, "DERECHOS HUMANOS") ~ "CNDH",
    stringr::str_detect(y, "SEGURIDAD") &
      stringr::str_detect(y, "PUBLICA") ~ "SSP",
    stringr::str_detect(y, "SEGURIDAD") &
      stringr::str_detect(y, "CIUDADANA") ~ "SSPC",
    stringr::str_detect(y, "CONSEJERIA") &
      stringr::str_detect(y, "JURIDICA") ~ "CJEF",
    stringr::str_detect(y, "CIENCIA") &
      stringr::str_detect(y, "TECNOLOGIA") ~ "Conacyt",
    stringr::str_detect(y, "ESTADISTICA") &
      stringr::str_detect(y, "GEOGRAFIC") ~ "INEGI",
    stringr::str_detect(y, "COMPETENCIA") &
      stringr::str_detect(y, "ECONOM") ~ "Cofece",
    stringr::str_detect(y, "TELECOMUNICACIONES") ~ "IFT",
    stringr::str_detect(y, "FEDERAL") &
      stringr::str_detect(y, "INFORMACION")~ "IFAI",
    stringr::str_detect(y, "NACIONAL") &
      stringr::str_detect(y, "INFORMACION")~ "INAI",
    stringr::str_detect(y, "TRANSPARENCIA") ~ "INAI",
    stringr::str_detect(y, "REGULADORA") &
      stringr::str_detect(y, "ENERGIA") ~ "CRE",
    stringr::str_detect(y, "HIDROCARBUROS") &
      stringr::str_detect(y, "NACIONAL") ~ "CNH",
    stringr::str_detect(y, "NO SECTOR") ~ "Ent. no sect.",
    stringr::str_detect(y, "CULTURA") ~ "Cultura",
    stringr::str_detect(y, "FISCALIA") ~ "FGR",
    stringr::str_detect(y, "PROCURADURIA") ~ "PGR",
    stringr::str_detect(y, "INSTITUTO") &
      stringr::str_detect(y, "SEGURO SOCIAL") ~ "IMSS",
    stringr::str_detect(y, "SEGURIDAD") &
      stringr::str_detect(y, "TRABAJADORES") &
      stringr::str_detect(y, "ESTADO") ~ "ISSSTE",
    stringr::str_detect(y, "PETROLEOS") &
      stringr::str_detect(y, "MEXICANOS") ~ "Pemex",
    stringr::str_detect(y, "ELECTRICIDAD") ~ "CFE",
    T ~ NA_character_
  )
}


#' Generar colúmna con clasificación de programable
#'
#' @param .x base de datos de presupuesto
#'
#' @return una base de datos de presupuesto con clasificación del gasto
#' programable y no programable
#' @export
gen_tipo_programable <- function(.x) {
  dplyr::mutate(.x,
    tipo_programable = dplyr::case_when(
      id_ramo %in% c(24, 28, 30, 34) ~ "No programable",
      id_ramo %in% c(52, 53) &
        id_capitulo == 9000 ~ "No programable",
      T ~ "Programable"
    )
  )
}


#' Generar clasificación económica
#'
#' @param .x base de datos de presupuesto
#' @param name nombre de la columna con la clasificación económica
#'
#' @importFrom rlang :=
#' @importFrom rlang !!
#' @return una base de datos de presupuesto con clasificación económica
#' @export
gen_clas_eco <- function (.x,
                          name = clasif_eco) {

  name_new_col <- rlang::enquo(name)

    .x %>% janitor::clean_names() %>% {
      if ("id_ramo" %in% names(.))
        dplyr::mutate(., id_ramo = as.character(id_ramo))
      else .
    } %>% {
      if ("ciclo" %in% names(.))
        dplyr::mutate(., ciclo = as.numeric(ciclo))
      else .
    } %>% {
      if (!("periodo" %in% names(.)) & ("ciclo" %in% names(.)))
        dplyr::mutate(., periodo = as.numeric(ciclo))
      else .
    } %>% {
      if (!("periodo" %in% names(.)) & !("ciclo" %in% names(.)))
        dplyr::mutate(., periodo = NA)
      else .
    } %>% {
      if (("id_capitulo" %in% names(.)))
        dplyr::mutate(., id_capitulo = as.numeric(substr(id_capitulo,
                                                         0, 1)) * 1000)
      else .
    } %>% {
      if (!("id_capitulo" %in% names(.)) & ("id_objeto_del_gasto" %in%
                                            names(.)))
        dplyr::mutate(., id_capitulo = as.numeric(substr(id_objeto_del_gasto,
                                                         0, 1)) * 1000)
      else .
    } %>% {
      if (("id_concepto" %in% names(.)))
        dplyr::mutate(., id_concepto = as.numeric(substr(id_concepto,
                                                         0, 2)) * 100)
      else .
    } %>% {
      if (!("id_concepto" %in% names(.)) & ("id_objeto_del_gasto" %in%
                                            names(.)))
        dplyr::mutate(., id_concepto = as.numeric(substr(id_objeto_del_gasto,
                                                         0, 2)) * 100)
      else .
    } %>% {
      if (("id_partida_generica" %in% names(.)))
        dplyr::mutate(., id_partida_generica = as.numeric(substr(id_partida_generica,
                                                                 0, 3)) * 10)
      else .
    } %>% {
      if (!("id_partida_generica" %in% names(.)) & ("id_objeto_del_gasto" %in%
                                                    names(.)))
        dplyr::mutate(., id_partida_generica = as.numeric(substr(id_objeto_del_gasto,
                                                                 0, 3)) * 10)
      else .
    } %>% {
      if (("id_objeto_del_gasto" %in% names(.)))
        dplyr::mutate(., id_objeto_del_gasto = as.numeric(id_objeto_del_gasto))
      else .
    } %>% { ## Cortar
      if (!("id_objeto_del_gasto" %in% names(.)) & ("id_partida_especifica" %in%
                                                    names(.)))
        dplyr::mutate(., id_objeto_del_gasto = as.numeric(id_partida_especifica))
      else .
    } %>% {
      if (!("desc_objeto_del_gasto" %in% names(.)) & ("desc_partida_especifica" %in%
                                                      names(.)))
        dplyr::mutate(., desc_objeto_del_gasto = desc_partida_especifica)
      else .
    } %>% {
      if ("id_ur" %in% names(.))
        dplyr::mutate(., id_ur = as.character(id_ur))
      else .
    } %>% {
      # if (!("clasif_eco" %in% names(.)) & ("id_ramo" %in% names(.) & "id_capitulo" %in% names(.))) {

      dplyr::mutate(

        ., !!name_new_col := dplyr::case_when(
          # GASTO CORRIENTE
          # Subsidios
          (id_tipogasto == 0 | id_tipogasto == 1 | id_tipogasto == 7) & stringr::str_starts(id_objeto_del_gasto, "43") ~ "Gasto corriente",
          # Servicios personales
          (id_tipogasto == 0 | id_tipogasto == 1 | id_tipogasto == 7) & stringr::str_starts(id_objeto_del_gasto, "1|83101|83102|83106|83107|83108|83109|83110|83111|83112|83113|83114|83115|83116|83117") ~ "Gasto corriente",
          # Gastos de operaci\u00f3n
          (id_tipogasto == 0 | id_tipogasto == 1 | id_tipogasto == 7) & stringr::str_starts(id_objeto_del_gasto, "2|3") & !stringr::str_starts(id_objeto_del_gasto, "391|394|395|396|397|26106|32902|39908|39910") ~ "Gasto corriente",
          # Otros de corriente
          (id_tipogasto == 0 | id_tipogasto == 1 | id_tipogasto == 7) &
            (
              (id_capitulo == "4000" & id_concepto != "4300" & id_concepto != "4500"& id_concepto != "4700") | # !str_starts(id_objeto_del_gasto, "43|45|47")) |
                stringr::str_starts(id_objeto_del_gasto, "79|85|391|394|395|396|397|834|26106|32902|39908|39910|83103|83105|83118") |
                (stringr::str_starts(id_objeto_del_gasto, "471") & (id_ramo == 19 & (id_ur == "GYR" | id_ur == "GYN")))
            ) ~ "Gasto corriente",

          # PENSIONES Y JUBILACIONES
          stringr::str_starts(id_objeto_del_gasto, "45") | (stringr::str_starts(id_objeto_del_gasto, "471") & (id_ramo == 19 & (id_ur != "GYR" & id_ur != "GYN"))) ~ "Pensiones y jubilaciones",

          # GASTOS DE INVERSI\u00f3N
          # Inversi\u00f3n f\u00edsica
          (id_tipogasto == 2| id_tipogasto == 3 | id_tipogasto == 9) & stringr::str_starts(id_objeto_del_gasto, "1|2|5|6|3|4|79|85|831|834") & !stringr::str_starts(id_objeto_del_gasto, "39909|43") ~ "Gastos de inversi\u00f3n",
          # Subsidios
          (id_tipogasto == 2| id_tipogasto == 3 | id_tipogasto == 9) & stringr::str_starts(id_objeto_del_gasto, "43") ~ "Gastos de inversi\u00f3n",
          # Otros de inversi\u00f3n
          (id_tipogasto == 2| id_tipogasto == 3 | id_tipogasto == 9) & stringr::str_starts(id_objeto_del_gasto, "7|39909") & !stringr::str_starts(id_objeto_del_gasto, "79") ~ "Gastos de inversi\u00f3n",

          T ~ NA_character_
        )

      )


    }

  }



#' Generar subclasificación económica
#'
#' @param .x base de datos de presupuesto
#' @param name_clas nombre de la columna con la clasificación económica
#' @param name_sub nombre de la columna con la sclasificación económica
#'
#' @importFrom rlang :=
#' @importFrom rlang !!
#' @return una base de datos de presupuesto con subclasificación económica
#' @export
gen_subclas_eco <- function (.x,
                             name_clas = clasif_eco,
                             name_sub = sub_clasif_eco) {

      name_new_col_clas <- rlang::enquo(name_clas)
      name_new_col_sub <- rlang::enquo(name_sub)


    .x %>%
      janitor::clean_names() %>% {
      if ("id_ramo" %in% names(.))
        dplyr::mutate(., id_ramo = as.character(id_ramo))
      else .
    } %>% {
      if (!is.na(periodo_col) & !("periodo" %in% names(.)))
        dplyr::mutate(., periodo = periodo_col)
      else .
    } %>% {
      if ("ciclo" %in% names(.))
        dplyr::mutate(., ciclo = as.numeric(ciclo))
      else .
    } %>% {
      if (!("periodo" %in% names(.)) & ("ciclo" %in% names(.)))
        dplyr::mutate(., periodo = as.numeric(ciclo))
      else .
    } %>% {
      if (!("periodo" %in% names(.)) & !("ciclo" %in% names(.)))
        dplyr::mutate(., periodo = NA)
      else .
    } %>% {
      if (("id_capitulo" %in% names(.)))
        dplyr::mutate(., id_capitulo = as.numeric(substr(id_capitulo,
                                                         0, 1)) * 1000)
      else .
    } %>% {
      if (!("id_capitulo" %in% names(.)) & ("id_objeto_del_gasto" %in%
                                            names(.)))
        dplyr::mutate(., id_capitulo = as.numeric(substr(id_objeto_del_gasto,
                                                         0, 1)) * 1000)
      else .
    } %>% {
      if (("id_concepto" %in% names(.)))
        dplyr::mutate(., id_concepto = as.numeric(substr(id_concepto,
                                                         0, 2)) * 100)
      else .
    } %>% {
      if (!("id_concepto" %in% names(.)) & ("id_objeto_del_gasto" %in%
                                            names(.)))
        dplyr::mutate(., id_concepto = as.numeric(substr(id_objeto_del_gasto,
                                                         0, 2)) * 100)
      else .
    } %>% {
      if (("id_partida_generica" %in% names(.)))
        dplyr::mutate(., id_partida_generica = as.numeric(substr(id_partida_generica,
                                                                 0, 3)) * 10)
      else .
    } %>% {
      if (!("id_partida_generica" %in% names(.)) & ("id_objeto_del_gasto" %in%
                                                    names(.)))
        dplyr::mutate(., id_partida_generica = as.numeric(substr(id_objeto_del_gasto,
                                                                 0, 3)) * 10)
      else .
    } %>% {
      if (("id_objeto_del_gasto" %in% names(.)))
        dplyr::mutate(., id_objeto_del_gasto = as.numeric(id_objeto_del_gasto))
      else .
    } %>% {
      if (!("id_objeto_del_gasto" %in% names(.)) & ("id_partida_especifica" %in%
                                                    names(.)))
        dplyr::mutate(., id_objeto_del_gasto = as.numeric(id_partida_especifica))
      else .
    } %>% {
      if (!("desc_objeto_del_gasto" %in% names(.)) & ("desc_partida_especifica" %in%
                                                      names(.)))
        dplyr::mutate(., desc_objeto_del_gasto = desc_partida_especifica)
      else .
    } %>% {
      if ("id_ur" %in% names(.))
        dplyr::mutate(., id_ur = as.character(id_ur))
      else .
    } %>% {
      # if (!("clasif_eco" %in% names(.)) & ("id_ramo" %in% names(.) & "id_capitulo" %in% names(.))) {

      dplyr::mutate(

        ., !!name_new_col_clas := dplyr::case_when(
          # GASTO CORRIENTE
          # Subsidios
          (id_tipogasto == 0 | id_tipogasto == 1 | id_tipogasto == 7) & stringr::str_starts(id_objeto_del_gasto, "43") ~ "Gasto corriente",
          # Servicios personales
          (id_tipogasto == 0 | id_tipogasto == 1 | id_tipogasto == 7) & stringr::str_starts(id_objeto_del_gasto, "1|83101|83102|83106|83107|83108|83109|83110|83111|83112|83113|83114|83115|83116|83117") ~ "Gasto corriente",
          # Gastos de operaci\u00f3n
          (id_tipogasto == 0 | id_tipogasto == 1 | id_tipogasto == 7) & stringr::str_starts(id_objeto_del_gasto, "2|3") & !stringr::str_starts(id_objeto_del_gasto, "391|394|395|396|397|26106|32902|39908|39910") ~ "Gasto corriente",
          # Otros de corriente
          (id_tipogasto == 0 | id_tipogasto == 1 | id_tipogasto == 7) &
            (
              (id_capitulo == "4000" & id_concepto != "4300" & id_concepto != "4500"& id_concepto != "4700") | # !str_starts(id_objeto_del_gasto, "43|45|47")) |
                stringr::str_starts(id_objeto_del_gasto, "79|85|391|394|395|396|397|834|26106|32902|39908|39910|83103|83105|83118") |
                (stringr::str_starts(id_objeto_del_gasto, "471") & (id_ramo == 19 & (id_ur == "GYR" | id_ur == "GYN")))
            ) ~ "Gasto corriente",

          # PENSIONES Y JUBILACIONES
          stringr::str_starts(id_objeto_del_gasto, "45") | (stringr::str_starts(id_objeto_del_gasto, "471") & (id_ramo == 19 & (id_ur != "GYR" & id_ur != "GYN"))) ~ "Pensiones y jubilaciones",

          # GASTOS DE INVERSI\u00f3N
          # Inversi\u00f3n f\u00edsica
          (id_tipogasto == 2| id_tipogasto == 3 | id_tipogasto == 9) & stringr::str_starts(id_objeto_del_gasto, "1|2|5|6|3|4|79|85|831|834") & !stringr::str_starts(id_objeto_del_gasto, "39909|43") ~ "Gastos de inversi\u00f3n",
          # Subsidios
          (id_tipogasto == 2| id_tipogasto == 3 | id_tipogasto == 9) & stringr::str_starts(id_objeto_del_gasto, "43") ~ "Gastos de inversi\u00f3n",
          # Otros de inversi\u00f3n
          (id_tipogasto == 2| id_tipogasto == 3 | id_tipogasto == 9) & stringr::str_starts(id_objeto_del_gasto, "7|39909") & !stringr::str_starts(id_objeto_del_gasto, "79") ~ "Gastos de inversi\u00f3n",

          T ~ NA_character_
        ),
        !!name_new_col_sub := dplyr::case_when(
          # GASTO CORRIENTE
          # Subsidios
          (id_tipogasto == 0 | id_tipogasto == 1 | id_tipogasto == 7) & id_concepto == "4300" ~ "Subsidios",
          # Servicios personales
          (id_tipogasto == 0 | id_tipogasto == 1 | id_tipogasto == 7) & stringr::str_starts(id_objeto_del_gasto, "1|83101|83102|83106|83107|83108|83109|83110|83111|83112|83113|83114|83115|83116|83117") ~ "Servicios personales",
          # Gastos de operaci\u00f3n
          (id_tipogasto == 0 | id_tipogasto == 1 | id_tipogasto == 7) & stringr::str_starts(id_objeto_del_gasto, "2|3") & !stringr::str_starts(id_objeto_del_gasto, "391|394|395|396|397|26106|32902|39908|39910") ~ "Gastos de operaci\u00f3n",
          clasif_eco == "Gasto corriente" ~ "Gastos de operaci\u00f3n",

          # PENSIONES Y JUBILACIONES
          stringr::str_starts(id_objeto_del_gasto, "45") | (stringr::str_starts(id_objeto_del_gasto, "471") & (id_ramo == 19 & (id_ur != "GYR" & id_ur != "GYN"))) ~ "Pensiones y jubilaciones",

          # GASTOS DE INVERSI\u00f3N
          # Subsidios
          (id_tipogasto == 2| id_tipogasto == 3 | id_tipogasto == 9) & stringr::str_starts(id_objeto_del_gasto, "43") ~ "Subsidios",
          # Inversi\u00f3n financiera
          (id_tipogasto == 2| id_tipogasto == 3 | id_tipogasto == 9) & (id_capitulo == "7000" & id_concepto != "7900") ~ "Inversi\u00f3n financiera",
          # Otros de inversi\u00f3n
          (id_tipogasto == 2| id_tipogasto == 3 | id_tipogasto == 9) & stringr::str_starts(id_objeto_del_gasto, "7|39909") & !stringr::str_starts(id_objeto_del_gasto, "79") ~ "Otros de inversi\u00f3n",
          # Inversi\u00f3n f\u00edsica
          clasif_eco == "Gastos de inversi\u00f3n" ~ "Inversi\u00f3n f\u00edsica",

          T ~ NA_character_
        )

      )


    }

}


#' Datos del deflactor de TP
#'
#' Son los datos del deflactor implícito del PIB, observados y estimados
#' de la SHCP.
#'
#' @format Data Frame
#' @source Datos de TP disponibles en https://www.transparenciapresupuestaria.gob.mx/work/models/PTP/Presupuesto/Programacion/Deflactores/Deflactores_PIB.xlsx
"deflactor_local"

#' Datos del deflactor para la CP de 2021
#'
#' Son los datos del deflactor implícito del PIB, observados y estimados
#' de la SHCP.
#'
#' @format Data Frame
#' @source Datos del deflactor del PIB de la SHCP disponibles en los Lineamientos para la Integración de la Cuenta Pública 2021 (https://www.cuentapublica.hacienda.gob.mx/es/CP/cuenta)
"CP2021"

#' Datos del deflactor utilizados en la CP de 2022
#'
#' Son los datos del deflactor implícito del PIB, observados y estimados
#' de la SHCP.
#'
#' @format Data Frame
#' @source Datos del deflactor del PIB de la SHCP disponibles en los Lineamientos para la Integración de la Cuenta Pública 2022 (https://www.cuentapublica.hacienda.gob.mx/es/CP/cuenta)
"CP2022"

globalVariables(c(".", "deflactor_local", "periodo",
                  "n", "id", "inpc_bd",
                  "year", "sp1", "deflactor_year",
                  "CP2021", "CP2022", 
                  "deflactor_desc", "clasif_eco", "id_ramo",
                  "ciclo", "id_capitulo", "id_objeto_del_gasto",
                  "id_concepto", "id_partida_especifica", "id_partida_generica",
                  "desc_partida_especifica", "id_ur", "clasif_eco",
                  "sub_clasif_eco", "periodo_col", "index",
                  "num", "desc_ramo", "aprobado",
                  "modificado", "pagado", "ejercido",
                  "proyecto", "monto_aprob_mes", "monto_aprobado_mensual",
                  "monto_modif_mes", "monto_modificado_mensual", "desc_objeto_del_gasto",
                  "monto_aprobado_mensual", "desc_ramo",
                  "inpc_bd"))
JavierMtzRdz/presupuestoR documentation built on June 11, 2024, 11:38 a.m.