library(shiny) library(shinythemes) library(shinyWidgets) library(sendmailR)

Función para adjuntar archivos

attachFiles <- function(input) { attachments <- NULL if (!is.null(input\(files)) { attachments <- input\)files$datapath } return(attachments) }

Interfaz de usuario

ui <- fluidPage( theme = shinytheme(“flatly”),

titlePanel(“Formulario de Proyecto Inmobiliario”),

sidebarLayout( sidebarPanel( fileInput(“files”, “Adjuntar documentos”, multiple = TRUE, accept = c(“.pdf”, “.doc”, “.docx”, “.xlsx”, “.csv”)),

  actionButton("sendButton", "Enviar", icon = icon("envelope"))
),

mainPanel(
  textInput("resumen", "Resumen ejecutivo del proyecto"),
  textInput("proforma", "Pro forma / Finanzas / Gastos de capital"),
  textInput("renders", "Diseño - Renders"),
  textInput("tasaciones", "Tasaciones recientes o pasadas de la propiedad"),
  textInput("acuerdos", "Acuerdos entre fideicomiso fiduciario y proyecto"),
  textInput("titulo", "Título actual"),
  textInput("planos", "Planos de construcción, conforme a obra, arquitectónicos, de ingeniería y otros planos"),
  textInput("informe", "Informe de estado actual de la propiedad"),
  textInput("permisos", "Permisos, cédulas de habitabilidad, avisos gubernamentales (Confotur)"),
  textInput("facturas", "Facturas históricas de energía y servicios públicos + Todos los documentos ambientales relevantes"),
  textInput("coordenadas", "Coordenadas esquinas del predio/Archivo shape file o KML o similar que pueda ser procesado en sistemas de información geográfico"),
  textInput("balance", "Balance de superficies del proyecto"),
  textInput("valores", "Desglose de valores de venta del proyecto, dependiendo del tipo de proyecto"),
  textInput("valores_unitarios", "Valores unitarios de venta ya sea de viviendas, lotes, departamentos, locales u lo que corresponda"),
  textInput("valor_total", "Valor estimado de la venta total"),
  textInput("coste_predio", "Valor estimado del coste del predio donde se realizará el proyecto"),
  textInput("coste_construccion", "Coste estimado de la construcción del proyecto o subdivisión o mensura del proyecto, este punto variará dependiendo del tipo de proyecto inmobiliario"),
  textInput("gastos_admin", "Gastos administrativos del proyecto"),
  textInput("gastos_permisos", "Gastos en permisos e impuestos"),
  textInput("gastos_marketing", "Gastos en Marketing y gastos por venta (estimación en porcentajes sobre el total de la venta)"),
  textInput("costes_indirectos", "Costes indirectos por honorarios profesionales (Arquitectos, Agrimensores, Contadores Etc)"),
  textInput("imprevistos", "Monto destinado a imprevistos (estimación en porcentajes sobre el total de la venta)"),
  textInput("rentabilidad", "Rentabilidad esperada o retorno de inversión"),
  textInput("plazo_ejecucion", "Plazo de ejecución del proyecto, ya sea por etapas o en su totalidad"),
  textOutput("confirm", container = tags$div(style = "margin-top: 20px;"))
)

) )

Servidor

server <- function(input, output) { observeEvent(input$sendButton, { # Adjuntar archivos attachments <- attachFiles(input)

# Crear cuerpo del correo
body <- sprintf(
  "Resumen ejecutivo del proyecto: %s\n\n", input$resumen) # Continuar con las demás variables

# Enviar correo electrónico con archivos adjuntos
email <- tryCatch({
  sendmail(
    from = "proyectos@example.com",
    to = "destinatario@example.com",
    subject = "Formulario de Proyecto Inmobiliario",
    body = body,
    smtp = list(
      host.name = "smtp.example.com",
      port = 465,
      user.name = "usuario",
      passwd = "contraseña",
      ssl = TRUE
    ),
    attach.files = attachments
  )
}, error = function(e) {
  return(list(status = "error", message = e$message))
})

# Mostrar mensaje de confirmación
output$confirm <- renderPrint({
  if (email$status == "mail sent") {
    "El formulario ha sido enviado correctamente."
  } else {
    paste("Ha ocurrido un error al enviar el formulario. Por favor, inténtalo nuevamente.\n",
          "Error: ", email$message)
  }
})

}) }

shinyApp(ui, server)