El análisis de contratos y documentos y estimación del valor con IA puede contener errores, es una estimación, y no es una oferta comercial; al continuar se recibirá una cotización formal, por parte de la empresa aseguradora.
Cotiza, compara y solicita tu seguro de cumplimiento
El seguro de cumplimiento es el mecanismo perfecto para generar más cierres de contratos al garantizar la ejecución de los mismos; somos el primer canal en ofrecer cotizaciones en tiempo real con IA.

Primero ingresa el valor
${escapeHtml(tipoTexto)}
${escapeHtml(valorTexto)}
${escapeHtml(descTexto)}
Vigencia: ${escapeHtml(fechaInicio)} a ${escapeHtml(fechaFin)}
`;
resumenCoberturas.appendChild(item);
});
}function actualizarResumenReporte(responseData) {
document.getElementById('resumen_contrato_valor').innerText =
responseData.cumplimiento_contrato_valor || responseData.prospecto_valor_asegurable
? '$ ' + formatNumberToDots(responseData.cumplimiento_contrato_valor || responseData.prospecto_valor_asegurable)
: '-';document.getElementById('resumen_contrato_fecha_inicio').innerText = formatFechaTexto(responseData.cumplimiento_contrato_fecha_inicio);
document.getElementById('resumen_contrato_fecha_fin').innerText = formatFechaTexto(responseData.cumplimiento_contrato_fecha_fin);renderizarResumenCoberturas(responseData.cumplimiento_coberturas || []);
resumenReporte.style.display = 'block';
seccionResultadosIA.style.display = 'none';
seccionDatosContacto.style.display = 'block';
}document.body.addEventListener('input', function(e) {
if(e.target.classList.contains('format-currency')) {
let val = e.target.value.replace(/\D/g, "");
e.target.value = val !== "" ? formatNumberToDots(parseInt(val, 10).toString()) : "";
}
});formEl.addEventListener('submit', function(e) {
e.preventDefault();
if (resumenReporte.style.display !== 'block') {
statusBox.className = 'status-msg status-error';
statusBox.innerHTML = 'Por favor, primero analiza los contratos usando el botón "Analizar contrato y documentos con IA".';
statusBox.style.display = 'block';
return;
}const btnCotizar = document.getElementById('btn_cotizar');
btnCotizar.disabled = true;
btnCotizar.innerText = 'Calculando cotización en tiempo real...';
statusBox.style.display = 'none';if (typeof jQuery !== 'undefined') {
this.querySelectorAll('.format-currency').forEach(input => {
input.dataset.originalValue = input.value;
input.value = parseCurrency(input.value);
});const datosFormatoLimpio = empaquetarDatos();
let hiddenCob = document.getElementById('scc_hidden_coberturas');
if(!hiddenCob) {
hiddenCob = document.createElement('input');
hiddenCob.type = 'hidden';
hiddenCob.name = 'solicitud_cumplimiento_coberturas';
hiddenCob.id = 'scc_hidden_coberturas';
this.appendChild(hiddenCob);
}
hiddenCob.value = JSON.stringify(datosFormatoLimpio.cumplimiento_coberturas);let hiddenDocs = document.getElementById('scc_hidden_docs');
if(!hiddenDocs) {
hiddenDocs = document.createElement('input');
hiddenDocs.type = 'hidden';
hiddenDocs.name = 'solicitud_archivos';
hiddenDocs.id = 'scc_hidden_docs';
this.appendChild(hiddenDocs);
}
hiddenDocs.value = JSON.stringify(datosFormatoLimpio.solicitud_archivos);this.querySelectorAll('.r-desc, .r-tipo, .r-val, .r-fi, .r-ff').forEach(el => {
if(el.name) { el.dataset.oldName = el.name; el.removeAttribute('name'); }
});const fakeResponse = {
status: 'success',
seguro_do_js_fetch: true
};jQuery(document).trigger('jet-form-builder/ajax/on-success', [fakeResponse, jQuery(this)]);
setTimeout(() => {
this.querySelectorAll('.format-currency').forEach(input => {
if (input.dataset.originalValue !== undefined) input.value = input.dataset.originalValue;
});
this.querySelectorAll('[data-old-name]').forEach(el => { el.name = el.dataset.oldName; });
btnCotizar.disabled = false;
btnCotizar.innerText = 'Ver valor precio';
}, 2000);
} else {
alert("Error crítico: La librería jQuery no está cargada.");
btnCotizar.disabled = false;
btnCotizar.innerText = 'Ver valor precio';
}
});fileInput.addEventListener('change', async function() {
if (this.files.length === 0) return;
if (statusBox.classList.contains('status-error')) {
statusBox.style.display = 'none';
}const filesArray = Array.from(this.files);
this.value = '';filesArray.forEach((file, index) => {
const li = document.createElement('li');
li.className = 'loading';
li.id = 'temp-upload-' + index;
li.innerText = `${file.name} (Subiendo al servidor...)`;
listaUI.appendChild(li);
});const uploadData = new FormData();
uploadData.append('action', 'scc_procesar_archivos');
uploadData.append('token', sessionToken);
filesArray.forEach(file => uploadData.append('archivos[]', file));try {
const upRes = await fetch(endpoint, { method: 'POST', body: uploadData });
const upJson = await upRes.json();
if (!upJson.success) throw new Error(upJson.data || 'No fue posible procesar los archivos.');filesArray.forEach((file, index) => {
const tempLi = document.getElementById('temp-upload-' + index);
if (tempLi) tempLi.remove();if(upJson.data.urls[index]) {
const docObj = { "documento": upJson.data.urls[index], "nombre": file.name };
documentosProcesadosUrl.push(docObj);
agregarArchivoUI(docObj);
}
});
} catch (error) {
alert("Error de conexión: " + error.message);
filesArray.forEach((file, index) => {
const tempLi = document.getElementById('temp-upload-' + index);
if (tempLi) tempLi.remove();
});
}
});function agregarArchivoUI(docObj) {
const li = document.createElement('li');
li.className = 'uploaded';
li.innerHTML = `${docObj.nombre}`;
li.querySelector('.btn-delete-file').addEventListener('click', function() {
const urlToRemove = this.getAttribute('data-url');
documentosProcesadosUrl = documentosProcesadosUrl.filter(d => d.documento !== urlToRemove);
li.remove();
if (documentosProcesadosUrl.length === 0) {
seccionResultadosIA.style.display = 'none';
seccionDatosContacto.style.display = 'none';
resumenReporte.style.display = 'none';
}
});
listaUI.appendChild(li);
}const wrapper = document.getElementById('coberturas_wrapper');
document.getElementById('btn_add_cobertura').addEventListener('click', () => {
const newRow = wrapper.children[0].cloneNode(true);
newRow.querySelectorAll('input, select, textarea').forEach(el => el.value = '');
const txtArea = newRow.querySelector('textarea.r-desc');
if(txtArea) {
txtArea.setAttribute('data-autoresize', '');
txtArea.setAttribute('rows', '5');
txtArea.style.minHeight = '140px';
txtArea.style.height = '140px';
}const btnRemove = document.createElement('button');
btnRemove.type = 'button';
btnRemove.className = 'btn-remove-repeater';
btnRemove.innerText = 'X';
btnRemove.onclick = function() { newRow.remove(); };
newRow.appendChild(btnRemove);
wrapper.appendChild(newRow);
initAutoResize(newRow);
});btnEditarReporte.addEventListener('click', function() {
seccionResultadosIA.style.display = 'block';
seccionResultadosIA.scrollIntoView({ behavior: 'smooth', block: 'start' });
});function empaquetarDatos() {
const getVal = (id) => {
const el = document.getElementById(id);
return el ? el.value : '';
};let arrayCoberturas = [];
document.querySelectorAll('.repeater-row').forEach(row => {
const elTipo = row.querySelector('.r-tipo');
const elDesc = row.querySelector('.r-desc');
const elVal = row.querySelector('.r-val');
const elFi = row.querySelector('.r-fi');
const elFf = row.querySelector('.r-ff');const tipo = elTipo ? elTipo.value : '';
const desc = elDesc ? elDesc.value : '';
if(tipo || desc) {
arrayCoberturas.push({
cumplimiento_cobertura: desc,
cumplimiento_cobertura_tipo: tipo,
cumplimiento_cobertura_valor: elVal ? parseCurrency(elVal.value) : '',
cumplimiento_cobertura_fecha_inicio: elFi ? elFi.value : '',
cumplimiento_cobertura_fecha_fin: elFf ? elFf.value : ''
});
}
});
return {
__queried_post_id: getVal('__queried_post_id'),
faf_context: getVal('faf_context'),
cumplimiento_wh_accion: getVal('cumplimiento_wh_accion'),
solicitud_archivos: documentosProcesadosUrl.map(d => ({ "documento": d.documento })),
cumplimiento_contrato_valor: parseCurrency(getVal('cumplimiento_contrato_valor')),
cumplimiento_contrato_fecha_inicio: getVal('cumplimiento_contrato_fecha_inicio'),
cumplimiento_contrato_fecha_fin: getVal('cumplimiento_contrato_fecha_fin'),
cumplimiento_coberturas: arrayCoberturas,
persona_prospecto_nombre_primero: getVal('persona_prospecto_nombre_primero') || getVal('prospecto_primer_nombre'),
persona_prospecto_nombre_segundo: getVal('persona_prospecto_nombre_segundo') || getVal('prospecto_segundo_nombre'),
persona_prospecto_apellido_primero: getVal('persona_prospecto_apellido_primero') || getVal('prospecto_primer_apellido'),
persona_prospecto_apellido_segundo: getVal('persona_prospecto_apellido_segundo') || getVal('prospecto_segundo_apellido'),
persona_prospecto_email: getVal('persona_prospecto_email') || getVal('prospecto_email'),
persona_prospecto_celular: getVal('persona_prospecto_celular') || getVal('prospecto_celular')
};
}function iniciarCronometro() {
let segundos = 0;
timerEl.innerText = '00:00';
timerInterval = setInterval(() => {
segundos++;
const m = String(Math.floor(segundos / 60)).padStart(2, '0');
const s = String(segundos % 60).padStart(2, '0');
timerEl.innerText = `${m}:${s}`;
}, 1000);
}async function ejecutarAnalisisIA() {
if (documentosProcesadosUrl.length === 0) {
statusBox.className = 'status-msg status-error';
statusBox.innerHTML = 'Por favor, primero sube al menos un archivo (contrato o documento) para analizar.';
statusBox.style.display = 'block';
return;
}document.getElementById('cumplimiento_wh_accion').value = 'analizar';
statusBox.style.display = 'none';
statusBox.className = 'status-msg';
btnAnalizar.disabled = true;
btnAnalizar.innerText = 'Analizando documentos de forma segura...';
preloaderContainer.classList.add('active');
iniciarCronometro();try {
const payloadData = new FormData();
payloadData.append('action', 'scc_analizar_datos_seguro');
payloadData.append('token', sessionToken);
payloadData.append('carga', JSON.stringify(empaquetarDatos()));const processRes = await fetch(endpoint, { method: 'POST', body: payloadData });
const textResponse = await processRes.text();
let processJson;
try {
processJson = JSON.parse(textResponse);
} catch(e) {
throw new Error('El sistema interrumpió la conexión. Por favor, intenta de nuevo.');
}if(!processJson.success) throw new Error(processJson.data || 'No fue posible completar la revisión del documento.');const responseData = processJson.data;
const dataMapping = {
'cumplimiento_contrato_valor': responseData.cumplimiento_contrato_valor || responseData.prospecto_valor_asegurable,
'cumplimiento_contrato_fecha_inicio': responseData.cumplimiento_contrato_fecha_inicio,
'cumplimiento_contrato_fecha_fin': responseData.cumplimiento_contrato_fecha_fin,
'persona_prospecto_nombre_primero': responseData.persona_prospecto_nombre_primero || responseData.prospecto_primer_nombre,
'persona_prospecto_nombre_segundo': responseData.persona_prospecto_nombre_segundo || responseData.prospecto_segundo_nombre,
'persona_prospecto_apellido_primero': responseData.persona_prospecto_apellido_primero || responseData.prospecto_primer_apellido,
'persona_prospecto_apellido_segundo': responseData.persona_prospecto_apellido_segundo || responseData.prospecto_segundo_apellido,
'persona_prospecto_email': responseData.persona_prospecto_email || responseData.prospecto_email,
'persona_prospecto_celular': responseData.persona_prospecto_celular || responseData.prospecto_celular
};
for (const [domId, val] of Object.entries(dataMapping)) {
const el = document.getElementById(domId);
if (el && val !== undefined && val !== null) {
el.value = (domId === 'cumplimiento_contrato_valor') ? formatNumberToDots(val) : val;
}
}if(responseData.cumplimiento_coberturas && Array.isArray(responseData.cumplimiento_coberturas)) {
wrapper.innerHTML = '';
responseData.cumplimiento_coberturas.forEach((cob, i) => {
const newRow = document.createElement('div');
newRow.className = 'repeater-row';
const valorFormateado = formatNumberToDots(cob.cumplimiento_cobertura_valor) || '';
let selectModificado = opcionesGlosarioHtml.replace(
`value='${cob.cumplimiento_cobertura_tipo}'`,
`value='${cob.cumplimiento_cobertura_tipo}' selected`
);
if (!selectModificado.includes('selected') && cob.cumplimiento_cobertura_tipo) {
selectModificado = opcionesGlosarioHtml.replace(
`value="${cob.cumplimiento_cobertura_tipo}"`,
`value="${cob.cumplimiento_cobertura_tipo}" selected`
);
}newRow.innerHTML = `