library(shiny) library(shinythemes) library(shinyWidgets) library(sendmailR)
attachFiles <- function(input) { attachments <- NULL if (!is.null(input\(files)) { attachments <- input\)files$datapath } return(attachments) }
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;"))
)
) )
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)