Tabla de Amortización: Cuota vencida UVR

Authors

- Juan Camilo Alfonso

- Andrés Felipe Díaz

- Anderson Quintero

- Johann Camilo Rincón

# Para hacer el documento interactivo
library(shiny)
# Para darle formato de tabla al data.frame y se muestre interactivo
library(DT)

Attaching package: 'DT'
The following objects are masked from 'package:shiny':

    dataTableOutput, renderDataTable
tabla.amort.UVR.pesos <- function(TipoAmortizacion= c("uvr", "pesos"), r, n, VP, UVR, e) {
  #' -TipoAmortizacion: toma  el valor "uvr" o "pesos"
  #' -r: Inflación anual.
  #' -n: Número total de años.
  #' -VP: Valor presente o monto del préstamo.
  #' -UVR: Valor inicial de la UVR.
  #' -e: Tasa de entrada - rentabilidad bruta sobre inflacion.
  #' Devuelve una tabla de amortización en formato data.frame, en una nueva pestaña
  
# calculamos los valores inciales necesarios para el correcto procedimiento en la amortizacion en cada tabla  
  n.meses <- n * 12 # tiempo en meses
  i <- (1 + e) * (1 + r) - 1 # tasa de interés efectiva anual
  d <- i / (1 + i) # tasa de descuento EA
  i12 <- 12 * ((1 + i)^(1/12) - 1) # tasa de interés nominal mensual
  i12_12 <- i12 / 12 # tasa de interés efectivs mensual
  d12 <- 12 * (1 - (1 - d)^(1/12)) # tasa de descuento nominal mensual
  k.mes <- (1 + r)^(1/12) - 1 # inflacion mensual
  a12 <- (1 - (1 + i)^(-n)) / i12 # 
  R <- VP / (12 * a12)# cuota en pesos
  R_uvr <- R / UVR # cuota llevada a UVR


  # Creamos la tabla de amortizacion en uvr, con sus respectivas columnas
  
  tabla.uvr <- data.frame(matrix(0, nrow = n.meses + 1, ncol = 6))
  colnames(tabla.uvr) <- c("mes", "UVR", "Abono a capital UVR", "Intereses UVR", "Cuota en UVR", "Saldo fin de mes UVR")
  # La primera fila de la tabla de amortizacion sólo contiene unos valores,manualmente asignamos: mes 0, valor inicial de la UVR tomado directamente del parámetro de entrada y el saldo fin de mes (en UVR) que se calcula VP / UVR  
  tabla.uvr[1, "mes"] <- 0
  tabla.uvr[1, "UVR"] <- UVR
  tabla.uvr[1, "Saldo fin de mes UVR"] <- VP / UVR
  
  # Se crea un for para el proceso de amortización, donde a cada j en el rango
  # de 1 hasta el total de número de meses, asigna de la siguiente manera:
  
  ### mes j
  ### UVR se calcula como UVR*(1+k.mes)
  ### Intereses UVR= Saldo fin de mes UVR del mes anterior * i12_12 
  ### Abono a capital en UVR= Cuota (fija en UVR) del presente mes - Intereses UVR del presente mes
  ### Saldo fin de mes UVR= Saldo fin de mes UVR del mes anterior - Abono a capital en UVR del presente mes
    
  for (j in 1:n.meses) {
    tabla.uvr[j + 1, "mes"] <- j
    tabla.uvr[j + 1, "UVR"] <- tabla.uvr[j, "UVR"] * (1 + k.mes)
    tabla.uvr[j + 1, "Cuota en UVR"] <- R_uvr
    tabla.uvr[j + 1, "Intereses UVR"] <- tabla.uvr[j, "Saldo fin de mes UVR"] * i12_12
    tabla.uvr[j + 1, "Abono a capital UVR"] <- tabla.uvr[j+1, "Cuota en UVR"] - tabla.uvr[j + 1, "Intereses UVR"]
    tabla.uvr[j + 1, "Saldo fin de mes UVR"] <- tabla.uvr[j, "Saldo fin de mes UVR"] - tabla.uvr[j + 1, "Abono a capital UVR"]
  }
  # El primer if que nos define el tipo de amortización en uvr
  
  if(TipoAmortizacion=="uvr"){
      
    # Como ya definimos la tabla uvr y sus columnas de amrotizacion en el cuerpo
    # principal de la función, en adición, redondeamos los valores a dos cifras decimales.
    Amort.uvr <- round(tabla.uvr, 2)
    return(as.data.frame(Amort.uvr))
  }
  
  
  
# El segundo if que nos define el tipo de amortización en pesos
  if(TipoAmortizacion=="pesos"){
    
    # creamos la tabla para pesos con sus columnas correspondientes
    tabla.pesos <- data.frame(matrix(0, nrow = n.meses + 1, ncol = 5))
    colnames(tabla.pesos) <- c("mes","Abono a capital pesos", "Intereses pesos", "Cuota en pesos", "Saldo fin de mes pesos")
    # La primera fila de la tabla de amortizacion para pesos sólo contiene dos valores,
    # manualmente asignamos: mes 0 y el saldo fin de mes (en pesos) que es igual a VP    
    tabla.pesos[1, "mes"] <- 0
    tabla.pesos[1, "Saldo fin de mes pesos"] <- VP 
   # Se crea un for para el proceso de amortización, donde a cada j en el rango
      # de 1 hasta el total de número de meses, asigna de la siguiente manera:
      
      ### mes j
      ### Abono a capital en pesos se calcula como UVR * Abono a capital en UVR del presente mes
      ### Intereses pesos= UVR * Intereses_UVR del presente mes
      ### Cuota en pesos= UVR del presente mes * Cuota_en_UVR del presente mes
      ### Saldo fin de mes pesos= UVR del mes presente * Saldo_fin_de_mes_UVR del presente mes
          
    for (j in 1:n.meses) {
      tabla.pesos[j + 1, "mes"] <- j
      tabla.pesos[j + 1, "Abono a capital pesos"] <- tabla.uvr[j+1, "UVR"] * tabla.uvr[j + 1, "Abono a capital UVR"]
      tabla.pesos[j + 1, "Intereses pesos"] <-  tabla.uvr[j+1, "UVR"]*tabla.uvr[j + 1, "Intereses UVR"]
      tabla.pesos[j + 1, "Cuota en pesos"] <- tabla.uvr[j+1, "UVR"]*tabla.uvr[j+1, "Cuota en UVR"]
      tabla.pesos[j + 1, "Saldo fin de mes pesos"] <- tabla.uvr[j+1, "UVR"]*tabla.uvr[j + 1, "Saldo fin de mes UVR"] 
      
    }    
    
    Amort.pesos <- round(tabla.pesos, 2)
    return(as.data.frame(Amort.pesos))
  }
  
}

ui <- fluidPage(
  titlePanel("Tabla de Amortización: Cuota vencida UVR"),
  sidebarLayout(
    sidebarPanel(
      numericInput("capital", "Capital:", value = 100000000),
      numericInput("tasa", "Tasa de Interés Real Anual:", value = 0.0928),
      numericInput("inflacion", "Tasa de Inflación Anual:", value = 0.0700),
      sliderInput("plazo", "Plazo (años):", min = 0, max = 90, value = 15, step = 1),
      selectInput("tipo_amortizacion", "Tipo de Amortización:",
                  choices = c("uvr", "pesos")),
      numericInput("uvr", "Valor de la UVR:", value = 279.4269)
    ),
    mainPanel(
      DTOutput("tabla_amortizacion")
    )
  )
)

server <- function(input, output) {
  output$tabla_amortizacion <- renderDT({
    tabla <- tabla.amort.UVR.pesos(
      TipoAmortizacion = input$tipo_amortizacion,
      r = input$tasa,
      n = input$plazo,
      VP = input$capital,
      UVR = input$uvr,
      e = input$inflacion
    )
    datatable(tabla, options = list(pageLength = 10, scrollX = TRUE,
                                    lengthMenu = c(13, 25, 37, 49, 61, 73, 85, 
                                                   97, 109, 121, 133, 145, 157, 
                                                   169, 181, 193, 205, 217, 229,
                                                   241)),
              callback = JS("table.columns().header().to$().css({fontSize: '16px', fontWeight: 'bolder'});"))
  })
}

shinyApp(ui = ui, server = server)