-
Diego_torresFecha de consulta 2 de mayo de 2024, 10:26
Hola muy buenos días, estoy intentando cargar un formulario vía API con un script hecho en python para luego obtner el pdf. El Form que necesito llenar es "Forma Cliente Particular" id: 240546574547868. Estoy enviando todos los campos que NO son calculables por lo que los otros deberían calcularse automáticamente, esto no sucede. Todos los calculos dependen del campo "Tipo de Casa" que se está cargando correctamente ya que lo corroboré en la vista de tabla del formulario. SI entro a la vista de tabla y cambio manualmente el valor de "Tipo de Casa", los campos calculables se actualizan correctamente. Les dejo el la funcion que estoy utilizando para ver si me pueden ayudar a resolverlo. Gracias un saludo.
def new_submission(logger: Logger, lead: Lead) -> None | str:
logger.fuente += " > Jotform API"
url = urllib.parse.urljoin(API_URL, f"form/{FORM_ID}/submissions")
#Valores por defecto
if lead.busquedas['covered_area'] == "" or lead.busquedas['covered_area'] == None:
lead.busquedas['covered_area'] = '350, 350'
if lead.busquedas['banios'] == "" or lead.busquedas['banios'] == None:
lead.busquedas['banios'] = '5, 5'
if lead.busquedas['recamaras'] == "" or lead.busquedas['recamaras'] == None:
lead.busquedas['recamaras'] = '4, 4'
props = {
"covered_area": 0,
"banios": 0 ,
"recamaras": 0,
}
#La data viene como banios: 5, 6. osea entre 5 y 6, calculamos un promedio entre esos dos valores y usamos eso
for key in props:
try:
[min, max] = lead.busquedas[key].split(', ')
props[key] = int((int(min) + int(max)) / 2)
except Exception as e:
logger.error(f"No se pudo obtener el {key}")
logger.debug(f"busquedas['{key}']: " + str(lead.busquedas[key]))
logger.error(str(e))
return None
payload = {
'apiKey': API_KEY,
"submission[124]": lead.nombre, #q124_nombreCliente "test"
"submission[4]": lead.email, #q4_emailCliente "test@gmail.com"
"submission[57]": lead.asesor['name'], #q57_escribaUna "test"
#"submission[123]": lead.asesor['telefono'], #lead.q123_email123 "test@gmail.com"
"submission[5]": lead.asesor['phone'], #q5_numeroDe[full] "00+0000-0000"
#"submission[116]": "22,500", #Valor tipo casa
"submission[117]": "2,500,000", #q117_pagoInicial "1,500,000"
"submission[119]": "2,500,000", #valor pago inicial q117_pagoInicial "1,500,000"
"submission[118]": "25%", #q118_pagoInicial118 "20%"
"submission[122]": "16 meses", #q122_aCuantos "18+meses"
"submission[9]": "Premium", #q9_escribaUna9 "Premium"
"submission[15]": props['recamaras'], #q15_cuantosCuartos "2"
"submission[16]": props['banios'], #q16_cuantosBanos56 "3"
"submission[76]": "0",# TAMAÑO DEL SOTANOq76_cuantosBanos "5"
"submission[78]": int(props['covered_area'] * 0.45), #Tamaño planta baja q78_tamanoDe "1"
"submission[79]": int(props['covered_area'] * 0.45), #Tamaño planta alta q79_tamanoDe79 "7"
"submission[77]": int(props['covered_area'] * 0.10), # Tamaño del roof garden q77_tamanoDel "8"
"submission[84]": "0", # Tamaño rampa de estacionamiento q84_tamanoDe84 "0"
"submission[85]": "30", # Tamaño jardin exterior q85_tamanoDe85 "0"
"submission[86]": "0", # Tamaño de alberca q86_tamanoDe86 "0"
"submission[87]": "50", # Tamaño muro perimetral q87_tamanoDe87 "0"
"submission[88]": "0", # Valor sotano q88_valorSotano "112,500"
}
res = requests.post(url, data=payload)
if res.ok:
logger.success('Solicitud exitosa')
data = res.json()
submissionID = data.get('content', {}).get('submissionID', None)
if submissionID == None:
return None
return PDF_URL.format(submissionID=submissionID)
else:
logger.error('Error en la solicitud:' + res.text)
return None
-
Vincenzo Jotform SupportFecha de respuesta 2 de mayo de 2024, 11:30
Hola Diego,
Gracias por contactar el Soporte Técnico de Jotform. Lamentamos que esté teniendo problemas en ver los campos de cálculo en Tablas cuando rellena su formulario vía API. Es importante notar que cuando se rellena el formulario vía API, los datos se envían directamente a Tablas sin pasar por el formulario mismo, y esto hace que las condiciones/los calculos no se activan. Por esto se quedan en blanco. Como solución alternativa puede considerar rellenar el formulario vía Parámetros URL. Come en este ejemplo de URL aquí. De esta forma, vendrá que enviar el formulario haciendo clic en el botón Enviar y los cálculos se efectuarán correctamente. Le muestro como hacerlo:
- Abrir la App para los Parámetros URL.
- Hacer clic en el botón Populate Fields.
- En la página popup, hacer clic en el botón Allow.
- Seleccionar el formulario y luego clic en Continue.
- Rellenar los campos del formulario y luego hacer clic en Generate URL.
- Luego abrir el URL y los campos serán automáticamente compilados.
- Finalmente, enviar el formulario.
Resultado:
Dado que la función que busca no está disponible en Jotform en este momento. Hemos enviado una solicitud a nuestros desarrolladores, pero el momento en que se desarrolle dependerá de su carga de trabajo, de su viabilidad y del número de usuarios que la soliciten. Si hay alguna actualización, volveremos a este hilo y se lo haremos saber.
Gracias por su paciencia y comprensión, se lo agradecemos.
-
Diego_torresFecha de respuesta 3 de mayo de 2024, 11:02
Gracias por la respuesta, entiendo que para hacerlo como me están diciendo tendría que usar algún webdriver como selenium dentro de mi script. O existe otra manera que no me estoy dando cuenta sin tener que usar selenium? Lo que no entiendo es cómo podría obtener el pdf una vez enviado el formulario. Yo lo que necesito es cargar los datos del formulario via script (en lo posible sin selenium) y obtener un link al pdf generado.
Muchas gracias. -
Sidharth Jotform SupportFecha de respuesta 3 de mayo de 2024, 13:51
Hi Diego,
Thanks for reaching out to Jotform Support. Unfortunately, our Spanish Support agents are busy helping other Jotform users at the moment. I'll try to help you in English using Google Translate, but you can reply in whichever language you feel comfortable using. Or, if you'd rather have support in Spanish, let us know and we can have them do that. But, keep in mind that you'd have to wait until they're available again.
Now, coming back to your question. The form must be submitted to perform the necessary calculations and save the data. I am not familiar with the Selenium tool, so I cannot confirm whether it would be a viable solution. Regarding obtaining the PDF URL, if you create an API call to save the submission, you will receive a submission ID as part of the response data. You can capture this ID and use it to construct the submission PDF URL. Here's the format for the submission PDF:
https://www.jotform.com/pdf-submission/{id}
The PDF can be downloaded by replacing {id} with the submission ID.
Give it a try and let us know how it goes.
-
Diego_torresFecha de respuesta 3 de mayo de 2024, 14:34
Hola, no tengo problema en que me respondan en inglés, yo seguiré hablando en español. Puedo realizar una petición para cargar el formulario através de la API, pero los campos que son calculables no se rellenan. En la primer respuesta que me dieron me mostraron una manera de que esto no pase pero es sin usar la api sino rellenando los campos con la url, pero de este modo no puedo obtener el pdf ya que no tengo forma de saber la submissionID.
Gracias -
Princess Jotform SupportFecha de respuesta 3 de mayo de 2024, 17:47
Hi Diego,
Thanks for getting back to us. You can use the following API call to generate the Original PDF.
https://api.jotform.com/pdf-converter/{formID}/fill-pdf?download=1&submissionID={sumissionID}&apikey={apiKey}
Replace formID inside the Curly Brace with your form's actual Form ID. It is the unique form number that can be found in the form link:
Whenever someone submits a response to your form, their submission is assigned a unique number called the Submission ID. You can check out this guide on Where to Find the Submission ID.
Give it a try and let us know if there’s anything else we can help you with.
-
Diego_torresFecha de respuesta 4 de mayo de 2024, 9:51
Hola gracias por las respuestas, agredecería que antes de responder leyeran todo el hilo para tener contexto sobre mi problema. Al parecer solamente están respondiendo sobre mi última consulta sin tener el contexto suficiente. Me gustaría poder hablar nuevamente con Vincenzo que fue la primera persona que me respondió y creo que si comprendió el asunto.
Gracias. -
Diego_torresFecha de respuesta 4 de mayo de 2024, 11:05
Lo terminé resolviendo usando parámetros url para cargar los datos y selenium para enviar el formulario. Igualmente me gustaría saber si existe otro modo de realizarlo sin la necesidad de utilizar un navegador headless. Creo que sería de mucha utilidad poder cargar los campos calculables através de la API, o tener una ruta separada para hacer esto mismo. De todos modos gracias por la ayuda!
Dejo el código por si alguien más se encuentra en esta misma situación:
import requests
import os
import urllib.parse
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from src.logger import Logger
from src.lead import Lead
API_KEY = os.getenv("JOTFORM_API_KEY")
FORM_ID = os.getenv("JOTFORM_FORM_ID")
assert API_KEY != "" and API_KEY != None, "JOTFORM_API_KEY is not in enviroment"
assert FORM_ID != "" and FORM_ID != None, "JOTFORM_FORM_ID is not in enviroment"
API_URL = "https://api.jotform.com"
PDF_URL = "https://www.jotform.com/pdf-submission/{submissionID}"
def generate_url(logger: Logger, lead: Lead) -> str | None:
#Valores por defecto
if lead.busquedas['covered_area'] == "" or lead.busquedas['covered_area'] == None:
lead.busquedas['covered_area'] = '350, 350'
if lead.busquedas['banios'] == "" or lead.busquedas['banios'] == None:
lead.busquedas['banios'] = '5, 5'
if lead.busquedas['recamaras'] == "" or lead.busquedas['recamaras'] == None:
lead.busquedas['recamaras'] = '4, 4'
props = {
"covered_area": 0,
"banios": 0 ,
"recamaras": 0,
}
#La data viene como banios: 5, 6. osea entre 5 y 6, calculamos un promedio entre esos dos valores y usamos eso
for key in props:
try:
[min, max] = lead.busquedas[key].split(', ')
props[key] = int((int(min) + int(max)) / 2)
except Exception as e:
logger.error(f"No se pudo obtener el {key}")
logger.debug(f"busquedas['{key}']: " + str(lead.busquedas[key]))
logger.error(str(e))
return None
url = f"https://www.jotform.com/{FORM_ID}"
params = {
"nombreCliente": lead.nombre,
"emailCliente": lead.email,
"escribaUna": lead.asesor['name'],
"email123": "john@example.com",
"numeroDe[full]": lead.asesor['phone'],
"pagoInicial": "2,500,000",
"pagoInicial118": "25%",
"aCuantos": "16+meses",
"escribaUna9": "Premium",
"cuantosCuartos": props['recamaras'],
"cuantosBanos56": props['banios'],
"cuantosBanos": "0", #Tamaño del sotano
"tamanoDe": int(props['covered_area'] * 0.45), #Tamaño planta baja
"tamanoDe79": int(props['covered_area'] * 0.45), #Tamaño planta alta
"tamanoDel": int(props['covered_area'] * 0.10), #Tamaño roof garden
"tamanoDe84": "0", #Tamaño rampa estacionamiento
"tamanoDe85": "30", #Tamaño jardin exterior
"tamanoDe86": "0", #Tamaño de alberca
"tamanoDe87": "50", #Tamaño muro perimetral
}
url = urllib.parse.urljoin(url, '?' + urllib.parse.urlencode(params))
return url
#Devuelve un link al PDF creado
def new_submission(logger: Logger, lead: Lead) -> None | str:
url = generate_url(logger, lead)
print(url)
if url == None:
return None
res = requests.get(url)
if not res.ok:
logger.error('Error en la solicitud:' + res.text)
return None
options = Options()
options.add_argument(f"--headless") #Session
options.add_argument("--no-sandbox") # Necesario para correrlo como root dentro del container
driver = webdriver.Chrome(options=options)
logger.debug("Generando pdf")
try:
driver.get(url)
button = driver.find_element(By.ID, "form-pagebreak-next_8")
button.click()
button = driver.find_element(By.ID, "form-pagebreak-next_82")
button.click()
button = driver.find_element(By.ID, "input_2")
button.click()
except Exception as e:
logger.error("driver error: " + str(e))
return None
finally:
driver.close()
submission = get_last_submission(logger)
if submission == None:
return None
if submission.get('id', None) == None:
logger.error("No se pudo obtener el id de la submission")
logger.debug("submission:" + str(submission))
return None
return PDF_URL.format(submissionID=submission['id'])
def get_last_submission(logger: Logger, form_id: str = FORM_ID):
url = urllib.parse.urljoin(API_URL, f"form/{form_id}/submissions")
payload = {
'apiKey': API_KEY
}
res = requests.get(url, params=payload)
if not res.ok:
logger.error('Error en la solicitud:' + res.text)
return None
logger.success('Solicitud exitosa')
data = res.json()
return data.get('content', [None])[0]
-
Sigit Jotform SupportFecha de respuesta 4 de mayo de 2024, 19:39
Hi Diego,
Thanks for getting back to us. We've added your response to the escalated feature request. We appreciate your input and will keep you updated on any developments regarding this feature.
If you have any further questions or concerns, feel free to let us know.