let base64AudioContent="",audioBlobUrl="",destinatarios=[],loginResponse="",TimeDashboard=6e4,AGoHub=(()=>{let e=[];return{getTimeControl:()=>6e4,getParameters:()=>e}})(),NIVEL_ALERTA=Object.freeze({INFORMATIVA:"INFORMATIVA",BAJA:"BAJA",CRITICA:"CRÍTICA",CORTE:"CORTE"}),FRECUENCIA=Object.freeze({INMEDIATA:"INMEDIATA",CADA_30_MIN:"CADA_30_MIN",DIARIA:"DIARIA"}),ESTADO_REGLA=Object.freeze({ACTIVO:"ACTIVO",INACTIVO:"INACTIVO"}),MANAGE_RULES_CANALS=Object.freeze({EMAIL:"EMAIL",WHATSAPP:"WHATSAPP",SMS:"SMS",SISTEMA:"SISTEMA"}),ETAPAS_NEGOCIO=[{value:"",label:"Todas"},{value:"inicio",label:"Inicio"},{value:"reunion-evaluatoria-alcance",label:"Reunión evaluatoria de alcance"},{value:"evaluacion-campania",label:"Evaluación de la campaña"},{value:"propuesta-estrategia",label:"Propuesta de la estrategia"},{value:"presentacion-estrategia",label:"Presentación de la estrategia"},{value:"condiciones-finales",label:"Condiciones finales"}],ESTADOS_NEGOCIO=[{value:"",label:"Todos"},{value:"activo",label:"Activo"},{value:"ganado",label:"Ganado"},{value:"perdido",label:"Perdido"},{value:"cancelado",label:"Cancelado"},{value:"en_revision",label:"En revisión"}],CLARIDAD_NIVELES=Object.freeze({MUY_CLARO:"Muy Claro",CLARO:"Claro",NEUTRO:"Neutro",CONFUSO:"Confuso",MUY_CONFUSO:"Muy Confuso"}),nivelesPredefinidos=[{valor:356,texto:"Administrador"},{valor:175,texto:"Contador"},{valor:165,texto:"Cobranza"},{valor:155,texto:"Cajero"},{valor:145,texto:"Facturador"}],etiquetasFijas={"Evento programado":"EventProg",Recordatorios:"EventReminder","Cumpleaños":"EventBirthday",Tareas:"EventTask","Eventos cerrados":"EventClose"},PUNTUALIDAD_NIVELES=Object.freeze({MUY_SATISFECHO:"Muy Satisfecho",SATISFECHO:"Satisfecho",NEUTRO:"Neutro",INSATISFECHO:"Insatisfecho",MUY_INSATISFECHO:"Muy Insatisfecho"}),SATISFACCION_NIVELES=Object.freeze({MUY_SATISFECHO:"Muy Satisfecho",SATISFECHO:"Satisfecho",NEUTRO:"Neutro",INSATISFECHO:"Insatisfecho",MUY_INSATISFECHO:"Muy Insatisfecho"}),_seguimientosCache=[],ESTADOS_LLAMADAS=[{value:"Planned",option:"Programada"},{value:"Held",option:"Realizada"},{value:"Not Held",option:"No realizada"},{value:"FollowUp",option:"Requiere seguimiento"},{value:"Cancelled",option:"Cancelada"},{value:"In Process",option:"En proceso"}],EntidadTipos={EVENTO:"evento",TICKET:"ticket",NEGOCIO:"negocio",OPORTUNIDAD:"oportunidad"},PLAN_USO=Object.freeze({FREE:"FREE",DEMO:"DEMO",PAY:"PAY",CUSTOM:"CUSTOM"}),API_KEY="PMAK-681b566ab21fed000124fb83-71f90069d9b542b844b59e99c2adc95c8a",COLLECTION_UID="38076310-86bf797a-799f-4beb-9266-882f3e4dac04";function getToken(){try{var e=localStorage.getItem("_login");return e?JSON.parse(e).token||"":(console.warn("No se encontró ningún resultado de login en localStorage."),"")}catch(e){return console.error("Error al obtener el token desde localStorage:",e),""}}function getPermissions(){try{var e,r=localStorage.getItem("_login");return r?(e=JSON.parse(r).configuration?.meta?.Permisos)&&void 0!==e.read&&void 0!==e.write&&void 0!==e.create&&void 0!==e.delete?e:(console.warn("Los permisos no están completos o no existen en el resultado del login."),null):(console.warn("No se encontró ningún resultado de login en localStorage."),null)}catch(e){return console.error("Error al obtener los permisos desde localStorage:",e),null}}function getEmpresaId(){try{var e,r=localStorage.getItem("_login");return r?(e=JSON.parse(r).configuration?.meta?.EmpresaId,Array.isArray(e)&&0{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/setUpdateSqlTable"):a("Error al obtener la URL del servidor.")})}),p=document.getElementById(o).value||"",m=localStorage.getItem("IDUsuario")||0,g=JSON.stringify({token:d,data:{tabla:e,IDname:a,atrib:r,atribValue:p,IdValue:t,IdClave2:n,IdValue2:i,IdUser:m,Delete:0,NuevoUpdate:"1"}}),f=await fetch(u,{method:"POST",headers:{"Content-Type":"application/json"},body:g});if(!f.ok)throw new Error("Error en la solicitud: "+f.statusText);var v=await f.json();v.status?console.log(v.msg):console.warn(v.msg),c&&c(v)}catch(e){console.error("Error en async_set_save:",e)}}async function async_login(e,r,o){try{var a,t,n,i=await getFingerprint(),s=await getIpAddress();i&&s?(t=await _login(e,r,i,s),console.log("Login exitoso:",t),!1===t.estado?(n=t.mensaje||"Acceso denegado por conflicto de sesión.",console.warn(n),o&&o(new Error(n),null)):(t&&t.token&&localStorage.setItem("token",t.token),t&&t.configuration&&t.configuration.meta&&(localStorage.setItem("IDUsuario",t.configuration.meta.IDUsuario),localStorage.setItem("Usuario",t.configuration.meta.Usuario),localStorage.setItem("Name",t.configuration.meta.Name),localStorage.setItem("_login",JSON.stringify(t))),o&&o(null,t))):(a="No se pudo obtener fingerprint o IP",console.warn(a),o&&o(a,null))}catch(e){throw console.error("Error en async_login:",e),o&&o(e,null),e}}async function getFingerprint(){try{return(await(await FingerprintJS.load()).get()).visitorId}catch(e){return console.error("No se pudo obtener el fingerprint:",e),null}}async function getIpAddress(){try{return(await(await fetch("https://api64.ipify.org?format=json")).json()).ip}catch(e){return console.error("No se pudo obtener la IP pública:",e),null}}function _login(o,a,t,n){return new Promise((e,r)=>{try{e(login(o,a,t,n))}catch(e){r(e)}})}function login(e,r,o,s){return new Promise((n,i)=>{try{let a=new Headers({"Content-Type":"application/json"}),t=JSON.stringify({name:e,pass:r,fingerprint:o,ip_address:s});ServicioURLManager.getUrlServicios((e,r)=>{var o;!r&&e&&e[0]&&e[0].Url?(e=e[0].Url+"/getlogin",o={method:"POST",headers:a,body:t,redirect:"follow"},fetch(e,o).then(e=>e.json()).then(e=>n(e)).catch(e=>i(e))):i(r||"Error al recuperar URL del servidor.")})}catch(e){i(e)}})}async function async_pubObj(){try{var e=await _pubObj__(e=>{console.log("Datos procesados en callback:",e)});return e&&console.log("Recuperación exitosa:",e),e}catch(e){throw console.error("Error en async_pubObj:",e),e}}let _pubObj__=o=>new Promise((e,r)=>{try{pubObj(o,e,r)}catch(e){r(e)}});function pubObj(n,i,s){try{let a=getToken(),t=(null!=document.getElementById("IdPublico")&&$("#IdPublico").html(""),new Headers({"Content-Type":"application/json"}));ServicioURLManager.getUrlServicios((e,r)=>{var o;!r&&e&&e[0]&&e[0].Url?(e=e[0].Url+"/getPublicoObjetivo",o={token:a,limitinit:0,limit_last:9999,Like:"",OrderBy:""},o={method:"POST",headers:t,body:JSON.stringify(o),redirect:"follow"},fetch(e,o).then(e=>{if(400<=e.status&&e.status<600)throw new Error("Error de inicio de sesión, verifique credenciales.");return e.json()}).then(e=>{processData(e,n,i)}).catch(e=>{s(e),marco_error(e.message||"Ocurrió un error al recuperar el público objetivo.")})):s(r||"Error al recuperar URL del servidor.")})}catch(e){s(e),console.error("Error en pubObj:",e)}}function processData(e,r,o){var t=e.results||[];if(0<$(".lpspub").length){let a="";t.forEach((e,r)=>{var o=e.Id,e=e.Name,r=0===r?"selected":"";a+=``}),null!=document.getElementById("IdPublico")&&$("#IdPublico").html(a)}else r([{Registros:e}]);o(e)}async function async_fetchPublicoObjetivo(e={},r){var{tipo:e,activo:o}=e,a=getToken();if(!a)throw new Error("Token no encontrado.");a={token:a,...e?{tipo:e}:{},...void 0!==o?{activo:o}:{}},e=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{r||!e?.[0]?.Url?a(r||"Error al recuperar la URL del servidor."):o(e[0].Url)})})+"/getPublicoObjetivo",o={method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a),redirect:"follow"};try{var t,n,i=await fetch(e,o);if(i.ok)return n=await i.json(),"function"==typeof r&&r(n),n;throw t=await i.text(),new Error(`Error ${i.status}: `+(t||"No se pudo recuperar el público objetivo."))}catch(e){throw console.error("async_fetchPublicoObjetivo ➜",e),e}}function exportTableToExcel(e,r="export.xlsx"){var e=document.getElementById(e),o=XLSX.utils.book_new();let a=[],t=(e.querySelectorAll("tr").forEach(e=>{let l=[];e.querySelectorAll("th, td").forEach(e=>{var e=e.innerText.trim(),r=e.match(/^(\d{2})\/(\d{2})\/(\d{4})(?: (\d{2}):(\d{2})(?::(\d{2}))?)?$/);if(r){var[,o,a,t,n="0",i="0",s="0"]=r,t=new Date(t+`-${a}-${o}T${n}:${i}:`+s);if(!isNaN(t.getTime()))return void l.push(t)}if(r=e.match(/^(\d{4})-(\d{2})-(\d{2})(?: (\d{2}):(\d{2})(?::(\d{2}))?)?$/)){var[,a,o,n,i="0",s="0",t="0"]=r,r=new Date(a+`-${o}-${n}T${i}:${s}:`+t);if(!isNaN(r.getTime()))return void l.push(r)}l.push(e)}),a.push(l)}),XLSX.utils.aoa_to_sheet(a));a.forEach((e,o)=>{e.forEach((e,r)=>{r=XLSX.utils.encode_cell({r:o,c:r});e instanceof Date&&(e=0{try{var e=getToken();if(!e)return n(new Error("Token no encontrado."));var{Id:r=0,txtName:i="",Tipo:s="Estatica",Activo:l=1,Delete:c=0,NuevoUpdate:d=1}=u;let o={token:e,data:{codigo:r,txtName:i,Tipo:s,Activo:l,Delete:c,NuevoUpdate:d}},a=new Headers({"Content-Type":"application/json"});ServicioURLManager.getUrlServicios((e,r)=>{r||!e?.[0]?.Url?n(new Error("No se pudo obtener la URL del servicio.")):(r=e[0].Url+"/setPublicoObjetivo",fetch(r,{method:"POST",headers:a,body:JSON.stringify(o),redirect:"follow"}).then(async e=>{var r;if(e.ok)return e.json();throw r=await e.text(),new Error(r||"Error HTTP "+e.status)}).then(e=>{console.log("Respuesta del servidor:",e),t(e)}).catch(e=>{console.error("Error en la petición fetch:",e),n(e)}))})}catch(e){n(e)}})}async function async_getWhatsStatus(e){try{await _getWhatsStatus(e)}catch(e){console.error("Error en async_getWhatsStatus:",e),marco_error(e)}}let _getWhatsStatus=o=>new Promise((e,r)=>{e(getWhatsStatus(o))});async function getWhatsStatus(i){try{let n=getToken();ServicioURLManager.getUrlServicios((e,r)=>{var o,a,t;!r&&e&&e[0]&&e[0].Url?(e=e[0].Url+"/getwhats_status",(o=new Headers).append("Content-Type","application/json"),a=document.getElementById("search")?.value||"",t=0<$(".getwhatsstatus-list-table_v").length?99999:10,t=JSON.stringify({token:n,limitinit:0,limit_last:t,Like:a,OrderBy:""}),fetch(e,{method:"POST",headers:o,body:t,redirect:"follow"}).then(e=>{if(400<=e.status&&e.status<600)throw new Error("Error HTTP: "+e.status);return e.json()}).then(e=>{!0===e.status||"true"===e.status?console.log("Operación exitosa."):console.warn("Error en la operación:",e.msg),i([{data:e}])}).catch(e=>{console.error("Error en la petición fetch:",e),marco_error(e)})):reject(r||"Error al recuperar URL del servidor.")})}catch(e){console.error("Excepción en getWhatsStatus:",e),marco_error("***********"+e)}}async function async_adminStatusWhats(e,r,o,a,t){try{var n=await _adminStatusWhats(e,r,o,a,t);return"true"===n.status||!0===n.status?console.log("Estado actualizado con éxito."):console.log("Error del servidor:",n.msg),n}catch(e){throw console.error("Error al procesar la solicitud:",e.message),e}}function _adminStatusWhats(n,i,s,l,c){return new Promise((a,t)=>{try{if(1!==n||0!==c&&""!==c){var e={txtName:s,closechat:l,Id:c,Delete:n,NuevoUpdate:i=1===n?"99":i},r=getToken();console.log("Objeto a enviar:",e);let o={method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:r,data:e}),redirect:"follow"};ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?(e=e[0].Url+"/setwhats_status",fetch(e,o).then(e=>{if(e.ok)return e.json();throw new Error("Error al actualizar el estado. Por favor, verifique la operación.")}).then(e=>a(e)).catch(e=>t(e))):t(r||"Error al recuperar URL del servidor.")})}else marco_error("Administrador de estados para WhatsApp: por favor seleccione un estado válido a modificar y/o eliminar."),t(new Error("Código no válido para eliminar."))}catch(e){t(e)}})}function base_adminStatusWhats(e,r,o,a,t){return _adminStatusWhats(e,r,o,a,t)}async function async_predefinidos(e="",r=9999,o="",a=()=>{}){try{var t=await _predefinidos_(e,r,o);console.log("Eventos cargados exitosamente",t),a(null,t)}catch(e){console.error("Error al cargar eventos predefinidos",e),a(e,null)}}let _predefinidos_=(o,a,t)=>new Promise((e,r)=>{predefinidos(o,a,t,e,r)});async function predefinidos(t,n,i,s,l,c=()=>{}){try{let a=getToken();ServicioURLManager.getUrlServicios((e,r)=>{var o;!r&&e&&e[0]&&e[0].Url?(e=e[0].Url+"/getEventsCategory",o=JSON.stringify({token:a,limitinit:0,limit_last:n,Like:t,OrderBy:i}),fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:o,redirect:"follow"}).then(e=>{if(e.ok)return e.json();throw new Error(`Error ${e.status}: No se pudo recuperar eventos.`)}).then(e=>{renderEvents(e.results),s(e),c(null,e)}).catch(e=>{l(e),c(e,null)})):l(r||"Error al recuperar URL del servidor.")})}catch(e){l(e),c(e,null)}}function renderEvents(e){if(e&&0!==e.length){var r=document.querySelector("#events_predef");if(r){let t=` `;e.forEach((e,r)=>{var{idevents_category:e,events_category_name:o,events_category_color:a}=e;t+=` `}),t+="
# Nombre Acciones
${r+1} ${o}
",r.innerHTML=t}else console.error("Contenedor no encontrado")}else console.warn("No se encontraron eventos.")}function editEvent(e,r,o){console.log("Editando evento:",{id:e,name:r,color:o})}async function async_setCategoryCalendar(e,r,a,t,n,i,s){try{var l={Profilename:r,Id:e,category:a,Delete:t,NuevoUpdate:n=0!==e&&1===t?"99":n},c={token:getToken(),data:l},d=(console.log(c),JSON.stringify(c));let o={method:"POST",headers:new Headers({"Content-Type":"application/json"}),body:d,redirect:"follow"};ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?(e=e[0].Url+"/setCategoryCalendar",fetch(e,o).then(async e=>{var r;400<=e.status&&e.status<600?s("Error de inicio de sesión, por favor verifique sus credenciales."):200===e.status?(r=await e.json(),i(r.results)):400===e.status&&s("Error")}).catch(e=>{s(e.message)})):s(r||"Error al recuperar URL del servidor.")})}catch(e){s(e.message)}}function admin_events_category_handler(){async_setCategoryCalendar(123,"Nombre de Prueba","Categoría de Ejemplo",1,0,e=>{console.log("Éxito",e),$("#modal_edit_predefini").modal("hide"),async_predefinidos("",9999,"",()=>{console.log("Lista de predefinidos actualizada.")})},e=>{console.error("Error",e),marco_error(e)})}async function async_manageContacts(e,r){try{var o=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/getcontactos"):a(r||"Error al recuperar URL del servidor.")})}),a={token:getToken(),limitinit:0,limit_last:e.limit,Like:e.like,OrderBy:e.orderBy},t={method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)},n=await fetch(o,t);if(!n.ok)throw new Error("Error al obtener contactos: "+n.statusText);r(null,await n.json())}catch(e){console.error("Error en async_fetch_Contacts:",e),r&&r(e)}}function renderContactTable(e,r){let l=``;e.forEach(e=>{var{IDContacto:r,Profilename:o,Movil:a,contactosemails:t,fecha_in:n,lastcontact:i="01/01/1980",DiassinConexion:s=0}=e;l+=``}),l+=`
# Contacto #Móvil #Email Fecha de incorporación Último contacto Días del último contacto Acción
${r} ${o} ${a} ${t} ${n} ${i} ${s}
    `,r&&r(l)}async function async_manageMyContactFrequency(e,r,o,a,t,n,i){var s=getToken();if(o)if(a)if(1!==e||r&&""!==r){s={token:s,data:{Profilename:o,Id:"0"!==r?r:0,Movil:a,contactosemails:t,Delete:e,NuevoUpdate:1===e?"99":r}};try{var l=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/setContactoFrecuente"):a(r||"Error al recuperar URL del servidor.")})}),c=await fetch(l,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)});if(c.ok){var d=await c.json();if(i&&i(d),n)if(document.getElementById(n))try{$("#"+n).modal("hide")}catch(e){console.error("Error al cerrar el modal",e)}}else marco_error("Error de inicio de sesión, por favor verifique sus credenciales.")}catch(e){marco_error(e)}}else marco_error("Por favor seleccione el tipo de cambio a modificar y/o eliminar.");else marco_error("Por favor complete el móvil del contacto");else marco_error("Por favor complete el nombre del contacto")}async function async_fetch_getUsers(e,r){e={limitInit:0,limitLast:1e3,like:"",orderBy:"Usuario",...e};try{var o,a,t,n,i=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getUsers"):a(r||"Error al recuperar URL del servidor.")})}),s=getToken();s?(o={token:s,limitinit:e.limitInit,limit_last:e.limitLast,Like:e.like,OrderBy:e.orderBy},console.log("Filtros de usuarios "),console.log(o),(a=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+s},body:JSON.stringify(o)})).ok?(n=await a.json(),r&&r(n,null)):(t=await a.json(),console.error("Error al obtener usuarios:",t.mensaje||"Error desconocido."),r&&r(null,t))):(console.error("No se encontró el token de autenticación."),r&&r(null,{mensaje:"Token no encontrado."}))}catch(e){console.error("Error durante la operación de fetch:",e),r&&r(null,{mensaje:"Error durante la operación de fetch."})}}async function async_manageEntityUsers(e,r){var o;if(["alta","baja","modificacion"].includes(e.operation)){if(!getPermissions())throw o=new Error("No se encontraron permisos válidos para este usuario."),r&&r(o,null),o;try{var a,t,n,i,s=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/manageEntityUsers"):a(r||"Error al recuperar URL del servidor.")})}),l=getToken();l?(a={operation:e.operation,token:l,...e},(t=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+l},body:JSON.stringify(a)})).ok?(i=await t.json(),r&&r(i,null)):(n=await t.json(),console.error(`Error en la operación ${e.operation}:`,n.mensaje||"Error desconocido."),r&&r(null,n))):(console.error("No se encontró el token de autenticación."),r&&r(null,{mensaje:"Token no encontrado."}))}catch(e){console.error("Error durante la operación asincrónica:",e),r&&r(null,{mensaje:"Error durante la operación."})}}else console.error("Operación no válida:",e.operation),r&&r(null,{mensaje:"Operación no válida."})}async function async_fetch_getUserProfile({limitinit:e,limit_last:r,Like:o="",OrderBy:a=""},t){var n=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getUserProfile"):a(r||"Error al recuperar URL del servidor.")})}),i=getToken(),i=JSON.stringify({token:i,limitinit:e,limit_last:r,Like:o,OrderBy:a});try{var s,l=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:i});if(l.ok)return t(s=await l.json()),s;throw new Error(`Error en la solicitud: ${l.status} - `+l.statusText)}catch(e){throw console.error("Error en async_fetch_getUserProfile:",e),t&&t(e,null),e}}async function async_set_manageEntityRol(e,r){if(!["alta","baja","modificacion"].includes(e.operation))throw o=new Error("Operación inválida."),r&&r(o,null),o;if(!getPermissions())throw o=new Error("No se encontraron permisos válidos para este usuario."),r&&r(o,null),o;var o=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/manageEntityRol"):a(r||"Error al recuperar URL del servidor.")})}),a=getToken(),e=JSON.stringify({operation:e.operation,Descripcion:e.Descripcion,Nivel:e.Nivel,ModulosSistema:e.ModulosSistema,read:e.read,write:e.write,create:e.create,delete:e.delete,..."baja"===e.operation||"modificacion"===e.operation?{Id:e.Id}:{},token:a});try{var t,n=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json"},body:e});if(n.ok)return t=await n.json(),r&&r(t),t;throw new Error(`Error en la solicitud: ${n.status} - `+n.statusText)}catch(e){throw console.error("Error en async_set_manageEntityRol:",e),r&&r(e,null),e}}async function async_fetch_FileUpload(e,r){try{if(!e||"function"!=typeof r)throw new Error("Parámetros inválidos: base64 y callback son obligatorios.");var o=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/files"):a(r||"Error al recuperar URL del servidor.")})});if(!o)throw new Error("Error al obtener la URL del servicio.");var a=getToken();if(!a)throw new Error("No se encontró un token válido para la autenticación.");var t=new Headers({"Content-Type":"text/plain",Authorization:"Bearer "+a});fetch(o,{method:"POST",headers:t,body:e,redirect:"follow"}).then(async e=>{if(!e.ok)throw new Error("Error en el servidor: "+e.statusText);e=await e.text();r(null,{url:e})}).catch(e=>{r(e,null)})}catch(e){console.error("Error en async_fetch_FileUpload:",e.message),r(e,null)}}let FotoTipos={PERSONAL:"PE",TEMPLATE:"T",PRODUCTO:"P",WORKFLOW:"W",PRESUPUESTOS:"PR",COTIZACIONES:"CO",TICKETS:"TI",EVENTOS:"EV",CHATBOT_companyLogoUrl:"CU",CHATBOT_imageUrl:"CI",CHATBOT_companyLogo:"CL",CHATBOT_chatbotimage:"CC"},Entidades=[{Id:8,Name:"Proveedor"},{Id:5,Name:"Partners"},{Id:9,Name:"Cliente"},{Id:7,Name:"Mis contactos"},{Id:6,Name:"Clientes Potenciales"}],ModulosSistema={ERP:51,BEST_ROUTE:52,CRM:53,COBRANZA:54,GESTION_VEHICULAR:55,BEQUICK:56,ONE_SERVICE:57,LINA_PLATFORM:58,CFE:59,AGO_GO:10,AGO_POCKET:11,AGO_CARE:12},SONIDOS=[{id:"beep-Promise",nombre:"Promise",url:"https://ago-gen.s3.us-east-2.amazonaws.com/notificaciones/promise-616.mp3",descripcion:"Promesa"},{id:"beep-Solemn",nombre:"Solemn",url:"https://ago-gen.s3.us-east-2.amazonaws.com/notificaciones/solemn-522.mp3",descripcion:"Un anuncio importante está a punto de ser transmitido.."},{id:"beep-Direct",nombre:"Direct",url:"https://ago-gen.s3.us-east-2.amazonaws.com/notificaciones/direct-545.mp3",descripcion:"Sonido percusivo repetido 4 veces, transmitiendo un sentido de urgencia.."}],NIVELES_ROLES=[{key:"ADMINISTRADOR",valor:356,label:"Administrador",permisos:["read","write","create","delete"]},{key:"CONTADOR",valor:175,label:"Contador",permisos:["read"]},{key:"CONTROL_DEUDAS",valor:165,label:"Cobranza",permisos:["read","write"]},{key:"CAJA",valor:155,label:"Cajero",permisos:["read"]},{key:"FACTURADOR",valor:145,label:"Facturador",permisos:["read","create"]},{key:"APP",valor:151,label:"App",permisos:[]},{key:"VENDEDOR",valor:162,label:"Vendedor",permisos:["read","write"]},{key:"VitaCRM",valor:300,label:"VitaCRM",permisos:["read","write"]}];function cargarOpcionesNivel(e){let o=document.getElementById(e);o.innerHTML='',NIVELES_ROLES.forEach(e=>{var r=document.createElement("option");r.value=e.valor,r.textContent=e.label+` (${e.valor})`,r.dataset.permisos=e.permisos.join(","),o.appendChild(r)})}async function async_manageFotos({Id:e,Url:r,Tipo:o,type:a,Name:t},n){try{n(await fetch_manageFotos({Id:e,Url:r,Tipo:o,type:a,Name:t}))}catch(e){console.error("Error en async_manageFotos:",e),n(null,e)}}function fetch_manageFotos({Id:o,Url:a,Tipo:t,type:n,Name:i}){return new Promise((e,r)=>{manageFotos({Id:o,Url:a,Tipo:t,type:n,Name:i}).then(e).catch(r)})}async function manageFotos({Id:e,Url:r,Tipo:o,type:a,Name:t}){try{var n=await getToken();if(!n)throw new Error("Token no válido o no encontrado.");var i={token:n,ID:e,Tipo:o,Url:r,type:a,Name:t},s={"Content-Type":"application/json"},l=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url||a("Error al obtener la URL del servidor."),o(e[0].Url+"/setFotos")})}),c={method:"POST",headers:s,body:JSON.stringify(i)},d=await fetch(l,c);if(d.ok)return await d.json();throw new Error("Error en la solicitud: "+d.statusText)}catch(e){throw console.error("Error en manageFotos:",e),e}}function cargarComboNiveles(e,r){let a=document.getElementById(e);var o;a?(a.innerHTML="",(o=document.createElement("option")).value="",o.textContent="-- Seleccione un nivel --",a.appendChild(o),Object.entries(r).forEach(([e,r])=>{var o=document.createElement("option");o.value=r,o.textContent=e+` (Nivel: ${r})`,a.appendChild(o)})):console.error(`Elemento con ID "${e}" no encontrado.`)}function cargarComboModulos(e,r){let a=document.getElementById(e);var o;a?(a.innerHTML="",(o=document.createElement("option")).value="",o.textContent="-- Seleccione un módulo --",a.appendChild(o),Object.entries(r).forEach(([e,r])=>{var o=document.createElement("option");o.value=r,o.textContent=e+` (ID: ${r})`,a.appendChild(o)})):console.error(`Elemento con ID "${e}" no encontrado.`)}function renderMenu(o,a,t){try{if(!Array.isArray(o))throw new Error("El parámetro 'menuArray' debe ser un array.");if("number"!=typeof a)throw new Error("El parámetro 'moduleId' debe ser un número.");if("string"!=typeof t||!t.trim())throw new Error("El parámetro 'containerId' debe ser un string no vacío.");var e=document.getElementById(t);if(!e)throw new Error(`No se encontró un contenedor con el ID '${t}'.`);e.innerHTML="",console.log(o);var n=o.find(e=>e.moduleId===a);if(!n)throw new Error(`No se encontró un módulo con el ID ${a}.`);let r="";n.menuModules.forEach(e=>{r=(r+=``)+function r(e){let o="";return e.forEach(e=>{e.subitems&&Array.isArray(e.subitems)&&0
    ${e.name}
    `:o+=` `}),o}(e.items)}),e.innerHTML=r}catch(e){console.error("Error en renderMenu:",e.message);o=document.getElementById(t);o&&(o.innerHTML='')}}function loadSubmenuToCombo(e,r){try{let o=document.getElementById(r);if(!o)throw new Error(`No se encontró un combo con el ID '${r}'.`);o.innerHTML='',e.forEach(e=>{e.menuModules.forEach(e=>{e.items.forEach(e=>{e.subitems&&Array.isArray(e.subitems)&&e.subitems.forEach(e=>{var r=document.createElement("option");r.value=e.itemId,r.textContent=e.name,o.appendChild(r)})})})})}catch(e){console.error("Error en loadSubmenuToCombo:",e.message)}}function handleCheckboxChange(e){console.log("Checkbox cambiado ----------\x3e:",e);var r="alta";async_managePermisos({operation:r="uncheck"==e.action?"baja":r,idperfil:e.PerfilId,idpkSubmodulo:e.itemId,IdModulo:e.moduleId},(e,r)=>{e?console.error("Error:",e.message):console.log("Resultado:",r)})}function loadModuleItemsToGridSelect(e,s,r,l,c,o={}){try{var a=document.getElementById(r);if(!a)throw new Error(`No se encontró un contenedor con el ID '${r}'.`);a.innerHTML="";var t=e.find(e=>parseInt(e.moduleId)===parseInt(s));if(!t||!Array.isArray(t.menuModules))throw new Error(`No se encontraron items para el módulo con ID ${s}.`);var d=document.createElement("table"),u=(d.className="table table-bordered table-hover",document.createElement("thead"));u.innerHTML=` Nombre ID Seleccionar `,d.appendChild(u);let n=document.createElement("tbody"),i=o.find(e=>parseInt(e.IdModulo)===parseInt(s))?.Submodulos.map(e=>parseInt(e.idpkSubmodulo))||[];t.menuModules.forEach(e=>{!function t(e){e.forEach(r=>{var e=document.createElement("tr");(o=document.createElement("td")).textContent=r.name,e.appendChild(o);(o=document.createElement("td")).textContent=r.itemId,e.appendChild(o);var o=document.createElement("td");let a=document.createElement("input");a.type="checkbox",a.className="form-check-input",a.dataset.itemId=r.itemId,a.dataset.moduleId=s,i.includes(parseInt(r.itemId))&&(a.checked=!0),a.addEventListener("change",()=>{var e=a.checked?"check":"uncheck",e={itemId:r.itemId,moduleId:s,name:r.name,PerfilId:c,action:e};l(e)}),o.appendChild(a),e.appendChild(o),n.appendChild(e),Array.isArray(r.subitems)&&t(r.subitems)})}(e.items)}),d.appendChild(n),a.appendChild(d)}catch(e){console.error("Error en loadModuleItemsToGridSelect:",e.message)}}function parseMenuPerfil(e){let r={};return e.forEach(e=>{r[e.IdModulo]=e.Submodulos.map(e=>e.Id)}),r}function getValidModules(e,r){try{var o=e.MenuPerfil.filter(e=>e.IdModulo===r);if(o.length)return o.map(e=>{if(Array.isArray(e.Submodulos))return{IdModulo:e.IdModulo,Submodulos:e.Submodulos};throw new Error(`El módulo con ID ${r} no contiene un array válido de submódulos.`)});throw new Error(`No se encontraron módulos para el ID ${r}.`)}catch(e){return console.error("Error en getValidModules:",e.message),[]}}function loadSubmodulesToCombo(e,r,t,n,o){try{let a=document.getElementById(r);if(!a)throw new Error(`No se encontró un combo con el ID '${r}'.`);var i=getValidModules(e,t);if(!i.length)throw new Error(`No se encontraron submódulos válidos para el ID del módulo ${t}.`);a.innerHTML='',i.forEach(e=>{e.Submodulos.forEach(e=>{var r,o=findMenuItem(n,t,e.idpkSubmodulo);o&&((r=document.createElement("option")).value=e.Id,r.textContent=o.name,a.appendChild(r))})}),"function"==typeof o&&o(null,{success:!0,message:"Submódulos cargados correctamente."})}catch(e){console.error("Error en loadSubmodulesToCombo:",e.message),"function"==typeof o&&o(e,null)}}function findMenuItem(e,r,o){e=e.find(e=>e.moduleId===r);if(e&&Array.isArray(e.menuModules))for(var a of e.menuModules){var t,n=a.items.find(e=>e.itemId===o);if(n)return n;for(t of a.items)if(t.subitems){var i=t.subitems.find(e=>e.itemId===o);if(i)return i}}return null}function getValidModulesRenderMenu(e,o,a){try{var r=e.MenuPerfil.filter(e=>e.IdModulo===a);if(r.length)return r.map(e=>{var r;if(Array.isArray(e.Submodulos))return r=e.Submodulos.map(r=>{var e=findParentMenuModule(o,a,r.idpkSubmodulo);if(e)return e=e.items.filter(e=>e.itemId===r.idpkSubmodulo||e.subitems&&e.subitems.some(e=>e.itemId===r.idpkSubmodulo)),{...r,items:e};throw new Error(`No se encontró un módulo padre para el itemId ${r.idpkSubmodulo}.`)}),{IdModulo:e.IdModulo,Submodulos:r};throw new Error(`El módulo con ID ${a} no contiene un array válido de submódulos.`)});throw new Error(`No se encontraron módulos para el ID ${a}.`)}catch(e){return console.error("Error en getValidModulesRenderMenu:",e.message),[]}}function renderMenuFromFilteredModules(e,r,t){try{var n=document.getElementById(r);if(!n)throw new Error(`No se encontró un contenedor con el ID '${r}'.`);n.innerHTML="";let a={},o=(e.forEach(o=>{o.Submodulos.forEach(e=>{var r=findParentMenuModule(menu,o.IdModulo,e.idpkSubmodulo);r?(r=r.module,a[r]||(a[r]={items:[]}),a[r].items.push(...e.items)):console.warn(`No se encontró un módulo padre para el ID ${o.IdModulo} con itemId `+e.idpkSubmodulo)})}),"");Object.entries(a).forEach(([e,r])=>{o+=``,r.items.forEach(e=>{o+=generateMenuItemHtml(e)})}),n.innerHTML=o,"function"==typeof t&&t(null,{success:!0,message:"Menú renderizado correctamente."})}catch(e){console.error("Error en renderMenuFromFilteredModules:",e.message),"function"==typeof t&&t(e,null)}}function generateMenuItemHtml(e){return e.subitems&&Array.isArray(e.subitems)&&0
    ${e.name}
    `:` `}function appendMenuItem(e,o){var a=document.createElement("li"),r=(a.className="menu-item",document.createElement("a"));if(r.href=o.route||"#",r.textContent=o.name,r.className="menu-link",a.appendChild(r),o.subitems&&Array.isArray(o.subitems)){let r=document.createElement("ul");r.className="menu-submodule",o.subitems.forEach(e=>{appendMenuItem(r,e)}),a.appendChild(r)}e.appendChild(a)}function findParentMenuModule(e,r,o){e=e.find(e=>e.moduleId===r);if(e&&Array.isArray(e.menuModules))for(var a of e.menuModules)if(a.items.some(e=>e.itemId===o||e.subitems&&e.subitems.some(e=>e.itemId===o)))return a;return null}function enviarNotificacion(e,r,o,a,t,n,i){let s=new Notification(r,{body:o,icon:a,vibrate:[200,100,200],data:{id:e,esGrave:n}});t?new Audio(t).play().then(()=>{i&&i(null,"Sonido reproducido correctamente")}).catch(e=>{console.error("Error reproduciendo el sonido:",e),i&&i(e,null)}):i&&i(null,"No se proporcionó URL para el sonido"),s.onclick=()=>{window.focus(),marcarComoLeido(s.data.id)},n&&destinatarios.forEach(e=>{e.recibirPorWhatsApp&&enviarPorWhatsApp(e,o),e.recibirPorEmail&&enviarPorEmail(e,r,o)})}function marcarComoLeido(e){console.log("Marcando cómo leído el mensaje ")}function enviarPorWhatsApp(e,r){console.log("Enviando email")}function enviarPorEmail(e,r,o){console.log("Enviando Email")}function controlMenuFromLogin(e,r,o){if(e&&e.configuration&&e.configuration.meta){var a=e.configuration.meta,t=a.Nivel,n=a.MenuPerfil,e=e.configuration.ConfigEmpresa;if(e&&98===e.Partners)document.location.href="../FS/index.php?languaje=en";else if(e&&!Object.values(ModulosSistema).includes(e.Partners))console.error("El Partner no está dentro de los módulos del sistema: Verifique el valor de ConfigEmpresa.Partners."),document.location.href="../erp/erp.php?languaje=en",o&&o(new Error("El Partner no está dentro de los módulos del sistema y se ha redirigido."));else{if(!n||0===n.length){if(!(350<=t))return console.error("El perfil del menú está vacío: Asegúrese de que loginResponse.configuration.meta.MenuPerfil no esté vacío y el nivel sea menor a 350."),void(o&&o(new Error("El perfil del menú está vacío y el nivel es menor a 350.")));console.warn("El perfil del menú está vacío, pero el nivel es mayor o igual a 350. Continuando con el flujo.")}e=n[0]?.IdModulo;e?350<=t?(renderMenu(menu,e,r),o&&o(null,"Menu renderizado con módulo principal.")):(renderMenuFromFilteredModules(getValidModulesRenderMenu(a,menu,e),r),o&&o(null,"Menu renderizado con módulos filtrados.")):(console.error("No se pudo obtener el ID del módulo principal del menú: Asegúrese de que MenuPerfil[0].IdModulo sea válido."),o&&o(new Error("No se pudo obtener el ID del módulo principal del menú.")))}}else console.error("Datos de respuesta inválidos: Verifique que loginResponse contenga configuration y meta."),o&&o(new Error("Datos de respuesta inválidos: Faltan campos esenciales en loginResponse."))}async function async_managePermisos({operation:e,idpk:r,idperfil:o,idpkSubmodulo:a,IdModulo:t},n){try{var i;if(!getPermissions())throw i=new Error("No se encontraron permisos válidos para este usuario."),n&&n(i,null),i;if(!e||!["alta","modificacion","baja"].includes(e))throw new Error("Operación no válida. Debe ser 'alta', 'modificacion' o 'baja'.");var s=getToken();if(!s)throw new Error("Token no encontrado o inválido.");var l,c,d={token:s,operation:e,idpk:r||null,idperfil:o||null,idpkSubmodulo:a||null,IdModulo:t||null},u=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url||a("Error al obtener la URL del servidor."),o(e[0].Url+"/setUsuControl")})}),p=await fetch(u,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+s},body:JSON.stringify(d)});if(p.ok)return c=await p.json(),n&&n(null,c),c;throw l=await p.json(),new Error(l.message||"Error en el servicio.")}catch(e){console.error("Error en async_managePermisos:",e.message),n&&n(e,null)}}async function handleMicrophone(a){try{let r=await navigator.mediaDevices.getUserMedia({audio:!0}),e=new MediaRecorder(r),o=[];e.ondataavailable=e=>{0{var e=new Blob(o,{type:"audio/webm"});base64AudioContent=await blobToBase64(e),audioBlobUrl=URL.createObjectURL(e),document.getElementById("playButton").disabled=!1,"function"==typeof a&&a(null,base64AudioContent),r.getTracks().forEach(e=>e.stop())},e.start(),setTimeout(()=>e.stop(),5e3)}catch(e){console.log(e),"function"==typeof a?a(e,null):console.error("Error al acceder al micrófono:",e)}}function blobToBase64(a){return new Promise((e,r)=>{let o=new FileReader;o.onloadend=()=>e(o.result.split(",")[1]),o.onerror=r,o.readAsDataURL(a)})}async function async_fetch_Plantillas(r,o){try{if(!getPermissions())throw new Error("No se encontraron permisos válidos para este usuario.");var a=getToken();if(!a)throw new Error("Token de autenticación no encontrado.");var{limitinit:t,limit_last:n,Like:i="",OrderBy:s="",Id:l=0,configuracion:c=!1}=r;if("number"!=typeof t||"number"!=typeof n)throw new Error("Parámetros requeridos faltantes o inválidos: limitinit, limit_last.");var d=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url||a("Error al obtener la URL del servidor."),o(e[0].Url+"/getPlantillas")})}),u={token:a,limitinit:t,limit_last:n,Like:i,OrderBy:s,Id:l},p=await fetch(d,{method:"POST",headers:{Authorization:"Bearer "+a,"Content-Type":"application/json"},body:JSON.stringify(u)});if(!p.ok)throw new Error("Error en el servicio: "+p.statusText);var m=await p.json();let e=[];if(l&&m.plantilla)e=[m.plantilla];else{if(!m.plantillas)throw new Error("Respuesta inesperada del servidor.");e=m.plantillas}c&&(e=e.filter(e=>["Regex","NOTQUESTION","WELCOME","BLANCK"].includes(e.WhastTipMsg))),"function"==typeof o&&o(e,null)}catch(e){console.error("Error en async_fetch_Plantillas:",e),"function"==typeof o&&o(null,e)}}function formatDateTime(e){var[e,r]=e.split(" "),[e,o,a]=e.split("-");return a+`/${o}/${e} `+r}function convertirTextoAHTML(e){e=e.split("\n");let r="",o=!1,a=!1;return e.forEach(e=>{e=e.trim();e.startsWith("1.")?(o||(r+="
      ",o=!0),r+=`
    1. ${e.slice(2).trim()}
    2. `):e.startsWith("-")?(a||(r+="
        ",a=!0),r+=`
      • ${e.slice(1).trim()}
      • `):""===e?(o&&(r+="
    ",o=!1),a&&(r+="",a=!1)):r+=`

    ${e}

    `}),o&&(r+=""),a&&(r+=""),r}async function fetchTrainingData({chatbotId:e,apiKey:r},o){try{var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/chatbot/training/api"):a("Error al obtener la URL del servidor")})}),t=new Headers,n=(t.append("botId",e),t.append("apiKey",r),{method:"GET",headers:t,redirect:"follow"}),i=await fetch(a,n);if(!i.ok)throw new Error("Error en el servicio: "+i.statusText);o(null,await i.text())}catch(e){console.error("Error en fetchTrainingData:",e),o(e)}}async function async_fetch_getEtiquetas({Like:e="",limitinit:r=0,limit_last:o=10,OrderBy:a="",Id:t=""},n){var i=getToken();if(!i)throw new Error("El token es obligatorio.");var s=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url||a("Error al obtener la URL del servidor."),o(e[0].Url+"/getEtiquetas")})}),i={method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:i,Like:e,limitinit:r,limit_last:o,OrderBy:a,Id:t})};try{var l,c=await fetch(s,i);if(!c.ok)throw l=await c.text(),new Error(`Error en el servicio: ${c.statusText} - `+l);n(await c.json())}catch(e){throw console.error("Error en async_fetch_getEtiquetas:",e),e}}function async_uploadFile(a,t,n,i,r){a&&t&&n&&i&&"function"==typeof r?new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/chatbot/training/files"):a(r||"Error al recuperar URL del servidor.")})}).then(e=>{if(!e)throw new Error("Error al obtener la URL del servicio.");var r,o=getToken();if(o)return(r=new Headers).append("apiKey",n),r.append("botId",i),r.append("Authorization","Bearer "+o),r.append("Content-Type","application/json"),o=JSON.stringify({fileName:a,data:t}),fetch(e,{method:"POST",headers:r,body:o});throw new Error("No se encontró un token válido para la autenticación.")}).then(e=>{if(e.ok)return e.json();throw new Error("Error en la carga del archivo: "+e.statusText)}).then(e=>{r(e)}).catch(e=>{console.error("Error en async_uploadFile:",e),r({error:e.message})}):r({error:"Parámetros inválidos: fileName, base64, apiKey, botId y callback son obligatorios."})}async function eliminarArchivoChatbot(e,r){try{var{fileId:o,apiKey:a,botId:t}=e;if(!o||!a||!t)throw new Error("Los parámetros fileId, apiKey y botId son obligatorios.");var n=getToken();if(!n)throw new Error("No se encontró un token válido para la autenticación.");var i,s=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/chatbot/training/files"):a("Error al recuperar URL del servidor.")})}),l=new Headers,c=(l.append("Authorization","Bearer "+n),l.append("apiKey",a),l.append("botId",t),{method:"DELETE",headers:l,redirect:"follow"}),d=await fetch(s+"/"+o,c);if(d.ok)return i=await d.json(),r&&r(i),i;throw new Error("Error en la operación: "+d.statusText)}catch(e){throw console.error("Error en eliminarArchivoChatbot:",e),e}}async function async_fetch_TrainingFiles({apiKey:e,botId:r},o){try{fetch_TrainingFiles({apiKey:e,botId:r},o)}catch(e){console.error("Error en async_fetch_TrainingFiles:",e),o(null,e)}}function fetch_TrainingFiles({apiKey:t,botId:n},i){(async()=>{try{var e=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/chatbot/training/files"):a("Error al recuperar URL del servidor.")})}),r=new Headers({apiKey:t,botId:n}),o=await fetch(e,{method:"GET",headers:r,redirect:"follow"});if(!o.ok)throw new Error("Error HTTP! Estado: "+o.status);var a=await o.text();i(a,null)}catch(e){console.error("Error en fetchTrainingFiles:",e),i(null,e)}})()}async function manageEntityChatbotQA(e,r){var{apiKey:o,botId:a,operation:t,id:n,data:i}=e;if(!["alta","modificacion","baja","consulta"].includes(t))throw new Error("Operación no válida. Use 'alta', 'modificacion', 'baja' o 'consulta'.");if(console.log(e),("modificacion"===t||"baja"===t)&&!e.id)throw new Error("El ID es obligatorio para las operaciones 'modificacion' y 'baja'.");if(("alta"===t||"modificacion"===t)&&!i)throw new Error("Los datos son obligatorios para las operaciones 'alta' y 'modificacion'.");e=getToken();if(!e)throw new Error("No se encontró un token válido para la autenticación.");var s=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/chatbot/training/qa"):a("Error al recuperar URL del servidor.")})}),l=new Headers,o=(l.append("apiKey",o),l.append("botId",a),l.append("Content-Type","application/json"),l.append("Authorization","Bearer "+e),JSON.stringify(i)),a={method:"baja"===t?"DELETE":"modificacion"===t?"PUT":"consulta"===t?"GET":"POST",headers:l,body:"baja"===t||"consulta"===t?null:o,redirect:"follow"};try{var c,d=await fetch("consulta"===t?s:s+"/"+(n||""),a);if(d.ok)return c=await d.json(),r&&r(c),c;throw new Error("Error en la solicitud: "+d.statusText)}catch(e){throw console.error("Error en manageEntityChatbotQA:",e),e}}let emojiCategories={"Más Usados":[],"Caritas y Personas":["😀","😁","😂","😃","😄","😅","😆","😇","😈","😉"],"Animales y Naturaleza":["🐕","🐙","🐢","🐥","🐨","🐱","🐻","🐿","🐵","🐒"],"Comida y Bebida":["🍕","🍖","🍗","🍙","🍚","🍝","🍤","🍧","🍫","🍳"],Objetos:["💻","📱","📺","🔧","🔨","🔮","🕐","🕑","🕒","🕓"],"Símbolos":["❤","💖","💗","💘","💙","💚","💛","💜","💝","💞"]};class EmojiHandler{constructor(e,r,o,a){this.emojiListElement=e,this.inputElement=r,this.emojiCategories=o,this.mostUsedEmojis=a}toggleEmojiList(){this.emojiListElement.style.display="block"===this.emojiListElement.style.display?"none":"block"}insertEmoji(e){this.inputElement.value+=this.decodeHtmlEntity(e),this.emojiListElement.style.display="none",this.trackMostUsed(e)}decodeHtmlEntity(e){var r=document.createElement("textarea");return r.innerHTML=e,r.value}trackMostUsed(e){this.mostUsedEmojis[e]?this.mostUsedEmojis[e]++:this.mostUsedEmojis[e]=1,this.updateMostUsedCategory()}updateMostUsedCategory(){this.emojiCategories["Más Usados"]=Object.keys(this.mostUsedEmojis).sort((e,r)=>this.mostUsedEmojis[r]-this.mostUsedEmojis[e]).slice(0,10),this.refreshEmojiList()}populateEmojiList(){var e,r;this.emojiListElement.innerHTML="";for(e of["Más Usados",...Object.keys(this.emojiCategories).filter(e=>"Más Usados"!==e)])0{var r=document.createElement("span");r.innerHTML=e,r.onclick=()=>this.insertEmoji(e),this.emojiListElement.appendChild(r)}))}refreshEmojiList(){this.populateEmojiList()}}function getParamsFromURL(r){try{var e=new URLSearchParams(window.location.search);let o={};e.forEach((e,r)=>{o[r]=e}),0{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/short/getResultToken"):a("Error al recuperar URL del servidor.")})}),a=new Headers,t=(a.append("Content-Type","application/json"),JSON.stringify({token:e})),n=await fetch(o,{method:"POST",headers:a,body:t,redirect:"manual"});if(!n.ok)throw new Error(`Error en la solicitud: ${n.status} `+n.statusText);r(null,(await n.json()).url)}catch(e){r(e,null)}}function initMapWithMarkers(e,r){let n=L.map("map").setView(e.center,e.zoom);L.tileLayer(e.tileLayer).addTo(n),r.forEach(e=>{var{lat:e,lng:r,title:o,icon:a,radius:t}=e,a={title:o,icon:L.icon(a)};L.marker([e,r],a).addTo(n).bindPopup(o);t&&L.circle([e,r],{color:"red",fillColor:"#f03",fillOpacity:.1,radius:t}).addTo(n)});try{document.getElementById("loader").style.display="none"}catch(e){}}async function async_fetchLastTransactions(e,r,o,a,t,n){try{var i=getToken();if(i){var s=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getLastTransaction"):a(r||"Error al recuperar URL del servidor.")})}),l={"Content-Type":"application/json",Authorization:"Bearer "+i},c=JSON.stringify({token:i,Since:e,until:r,horIni:o,horFin:a,Limit:t}),d=await fetch(s,{method:"POST",headers:l,body:c});if(!d.ok)throw new Error("Error en el servicio: "+d.statusText);n(null,await d.json())}else console.error("No se encontró el token de autenticación."),n(null,{mensaje:"Token no encontrado."})}catch(e){n(e,null)}}async function async_getActiveSesion(e,r){try{var o=getToken();if(o){var{Since:a,until:t,horIni:n="",horFin:i="",Limit:s=0,GroupBy:l="day"}=e,c=JSON.stringify({token:o,Since:a,until:t,horIni:n,horFin:i,Limit:""+s,GroupBy:l}),d=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/getActiveSesion"):a(r||"Error al obtener la URL del servidor.")})}),u=await fetch(d,{method:"POST",headers:{"Content-Type":"application/json"},body:c});if(!u.ok)throw new Error("Error en el servicio: "+u.statusText);r(await u.json(),null)}else console.error("Token no encontrado."),r(null,{mensaje:"Token no encontrado."})}catch(e){console.error("Error en async_getActiveSesion:",e),r(null,e)}}async function async_manageEntityTicket(e,r){try{var o,a;if(["alta","modificacion","baja"].includes(e.operation)){if(!getPermissions())throw o=new Error("No se encontraron permisos válidos para este usuario."),r&&r(o,null),o;if("baja"===e.operation&&e.idpk<5)throw a=new Error("No se puede eliminar un estado con ID menor a 5, es parte de la configuración del sistema."),r&&r(a,null),a;var t,n,i,s,l=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/setEstadoTicket"):a(r||"Error al recuperar URL del servidor.")})}),c=getToken();c?(t={...e,token:c},(n=await fetch(l,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})).ok?(s=await n.json(),r&&r(null,s)):(i=await n.json(),console.error("Error en el servicio:",i),r&&r(null,i))):(console.error("No se encontró el token de autenticación."),r&&r(null,{mensaje:"Token no encontrado."}))}else console.error("Operación no válida:",e.operation),r&&r(null,{mensaje:"Operación no válida."})}catch(e){console.error("Error en async_manageEntityTicket:",e),r&&r(e,null)}}async function getEntity(e,r){try{var o,a,t,n,i=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getEstadoTicket"):a(r||"Error al recuperar URL del servidor.")})}),s=getToken();s?(o=JSON.stringify({token:s,idpk:e.idpk||0,filters:e.filters||{}}),(a=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json"},body:o})).ok?(n=await a.json(),r&&r(null,n)):(t=await a.text(),console.error("Error en la solicitud POST:",t),r&&r(null,t))):(console.error("No se encontró el token de autenticación."),r&&r(null,{mensaje:"Token no encontrado."}))}catch(e){console.error("Error en getEntity:",e),r&&r(e,null)}}async function async_managePriority(e,r){try{var o;if(["alta","modificacion","baja"].includes(e.operation)){if(!getPermissions())throw o=new Error("No se encontraron permisos válidos para este usuario."),r&&r(o,null),o;var a,t=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/setPriority"):a(r||"Error al recuperar URL del servidor.")})});if("baja"===e.operation&&e.id_priority<7)throw a=new Error("No se puede eliminar una prioridad con ID menor a 7, es parte de la configuración del sistema."),r&&r(a,null),a;var n=getToken();if(n){var i,s,l={token:n,...e},c=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(l)});if(c.ok)return s=await c.json(),r&&r(null,s),s;i=await c.json(),console.error("Error en la respuesta del servidor:",i),r&&r(null,{mensaje:i.message})}else console.error("No se encontró el token de autenticación."),r&&r(null,{mensaje:"Token no encontrado."})}else console.error("Operación no válida:",e.operation),r&&r(null,{mensaje:"Operación no válida."})}catch(e){console.error("Error en async_managePriority:",e),r&&r(e,null)}}async function getEntity_Priorities(e,r){try{var o,a,t,n,i=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getPriorities"):a(r||"Error al recuperar URL del servidor.")})}),s=getToken();s?(o=JSON.stringify({token:s,idpk:e.idpk||0,filters:e.filters||{}}),(a=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json"},body:o})).ok?(n=await a.json(),r&&r(null,n)):(t=await a.text(),console.error("Error en la solicitud POST:",t),r&&r(null,t))):(console.error("No se encontró el token de autenticación."),r&&r(null,{mensaje:"Token no encontrado."}))}catch(e){console.error("Error en getEntity_Priorities:",e),r&&r(e,null)}}async function async_managePipeline(e,r){try{var o;if(["alta","modificacion","baja"].includes(e.operation)){if(!getPermissions())throw o=new Error("No se encontraron permisos válidos para este usuario."),r&&r(o,null),o;var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/setPipeline"):a(r||"Error al recuperar URL del servidor.")})}),t=getToken();if(t){var n,i,s={token:t,...e},l=(console.log("************ piperline"),console.log(s),await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)}));if(l.ok)return i=await l.json(),r&&r(null,i),i;n=await l.json(),console.error("Error en la respuesta del servidor:",n),r&&r(null,{mensaje:n.message})}else console.error("No se encontró el token de autenticación."),r&&r(null,{mensaje:"Token no encontrado."})}else console.error("Operación no válida:",e.operation),r&&r(null,{mensaje:"Operación no válida."})}catch(e){console.error("Error en async_managePipeline:",e),r&&r(e,null)}}async function getEntity_Pipeline(e,r){try{var o=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getPipeline"):a(r||"Error al recuperar URL del servidor.")})}),a=getToken();if(a){var t,n,i=JSON.stringify({token:a,id:e.idpk||0,filters:e.filters||{}}),s=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json"},body:i});if(s.ok)return n=await s.json(),r&&r(null,n),n;t=await s.text(),console.error("Error en la solicitud POST:",t),r&&r(null,t)}else console.error("No se encontró el token de autenticación."),r&&r(null,{mensaje:"Token no encontrado."})}catch(e){console.error("Error en getEntity_Pipeline:",e),r&&r(e,null)}}async function async_manageFuente(e,r){try{var o;if(["alta","modificacion","baja"].includes(e.operation)){if(!getPermissions())throw o=new Error("No se encontraron permisos válidos para este usuario."),r&&r(o,null),o;var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/setFuente"):a(r||"Error al recuperar URL del servidor.")})}),t=getToken();if(t){var n,i,s={token:t,...e},l=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)});if(l.ok)return i=await l.json(),r&&r(null,i),i;n=await l.json(),console.error("Error en la respuesta del servidor:",n),r&&r(null,{mensaje:n.message})}else console.error("No se encontró el token de autenticación."),r&&r(null,{mensaje:"Token no encontrado."})}else console.error("Operación no válida:",e.operation),r&&r(null,{mensaje:"Operación no válida."})}catch(e){console.error("Error en async_manageFuente:",e),r&&r(e,null)}}async function getEntity_Fuente(e,r){try{var o=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getFuente"):a(r||"Error al recuperar URL del servidor.")})}),a=getToken();if(a){var t,n,i=JSON.stringify({token:a,id:e.idpk||0,filters:e.filters||{}}),s=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json"},body:i});if(s.ok)return n=await s.json(),r&&r(null,n),n;t=await s.text(),console.error("Error en la solicitud POST:",t),r&&r(null,t)}else console.error("No se encontró el token de autenticación."),r&&r(null,{mensaje:"Token no encontrado."})}catch(e){console.error("Error en getEntity_Fuente:",e),r&&r(e,null)}}async function async_manageTicket(e,r){try{var o;if(["alta","modificacion","baja"].includes(e.operation)){if(!getPermissions())throw o=new Error("No se encontraron permisos válidos para este usuario."),r&&r(o,null),o;var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/setTicket"):a(r||"Error al recuperar URL del servidor.")})}),t=getToken();if(t){var n,i,s={token:t,...e},l=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)});if(l.ok)return i=await l.json(),r&&r(null,i),i;n=await l.json(),console.error("Error en la respuesta del servidor:",n),r&&r(null,{mensaje:n.message})}else console.error("No se encontró el token de autenticación."),r&&r(null,{mensaje:"Token no encontrado."})}else console.error("Operación no válida:",e.operation),r&&r(null,{mensaje:"Operación no válida."})}catch(e){console.error("Error en async_manageTicket:",e),r&&r(e,null)}}async function getEntity_Ticket_SSE(r,o,a,t){try{var n=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getTickets"):a(r||"Error al recuperar URL del servidor.")})}),i=await getToken();if(!i)throw new Error("Token no válido o no encontrado.");var s=JSON.stringify({token:i,Id:r.idpk||0,filters:r.filters||{}}),l=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:s});if(!l.ok)throw new Error("Error en la solicitud: "+l.statusText);var c=l.body.getReader(),d=new TextDecoder("utf-8");let e="";for(var u=[];;){var{done:p,value:m}=await c.read();if(p)break;var g,f=(e+=d.decode(m,{stream:!0})).split("\n\n");e=f.pop();for(g of f)if(g.startsWith("data: "))try{var v=JSON.parse(g.replace("data: ",""));u.push(v),o&&o(v)}catch(e){console.warn("Error al parsear JSON en SSE:",e)}}a&&a(u)}catch(e){console.error("Error en getEntity_Ticket_SSE:",e),t&&t(e)}}async function async_manageCanal(e,r){try{var o;if(["alta","modificacion","baja"].includes(e.operation)){if(!getPermissions())throw o=new Error("No se encontraron permisos válidos para este usuario."),r&&r(o,null),o;var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/setCanales"):a(r||"Error al recuperar URL del servidor.")})}),t=getToken();if(t){var n,i,s={token:t,...e},l=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)});if(l.ok)return i=await l.json(),r&&r(null,i),i;n=await l.json(),console.error("Error en la respuesta del servidor:",n),r&&r(null,{mensaje:n.message})}else console.error("No se encontró el token de autenticación."),r&&r(null,{mensaje:"Token no encontrado."})}else console.error("Operación no válida:",e.operation),r&&r(null,{mensaje:"Operación no válida."})}catch(e){console.error("Error en async_manageCanal:",e),r&&r(e,null)}}async function getEntity_Canal_SSE(r,o,a,t){try{var n=await getToken();if(!n)throw new Error("Token no válido o no encontrado.");var i=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/getCanales"):a(r||"Error al recuperar la URL del servidor.")})}),s=JSON.stringify({token:n,Id:r?.idpk||0,filters:r?.filters||{}}),l=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json"},body:s});if(!l.ok||!l.body)throw new Error("Error en la solicitud: "+l.statusText);var c=l.body.getReader(),d=new TextDecoder("utf-8");let e="";for(var u=[];;){var{done:p,value:m}=await c.read();if(p)break;var g,f=(e+=d.decode(m,{stream:!0})).split("\n\n");e=f.pop();for(g of f)if(g.startsWith("data: ")){var v=g.replace("data: ","").trim();try{var h=JSON.parse(v);u.push(h),"function"==typeof o&&o(h)}catch(e){console.warn("JSON incompleto o inválido. Ignorado.",e)}}}"function"==typeof a&&a(u)}catch(e){console.error("Error en getEntity_Canal_SSE:",e),"function"==typeof t&&t(e)}}async function getEntity_Cuentas_SSE(r,o,a,t){try{var n=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getCuentasService"):a(r||"Error al recuperar URL del servidor.")})}),i=await getToken();if(!i)throw new Error("Token no válido o no encontrado.");var s=JSON.stringify({token:i,nivel:r.nivel||0,desde:r.desde||0,hasta:r.hasta||10,filtros:r.filtros||{}}),l=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:s});if(!l.ok)throw new Error("Error en la solicitud: "+l.statusText);var c=l.body.getReader(),d=new TextDecoder("utf-8");let e="";for(var u=[];;){var{done:p,value:m}=await c.read();if(p)break;var g,f=d.decode(m,{stream:!0}),v=(e+=f).split("\n\n");e=v.pop();for(g of v)if(g.startsWith("data: "))try{var h=JSON.parse(g.replace("data: ",""));u.push(h),o&&o(h)}catch(e){console.warn("Error parseando JSON parcial, ignorando paquete incompleto",e)}}a&&a(u)}catch(e){console.error("Error en getEntity_Cuentas_SSE:",e),t&&t(e)}}async function async_manageChatBot(e,r){try{var o;if(["alta","modificacion","baja"].includes(e.operation)){if(!getPermissions())throw o=new Error("No se encontraron permisos válidos para este usuario."),r&&r(o,null),o;var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/setChatBot"):a(r||"Error al recuperar URL del servidor.")})}),t=getToken();if(t){var n,i,s={token:t,...e},l=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)});if(l.ok)return i=await l.json(),r&&r(null,i),i;n=await l.json(),console.error("Error en la respuesta del servidor:",n),r&&r(null,{mensaje:n.message})}else console.error("No se encontró el token de autenticación."),r&&r(null,{mensaje:"Token no encontrado."})}else console.error("Operación no válida:",e.operation),r&&r(null,{mensaje:"Operación no válida."})}catch(e){console.error("Error en async_manageChatBot:",e),r&&r(e,null)}}async function getEntity_ChatBot_SSE(e,r,o,a){try{var t=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getChatBot"):a(r||"Error al recuperar URL del servidor.")})}),n=await getToken();if(!n)throw new Error("Token no válido o no encontrado.");var i=JSON.stringify({token:n,filters:e.filters||{},desde:e.desde||0,hasta:e.hasta||100}),s=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:i});if(!s.ok)throw new Error("Error en la solicitud: "+s.statusText);for(var l=s.body.getReader(),c=new TextDecoder("utf-8"),d=[];;){var u,p,{done:m,value:g}=await l.read();if(m)break;for(u of c.decode(g,{stream:!0}).split("\n\n").filter(e=>""!==e.trim()))u.startsWith("data: ")&&(p=JSON.parse(u.replace("data: ","")),d.push(p),r)&&r(p)}o&&o(d)}catch(e){console.error("Error en getEntity_ChatBot_SSE:",e),a&&a(e)}}async function getGlobalLogs_SSE(r,o,a,t){try{var n=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getGlobalLogs"):a(r||"Error al recuperar URL del servidor.")})}),i=await getToken();if(!i)throw new Error("Token no válido o no encontrado.");var s=JSON.stringify({token:i,filters:r.filters||{},desde:r.desde||0,hasta:r.hasta||100}),l=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:s});if(!l.ok)throw new Error("Error en la solicitud: "+l.statusText);var c=l.body.getReader(),d=new TextDecoder("utf-8");let e="";for(;;){var{done:u,value:p}=await c.read();if(u)break;var m=(e+=d.decode(p,{stream:!0})).split("\n\n");for(let e=0;e{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getLogsChatbot"):a(r||"Error al recuperar URL del servidor.")})}),t=getToken();if(!t)throw new Error("Token no válido o no encontrado.");var n=JSON.stringify({token:t}),i=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:n});if(!i.ok)throw new Error("Error en la solicitud: "+i.statusText);for(var s=i.body.getReader(),l=new TextDecoder("utf-8"),c=[];;){var d,u,{done:p,value:m}=await s.read();if(p)break;for(d of l.decode(m,{stream:!0}).split("\n\n").filter(e=>""!==e.trim()))d.startsWith("data: ")&&(u=JSON.parse(d.replace("data: ","")),c.push(u),e)&&e(u)}r&&r(c)}catch(e){console.error("Error en getLast15Logs:",e),o&&o(e)}}async function getActivityTimeline(e,r,o,a){try{var t=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getActivityTimeline"):a(r||"Error al recuperar URL del servidor.")})}),n=getToken();if(!n)throw new Error("Token no válido o no encontrado.");var i=JSON.stringify({token:n,user_id:e.user_id,desde:e.desde||0,hasta:e.hasta||20}),s=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:i});if(!s.ok)throw new Error("Error en la solicitud: "+s.statusText);for(var l=s.body.getReader(),c=new TextDecoder("utf-8"),d=[];;){var u,p,{done:m,value:g}=await l.read();if(m)break;for(u of c.decode(g,{stream:!0}).split("\n\n").filter(e=>""!==e.trim()))u.startsWith("data: ")&&(p=JSON.parse(u.replace("data: ","")),d.push(p),r)&&r(p)}o&&o(d)}catch(e){console.error("Error en getActivityTimeline:",e),a&&a(e)}}async function getChatbotUISetting(e,r){try{var o;if(!e.botId||!e.apiKey)throw o=new Error("Parámetros obligatorios faltantes: botId y apiKey son requeridos."),r&&r(o,null),o;var a,t,n,i=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/chatbot/uisetting"):a(r||"Error al recuperar URL del servidor.")})}),s=new Headers,l=(s.append("botId",e.botId),s.append("apiKey",e.apiKey),{method:"GET",headers:s,redirect:"follow"}),c=await fetch(i,l);if(c.ok)return n=await c.json(),r&&r(null,n),n;throw a=await c.text(),t=new Error(`Error en la solicitud GET: ${c.statusText} - `+a),r&&r(t,null),t}catch(e){throw console.error("Error en getChatbotUISetting:",e),r&&r(e,null),e}}async function async_manageChatbotUI(e,r){try{if(!e||"object"!=typeof e)throw new Error("Los parámetros son obligatorios y deben ser un objeto válido.");var{headerTitle:o,headerBackgroundColor:a,headerTitleColor:t,welcomeChatbot:n,chatbotimage:i,chatbotMessageBorderColor:s,chatbotMessageFontColor:l,userMessageBorderColor:c,userMessageFontColor:d,backgroundColor:u,fontSize:p,showLogo:m,showTitle:g,messagePlaceholder:f,botId:v,apiKey:h}=e;if(!getToken())throw new Error("Token de autenticación no encontrado.");if(!getPermissions())throw new Error("Permisos insuficientes para realizar esta operación.");var w,y,E=new Headers,S=(E.append("botId",v),E.append("apiKey",h),E.append("Content-Type","application/json"),await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/chatbot/updatesetting"):a(new Error("Error al recuperar la URL del servidor."))})})),b={headerTitle:o,headerBackgroundColor:a,headerTitleColor:t,welcomeChatbot:n,chatbotimage:i,chatbotMessageBorderColor:s,chatbotMessageFontColor:l,userMessageBorderColor:c,userMessageFontColor:d,backgroundColor:u,fontSize:p,showLogo:m,showTitle:g,messagePlaceholder:f},U={method:"PUT",headers:E,body:JSON.stringify(b)},T=await fetch(S,U);if(T.ok)return y=await T.json(),r&&r(null,y),y;throw w=await T.json(),new Error(w.message||"Error al configurar el chatbot.")}catch(e){throw console.error("Error en async_manageChatbotUI:",e),r&&r(e,null),e}}async function async_uploadCompanyLogo(e,r){try{if(!e||"object"!=typeof e)throw new Error("Los parámetros son obligatorios y deben ser un objeto válido.");var{fileName:o,data:a,botId:t,apiKey:n}=e;if(!(o&&a&&t&&n))throw new Error("Todos los parámetros son obligatorios.");if(!getToken())throw new Error("Token de autenticación no encontrado.");if(!getPermissions())throw new Error("Permisos insuficientes para realizar esta operación.");var i,s,l=new Headers,c=(l.append("botId",t),l.append("apiKey",n),l.append("Content-Type","application/json"),await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/chatbot/companyLogo"):a(new Error("Error al recuperar la URL del servidor."))})})),d=JSON.stringify({fileName:o,data:a}),u=await fetch(c,{method:"POST",headers:l,body:d,redirect:"follow"});if(u.ok)return s=await u.json(),r&&r(null,s),s;throw i=await u.json(),new Error(i.message||"Error al subir el logotipo de la empresa.")}catch(e){throw console.error("Error en async_uploadCompanyLogo:",e),r&&r(e,null),e}}async function async_chatbotImage(e,r){try{if(!e||"object"!=typeof e)throw new Error("Los parámetros son obligatorios y deben ser un objeto válido.");var{fileName:o,data:a,botId:t,apiKey:n}=e;if(!(o&&a&&t&&n))throw new Error("Todos los parámetros son obligatorios.");if(!getToken())throw new Error("Token de autenticación no encontrado.");if(!getPermissions())throw new Error("Permisos insuficientes para realizar esta operación.");var i,s,l=new Headers,c=(l.append("botId",t),l.append("apiKey",n),l.append("Content-Type","application/json"),await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/chatbot/chatbotImage"):a(new Error("Error al recuperar la URL del servidor."))})})),d=JSON.stringify({fileName:o,data:a}),u=await fetch(c,{method:"POST",headers:l,body:d});if(u.ok)return s=await u.json(),r&&r(null,s),s;throw i=await u.json(),new Error(i.message||"Error al subir la imagen al chatbot.")}catch(e){throw console.error("Error en async_chatbotImage:",e),r&&r(e,null),e}}async function getEntity_LastAccountTwoWeek_SSE(e,r,o,a){try{var t=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getLastAccountTwoWeeks"):a(r||"Error al recuperar URL del servidor.")})}),n=await getToken();if(!n)throw new Error("Token no válido o no encontrado.");var i=JSON.stringify({token:n,nivel:e.nivel||0,desde:e.desde||0,hasta:e.hasta||10,filtros:e.filtros||{}}),s=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:i});if(!s.ok)throw new Error("Error en la solicitud: "+s.statusText);for(var l=s.body.getReader(),c=new TextDecoder("utf-8"),d=[];;){var u,p,{done:m,value:g}=await l.read();if(m)break;for(u of c.decode(g,{stream:!0}).split("\n\n").filter(e=>""!==e.trim()))u.startsWith("data: ")&&(p=JSON.parse(u.replace("data: ","")),d.push(p),r)&&r(p)}o&&o(d)}catch(e){console.error("Error en getEntity_LastAccountTwoWeek_SSE:",e),a&&a(e)}}async function getSurveyStatistics_SSE(e,r,o,a){try{var t=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getSurveyStatistics"):a(r||"Error al recuperar URL del servidor.")})}),n=e.token||await getToken();if(!n)throw new Error("Token no válido o no encontrado.");var i=JSON.stringify({token:n,limitinit:e.limitinit||0,limit_last:e.limit_last||10,Like:e.Like||"",OrderBy:e.OrderBy||"dateproces DESC",dateproces_start:e.dateproces_start||"2024-11-30 00:00:01",dateproces_end:e.dateproces_end||"2025-11-30 23:59:59",dateresponde_start:e.dateresponde_start||"",dateresponde_end:e.dateresponde_end||""}),s=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:i});if(!s.ok)throw new Error("Error en la solicitud: "+s.statusText);for(var l=s.body.getReader(),c=new TextDecoder("utf-8"),d=[];;){var u,p,{done:m,value:g}=await l.read();if(m)break;for(u of c.decode(g,{stream:!0}).split("\n\n").filter(e=>""!==e.trim()))u.startsWith("data: ")&&(p=JSON.parse(u.replace("data: ","")),d.push(p),r)&&r(p)}o&&o(d)}catch(e){console.error("Error en getSurveyStatistics_SSE:",e),a&&a(e)}}async function getCustomerSatisfactionSSE(e,r,o,a){try{var t=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getCustomerSatisfactionSSE"):a(r||"Error al recuperar URL del servidor.")})}),n=e.token||await getToken();if(!n)throw new Error("Token no válido o no encontrado.");var i=JSON.stringify({token:n,date_start:e.date_start,date_end:e.date_end}),s=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:i});if(!s.ok)throw new Error("Error en la solicitud: "+s.statusText);for(var l=s.body.getReader(),c=new TextDecoder("utf-8"),d=[];;){var u,p,{done:m,value:g}=await l.read();if(m)break;for(u of c.decode(g,{stream:!0}).split("\n\n").filter(e=>""!==e.trim()))u.startsWith("data: ")&&(p=JSON.parse(u.replace("data: ","")),d.push(p),r)&&r(p)}o&&o(d)}catch(e){console.error("Error en getCustomerSatisfactionSSE:",e),a&&a(e)}}async function getMobilePunctualitySSE(e,r,o,a){try{var t=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getMobilePunctualitySSE"):a(r||"Error al recuperar URL del servidor.")})}),n=e.token||await getToken();if(!n)throw new Error("Token no válido o no encontrado.");var i=JSON.stringify({token:n,date_start:e.date_start,date_end:e.date_end}),s=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:i});if(!s.ok)throw new Error("Error en la solicitud: "+s.statusText);for(var l=s.body.getReader(),c=new TextDecoder("utf-8"),d=[];;){var u,p,{done:m,value:g}=await l.read();if(m)break;for(u of c.decode(g,{stream:!0}).split("\n\n").filter(e=>""!==e.trim()))u.startsWith("data: ")&&(p=JSON.parse(u.replace("data: ","")),d.push(p),r)&&r(p)}o&&o(d)}catch(e){console.error("Error en getMobilePunctualitySSE:",e),a&&a(e)}}async function getFollowupClaritySSE(e,r,o,a){try{var t=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getFollowupClaritySSE"):a(r||"Error al recuperar URL del servidor.")})}),n=e.token||await getToken();if(!n)throw new Error("Token no válido o no encontrado.");var i=JSON.stringify({token:n,date_start:e.date_start,date_end:e.date_end}),s=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:i});if(!s.ok)throw new Error("Error en la solicitud: "+s.statusText);for(var l=s.body.getReader(),c=new TextDecoder("utf-8"),d=[];;){var u,p,{done:m,value:g}=await l.read();if(m)break;for(u of c.decode(g,{stream:!0}).split("\n\n").filter(e=>""!==e.trim()))u.startsWith("data: ")&&(p=JSON.parse(u.replace("data: ","")),d.push(p),r)&&r(p)}o&&o(d)}catch(e){console.error("Error en getFollowupClaritySSE:",e),a&&a(e)}}async function async_manageSurveyProcess(e,r){if(e.data&&["alta","baja","modificacion"].includes(e.data.operation))try{var o,a,t,n,i=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/SurveyProcess"):a(r||"Error al recuperar URL del servidor.")})}),s=getToken();s?(o={token:s,data:e.data},console.log("Enviando solicitud a:",i),console.log("Cuerpo de la solicitud:",o),(a=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+s},body:JSON.stringify(o)})).ok?(n=await a.json(),r&&r(n,null)):(t=await a.json(),console.error(`Error en la operación ${e.data.operation}:`,t.mensaje||"Error desconocido."),r&&r(null,t))):(console.error("No se encontró el token de autenticación."),r&&r(null,{mensaje:"Token no encontrado."}))}catch(e){console.error("Error durante la operación asincrónica:",e),r&&r(null,{mensaje:"Error durante la operación."})}else console.error("Operación no válida:",e.data?e.data.operation:"undefined"),r&&r(null,{mensaje:"Operación no válida."})}async function getCatalogoActivoSSE(r,o,a,t){try{var n=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getCatalogoActivo"):a(r||"Error al recuperar URL del servidor.")})}),i=r.token||await getToken();if(!i)throw new Error("Token no válido o no encontrado.");var s=JSON.stringify({token:i,producto:r.producto||"",tipiva:r.tipiva||"",categoria:r.categoria||"",familia:r.familia||"",grupo:r.grupo||"",IdProveedor:r.IdProveedor||"",activos:r.activos||"",CritTc:r.CritTc||""}),l=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:s});if(!l.ok)throw new Error("Error en la solicitud: "+l.statusText);var c=l.body.getReader(),d=new TextDecoder("utf-8"),u=[];let e="";for(;;){var{done:p,value:m}=await c.read();if(p)break;var g,f=d.decode(m,{stream:!0}),v=(e+=f).split("\n\n");e=v.pop();for(g of v)if(g.startsWith("data: "))try{var h=g.replace("data: ","").trim(),w=JSON.parse(h);u.push(w),o&&o(w)}catch(e){console.error("Error al parsear JSON en SSE:",e,"Datos recibidos:",g)}}a&&a(u)}catch(e){console.error("Error en getCatalogoActivoSSE:",e),t&&t(e)}}async function getCategoriasSSE(e,r,o,a){try{var t=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getCategoriasSSE"):a(r||"Error al recuperar URL del servidor.")})}),n=e.token||getToken();if(!n)throw new Error("Token no válido o no encontrado.");var i=JSON.stringify({token:n,filtro:e.filtro||"",menuResto:e.menuResto||""}),s=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:i});if(!s.ok)throw new Error("Error en la solicitud: "+s.statusText);for(var l=s.body.getReader(),c=new TextDecoder("utf-8"),d=[];;){var u,p,{done:m,value:g}=await l.read();if(m)break;for(u of c.decode(g,{stream:!0}).split("\n\n").filter(e=>""!==e.trim()))try{u.startsWith("data: ")&&(p=JSON.parse(u.replace("data: ","")),d.push(p),r)&&r(p)}catch(e){console.error("Error al parsear SSE:",e)}}o&&o(d)}catch(e){console.error("Error en getCategoriasSSE:",e),a&&a(e)}}async function getMovilActiveSSE(e,r,o,a){try{var t=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getMovilActiveSSE"):a(r||"Error al recuperar URL del servidor.")})}),n=e.token||await getToken();if(!n)throw new Error("Token no válido o no encontrado.");var i=JSON.stringify({token:n,Like:e.Like||"",Id:e.Id||null,Vid:e.Vid||null,limitinit:e.limitinit||0,limit_last:e.limit_last||10,OrderBy:e.OrderBy||"T1.MovId"}),s=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:i});if(!s.ok)throw new Error("Error en la solicitud: "+s.statusText);for(var l=s.body.getReader(),c=new TextDecoder("utf-8"),d=[];;){var u,p,{done:m,value:g}=await l.read();if(m)break;for(u of c.decode(g,{stream:!0}).split("\n\n").filter(e=>""!==e.trim()))u.startsWith("data: ")&&(p=JSON.parse(u.replace("data: ","")),d.push(p),r)&&r(p)}o&&o(d)}catch(e){console.error("Error en getMovilActiveSSE:",e),a&&a(e)}}async function getConcesioSSE(e,r,o,a){try{var t=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getConcesioSSE"):a(r||"Error al recuperar URL del servidor.")})}),n=e.token||await getToken();if(!n)throw new Error("Token no válido o no encontrado.");var i=JSON.stringify({token:n,Like:e.Like||"",Id:e.Id||0,Vid:e.Vid||0,OrderBy:e.OrderBy}),s=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:i});if(!s.ok)throw new Error("Error en la solicitud: "+s.statusText);for(var l=s.body.getReader(),c=new TextDecoder("utf-8"),d=[];;){var u,p,{done:m,value:g}=await l.read();if(m)break;for(u of c.decode(g,{stream:!0}).split("\n\n").filter(e=>""!==e.trim()))u.startsWith("data: ")&&(p=JSON.parse(u.replace("data: ","")),d.push(p),r)&&r(p)}o&&o(d)}catch(e){console.error("Error en getConcesioSSE:",e),a&&a(e)}}async function getServiciosSSE(r,o,a,t){try{var n=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getServiciosSSE"):a(r||"Error al recuperar URL del servidor.")})}),i=r.token||await getToken();if(!i)throw new Error("Token no válido o no encontrado.");var s=JSON.stringify({token:i,Since:r.Since||"",until:r.until||"",horIni:r.horIni||"",horFin:r.horFin||"",ExtraFiltro:r.ExtraFiltro||"",status:r.status||"",OrderBy:r.OrderBy||""}),l=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:s});if(!l.ok)throw new Error("Error en la solicitud: "+l.statusText);var c=l.body.getReader(),d=new TextDecoder("utf-8");let e="";for(var u=[];;){var{done:p,value:m}=await c.read();if(p)break;var g,f=(e+=d.decode(m,{stream:!0})).split("\n\n");e=f.pop();for(g of f)if(g.startsWith("data: "))try{var v=JSON.parse(g.replace("data: ",""));u.push(v),o&&o(v)}catch(e){console.error("Error al parsear JSON en getServiciosSSE:",e)}}a&&a(u)}catch(e){console.error("Error en getServiciosSSE:",e),t&&t(e)}}async function getTraySSE(r,o,a,t){try{var n=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getTraySSE"):a(r||"Error al recuperar URL del servidor.")})}),i=r.token||await getToken();if(!i)throw new Error("Token no válido o no encontrado.");var s=JSON.stringify({token:i,hours:r.hours||96,limitinit:r.limitinit||0,limit_last:r.limit_last||10}),l=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:s});if(!l.ok)throw new Error("Error en la solicitud: "+l.statusText);var c=l.body.getReader(),d=new TextDecoder("utf-8");let e="";for(;;){var{done:u,value:p}=await c.read();if(u)break;var m,g=(e+=d.decode(p,{stream:!0})).split("\n\n");e=g.pop();for(m of g)if(m.startsWith("data: "))try{var f=JSON.parse(m.replace("data: ",""));o&&o(f)}catch(e){console.error("Error al parsear JSON en SSE:",e)}}a&&a()}catch(e){console.error("Error en getTraySSE:",e),t&&t(e)}}function iniciarHora(e){var r=new Date,o=verificarTiempo(r.getHours())+`:${verificarTiempo(r.getMinutes())}:`+verificarTiempo(r.getSeconds()),r=["Dom","Lun","Mar","Mié","Jue","Vie","Sáb"][r.getDay()]+`, ${r.getDate()} ${["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"][r.getMonth()]} `+r.getFullYear();try{e.idHora&&(document.getElementById(e.idHora).innerHTML=o),e.idFecha&&(document.getElementById(e.idFecha).innerHTML=r)}catch(e){console.error("Error actualizando la hora y la fecha: ",e)}}function verificarTiempo(e){return e<10?"0"+e:e}async function getLastMessage(e,r,o=()=>{},a=()=>{}){try{var t=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getLastMessageId"):a(r||"Error al recuperar URL del servidor.")})}),n=e.token||await getToken();if(!n)throw new Error("Token no válido o no encontrado.");if(!e.Movil)throw new Error("El número de móvil es obligatorio.");var i=JSON.stringify({token:n,Movil:e.Movil}),s=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:i});if(!s.ok)throw new Error("Error en la solicitud: "+s.statusText);for(var l=s.body.getReader(),c=new TextDecoder("utf-8"),d=[];;){var u,p,{done:m,value:g}=await l.read();if(m)break;for(u of c.decode(g,{stream:!0}).split("\n\n").filter(e=>""!==e.trim()))u.startsWith("data: ")&&(p=JSON.parse(u.replace("data: ","")),d.push(p),r)&&r(p)}"function"==typeof o&&o(d)}catch(e){console.error("Error en getLastMessageSSE:",e),a(e)}}async function fetchMessageHistorySSE(o,a,t,r){try{var n=o.token||await getToken();if(!n)throw new Error("Token no válido o no encontrado.");let e=o.WhaId;e.startsWith("0")&&(e="598"+e.substring(1));var i=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getMessageHistorySince"):a(r||"Error al recuperar URL del servidor.")})}),s=JSON.stringify({token:n,WhaId:e,Id:o.Id||0,limitinit:o.limitinit||0,limit_last:o.limit_last||10}),l=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json"},body:s});if(!l.ok)throw new Error("Error en la solicitud: "+l.statusText);var c=l.body.getReader(),d=new TextDecoder("utf-8");let r="";for(var u=[];;){var{done:p,value:m}=await c.read();if(p)break;var g,f=(r+=d.decode(m,{stream:!0})).split("\n\n");r=f.pop();for(g of f)if(g.startsWith("data: "))try{var v=JSON.parse(g.replace("data: ",""));u.push(v),a&&a(v)}catch(e){console.error("Error al parsear JSON en SSE:",e,"Línea recibida:",g)}}t&&t(u)}catch(e){console.error("Error en fetchMessageHistorySSE:",e),r&&r(e)}}function formatTextToHTML(e){if(!e||"string"!=typeof e)throw new Error("El parámetro 'text' debe ser una cadena de texto válida.");let r=e.replace(/\*(.*?)\*/g,"$1");return r=(r=r.replace(/\|/g,"
    ")).replace(/https:\/\/([^\s]+)/g,'https://$1')}async function async_getstate_line(e,r){try{r([{DatLine:await _getstate_line_(e)}])}catch(e){console.error("Error en async_getstate_line:",e)}}let _getstate_line_=o=>new Promise(async(e,r)=>{try{e(await getstate_line_(o))}catch(e){r(e)}});async function getstate_line_(e){try{var r=getToken(),o=getEmpresaId();if(!r)throw new Error("Token no válidos.");if(!o)throw new Error("IdEmpresa no válidos.");var a,t,n=new Headers({"Content-Type":"application/json"}),i=JSON.stringify({token:r,Linea:e,IdEmpresa:o}),s=(console.log("Datos enviados:",i),await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url||a("Error al recuperar URL del servidor."),o(e[0].Url+"/getLineStatus")})})),l=(console.log("URL final:",s),{method:"POST",headers:n,body:i}),c=await fetch(s,l);if(c.ok)return t=await c.json(),console.log("Respuesta del servidor:",t),t;throw a=await c.text(),new Error(`Error HTTP: ${c.status} - `+a)}catch(e){throw console.error("Error en getstate_line:",e),e}}async function async_sendmessage(e,r,o,a,t=0,n="-",i="-",s,l=2,c=2,d){try{await _sendmessage_(e,r,o,a,t,n,i,s,l,c,d)}catch(e){console.error("Error en async_sendmessage:",e)}}let _sendmessage_=(r,o,a,t,n,i,s,l,c,d,u)=>new Promise(e=>{e(sendmessage(r,o,a,t,n,i,s,l,c,d,u))}),getStoredLocation=()=>({Latitude:localStorage.getItem("Latitude")||"-",Longitude:localStorage.getItem("Longitude")||"-"}),getDeviceLocation=async()=>new Promise(r=>{"geolocation"in navigator?navigator.geolocation.getCurrentPosition(e=>{r({Latitude:e.coords.latitude.toString(),Longitude:e.coords.longitude.toString()})},()=>{r(getStoredLocation())}):r(getStoredLocation())}),buildPayload=({token:e,Lineadesdedondenotifico:r,movildestino:o,IdExterno:a,IdAgente:t,IDUsuario:n,Rec_name:i,copyText:s,IdPublico:l,Latitude:c,Longitude:d,parameters:u,IdWhats_status:p=2,IdCanal:m=2})=>({token:e,sender:r,to:o,To:o,From:o,AccountSid:a,IdAgente:t,MediaContentType0:"",IDUser:n,IDUsuario:n,ProfileName:i,texto:s,MediaUrl0:"",MediaUrl:"",IdPublico:l,Latitude:c,IdCanal:m,IdWhats_status:p,Longitude:d,Reply:"S",url:localStorage.getItem("UrlFile"),filetype:localStorage.getItem("fyleType"),Document:localStorage.getItem("base64"),plantilla_oficial:{name:localStorage.getItem("NamePlantilla")?.trim()||"",variables:Array.isArray(u)?u:[]}}),buildPayload_WOFI0=({token:e,Lineadesdedondenotifico:r,movildestino:o,IdExterno:a,IdAgente:t,IDUsuario:n,Rec_name:i,copyText:s,IdPublico:l,Latitude:c,Longitude:d,Usuario:u,IdWhats_status:p=2,IdCanal:m=2})=>{let g=localStorage.getItem("fyleType");return g=g?g.replace("data:",""):"",{token:e,message:{ProfileName:i,UserAppExterna:u||"",Body:s,MediaContentType0:"file",To:r,AccountSid:a,From:o,IdAgente:t,IdPublico:l,MediaUrl:localStorage.getItem("MediaUrl")||"",Longitude:d||"",Latitude:c||"",IdCanal:m,IdWhats_status:p,IDUsuario:n,Document:localStorage.getItem("base64")||"",filetype:g,Reply:"S",url:localStorage.getItem("UrlFile")||""}}},clearLocalStorageKeys=()=>{["NamePlantilla","UrlFile","fyleType","base64"].forEach(e=>localStorage.setItem(e,""))},fetchWithTimeout=async(e,r,o=1e4)=>{let a=new AbortController;o=setTimeout(()=>a.abort(),o);try{var t=await fetch(e,{...r,signal:a.signal});return clearTimeout(o),t}catch(e){throw clearTimeout(o),e}};function getTimecontrolChat(){try{var e,r=localStorage.getItem("_login");return r?void 0!==(e=JSON.parse(r).configuration?.meta?.timecontrolChat)?e:(console.warn("No se encontró el atributo 'timecontrolChat' en la estructura de datos."),null):(console.warn("No se encontró ningún resultado de login en localStorage."),null)}catch(e){return console.error("Error al obtener 'timecontrolChat' desde localStorage:",e),null}}function getUsoWhatsapp(){try{var e,r=localStorage.getItem("_login");return r?void 0!==(e=JSON.parse(r).configuration?.meta?.usoWhatsapp)?e:(console.warn("No se encontró el atributo 'usoWhatsapp' en la estructura de datos."),null):(console.warn("No se encontró ningún resultado de login en localStorage."),null)}catch(e){return console.error("Error al obtener 'usoWhatsapp' desde localStorage:",e),null}}let validateInput=(e,r,o)=>e&&r?!(e.length<6&&(r="Número de móvil destino es demasiado corto.",console.warn(r),o&&o({error:r}),1)):(e="Número de móvil destino y origen son requeridos.",console.warn(e),o&&o({error:e}),!1);async function sendmessage(d,u,p,m,g,f,v,h,w,y,E){try{if(validateInput(u,p,E)){var e,r=getUsoWhatsapp();if(r&&"N"!==r){let c=await getToken();if(!c)throw new Error("No se encontró un token válido");u.startsWith("0")&&(u="598"+u.substring(1)),"-"===f&&"-"===v&&({Latitude:f,Longitude:v}=await getDeviceLocation());var o,a=getUserDetails();if(a&&a.IDUsuario){let s=a.IDUsuario,l=a.Usuario;console.log("Lineadesdedondenotifico "+p),async_getstate_line(p,async r=>{console.log("DataStatusline"),console.log(r);let t=r[0].DatLine[0].WOFI;console.log("4027 WOFI:",t);var r=new Headers,o=(r.append("Content-Type","application/json"),l);"template_efi"===localStorage.getItem("NamePlantilla")&&(d="");let e;e=(1==t?buildPayload:buildPayload_WOFI0)({token:c,Lineadesdedondenotifico:p,movildestino:u,IdExterno:m,IdAgente:0,IDUsuario:s,Rec_name:o,copyText:d,IdPublico:g,Latitude:f,Longitude:v,parameters:h,Usuario:l,IdWhats_status:w,IdCanal:y}),clearLocalStorageKeys();o=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url||a("Error al recuperar URL del servidor."),o(1==t?e[0].Url+"/send_message":e[0].Url+"/send")})}),console.log("Enviando solicitud a:",o),console.log("payload "+e),console.log(e),r={method:"POST",headers:r,body:JSON.stringify(e),redirect:"follow"};try{var a,n,i=await fetchWithTimeout(o,r);i.ok?(n=await i.json(),E&&E(n)):(a=`Error ${i.status}: `+i.statusText,console.error("Error en la solicitud fetch:",{url:o,requestOptions:r,errorMsg:a}),E&&E({error:a}))}catch(e){console.error("Error en la solicitud fetch:",{url:o,requestOptions:r,error:e}),E&&E({error:e.message})}})}else o="No se pudo obtener el IDUsuario del usuario autenticado.",console.warn(o),E&&E({error:o})}else e="El uso de WhatsApp no está habilitado en la configuración de la empresa.",console.warn(e),E&&E({error:e})}}catch(e){console.error("Error en sendmessage:",e),E&&E({error:e.message})}}async function getSurveyServiceStatsSSE(r,o,a,t){try{var n=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getSurveyServiceStatsSSE"):a(r||"Error al recuperar URL del servidor.")})});if(!(r.token||await getToken()))throw new Error("Token no válido o no encontrado.");var i=JSON.stringify(r),s=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:i});if(!s.ok)throw new Error("Error en la solicitud: "+s.statusText);var l=s.body.getReader(),c=new TextDecoder("utf-8"),d=[];let e="";for(;;){var{done:u,value:p}=await l.read();if(u)break;var m=(e+=c.decode(p,{stream:!0})).split("\n\n");for(let e=0;e{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/manageRecipients"):a(r||"Error al recuperar URL del servidor.")})}),l=getToken();l?(a={token:l,data:e.data},(t=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+l},body:JSON.stringify(a)})).ok?(i=await t.json(),r&&r(i,null)):(n=await t.json(),console.error(`Error en la operación ${e.operation}:`,n.mensaje||"Error desconocido."),r&&r(null,n))):(console.error("No se encontró el token de autenticación."),r&&r(null,{mensaje:"Token no encontrado."}))}catch(e){console.error("Error durante la operación asincrónica:",e),r&&r(null,{mensaje:"Error durante la operación."})}}else console.error("Operación no válida:",e.data.operation),r&&r(null,{mensaje:"Operación no válida."})}async function getRecipientsSSE(r,o,a,t){try{var n=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getRecipientsSSE"):a(r||"Error al recuperar URL del servidor.")})});if(!(r.token||await getToken()))throw new Error("Token no válido o no encontrado.");var i=JSON.stringify(r),s=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:i});if(!s.ok)throw new Error("Error en la solicitud: "+s.statusText);var l=s.body.getReader(),c=new TextDecoder("utf-8"),d=[];let e="";for(;;){var{done:u,value:p}=await l.read();if(u)break;var m=(e+=c.decode(p,{stream:!0})).split("\n\n");for(let e=0;e{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/manageRules"):a(r||"Error al recuperar URL del servidor.")})}),t=getToken();if(t){var n,i={token:t,operation:e.operation,data:e.data},s=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+t},body:JSON.stringify(i)});if(s.ok){var l=s.body.getReader(),c=new TextDecoder("utf-8");let e="",r="";for(;;){var{done:d,value:u}=await l.read();if(d)break;r+=c.decode(u,{stream:!0}),e+=r}var p=JSON.parse(e);o&&o(p,null)}else n=await s.json(),console.error(`Error en la operación ${e.operation}:`,n.mensaje||"Error desconocido."),o&&o(null,n)}else console.error("No se encontró el token de autenticación."),o&&o(null,{mensaje:"Token no encontrado."})}catch(e){console.error("Error durante la operación asincrónica:",e),o&&o(null,{mensaje:"Error durante la operación."})}}else console.error("Operación no válida:",e.operation),o&&o(null,{mensaje:"Operación no válida."})}async function getModulosSSE(r,o,a,t){try{var n=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getModulosSSE"):a(r||"Error al recuperar URL del servidor.")})}),i=r.token||await getToken();if(!i)throw new Error("Token no válido o no encontrado.");var s=JSON.stringify({token:i}),l=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:s});if(!l.ok)throw new Error("Error en la solicitud: "+l.statusText);var c=l.body.getReader(),d=new TextDecoder("utf-8"),u=[];let e="";for(;;){var{done:p,value:m}=await c.read();if(p)break;var g=(e+=d.decode(m,{stream:!0})).split("\n\n");for(let e=0;e{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getActiveRulesSSE"):a(r||"Error al recuperar URL del servidor.")})}),i=r.token||await getToken();if(!i)throw new Error("Token no válido o no encontrado.");var s=JSON.stringify({token:i,estado:r.estado,OrderBy:r.OrderBy}),l=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:s});if(!l.ok)throw new Error("Error en la solicitud: "+l.statusText);var c=l.body.getReader(),d=new TextDecoder("utf-8"),u=[];let e="";for(;;){var{done:p,value:m}=await c.read();if(p)break;var g=(e+=d.decode(m,{stream:!0})).split("\n\n");for(let e=0;e{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getResumenIndicadoresEncuestas"):a(r||"Error al recuperar URL del servidor.")})}),t=e.token||await getToken();if(!t)throw new Error("Token no válido o no encontrado.");var n=JSON.stringify({token:t,fecha_inicio:e.fecha_inicio||"",fecha_fin:e.fecha_fin||""}),i=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:n});if(!i.ok)throw new Error("Error en la solicitud: "+i.statusText);var s=await i.json();r&&r(s)}catch(e){console.error("Error en getResumenIndicadoresEncuestas:",e),o&&o(e)}}async function getResumenRespuestasPorPregunta(e,r,o){try{var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getResumenRespuestasPorPregunta"):a(r||"Error al recuperar URL del servidor.")})}),t=e.token||await getToken();if(!t)throw new Error("Token no válido o no encontrado.");var n=JSON.stringify({token:t,fecha_inicio:e.fecha_inicio||"",fecha_fin:e.fecha_fin||""}),i=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:n});if(!i.ok)throw new Error("Error en la solicitud: "+i.statusText);var s=await i.json();r&&r(s)}catch(e){console.error("Error en getResumenRespuestasPorPregunta:",e),o&&o(e)}}async function getServiciosPorCiudad(e,r,o){try{var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getServiciosPorCiudad"):a(r||"Error al recuperar URL del servidor.")})}),t=e.token||await getToken();if(!t)throw new Error("Token no válido o no encontrado.");var n=JSON.stringify({token:t,Since:e.Since||"",until:e.until||"",horIni:e.horIni||"00:00:00",horFin:e.horFin||"23:59:59"}),i=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:n});if(!i.ok)throw new Error("Error en la solicitud: "+i.statusText);var s=await i.json();r&&r(s)}catch(e){console.error("Error en getServiciosPorCiudad:",e),o&&o(e)}}async function getSrvRanking(e,r,o){try{var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getSrvRanking"):a(r||"Error al recuperar URL del servidor.")})}),t=e.token||await getToken();if(!t)throw new Error("Token no válido o no encontrado.");var n=JSON.stringify({token:t,Since:e.Since||"",until:e.until||"",horIni:e.horIni||"00:00:00",horFin:e.horFin||"23:59:59",OrderBy:e.OrderBy||""}),i=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:n});if(!i.ok)throw new Error("Error en la solicitud: "+i.statusText);var s=await i.json();r&&r(s)}catch(e){console.error("Error en getSrvRanking:",e),o&&o(e)}}async function getServiciosPorDepartamento(e,r,o){try{var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getServiciosPorDepartamento"):a(r||"Error al recuperar URL del servidor.")})}),t=e.token||await getToken();if(!t)throw new Error("Token no válido o no encontrado.");var n=JSON.stringify({token:t,Since:e.Since||"",until:e.until||"",horIni:e.horIni||"00:00:00",horFin:e.horFin||"23:59:59"}),i=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:n});if(!i.ok)throw new Error("Error en la solicitud: "+i.statusText);var s=await i.json();r&&r(s)}catch(e){console.error("Error en getServiciosPorDepartamento:",e),o&&o(e)}}async function getServiciosPorFalla(e,r,o){try{var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getServiciosPorFalla"):a(r||"Error al recuperar URL del servidor.")})}),t=e.token||await getToken();if(!t)throw new Error("Token no válido o no encontrado.");var n=JSON.stringify({token:t,Since:e.Since||"",until:e.until||"",horIni:e.horIni||"00:00:00",horFin:e.horFin||"23:59:59"}),i=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:n});if(!i.ok)throw new Error("Error en la solicitud: "+i.statusText);var s=await i.json();r&&r(s)}catch(e){console.error("Error en getServiciosPorFalla:",e),o&&o(e)}}async function getCostoPorCarrierWhatsapp(e,r,o){try{var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getCostoPorCarrierWhatsapp"):a(r||"Error al recuperar URL del servidor.")})}),t=e.token||await getToken();if(!t)throw new Error("Token no válido o no encontrado.");var n=JSON.stringify({token:t}),i=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:n});if(!i.ok)throw new Error("Error en la solicitud: "+i.statusText);var s=await i.json();r&&r(s)}catch(e){console.error("Error en getCostoPorCarrierWhatsapp:",e),o&&o(e)}}async function getServiciosPorTipificacion(e,r,o){try{var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getServiciosPorTipificacion"):a(r||"Error al recuperar URL del servidor.")})}),t=e.token||await getToken();if(!t)throw new Error("Token no válido o no encontrado.");var n=JSON.stringify({token:t,Since:e.Since||"",until:e.until||"",horIni:e.horIni||"00:00:00",horFin:e.horFin||"23:59:59"}),i=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:n});if(!i.ok)throw new Error("Error en la solicitud: "+i.statusText);var s=await i.json();r&&r(s)}catch(e){console.error("Error en getServiciosPorTipificacion:",e),o&&o(e)}}async function getServiciosPorMarca(e,r,o){try{var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getServiciosPorMarca"):a(r||"Error al recuperar URL del servidor.")})}),t=e.token||await getToken();if(!t)throw new Error("Token no válido o no encontrado.");var n=JSON.stringify({token:t,Since:e.Since||"",until:e.until||"",horIni:e.horIni||"00:00:00",horFin:e.horFin||"23:59:59"}),i=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:n});if(!i.ok)throw new Error("Error en la solicitud: "+i.statusText);var s=await i.json();r&&r(s)}catch(e){console.error("Error en getServiciosPorMarca:",e),o&&o(e)}}async function getServiciosPorHora(e,r,o){try{var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getServiciosPorHora"):a(r||"Error al recuperar URL del servidor.")})}),t=e.token||await getToken();if(!t)throw new Error("Token no válido o no encontrado.");var n=JSON.stringify({token:t,Since:e.Since||"",until:e.until||"",horIni:e.horIni||"00:00:00",horFin:e.horFin||"23:59:59"}),i=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:n});if(!i.ok)throw new Error("Error en la solicitud: "+i.statusText);var s=await i.json();r&&r(s)}catch(e){console.error("Error en getServiciosPorHora:",e),o&&o(e)}}async function getServiciosPorFecha(e,r,o){try{var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getServiciosPorFecha"):a(r||"Error al recuperar URL del servidor.")})}),t=e.token||await getToken();if(!t)throw new Error("Token no válido o no encontrado.");var n=JSON.stringify({token:t,Since:e.Since||"",until:e.until||"",horIni:e.horIni||"00:00:00",horFin:e.horFin||"23:59:59"}),i=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:n});if(!i.ok)throw new Error("Error en la solicitud: "+i.statusText);var s=await i.json();r&&r(s)}catch(e){console.error("Error en getServiciosPorFecha:",e),o&&o(e)}}async function getServiciosPorZona(e,r,o){try{var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getServiciosPorZona"):a(r||"Error al recuperar URL del servidor.")})}),t=e.token||await getToken();if(!t)throw new Error("Token no válido o no encontrado.");var n=JSON.stringify({token:t,Since:e.Since||"",until:e.until||"",horIni:e.horIni||"00:00:00",horFin:e.horFin||"23:59:59"}),i=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:n});if(!i.ok)throw new Error("Error en la solicitud: "+i.statusText);var s=await i.json();r&&r(s)}catch(e){console.error("Error en getServiciosPorZona:",e),o&&o(e)}}async function getServiciosPorTipo(e,r,o){try{var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getServiciosPorTipo"):a(r||"Error al recuperar URL del servidor.")})}),t=e.token||await getToken();if(!t)throw new Error("Token no válido o no encontrado.");var n=JSON.stringify({token:t,Since:e.Since||"",until:e.until||"",horIni:e.horIni||"00:00:00",horFin:e.horFin||"23:59:59"}),i=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:n});if(!i.ok)throw new Error("Error en la solicitud: "+i.statusText);var s=await i.json();r&&r(s)}catch(e){console.error("Error en getServiciosPorTipo:",e),o&&o(e)}}async function getStatusServicio(e,r,o){try{var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getStatusSrv"):a(r||"Error al recuperar URL del servidor.")})}),t=e.token||await getToken();if(!t)throw new Error("Token no válido o no encontrado.");if(!e.IdUnico)throw new Error("IdUnico es requerido.");var n=JSON.stringify({token:t,IdUnico:e.IdUnico}),i=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:n});if(!i.ok)throw new Error("Error en la solicitud: "+i.statusText);var s=await i.json();r&&r(s)}catch(e){console.error("Error en getStatusServicio:",e),o&&o(e)}}async function async_manageEntityPropuestas(e,r){var o;if(["alta","baja","modificacion"].includes(e.operation)){if(!getPermissions())throw o=new Error("No se encontraron permisos válidos para este usuario."),r&&r(o,null),o;try{var a,t,n=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/manageEntityPropuestas"):a(r||"Error al recuperar URL del servidor.")})}),i=getToken();i?(a={token:i,data:{operation:e.operation,...e.data}},console.log("**************"),console.log(a),t=await(await fetch(n,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+i},body:JSON.stringify(a)})).json(),r&&r(t,null)):(console.error("Token de autenticación no encontrado."),r&&r(null,{mensaje:"Token no encontrado."}))}catch(e){console.error("Error durante la operación asincrónica:",e),r&&r(null,{mensaje:"Error durante la operación."})}}else console.error("Operación no válida:",e.operation),r&&r(null,{mensaje:"Operación no válida."})}async function getEntity_PropuestasEnriquecidas_SSE(r,o,a,t){try{var n=r.token||await getToken();if(!n)throw new Error("Token no válido o no encontrado.");var i=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getPropuestasEnriquecidas"):a(r||"Error al recuperar URL del servidor.")})}),s=JSON.stringify({token:n,limitinit:r.limitinit??0,limit_last:r.limit_last??10,Like:r.Like??"",OrderBy:r.OrderBy??"",filters:r.filters??{}}),l=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json"},body:s});if(!l.ok)throw new Error("Error en la solicitud: "+l.statusText);var c=l.body.getReader(),d=new TextDecoder("utf-8");let e="";for(var u=[];;){var{done:p,value:m}=await c.read();if(p)break;var g,f=(e+=d.decode(m,{stream:!0})).split("\n\n");e=f.pop();for(g of f)if(g.startsWith("data: "))try{var v=JSON.parse(g.replace("data: ",""));Array.isArray(v.data)&&0===v.data.length||(u.push(v),o&&o(v))}catch(e){console.warn("Error al parsear JSON en SSE:",e)}}a&&a(u)}catch(e){console.error("Error en getEntity_PropuestasEnriquecidas_SSE:",e),t&&t(e)}}async function async_manageEntityEtapasEmbudo(e,r){var o;if(["alta","baja","modificacion"].includes(e.operation)){if(!getPermissions())throw o=new Error("No se encontraron permisos válidos para este usuario."),r&&r(o,null),o;try{var a,t,n=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/manageEntityEtapasEmbudo"):a(r||"Error al recuperar URL del servidor.")})}),i=getToken();i?(a={token:i,data:{operation:e.operation,...e.data}},t=await(await fetch(n,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+i},body:JSON.stringify(a)})).json(),r&&r(t,null)):(console.error("Token de autenticación no encontrado."),r&&r(null,{mensaje:"Token no encontrado."}))}catch(e){console.error("Error durante la operación asincrónica:",e),r&&r(null,{mensaje:"Error durante la operación."})}}else console.error("Operación no válida:",e.operation),r&&r(null,{mensaje:"Operación no válida."})}async function getEntity_EtapasEmbudoEnriquecidas_SSE(e,r,o,a){try{var t=e.token||await getToken();if(!t)throw new Error("Token no válido o no encontrado.");var n=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getEtapasEmbudoEnriquecidas"):a(r||"Error al recuperar URL del servidor.")})}),i=JSON.stringify({token:t,limitinit:e.limitinit??0,limit_last:e.limit_last??10,Like:e.Like??"",OrderBy:e.OrderBy??"",filters:e.filters??{}}),s=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:i});if(!s.ok)throw new Error("Error en la solicitud: "+s.statusText);var l=await s.json();r&&r(l),o&&o([l])}catch(e){console.error("Error en getEntity_EtapasEmbudoEnriquecidas_SSE:",e),a&&a(e)}}async function obtenerFingerprintYIP(e){var r=await(await FingerprintJS.load()).get(),o=await(await fetch("https://api64.ipify.org?format=json")).json();e(r.visitorId,o.ip)}async function async_cerrarSesionesUsuario(e,r){try{var o=e.token||await getToken();if(!o)throw new Error("Token no válido o no encontrado.");if(!e.user_id)throw new Error("El parámetro 'user_id' es obligatorio.");var a,t=await(await FingerprintJS.load()).get(),n=await(await fetch("https://api64.ipify.org?format=json")).json(),i={token:o,data:{user_id:e.user_id,fingerprint:t.visitorId,ip_address:n.ip}},s=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/cerrarSesionesUsuario"):a(r||"Error al recuperar URL del servidor.")})}),l=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)}),c=await l.json();if(!l.ok)throw a=c?.message||"Error al cerrar sesiones del usuario.",new Error(a);r&&r(null,c)}catch(e){console.error("Error en async_cerrarSesionesUsuario:",e),r&&r(e)}}async function async_cerrarSesionEspecifica(e,r){try{var o=e.token||await getToken();if(!o)throw new Error("Token no válido o no encontrado.");if(!e.user_id||!e.fingerprint)throw new Error("Los parámetros 'user_id' y 'fingerprint' son obligatorios.");var a,t={token:o,data:{user_id:e.user_id,fingerprint:e.fingerprint}},n=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/cerrarSesionEspecifica"):a(r||"Error al recuperar URL del servidor.")})}),i=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),s=await i.json();if(!i.ok)throw a=s?.message||"Error al cerrar la sesión específica.",new Error(a);r&&r(null,s)}catch(e){console.error("Error en async_cerrarSesionEspecifica:",e),r&&r(e)}}async function async_getSessionLogsKPIs(e,r){try{var o=e.token||await getToken();if(!o)throw new Error("Token no válido o no encontrado.");var a,t={token:o,...e.Since&&{Since:e.Since},...e.until&&{until:e.until},...e.user_id&&{user_id:e.user_id}},n=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getSessionLogsKPIs"):a(r||"Error al recuperar URL del servidor.")})}),i=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),s=await i.json();if(!i.ok)throw a=s?.message||"Error al obtener KPIs de sesión.",new Error(a);r&&r(null,s)}catch(e){console.error("Error en async_getSessionLogsKPIs:",e),r&&r(e)}}async function async_getSesionesActivas(e,r){try{var o=e.token||await getToken();if(!o)throw new Error("Token no válido o no encontrado.");var a,t={token:o},n=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getSesionesActivas"):a(r||"Error al recuperar URL del servidor.")})}),i=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),s=await i.json();if(!i.ok)throw a=s?.message||"Error al obtener sesiones activas.",new Error(a);r&&r(null,s)}catch(e){console.error("Error en async_getSesionesActivas:",e),r&&r(e)}}async function async_getUsuariosUnicos(e,r){try{var o=e.token||await getToken();if(!o)throw new Error("Token no válido o no encontrado.");if(!e.Since||!e.until)throw new Error("Parámetros 'Since' y 'until' son obligatorios.");var a,t={token:o,Since:e.Since,until:e.until},n=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getUsuariosUnicos"):a(r||"Error al recuperar URL del servidor.")})}),i=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),s=await i.json();if(!i.ok)throw a=s?.message||"Error al obtener usuarios únicos.",new Error(a);r&&r(null,s)}catch(e){console.error("Error en async_getUsuariosUnicos:",e),r&&r(e)}}async function async_getDuracionPromedioSesion(e,r){try{var o=e.token||await getToken();if(!o)throw new Error("Token no válido o no encontrado.");if(!e.Since||!e.until)throw new Error("Parámetros 'Since' y 'until' son obligatorios.");var a,t={token:o,Since:e.Since,until:e.until},n=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getDuracionPromedioSesion"):a(r||"Error al recuperar URL del servidor.")})}),i=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),s=await i.json();if(!i.ok)throw a=s?.message||"Error al obtener duración promedio.",new Error(a);r&&r(null,s)}catch(e){console.error("Error en async_getDuracionPromedioSesion:",e),r&&r(e)}}async function async_getTasaRebote(e,r){try{var o=e.token||await getToken();if(!o)throw new Error("Token no válido o no encontrado.");if(!e.Since||!e.until)throw new Error("Parámetros 'Since' y 'until' son obligatorios.");var a,t={token:o,Since:e.Since,until:e.until},n=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getTasaRebote"):a(r||"Error al recuperar URL del servidor.")})}),i=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),s=await i.json();if(!i.ok)throw a=s?.message||"Error al obtener la tasa de rebote.",new Error(a);r&&r(null,s)}catch(e){console.error("Error en async_getTasaRebote:",e),r&&r(e)}}async function getLogAuditoriaSSE(r,o,a,t){try{var n=r.token||await getToken();if(!n)throw new Error("Token no válido o no encontrado.");var i=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getLogAuditoria"):a(r||"Error al recuperar URL del servidor.")})}),s=JSON.stringify({token:n,Since:r.Since||"",until:r.until||"",limitinit:r.limitinit||0,limit_last:r.limit_last||100}),l=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json"},body:s});if(!l.ok)throw new Error("Error en la solicitud: "+l.statusText);var c=l.body.getReader(),d=new TextDecoder("utf-8");let e="";for(var u=[];;){var{done:p,value:m}=await c.read();if(p)break;var g,f=(e+=d.decode(m,{stream:!0})).split("\n\n");e=f.pop();for(g of f)if(g.startsWith("data: "))try{var v=JSON.parse(g.replace("data: ",""));u.push(v),o&&o(v)}catch(e){console.error("Error al parsear JSON en getLogAuditoriaSSE:",e)}}a&&a(u)}catch(e){console.error("Error en getLogAuditoriaSSE:",e),t&&t(e)}}async function getServiciosUbicacionSSE(r,o,a,t){try{var n=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getServiciosUbicacionSSE"):a(r||"Error al recuperar URL del servidor.")})}),i=r.token||await getToken();if(!i)throw new Error("Token no válido o no encontrado.");var s=JSON.stringify({token:i,Since:r.Since||"",until:r.until||"",horIni:r.horIni||"",horFin:r.horFin||"",status:r.status||"",lastId:r.lastId||0}),l=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:s});if(!l.ok)throw new Error("Error en la solicitud: "+l.statusText);var c=l.body.getReader(),d=new TextDecoder("utf-8");let e="";for(var u=[];;){var{done:p,value:m}=await c.read();if(p)break;var g,f=(e+=d.decode(m,{stream:!0})).split("\n\n");e=f.pop();for(g of f)if(g.startsWith("data: "))try{var v=JSON.parse(g.replace("data: ",""));u.push(v),o&&o(v)}catch(e){console.error("Error al parsear JSON en getServiciosUbicacionSSE:",e)}}a&&a(u)}catch(e){console.error("Error en getServiciosUbicacionSSE:",e),t&&t(e)}}async function async_getInsightsInterpretacion(e,r){try{var o=e.token||await getToken();if(!o)throw new Error("Token no válido o no encontrado.");if(!e.pregunta||"string"!=typeof e.pregunta)throw new Error("La pregunta es obligatoria y debe ser un texto.");var a,t={token:o,pregunta:e.pregunta},n=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/chatbot/insights/analizar-e-interpretar"):a("Error al recuperar URL del servidor.")})}),i=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),s=await i.json();if(!i.ok)throw a=s?.message||"Error al procesar la interpretación de insights.",new Error(a);r&&r(null,s)}catch(e){console.error("Error en async_getInsightsInterpretacion:",e),r&&r(e)}}async function async_registerUsageAction(e,r){var o;if(!getPermissions())throw o=new Error("No se encontraron permisos válidos para este usuario."),r&&r(null,{mensaje:o.message}),o;try{var a,t=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/usage/register"):a(r||"Error al recuperar URL del servidor.")})}),n=getToken();if(!n)throw a=new Error("Token de autenticación no encontrado."),r&&r(null,{mensaje:a.message}),a;var i={token:n,action_type:e.action_type,user_id:e.user_id},s=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+n},body:JSON.stringify(i)})).json();r&&r(s,null)}catch(e){console.error("Error durante el registro de uso:",e),r&&r(null,{mensaje:"Error durante el registro de uso."})}}async function async_getUsageStatusAction(e,r){try{var o=getToken();if(!o)throw new Error("Token no válido o no encontrado.");if(!e.action_type||"string"!=typeof e.action_type)throw new Error("El tipo de acción es obligatorio y debe ser un texto.");if(!e.user_id||"number"!=typeof e.user_id)throw new Error("El ID del usuario es obligatorio y debe ser un número.");var a,t={token:o,action_type:e.action_type,user_id:e.user_id},n=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/usage/status"):a("Error al recuperar URL del servidor.")})}),i=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(t)}),s=await i.json();if(!i.ok)throw a=s?.message||"Error al consultar el estado de uso.",new Error(a);r&&r(s,null)}catch(e){console.error("Error en async_getUsageStatusAction:",e),r&&r(null,{mensaje:e.message})}}function generarInsightServicios(e,a=0,t=24){let n=["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],i={};e.forEach(({fecha:e,hora:r,cantidad:o})=>{a<=r&&re)),o=.9*r;var s=e.filter(([,e])=>e>=o).map(([e])=>e);return 0===s.length?(e=e.find(([,e])=>e===r),`El día con mayor volumen operativo en el rango horario seleccionado (${a} a ${t} hs) fue ${e[0]}, con un total de ${e[1]} servicios.`):`Los días ${s.join(" y ")} presentan el mayor volumen operativo entre ${a} y ${t} hs.`}function calcularPorcentajeServiciosDelDia(e,r=new Date){let o=r.toISOString().slice(0,10);var a=new Date(r);a.setFullYear(a.getFullYear()-1);let t=a.toISOString().slice(0,10),n=r.getHours();a=e.filter(e=>e.fecha===o&&e.hora<=n).reduce((e,r)=>e+r.cantidad,0),r=e.filter(e=>e.fecha===t).reduce((e,r)=>e+r.cantidad,0);return 0===r?0:Math.round(10*(a/r*100))/10}function calcularAcumuladoActual(e,r=new Date){let o=String(r.getDate()).padStart(2,"0")+`/${String(r.getMonth()+1).padStart(2,"0")}/`+r.getFullYear(),a=r.getHours();return e.filter(e=>e.Fecha===o&&parseInt(e.Hora)<=a).reduce((e,r)=>e+r.Cantidad,0)}function calcularAcumuladoAnioAnterior(e,r=new Date){let o=String(r.getDate()).padStart(2,"0")+`/${String(r.getMonth()+1).padStart(2,"0")}/`+(r.getFullYear()-1);return e.filter(e=>e.Fecha===o).reduce((e,r)=>e+r.Cantidad,0)}function calcularDesviacionTendenciaEsperada(e,r,o=new Date){var a=String(o.getDate()).padStart(2,"0"),t=String(o.getMonth()+1).padStart(2,"0"),n=o.getFullYear();let i=a+`/${t}/`+n,s=a+`/${t}/`+(n-1),l=o.getHours();a=e.filter(e=>e.Fecha===i&&parseInt(e.Hora)<=l).reduce((e,r)=>e+r.Cantidad,0),t=r.filter(e=>e.Fecha===s&&parseInt(e.Hora)<=l).reduce((e,r)=>e+r.Cantidad,0),n=0===t?0:Math.round((a-t)/t*1e3)/10;return{acumuladoHoy:a,acumuladoAnterior:t,desviacion:n,insight:`La desviación respecto a la tendencia histórica es de ${n}%`}}function handleRankingData(e,t,n=new Date){if(Array.isArray(e)&&0!==e.length){let r=n.getHours();let o=String(n.getDate()).padStart(2,"0")+`/${String(n.getMonth()+1).padStart(2,"0")}/`+n.getFullYear();var n=new Date(n),i=(n.setDate(n.getDate()-1),String(n.getDate()).padStart(2,"0"));let a=i+`/${String(n.getMonth()+1).padStart(2,"0")}/`+n.getFullYear();var i=e.filter(e=>e.Fecha===o&&parseInt(e.Hora)<=r),n=i.reduce((e,r)=>e+r.Cantidad,0),e=(t||[]).filter(e=>e.Fecha===a&&parseInt(e.Hora)<=r).reduce((e,r)=>e+r.Cantidad,0),t=[...new Set(i.map(e=>parseInt(e.Hora)))],t=0r.Cantidad>e.Cantidad?r:e,{Hora:"00",Cantidad:0}).Hora,s=n-e,l=0<=s?"text-success":"text-danger",c=0<=s?"up":"down",e=0 ${0<=s?"+":"-"}${Math.abs(s)} (${e}% vs ayer) `}else console.error("Datos inválidos para el ranking")}async function async_manageUsuariosFacturacionMenu(e,r){if(["alta","modificacion","baja"].includes(e.operation)){if(!getPermissions())throw o=new Error("No se encontraron permisos válidos para este usuario."),r&&r(o,null),o;var o=getToken();if(o)try{var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/manageUsuariosFacturacionMenu"):a("Error al recuperar URL del servidor.")})}),t={token:o,...e},n=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(t)}),i=await n.json();n.ok?r&&r(i,null):r&&r(null,i)}catch(e){console.error("❌ Error en async_manageUsuariosFacturacionMenu:",e),r&&r(null,{mensaje:"Error en la operación."})}else a=new Error("Token de autenticación no encontrado."),r&&r(a,null)}else o=new Error("Operación no válida: "+e.operation),r&&r(null,{mensaje:o.message})}async function async_manageUsosDashboard(e,r){if(["alta","baja"].includes(e.operation)){if(!getPermissions())throw o=new Error("No se encontraron permisos válidos para este usuario."),r&&r(o,null),o;var o=getToken();if(o)try{var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/manageUsosDashboard"):a("Error al recuperar URL del servidor.")})}),t={token:o,...e},n=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(t)}),i=await n.json();n.ok?r&&r(i,null):r&&r(null,i)}catch(e){console.error("❌ Error en async_manageUsosDashboard:",e),r&&r(null,{mensaje:"Error en la operación."})}else a=new Error("Token de autenticación no encontrado."),r&&r(a,null)}else o=new Error("Operación no válida: "+e.operation),r&&r(null,{mensaje:o.message})}async function obtenerEstadisticasDeUso(e,r){if(!getPermissions())throw new Error("No se encontraron permisos válidos para este usuario.");var o=getToken();if(!o)throw new Error("Token de autenticación no encontrado.");if(!e||!r)throw new Error("Parámetros 'usuario_id' y 'tipo_dashboard' son obligatorios.");try{var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getEstadisticasUsoDashboard"):a("Error al recuperar URL del servidor.")})}),t={token:o,usuario_id:e,tipo_dashboard:r},n=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(t)}),i=await n.json();if(n.ok)return{usosHoy:i.usosHoy||0,usosTotales:i.usosTotales||0};throw new Error(i.message||"Error consultando estadísticas de uso")}catch(e){throw console.error("❌ Error en obtenerEstadisticasDeUso:",e),e}}async function obtenerConfiguracionFacturacionMenu(e,r){if(!getPermissions())throw new Error("No se encontraron permisos válidos para este usuario.");var o=getToken();if(!o)throw new Error("Token de autenticación no encontrado.");if(!e||!r)throw new Error("Parámetros 'usuario_id' y 'menu_id' son obligatorios.");try{var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getConfiguracionFacturacionMenu"):a("Error al recuperar URL del servidor.")})}),t={token:o,usuario_id:e,menu_id:r},n=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(t)}),i=await n.json();if(n.ok)return i.configuracion;throw new Error(i.message||"Error consultando configuración de facturación")}catch(e){throw e}}async function async_manageUsuarioConfig(e,r){var o;if(["alta","baja","modificacion"].includes(e.operation)){if(!getPermissions())throw o=new Error("No se encontraron permisos válidos para este usuario."),r&&r(o,null),o;try{var a,t,n,i,s=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/manageUsuarioConfig"):a(r||"Error al recuperar URL del servidor.")})}),l=getToken();l?(a={token:l,operation:e.operation,...e.data},(t=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+l},body:JSON.stringify(a)})).ok?(i=await t.json(),r&&r(i,null)):(n=await t.json(),console.error(`Error en la operación ${e.operation}:`,n.mensaje||"Error desconocido."),r&&r(null,n))):(console.error("No se encontró el token de autenticación."),r&&r(null,{mensaje:"Token no encontrado."}))}catch(e){console.error("Error durante la operación asincrónica:",e),r&&r(null,{mensaje:"Error durante la operación."})}}else console.error("Operación no válida:",e.operation),r&&r(null,{mensaje:"Operación no válida."})}async function async_getUsuarioConfig(e){if(!getPermissions())throw new Error("No se encontraron permisos válidos para este usuario.");var r=getToken();if(!r)throw new Error("Token de autenticación no encontrado.");if(!e)throw new Error("El parámetro 'IDUsuario' es obligatorio.");try{var o=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getUsuarioConfig"):a("Error al recuperar URL del servidor.")})}),a={token:r,IDUsuario:e},t=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r},body:JSON.stringify(a)}),n=await t.json();if(t.ok&&200===n.code)return n.data||{};throw new Error(n.message||"Error consultando configuración del usuario")}catch(e){throw console.error("❌ Error en async_getUsuarioConfig:",e),e}}async function async_manageComprasCreditosDashboard(e,r){var o;if(["alta","baja","modificacion"].includes(e.operation)){if(!getPermissions())throw o=new Error("No se encontraron permisos válidos para este usuario."),r&&r(o,null),o;try{var a,t,n,i,s=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/manageComprasCreditosDashboard"):a(r||"Error al recuperar URL del servidor.")})}),l=getToken();l?(a={token:l,operation:e.operation,...e.data},(t=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+l},body:JSON.stringify(a)})).ok?(i=await t.json(),r&&r(i,null)):(n=await t.json(),console.error(`Error en la operación ${e.operation}:`,n.mensaje||"Error desconocido."),r&&r(null,n))):(console.error("No se encontró el token de autenticación."),r&&r(null,{mensaje:"Token no encontrado."}))}catch(e){console.error("Error durante la operación asincrónica:",e),r&&r(null,{mensaje:"Error durante la operación."})}}else console.error("Operación no válida:",e.operation),r&&r(null,{mensaje:"Operación no válida."})}async function obtenerEstadisticasCreditosUsados(e,r,o){if(!getPermissions())throw new Error("No se encontraron permisos válidos para este usuario.");var a=getToken();if(!a)throw new Error("Token de autenticación no encontrado.");if(!e||!r||!o)throw new Error("Los parámetros 'usuario_id', 'menu_id' y 'tipo_dashboard' son obligatorios.");try{var t=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getEstadisticasCreditosUsados"):a("Error al recuperar URL del servidor.")})}),n={token:a,usuario_id:e,menu_id:r,tipo_dashboard:o},i=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+a},body:JSON.stringify(n)}),s=await i.json();if(i.ok)return{usosTotales:s.usosTotales||0,usosHoy:s.usosHoy||0,creditosDiarios:s.creditosDiarios||0,creditosTotales:s.creditosTotales||0,lastCompraId:s.lastCompraId||null};throw new Error(s.message||"Error consultando créditos usados")}catch(e){throw console.error("❌ Error en obtenerEstadisticasCreditosUsados:",e),e}}async function async_manageUsosCreditosDashboard(e,r){var o;if(["alta","baja"].includes(e.operation)){if(!getPermissions())throw o=new Error("No se encontraron permisos válidos para este usuario."),r&&r(o,null),o;try{var a,t,n,i,s=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/manageUsosCreditosDashboard"):a(r||"Error al recuperar URL del servidor.")})}),l=getToken();l?(a={token:l,operation:e.operation,...e.data},(t=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+l},body:JSON.stringify(a)})).ok?(i=await t.json(),r&&r(i,null)):(n=await t.json(),console.error(`Error en la operación ${e.operation}:`,n.mensaje||"Error desconocido."),r&&r(null,n))):(console.error("No se encontró el token de autenticación."),r&&r(null,{mensaje:"Token no encontrado."}))}catch(e){console.error("Error durante la operación asincrónica:",e),r&&r(null,{mensaje:"Error durante la operación."})}}else console.error("Operación no válida:",e.operation),r&&r(null,{mensaje:"Operación no válida."})}async function validarMenuFacturable(r,o,a,t){try{var e,n=localStorage.getItem("_login");if(34==r||35==r)window.location.href=o;else if(n){var i,s=JSON.parse(n)?.configuration?.meta;if(s){var l,c=s.IDUsuario,d=0===parseInt(s.isGratis);if(o)if(1==d)await async_manageUsosDashboard({operation:"alta",usuario_id:c,tipo_dashboard:o,is_facturable:0,idUsuario:c},(e,r)=>{r&&t&&t({status:!1,message:r})}),t&&t({status:!0});else{let e;try{e=await obtenerConfiguracionFacturacionMenu(c,r)}catch(e){return void(t&&t({status:!1,message:"No se encontró configuración de facturación para este menú."}))}var u=1===e.is_facturable,p=e.plan_uso||"PAY",m=parseInt(e.max_usos_gratis_diarios||0),g=parseInt(e.max_usos_gratis_totales||0);if(u&&"FREE"!==p){var f,{usosHoy:v,usosTotales:h}=await obtenerEstadisticasDeUso(c,o);if(v{r&&t&&t({status:!1,message:r})}),t&&t({status:!0});else{let e;try{e=await obtenerEstadisticasCreditosUsados(c,r,o)}catch(e){return console.error("? Error en obtenerEstadisticasCreditosUsados:",e),void(t&&t({status:!1,message:e.message}))}e.lastCompraId&&(e.usosTotales{r&&t&&t({status:!1,message:r})}),t&&t({status:!0})):(f="Se superaron los límites de uso gratuito y no hay créditos disponibles.",console.warn("??",f),a&&(window.location.href=a),t&&t({status:!1,message:f}))}}else await async_manageUsosDashboard({operation:"alta",usuario_id:c,tipo_dashboard:o,is_facturable:0,idUsuario:c},(e,r)=>{r&&t&&t({status:!1,message:r})}),t&&t({status:!0})}else l="Parámetro 'tipo_dashboard' es obligatorio.",console.error("?",l),t&&t({status:!1,message:l})}else i="No se encontró la sección 'meta' en la configuración.",console.error("?",i),t&&t({status:!1,message:i})}else e="No se encontró ningún resultado de login en localStorage.",console.warn("??",e),t&&t({status:!1,message:e})}catch(e){console.error("? Error en validarMenuFacturable:",e),t&&t({status:!1,message:e.message})}}function openaction(e,r,o="/pasarela/pago.html"){try{validarMenuFacturable(e,r,o,e=>{e.status?(console.log("? Acceso permitido al dashboard."),window.location.href=r):(console.warn("? Acceso denegado:",e.message),alert(e.message))})}catch(e){}}function getFirstLoginDone(){try{var e,r=localStorage.getItem("_login");return r?"number"==typeof(e=JSON.parse(r)?.configuration?.meta?.ConfigUI)?.first_login_done?e.first_login_done:(console.warn("No se encontró el valor 'first_login_done' en la configuración del usuario."),-1):(console.warn("No se encontró ningún resultado de login en localStorage."),-1)}catch(e){return console.error("Error al obtener el valor de 'first_login_done':",e),-1}}function getPanelDefault(){try{var e,r=localStorage.getItem("_login");return r?"string"==typeof(e=JSON.parse(r)?.configuration?.meta?.ConfigUI)?.panel_default?e.panel_default:(console.warn("No se encontró el valor 'panel_default' en la configuración del usuario. Retornando 'index.php'."),"index.php"):(console.warn("No se encontró ningún resultado de login en localStorage."),"index.php")}catch(e){return console.error("Error al obtener el valor de 'panel_default':",e),"index.php"}}function calcularPromedioEscala5(e){let o=0,a=0;return e.forEach(e=>{var r=5-e.escala;o+=r*e.total,a+=e.total}),0{let o=0,a=0;return e.forEach(e=>{var r=5-e.escala;o+=r*e.total,a+=e.total}),0{var r=parseFloat(s(n.respuestas.data[e])),o=parseFloat(s(i.respuestas.data[e])),a=+(r-o).toFixed(2);let t="➖";.05{var r,e={...e};return e.ZonaName&&""!==e.ZonaName.trim()||(r=parseFloat(e.Latitud),isNaN(r)?e.ClusterGeo="ND":e.ClusterGeo=r.toFixed(6).toString().substring(0,r<0?3:2)),e}):[]}function generarDetallePorHora(e){let a=["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],t=[],n={};return e.forEach(({fecha:e,hora:r,cantidad:o})=>{e=a[new Date(e).getDay()]+"-"+r;n[e]=(n[e]||0)+o}),Object.entries(n).forEach(([e,r])=>{var[e,o]=e.split("-");t.push({dia:e,hora:Number(o),cantidad:r})}),t.sort((e,r)=>a.indexOf(e.dia)-a.indexOf(r.dia)||e.hora-r.hora)}async function getKnowbaseSSE(e,a,t,n){try{var i=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/viki/getKnowbaseSSE"):(e=r||"Error al recuperar URL del servidor.",n&&n(e),a(e))})}),s=e.token||await getToken();if(!s)throw new Error("Token no válido o no encontrado.");if(!e.apiKey||!e.botId)throw new Error("apiKey y botId son requeridos.");let r={token:s,like:e.like||void 0,lang:e.lang||void 0,tag:e.tag||void 0,folder:e.folder||void 0,filetype:e.filetype||void 0,type:e.type||void 0,limit:e.limit||100};Object.keys(r).forEach(e=>void 0===r[e]&&delete r[e]);var l=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json",apiKey:e.apiKey,botId:e.botId},body:JSON.stringify(r)});if(!l.ok)throw new Error("Error en la solicitud: "+l.statusText);var c=l.body.getReader(),d=new TextDecoder("utf-8");let o="";for(var u=[];;){var{done:p,value:m}=await c.read();if(p)break;var g,f=(o+=d.decode(m,{stream:!0})).split("\n\n");o=f.pop();for(g of f){var v=g.trim();if(v.startsWith("data: ")){var h=v.slice(6).trim();try{var w=JSON.parse(h);u.push(w),a&&a(w)}catch(e){console.warn("Fragmento JSON incompleto u inválido, retenido en buffer.",e),o="data: "+h+"\n\n"+o;break}}}}t&&t(u)}catch(e){console.error("Error en getKnowbaseSSE:",e),n&&n(e)}}let TIPO_DOCUMENTO_PERMITIDO=["Knowbase","Faq","Help","Atención al cliente","reservas"],IDIOMAS_PERMITIDOS=["es","en","pt"];async function async_storeToKnowbase(e,r){try{var o=getToken();if(!o)throw new Error("Token de autenticación no disponible.");if(!TIPO_DOCUMENTO_PERMITIDO.includes(e.type))throw new Error(`El tipo de documento '${e.type}' no está permitido. Tipos válidos: ${TIPO_DOCUMENTO_PERMITIDO.join(", ")}.`);if(!IDIOMAS_PERMITIDOS.includes(e.lang))throw new Error(`El idioma '${e.lang}' no está permitido. Idiomas válidos: ${IDIOMAS_PERMITIDOS.join(", ")}.`);if(!e.apiKey||!e.botId)throw new Error("Los campos apiKey y botId son obligatorios.");var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/viki/storeToKnowbase"):a("Error al recuperar URL del servidor.")})}),t={token:e.token,tag:e.tag,folder:e.folder,lang:e.lang,filetype:e.filetype,url_file:e.url_file,title:e.title,aditional:e.aditional,observaciones:e.observaciones,type:e.type},n=await(await fetch(a,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o,apiKey:e.apiKey,botId:e.botId},body:JSON.stringify(t)})).json();r&&r(n,null)}catch(e){console.error("Error en async_storeToKnowbase:",e),r&&r(null,{mensaje:e.message})}}function cargarZonasHorarias(o,a=""){if(!(o instanceof HTMLSelectElement))throw new Error("El parámetro debe ser un elemento no encontrado: "+e)}function getMonedasISO4217(e,o){let a=document.getElementById(e);a&&[{Currency:"Afghan Afghani",value:"AFN"},{Currency:"Euro",value:"EUR"},{Currency:"Albanian Lek",value:"ALL"},{Currency:"Algerian Dinar",value:"DZD"},{Currency:"United States Dollar",value:"USD"},{Currency:"Argentine Peso",value:"ARS"},{Currency:"Australian Dollar",value:"AUD"},{Currency:"Brazilian Real",value:"BRL"},{Currency:"Canadian Dollar",value:"CAD"},{Currency:"Swiss Franc",value:"CHF"},{Currency:"Chilean Peso",value:"CLP"},{Currency:"Chinese Yuan",value:"CNY"},{Currency:"Colombian Peso",value:"COP"},{Currency:"Czech Koruna",value:"CZK"},{Currency:"Danish Krone",value:"DKK"},{Currency:"Egyptian Pound",value:"EGP"},{Currency:"British Pound",value:"GBP"},{Currency:"Hong Kong Dollar",value:"HKD"},{Currency:"Hungarian Forint",value:"HUF"},{Currency:"Indian Rupee",value:"INR"},{Currency:"Israeli New Shekel",value:"ILS"},{Currency:"Japanese Yen",value:"JPY"},{Currency:"Mexican Peso",value:"MXN"},{Currency:"Norwegian Krone",value:"NOK"},{Currency:"New Zealand Dollar",value:"NZD"},{Currency:"Peruvian Sol",value:"PEN"},{Currency:"Philippine Peso",value:"PHP"},{Currency:"Polish Zloty",value:"PLN"},{Currency:"Russian Ruble",value:"RUB"},{Currency:"Swedish Krona",value:"SEK"},{Currency:"Singapore Dollar",value:"SGD"},{Currency:"Thai Baht",value:"THB"},{Currency:"Turkish Lira",value:"TRY"},{Currency:"Ukrainian Hryvnia",value:"UAH"},{Currency:"Uruguayan Peso",value:"UYU"},{Currency:"Venezuelan Bolívar",value:"VES"},{Currency:"South African Rand",value:"ZAR"}].forEach(e=>{var r=document.createElement("option");r.value=e.value,r.textContent=e.Currency,e.value===o&&(r.selected=!0),a.appendChild(r)})}async function askFAQSSE(r,o,a,t){try{var n=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/viki/askFAQSSE"):a(r||"Error al recuperar URL del servidor.")})}),i=r.token||await getToken();if(!i)throw new Error("Token no válido o no encontrado.");if(!r.apiKey||!r.botId)throw new Error("Faltan apiKey o botId en los parámetros.");var s=JSON.stringify({token:i,question:r.question,use_ai:r.use_ai??!0}),l=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json",apiKey:r.apiKey,botId:r.botId},body:s});if(!l.ok)throw new Error("Error en la solicitud: "+l.statusText);var c=l.body.getReader(),d=new TextDecoder("utf-8");let e="";for(var u=[];;){var{done:p,value:m}=await c.read();if(p)break;var g,f=(e+=d.decode(m,{stream:!0})).split("\n\n");e=f.pop();for(g of f)if(""!==g.trim()&&g.startsWith("data: "))try{var v=JSON.parse(g.slice(6));u.push(v),o&&o(v)}catch(e){console.warn("Error al parsear el JSON:",e)}}if(e.trim().startsWith("data: "))try{var h=JSON.parse(e.trim().slice(6));u.push(h),o&&o(h)}catch(e){console.warn("Error al parsear el JSON final:",e)}try{a&&a(u)}catch(e){console.error("Error en el callback onComplete:",e)}}catch(e){console.error("Error en askFAQSSE:",e);try{t&&t(e)}catch(e){console.error("Error en el callback onError:",e)}}}function exportarMapa(){var e=document.getElementById("map");e?domtoimage.toPng(e).then(function(e){var r=document.createElement("a");r.download="mapa_heatmap.png",r.href=e,r.click()}).catch(function(e){console.error("❌ Error al exportar con dom-to-image:",e)}):console.error("No se encontró el contenedor con ID 'map'")}function exportarMapaMapbox(o="mapa_servicios.png"){domtoimage.toPng(document.getElementById("map")).then(function(e){var r=document.createElement("a");r.download=o,r.href=e,r.click()})}async function obtenerDemoraPromedioPorWhatsapp(){var e=getToken();if(!e)throw new Error("Token de autenticación no encontrado.");try{var r=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getDemoraPromedioPorWhatsapp"):a("Error al recuperar URL del servidor.")})}),o={token:e},a=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+e},body:JSON.stringify(o)}),t=await a.json();if(a.ok&&t?.data?.demora_promedio)return{demoraPromedio:parseFloat(t.data.demora_promedio)};throw new Error(t.message||"Error consultando la demora promedio por WhatsApp")}catch(e){throw console.error("❌ Error en obtenerDemoraPromedioPorWhatsapp:",e),e}}async function actualizarDemoraPromedioPorWhatsapp(e){var r=document.getElementById(e);if(r){console.log("Ando consultando actualizarDemoraPromedioPorWhatsapp ");try{var o=await obtenerDemoraPromedioPorWhatsapp();r.textContent=o.demoraPromedio.toFixed(2)}catch(e){r.textContent="Error",console.error("❌ No se pudo cargar la demora promedio:",e)}}else console.warn(`⚠️ Elemento con ID '${e}' no encontrado.`)}async function obtenerPuntualidadPromedio(){var e=getToken();if(!e)throw new Error("Token de autenticación no encontrado.");try{var r=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getMobilePunctualityPonderado"):a("Error al recuperar URL del servidor.")})}),o={token:e,date_start:getFecha15DiasAtras(),date_end:getFechaHoy()},a=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+e},body:JSON.stringify(o)}),t=await a.json();if(a.ok&&void 0!==t.ponderado)return{ponderado:parseFloat(t.ponderado)};throw new Error(t.message||"Error consultando la puntualidad promedio")}catch(e){throw console.error("? Error en obtenerPuntualidadPromedio:",e),e}}function getFecha15DiasAtras(){var e=new Date;return e.setDate(e.getDate()-15),e.toISOString().split("T")[0]}function getFechaHoy(){return(new Date).toISOString().split("T")[0]}function interpretarPuntualidadConEtiqueta(e){return e<.5?{label:"Excelente",class:"bg-success",bgCard:"bg-light-success"}:e<1.5?{label:"Muy Bueno",class:"bg-primary",bgCard:"bg-light-primary"}:e<2.5?{label:"Regular",class:"bg-warning text-dark",bgCard:"bg-light-warning"}:e<3.5?{label:"Insuficiente",class:"bg-danger",bgCard:"bg-light-danger"}:{label:"Crítico",class:"bg-dark",bgCard:"bg-light-dark"}}async function getAlertasMultiplesSSE(r={},o,a,t){try{var n=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getAlertasMultiplesSSE"):a(r||"Error al recuperar URL del servidor.")})}),i=await getToken();if(!i)throw new Error("Token no válido o no encontrado.");var s=JSON.stringify({token:i,date_start:r.date_start||void 0,date_end:r.date_end||void 0}),l=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:s});if(!l.ok)throw new Error("Error en la solicitud: "+l.statusText);var c=l.body.getReader(),d=new TextDecoder("utf-8");let e="";for(var u=[];;){var{done:p,value:m}=await c.read();if(p)break;var g,f=(e+=d.decode(m,{stream:!0})).split("\n\n");e=f.pop();for(g of f)if(g.startsWith("data: "))try{var v=JSON.parse(g.replace("data: ",""));u.push(v),o&&o(v)}catch(e){console.warn("Error al parsear JSON SSE:",e)}}a&&a(u)}catch(e){console.error("Error en getAlertasMultiplesSSE:",e),t&&t(e)}}async function fetchPostmanCollectionByUID(e){try{var r=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/documentacion"):a("Error al recuperar URL del servidor.")})}),o=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:"68630cbbae9f109c063925acc18838ddc8009d261d8630b623c5196288698ad5"})}),a=await o.json();if(!o.ok||!a.collection)throw new Error(a.message||"Error consultando la colección Postman desde Laravel.");"function"==typeof e?e(a.collection):console.log("Colección obtenida desde Laravel:",a.collection)}catch(e){throw console.error("? Error en fetchPostmanCollectionByUID:",e),e}}function switchHelpContext(e){document.querySelectorAll('.help-block[data-context="'+e+'"]').forEach(e=>e.classList.remove("d-none"));let r="";return"plataforma"===e?r="fcf43a425ec3669087507aecf010a0f892520315368ca1ae7e314f94bd5ecc93":"empresa"===e&&(r=getToken()),r}async function async_consultarRUT(e,r){try{var o,a,t,n=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/migrate/consultarRUT"):a("Error al recuperar URL del servidor.")})}),i=getToken();i?(o={token:i,data:e.data},t=await(a=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)})).json(),a.ok&&!1!==t.success?r&&r(t,null):(console.error("Error en la consulta de RUT:",t),r&&r(null,t))):(console.error("No se encontró el token de autenticación."),r&&r(null,{mensaje:"Token no encontrado."}))}catch(e){console.error("Error durante la operación asincrónica de consulta RUT:",e),r&&r(null,{mensaje:"Error durante la consulta."})}}async function async_managePlantillasWhatsapp(e,r){try{var o=getToken();if(!o)throw new Error("Token de autenticación no disponible.");if(!["alta","modificacion","baja"].includes(e.operation))throw new Error(`La operación '${e.operation}' no es válida. Use 'alta', 'modificacion' o 'baja'.`);if(!e.data||"object"!=typeof e.data)throw new Error("El parámetro 'data' es obligatorio y debe ser un objeto.");if(!e.data.user_id)throw new Error("El campo 'user_id' es obligatorio en data.");if("baja"!==e.operation){if(!e.data.IdUnicoSrv)throw new Error("El campo 'IdUnicoSrv' es obligatorio para la operación 'alta' o 'modificacion'.");if(!e.data.TextoPlantilla)throw new Error("El campo 'TextoPlantilla' es obligatorio para la operación 'alta' o 'modificacion'.")}else if(!e.data.id)throw new Error("El campo 'id' es obligatorio para la operación 'baja'.");var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/managePlantillasWhatsapp"):a("Error al recuperar URL del servidor.")})}),t={token:e.token,operation:e.operation,data:e.data},n=await(await fetch(a,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(t)})).json();r&&r(n,null)}catch(e){console.error("Error en async_managePlantillasWhatsapp:",e),r&&r(null,{mensaje:e.message})}}async function async_getSrvPlantillasWhatsapp(e,r){try{var o=getToken();if(!o)throw new Error("Token de autenticación no disponible.");var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/getSrvPlantillasWhatsapp"):a("Error al recuperar URL del servidor.")})}),t={token:e.token};e.id&&(t.id=e.id),e.IdUnicoSrv&&(t.IdUnicoSrv=e.IdUnicoSrv);var n=await(await fetch(a,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(t)})).json();r&&r(n,null)}catch(e){console.error("Error en async_getSrvPlantillasWhatsapp:",e),r&&r(null,{mensaje:e.message})}}async function async_set_managePlantilla(e,r){try{if(!["alta","modificacion","baja"].includes(e.operation))throw new Error("Operación no válida. Solo se permite alta, modificacion o baja.");var o=getToken();if(!o)throw new Error("Token no válido o ausente.");var a,t,n=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{r||!e?.[0]?.Url?a("Error al recuperar URL del servidor."):o(e[0].Url+"/managePlantilla")})}),i={token:o,operation:e.operation,user:e.user,data:e.data},s=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});if(s.ok)return t=await s.json(),r&&r(null,t),t;throw a=await s.json(),new Error(a.message||"Error en la respuesta del servidor.")}catch(e){throw console.error("Error en async_set_managePlantilla:",e),r&&r(e,null),e}}async function async_manageSucursales(e,r){try{var o=getToken();if(!o)throw new Error("Token de autenticación no disponible.");if(!["alta","modificacion","baja"].includes(e.operation))throw new Error(`Operación inválida: '${e.operation}'. Use 'alta', 'modificacion' o 'baja'.`);if(!e.data||"object"!=typeof e.data)throw new Error("El parámetro 'data' es obligatorio y debe ser un objeto válido.");var a={...e.data};if("alta"===e.operation)a.NuevoUpdate=1;else if("baja"===e.operation){if(!a.Id)throw new Error("El campo 'Id' es obligatorio para la operación 'baja'.");a.Delete=1}else{if(!a.Id)throw new Error("El campo 'Id' es obligatorio para la operación 'modificacion'.");a.NuevoUpdate=0}var t=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/manageSucursales"):a("Error al obtener la URL del servidor.")})}),n={token:e.token,data:a},i=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(n)})).json();r&&r(i,null)}catch(e){console.error("Error en async_manageSucursales:",e),r&&r(null,{mensaje:e.message})}}async function getSucursales(e,r,o){try{var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getSucursales"):a(r||"Error al recuperar URL del servidor.")})}),t=e.token||getToken();if(!t)throw new Error("Token no válido o no encontrado.");var n=JSON.stringify({token:t,Id:e.Id||null,limitinit:e.limitinit||0,limit_last:e.limit_last||10,Like:e.Like||"",OrderBy:e.OrderBy||""}),i=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:n});if(!i.ok)throw new Error("Error en la solicitud: "+i.statusText);var s=await i.json();r&&r(s)}catch(e){console.error("Error en getSucursales:",e),o&&o(e)}}function getNivelBadge(r){var e=NIVELES_ROLES.find(e=>e.valor===parseInt(r)),o=e?e.label:"Nivel "+r;return`${o}`}function getColorByRol(e){switch(e.toUpperCase()){case"ADMINISTRADOR":return"bg-label-danger";case"CONTADOR":return"bg-label-info";case"CONTROL_DEUDAS":return"bg-label-warning";case"CAJA":return"bg-label-secondary";case"FACTURADOR":return"bg-label-success";case"APP":return"bg-label-primary";case"VENDEDOR":return"bg-label-purple";default:return"bg-label-light"}}function getUsuControl(o,a){ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?(r=o.token||getToken())?(r=JSON.stringify({token:r,idperfil:o.idperfil,IdModulo:o.IdModulo}),fetch(e[0].Url+"/getUsuControl",{method:"POST",headers:{"Content-Type":"application/json"},body:r}).then(e=>{if(e.ok)return e.json();throw new Error("Error en la solicitud: "+e.statusText)}).then(e=>a(null,e)).catch(e=>a(e,null))):a(new Error("Token no válido o no encontrado."),null):a(new Error("Error al recuperar URL del servidor."),null)})}async function getWhatsappAvailableLines(e,r,o){try{var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getWhatsappAvailableLines"):a(r||"Error al recuperar URL del servidor.")})}),t=e.token||getToken();if(!t)throw new Error("Token no válido o no encontrado.");if(!e.IdEmpresa)throw new Error("Debe especificarse el IdEmpresa.");var n=JSON.stringify({token:t,IdEmpresa:e.IdEmpresa}),i=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:n});if(!i.ok)throw new Error("Error en la solicitud: "+i.statusText);var s=await i.json();r&&r(s)}catch(e){console.error("Error en getWhatsappAvailableLines:",e),o&&o(e)}}async function async_manageEmailsPlan(e,r){try{var o=getToken();if(!o)throw new Error("Token de autenticación no disponible.");if(!["alta","modificacion","baja"].includes(e.operation))throw new Error(`Operación inválida: '${e.operation}'. Use 'alta', 'modificacion' o 'baja'.`);if(!e.data||"object"!=typeof e.data)throw new Error("El parámetro 'data' es obligatorio y debe ser un objeto válido.");var a={...e.data};if("alta"===e.operation)a.NuevoUpdate=1,a.Delete=0;else if("modificacion"===e.operation){if(!a.Id)throw new Error("El campo 'Id' es obligatorio para la operación 'modificacion'.");a.NuevoUpdate=0,a.Delete=0}else if("baja"===e.operation){if(!a.Id)throw new Error("El campo 'Id' es obligatorio para la operación 'baja'.");a.Delete=1,a.NuevoUpdate=99}a.Planmails&&(a.Planmails=btoa(unescape(encodeURIComponent(a.Planmails))));var t=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/setEmailsPlantillas"):a("Error al obtener la URL del servidor.")})}),n={token:e.token,idUsuario:getUserDetails()?.IDUsuario||1,data:a},i=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(n)})).json();r&&r(i,null)}catch(e){console.error("Error en async_manageEmailsPlan:",e),r&&r(null,{mensaje:e.message})}}async function async_getEmailsPlan(e={},r){try{var o=getToken();if(!o)throw new Error("Token de autenticación no disponible.");var{filtro:a="",Id:t=null}=e,n=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/getEmailsPlantillas"):a("Error al obtener la URL del servidor.")})}),i={token:o};t?i.Id=t:i.filtro=a;var s=await(await fetch(n,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(i)})).json();r&&r(s,null)}catch(e){console.error("Error en async_getEmailsPlan:",e),r&&r(null,{mensaje:e.message})}}function decodePlanmailContent(e){try{return atob(e)}catch(e){return console.warn("Error al decodificar Planmails:",e.message),"[Contenido no disponible]"}}async function async_getCategoriasCRM(e={},r){try{var o=getToken();if(!o)throw new Error("Token de autenticación no disponible.");var a,{limitinit:t=0,limit_last:n=10,Like:i="",OrderBy:s="",Id:l=null,MenuResto:c=!1}=e,d=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/get_Categorias"):a("Error al obtener la URL del servidor.")})}),u={token:o,limitinit:t,limit_last:n,Like:i,OrderBy:s,Id:l,MenuResto:c},p=await fetch(d,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(u)});if(!p.ok)throw a=await p.json(),new Error(a.message||"Error al consultar categorías.");var m=await p.json();r&&r(m,null)}catch(e){console.error("Error en async_getCategoriasCRM:",e),r&&r(null,{mensaje:e.message})}}async function async_manageSmsPlantilla(e,r){try{var o=getToken();if(!o)throw new Error("Token de autenticación no disponible.");if(!["alta","modificacion","baja"].includes(e.operation))throw new Error(`Operación inválida: '${e.operation}'. Use 'alta', 'modificacion' o 'baja'.`);if(!e.data||"object"!=typeof e.data)throw new Error("El parámetro 'data' es obligatorio y debe ser un objeto válido.");var a={...e.data};if("alta"===e.operation)a.NuevoUpdate=1,a.Delete=0;else if("modificacion"===e.operation){if(!a.Id)throw new Error("El campo 'Id' es obligatorio para la operación 'modificacion'.");a.NuevoUpdate=0,a.Delete=0}else if("baja"===e.operation){if(!a.Id)throw new Error("El campo 'Id' es obligatorio para la operación 'baja'.");a.Delete=1,a.NuevoUpdate=99}if(a.AgoText&&160{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/setAgoSmsPlantilla"):a("Error al obtener la URL del servidor.")})}),n={token:e.token,idUsuario:getUserDetails()?.IDUsuario||1,data:a},i=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(n)})).json();r&&r(i,null)}catch(e){console.error("Error en async_manageSmsPlantilla:",e),r&&r(null,{mensaje:e.message})}}async function async_getSmsPlantillas(e={},r){try{var o=getToken();if(!o)throw new Error("Token de autenticación no disponible.");var{filtro:a="",Id:t=null}=e,n=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/getsmsPlantillas"):a("Error al obtener la URL del servidor.")})}),i={token:o};t?i.Id=t:i.filtro=a;var s=await(await fetch(n,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(i)})).json();r&&r(s,null)}catch(e){console.error("Error en async_getSmsPlantillas:",e),r&&r(null,{mensaje:e.message})}}async function async_getAlertKeywords(e={},r){try{var o=e.token||getToken();if(!o)throw new Error("Token de autenticación no disponible.");var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/getAlertKeywords"):a("Error al obtener la URL del servidor.")})}),t={token:o},n=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(t)}),i=await n.json();if(!n.ok||200!==i.status)throw new Error("No se pudo recuperar la lista de palabras clave.");r&&r(i.keywords,null)}catch(e){console.error("Error en async_getAlertKeywords:",e),r&&r(null,{mensaje:e.message})}}async function async_manageAlertKeyword(e,r){try{var o=getToken();if(!o)throw new Error("Token de autenticación no disponible.");if(!["alta","modificacion","baja"].includes(e.operation))throw new Error(`Operación inválida: '${e.operation}'. Use 'alta', 'modificacion' o 'baja'.`);if(!e.data||"object"!=typeof e.data)throw new Error("El parámetro 'data' es obligatorio y debe ser un objeto válido.");var a={...e.data};if("alta"===e.operation)a.NuevoUpdate=1,a.Delete=0;else if("modificacion"===e.operation){if(!a.id)throw new Error("El campo 'Id' es obligatorio para la operación 'modificacion'.");a.NuevoUpdate=0,a.Delete=0}else if("baja"===e.operation){if(!a.id)throw new Error("El campo 'Id' es obligatorio para la operación 'baja'.");a.Delete=1,a.NuevoUpdate=99}if(!a.palabra||""===a.palabra.trim())throw new Error("El campo 'palabra' no puede estar vacío.");var t=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/setAlertKeyword"):a("Error al obtener la URL del servidor.")})}),n={token:e.token,idUsuario:getUserDetails()?.IDUsuario||1,data:a},i=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(n)})).json();r&&r(i,null)}catch(e){console.error("Error en async_manageAlertKeyword:",e),r&&r(null,{mensaje:e.message})}}async function async_manageForCobros(e,r){try{var o=getToken();if(!o)throw new Error("Token de autenticación no disponible.");if(!["alta","modificacion","baja"].includes(e.operation))throw new Error(`Operación inválida: '${e.operation}'. Use 'alta', 'modificacion' o 'baja'.`);if(!e.data||"object"!=typeof e.data)throw new Error("El parámetro 'data' es obligatorio y debe ser un objeto válido.");var a={...e.data};if("alta"===e.operation)a.NuevoUpdate=1,a.Delete=0;else if("modificacion"===e.operation){if(!a.id)throw new Error("El campo 'id' es obligatorio para la operación 'modificacion'.");a.NuevoUpdate=0,a.Delete=0}else if("baja"===e.operation){if(!a.id)throw new Error("El campo 'id' es obligatorio para la operación 'baja'.");a.Delete=1,a.NuevoUpdate=99}var t=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/setForCobros"):a("Error al obtener la URL del servidor.")})}),n={token:o,idUsuario:getUserDetails()?.IDUsuario||1,data:a},i=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(n)})).json();r&&r(i,null)}catch(e){console.error("Error en async_manageForCobros:",e),r&&r(null,{mensaje:e.message})}}async function async_getForCobros(e={},r){try{var o=e.token||getToken();if(!o)throw new Error("Token de autenticación no disponible.");var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/getForCobros"):a("Error al obtener la URL del servidor.")})}),t={token:o},n=(e.id&&(t.id=e.id),await fetch(a,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(t)})),i=await n.json();if(!n.ok||200!==i.status)throw new Error("No se pudo recuperar la(s) forma(s) de cobro.");e.id?r&&r({registro:i.registro,historial:i.historial},null):r&&r(i.registros,null)}catch(e){console.error("Error en async_getForCobros:",e),r&&r(null,{mensaje:e.message})}}async function async_getMotBaja(e={},r){try{var o=e.token||getToken();if(!o)throw new Error("Token de autenticación no disponible.");var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/getMotBajas"):a("Error al obtener la URL del servidor.")})}),t={token:o},n=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(t)}),i=await n.json();if(!n.ok)throw new Error("No se pudo recuperar la lista de motivos de baja.");r&&r(i.motivos||i.data||i,null)}catch(e){console.error("Error en async_getMotBaja:",e),r&&r(null,{mensaje:e.message})}}async function async_manageMotivosBaja(e,r){try{var o=getToken();if(!o)throw new Error("Token de autenticación no disponible.");if(!["alta","modificacion","baja"].includes(e.operation))throw new Error(`Operación inválida: '${e.operation}'. Use 'alta', 'modificacion' o 'baja'.`);if(!e.data||"object"!=typeof e.data)throw new Error("El parámetro 'data' es obligatorio y debe ser un objeto válido.");var a={...e.data};if("alta"===e.operation)a.NuevoUpdate=1,a.Delete=0;else if("modificacion"===e.operation){if(!a.id)throw new Error("El campo 'MotBId' es obligatorio para la operación 'modificacion'.");a.NuevoUpdate=0,a.Delete=0}else if("baja"===e.operation){if(!a.id)throw new Error("El campo 'MotBId' es obligatorio para la operación 'baja'.");a.NuevoUpdate=99,a.Delete=1}var t=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/setMotivosBaja"):a("Error al obtener la URL del servidor.")})}),n={token:o,idUsuario:getUserDetails()?.IDUsuario||1,data:a},i=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(n)})).json();r&&r(i,null)}catch(e){console.error("Error en async_manageMotivosBaja:",e),r&&r(null,{mensaje:e.message})}}async function async_manageTiposAfiliacion(e,r){try{var o=getToken();if(!o)throw new Error("Token de autenticación no disponible.");if(!["alta","modificacion","baja"].includes(e.operation))throw new Error(`Operación inválida: '${e.operation}'. Use 'alta', 'modificacion' o 'baja'.`);if(!e.data||"object"!=typeof e.data)throw new Error("El parámetro 'data' es obligatorio y debe ser un objeto válido.");var a={...e.data};if("alta"===e.operation)a.NuevoUpdate=1,a.Delete=0;else if("modificacion"===e.operation){if(!a.IdTipAfil)throw new Error("El campo 'IdTipAfil' es obligatorio para la operación 'modificacion'.");a.NuevoUpdate=0,a.Delete=0}else if("baja"===e.operation){if(!a.IdTipAfil)throw new Error("El campo 'IdTipAfil' es obligatorio para la operación 'baja'.");a.NuevoUpdate=99,a.Delete=1}var t=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/setTiposAfiliacion"):a("Error al obtener la URL del servidor.")})}),n={token:o,idUsuario:getUserDetails()?.IDUsuario||1,data:a},i=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(n)})).json();r&&r(i,null)}catch(e){console.error("Error en async_manageTiposAfiliacion:",e),r&&r(null,{mensaje:e.message})}}async function async_getTiposAfiliacion(e={},r){try{var o=e.token||getToken();if(!o)throw new Error("Token de autenticación no disponible.");var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/getTiposAfiliacion"):a("Error al obtener la URL del servidor.")})}),t={token:o},n=(e.IdTipAfil&&(t.IdTipAfil=e.IdTipAfil),await fetch(a,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(t)})),i=await n.json();if(!n.ok)throw new Error("No se pudo recuperar la información de tipos de afiliación.");r&&r(i.registros||i.registro||i,null)}catch(e){console.error("Error en async_getTiposAfiliacion:",e),r&&r(null,{mensaje:e.message})}}async function async_manageMonedas(e,r){try{var o=getToken();if(!o)throw new Error("Token de autenticación no disponible.");if(!["alta","modificacion","baja"].includes(e.operation))throw new Error(`Operación inválida: '${e.operation}'. Use 'alta', 'modificacion' o 'baja'.`);if(!e.data||"object"!=typeof e.data)throw new Error("El parámetro 'data' es obligatorio y debe ser un objeto válido.");var a={...e.data};if("alta"===e.operation){if(!a.Name)throw new Error("El campo 'Name' es obligatorio para la operación 'alta'.");a.Id=99,a.NuevoUpdate=1,a.Delete=0}else if("modificacion"===e.operation){if(!a.Id)throw new Error("El campo 'Id' es obligatorio para la operación 'modificacion'.");a.NuevoUpdate=0,a.Delete=0}else if("baja"===e.operation){if(!a.Id)throw new Error("El campo 'Id' es obligatorio para la operación 'baja'.");a.NuevoUpdate=99,a.Delete=1}var t,n=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/setMonedas"):a("Error al obtener la URL del servidor.")})}),i={token:o,operation:e.operation,data:a},s=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(i)});if(!s.ok)throw t=await s.text(),new Error("Error del servidor: "+t);var l=await s.json();"function"==typeof r&&r(l,null)}catch(e){console.error("Error en async_manageMonedas:",e),"function"==typeof r&&r(null,{mensaje:e.message})}}async function async_getMonedas(e={},r){try{var o=e.token||getToken();if(!o)throw new Error("Token de autenticación no disponible.");var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/getMonedas"):a("Error al obtener la URL del servidor.")})}),t={token:o,Id:e.Id||"",Like:e.Like||"",OrderBy:e.OrderBy||"",limitinit:e.limitinit??0,limit_last:e.limit_last??100},n=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(t)}),i=await n.json();if(!n.ok)throw new Error("No se pudo recuperar la información de monedas.");r&&r(i.registros||i.registro||i,null)}catch(e){console.error("Error en async_getMonedas:",e),r&&r(null,{mensaje:e.message})}}async function async_manageEmpConv(e,r){try{var o=getToken();if(!o)throw new Error("Token de autenticación no disponible.");if(!["alta","modificacion","baja"].includes(e.operation))throw new Error(`Operación inválida: '${e.operation}'. Use 'alta', 'modificacion' o 'baja'.`);if(!e.data||"object"!=typeof e.data)throw new Error("El parámetro 'data' es obligatorio y debe ser un objeto válido.");var a={...e.data};if("alta"===e.operation)a.NuevoUpdate=1,a.Delete=0;else if("modificacion"===e.operation){if(!a.id)throw new Error("El campo 'id' es obligatorio para la operación 'modificacion'.");a.NuevoUpdate=0,a.Delete=0}else if("baja"===e.operation){if(!a.id)throw new Error("El campo 'id' es obligatorio para la operación 'baja'.");a.NuevoUpdate=99,a.Delete=1}var t=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/setEmpConv"):a("Error al obtener la URL del servidor.")})}),n={token:o,idUsuario:getUserDetails()?.IDUsuario||1,data:a},i=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(n)})).json();r&&r(i,null)}catch(e){console.error("Error en async_manageEmpConv:",e),r&&r(null,{mensaje:e.message})}}async function async_getEmpConv(e={},r){try{var o=e.token||getToken();if(!o)throw new Error("Token de autenticación no disponible.");var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/getEmpConv"):a("Error al obtener la URL del servidor.")})}),t={token:o,id:e.id||null},n=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(t)}),i=await n.json();if(!n.ok)throw new Error("No se pudo recuperar la información de empresas por convenio.");r&&r(i.registros||i.registro||i,null)}catch(e){console.error("Error en async_getEmpConv:",e),r&&r(null,{mensaje:e.message})}}async function async_manageTipoSocios(e,r){try{var o=getToken();if(!o)throw new Error("Token de autenticación no disponible.");if(!["alta","modificacion","baja"].includes(e.operation))throw new Error(`Operación inválida: '${e.operation}'. Use 'alta', 'modificacion' o 'baja'.`);if(!e.data||"object"!=typeof e.data)throw new Error("El parámetro 'data' es obligatorio y debe ser un objeto válido.");var a={...e.data};if("alta"===e.operation)a.NuevoUpdate=1,a.Delete=0;else if("modificacion"===e.operation){if(!a.IdTipSoc)throw new Error("El campo 'IdTipSoc' es obligatorio para la operación 'modificacion'.");a.NuevoUpdate=0,a.Delete=0}else if("baja"===e.operation){if(!a.IdTipSoc)throw new Error("El campo 'IdTipSoc' es obligatorio para la operación 'baja'.");a.NuevoUpdate=0,a.Delete=1}var t=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/setTipoSocios"):a("Error al obtener la URL del servidor.")})}),n={token:o,idUsuario:getUserDetails()?.IDUsuario||1,data:a},i=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(n)})).json();r&&r(i,null)}catch(e){console.error("Error en async_manageTipoSocios:",e),r&&r(null,{mensaje:e.message})}}async function async_getTipoSocios(e={},r){try{var o=e.token||getToken();if(!o)throw new Error("Token de autenticación no disponible.");var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/getTipoSocios"):a("Error al obtener la URL del servidor.")})}),t={token:o,IdTipSoc:e.IdTipSoc||null},n=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(t)}),i=await n.json();if(!n.ok)throw new Error("No se pudo recuperar la información de tipos de socios.");r&&r(i.registros||i.registro||i,null)}catch(e){console.error("Error en async_getTipoSocios:",e),r&&r(null,{mensaje:e.message})}}async function async_getCalendarEvents(e={},r){var o=e.token||("function"==typeof getToken?getToken():null);if(!o)return t=new Error("Token de autenticación no disponible."),console.error("Error en async_getCalendarEvents:",t),r&&r(null,{mensaje:t.message});try{if("function"==typeof getPermissions)if(!getPermissions())throw new Error("No se encontraron permisos válidos para este usuario.")}catch(e){console.warn("Permisos no válidos (continuando solo si tu flujo lo permite):",e.message)}let a={start_event:"start_event",end_event:"end_event",id:"id",Usuario:"Usuario",Categoria:"Categoria"};var{UlFecProFrom:t,UlFecProTo:n,IdUsuario:i,IdCliente:s,IdCategoria:l,Nivel:c,Like:d,TipEnvio:u,Etiqueta:p,CheckAppointment:m,limitInit:g,limitLast:f}=e,n={token:o,...t?{UlFecProFrom:t}:{},...n?{UlFecProTo:n}:{},...null!=i?{IdUsuario:Number(i)}:{},...null!=s?{IdCliente:Number(s)}:{},...null!=l?{IdCategoria:Number(l)}:{},...null!=c?{Nivel:Number(c)}:{},...d?{Like:d}:{},...u?{TipEnvio:u}:{},...null!=p?{Etiqueta:p}:{},...void 0!==m&&""!==m?{CheckAppointment:m}:{},...Number.isFinite(Number(g))?{limitInit:Number(g)}:{},...Number.isFinite(Number(f))?{limitLast:Number(f)}:{},...e.OrderBy?{OrderBy:(t=e.OrderBy,t&&"string"==typeof t&&(t=t.split(",").map(e=>e.trim()).filter(Boolean).map(e=>a[e]).filter(Boolean)).length?t.join(", "):"start_event, id")}:{OrderBy:"start_event, id"}};try{var v=await new Promise((o,a)=>{"undefined"!=typeof ServicioURLManager&&ServicioURLManager?.getUrlServicios?ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/getEntity_CalendarEvents"):a(new Error("Error al obtener la URL del servidor."))}):a(new Error("No se encontró ServicioURLManager.getUrlServicios."))}),h=await fetch(v,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(n)});let e;try{e=await h.json()}catch(e){throw new Error("Respuesta del servidor no es JSON válido.")}if(h.ok)return r&&r(e,null);throw new Error(e?.message||"No se pudo recuperar la información del calendario.")}catch(e){return console.error("Error en async_getCalendarEvents:",e),r&&r(null,{mensaje:e.message})}}async function async_manageCategoryCalendar(e,r){try{var o=getToken();if(!o)throw new Error("Token de autenticación no disponible.");if(!["alta","modificacion","baja"].includes(e.operation))throw new Error(`Operación inválida: '${e.operation}'. Use 'alta', 'modificacion' o 'baja'.`);if(!e.data||"object"!=typeof e.data)throw new Error("El parámetro 'data' es obligatorio y debe ser un objeto válido.");var a={...e.data};if("alta"===e.operation)a.NuevoUpdate=1,a.Delete=99;else if("modificacion"===e.operation){if(!a.Id)throw new Error("El campo 'Id' es obligatorio para la operación 'modificacion'.");a.NuevoUpdate=0,a.Delete=99}else if("baja"===e.operation){if(!a.Id)throw new Error("El campo 'Id' es obligatorio para la operación 'baja'.");a.NuevoUpdate=99,a.Delete=1}var t=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/setCategoryCalendar"):a("Error al obtener la URL del servidor.")})}),n={token:o,data:a},i=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(n)})).json();r&&r(i,null)}catch(e){console.error("Error en async_manageCategoryCalendar:",e),r&&r(null,{mensaje:e.message})}}async function async_getEventsCategory(e={},r){try{var o=e.token||getToken();if(!o)throw new Error("Token de autenticación no disponible.");var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/getEventsCategory"):a("Error al obtener la URL del servidor.")})}),t={token:o,limitinit:e.limitinit??0,limit_last:e.limit_last??10,Like:e.Like??"",OrderBy:e.OrderBy??"events_category_name asc"},n=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(t)}),i=await n.json();if(!n.ok)throw new Error(i.message||"No se pudo recuperar la información de categorías de eventos.");r&&r(i||[],null)}catch(e){console.error("Error en async_getEventsCategory:",e),r&&r(null,{mensaje:e.message})}}async function async_manageCalendarEvent(e,r){try{var o=getToken();if(!o)throw new Error("Token de autenticación no disponible.");if(!["alta","modificacion","baja"].includes(e.operation))throw new Error(`Operación inválida: '${e.operation}'. Use 'alta', 'modificacion' o 'baja'.`);if(!e.configurations||"object"!=typeof e.configurations)throw new Error("El parámetro 'configurations' es obligatorio y debe ser un objeto válido.");var a={...e.configurations};if("alta"===e.operation)a.NuevoUpdate="1",a.Delete="99";else if("modificacion"===e.operation){if(!a.Id||0===a.Id)throw new Error("El campo 'Id' es obligatorio para 'modificacion'.");a.NuevoUpdate="0",a.Delete="99"}else if("baja"===e.operation){if(!a.Id||0===a.Id)throw new Error("El campo 'Id' es obligatorio para 'baja'.");a.NuevoUpdate="99",a.Delete="1"}var t=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/manageCalendarEvent"):a("Error al obtener la URL del servidor.")})}),n={token:o,user_id:e.user_id,configurations:a},i=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(n)})).json();r&&r(i,null)}catch(e){console.error("Error en async_manageCalendarEvent:",e),r&&r(null,{mensaje:e.message})}}async function async_manageEntityCalls(e,r){try{var o=getToken();if(!o)throw new Error("Token de autenticación no disponible.");if(!["alta","modificacion","baja"].includes(e.operation))throw new Error(`Operación inválida: '${e.operation}'. Use 'alta', 'modificacion' o 'baja'.`);if(!e.data||"object"!=typeof e.data)throw new Error("El parámetro 'data' es obligatorio y debe ser un objeto válido.");var a={...e.data};if("alta"===e.operation)a.NuevoUpdate="1",a.Delete="99";else if("modificacion"===e.operation){if(!a.IdTarea||"0"===a.IdTarea)throw new Error("El campo 'IdTarea' es obligatorio para la modificación.");a.NuevoUpdate="0",a.Delete="99"}else if("baja"===e.operation){if(!a.IdTarea||"0"===a.IdTarea)throw new Error("El campo 'IdTarea' es obligatorio para la baja.");a.NuevoUpdate="99",a.Delete="1"}var t=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/setCalls"):a("Error al obtener la URL del servidor.")})}),n={token:o,data:a},i=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(n)})).json();r&&r(i,null)}catch(e){console.error("Error en async_manageEntityCalls:",e),r&&r(null,{mensaje:e.message})}}async function getEntity_Calls_SSE(r,o,a,t){try{var n=r.token||await getToken();if(!n)throw new Error("Token no válido o no encontrado.");var i=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/getCalls"):a(r||"Error al recuperar URL del servidor.")})}),s=JSON.stringify({token:n,limitinit:r.limitinit??0,limit_last:r.limit_last??10,Like:r.Like??"",OrderBy:r.OrderBy??"",filters:r.filters??{}}),l=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json"},body:s});if(!l.ok)throw new Error("Error en la solicitud: "+l.statusText);var c=l.body.getReader(),d=new TextDecoder("utf-8");let e="";for(var u=[];;){var{done:p,value:m}=await c.read();if(p)break;var g,f=(e+=d.decode(m,{stream:!0})).split("\n\n");e=f.pop();for(g of f)if(g.startsWith("data: "))try{var v=JSON.parse(g.replace("data: ",""));Array.isArray(v.data)&&0===v.data.length||(u.push(v),o&&o(v))}catch(e){console.warn("Error al parsear JSON en SSE:",e)}}a&&a(u)}catch(e){console.error("Error en getEntity_Calls_SSE:",e),t&&t(e)}}async function async_manageEntityNegocios(e,r){var o;if(["alta","baja","modificacion"].includes(e.operation)){if(!getPermissions())throw o=new Error("No se encontraron permisos válidos para este usuario."),r&&r(o,null),o;try{var a,t,n=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/manageEntityNegocios"):a(r||"Error al recuperar URL del servidor.")})}),i=getToken();i?(a={token:i,data:{operation:e.operation,...e.data}},t=await(await fetch(n,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+i},body:JSON.stringify(a)})).json(),r&&r(t,null)):(console.error("Token de autenticación no encontrado."),r&&r(null,{mensaje:"Token no encontrado."}))}catch(e){console.error("Error durante la operación asincrónica:",e),r&&r(null,{mensaje:"Error durante la operación."})}}else console.error("Operación no válida:",e.operation),r&&r(null,{mensaje:"Operación no válida."})}function getEntity_NegociosEnriquecidos_SSE(p={},e={}){let{onMessage:m,onComplete:g,onError:t,onOpen:f,onFinally:v}=e,h=0,w=0,r=new AbortController,y=r.signal;return{abort:()=>r.abort(),done:(async()=>{try{var e=p.token||("function"==typeof getToken?getToken():null);if(!e)throw new Error("Token no válido o no encontrado.");var r=await new Promise((o,a)=>{if("undefined"!=typeof ServicioURLManager&&ServicioURLManager?.getUrlServicios)try{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]&&e[0].Url?o(e[0].Url+"/getNegociosEnriquecidos"):a(r||new Error("Error al recuperar URL del servidor."))})}catch(e){a(e)}else a(new Error("ServicioURLManager.getUrlServicios no está definido."))}),o=JSON.stringify({token:e,limitinit:Number.isFinite(p.limitinit)?p.limitinit:0,limit_last:Number.isFinite(p.limit_last)?p.limit_last:10,Like:p.Like??"",OrderBy:p.OrderBy??"n.id DESC",filters:p.filters??{}}),a=(console.log("slicitando "),await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:o,signal:y}));if(!a.ok)throw new Error(`Error en la solicitud: ${a.status} `+a.statusText);f&&f();var n=a.body?.getReader(),i=new TextDecoder("utf-8");if(!n)throw new Error("La respuesta no es streameable.");let t="";for(var s=e=>{var r,o,e=e.split(/\n\n/);t=e.pop()??"";for(r of e)for(o of r.split("\n").filter(e=>e.trim()&&!e.trim().startsWith(":")).join("\n").split("\n").filter(e=>e.startsWith("data:")).map(e=>e.replace(/^data:\s?/,"")))if(o)try{var a=JSON.parse(o);w++,Array.isArray(a?.data)&&(h+=a.data.length),m&&m(a)}catch(e){console.warn("?? Error al parsear JSON de SSE:",e)}};;){var{done:l,value:c}=await n.read();if(l)break;try{var d=i.decode(c,{stream:!0});s(t+d)}catch(e){console.warn("?? Error procesando chunk SSE:",e)}}if(t.trim())try{s(t+"\n\n")}catch{}console.log("complete ");var u={received:h,batches:w};return g&&g(u),u}catch(e){throw t&&t(e),e}finally{v&&v()}})()}}async function async_manageEntityCategoriasNegocio(e,r){var o;if(["alta","baja","modificacion"].includes(e.operation)){if(!getPermissions())throw o=new Error("No se encontraron permisos válidos para este usuario."),r&&r(o,null),o;try{var a,t,n=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/setNegociosCategorias"):a(r||"Error al recuperar URL del servidor.")})}),i=getToken();i?(a={token:i,data:{operation:e.operation,...e.data}},t=await(await fetch(n,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+i},body:JSON.stringify(a)})).json(),r&&r(t,null)):(console.error("Token de autenticación no encontrado."),r&&r(null,{mensaje:"Token no encontrado."}))}catch(e){console.error("Error durante la operación asincrónica:",e),r&&r(null,{mensaje:"Error durante la operación."})}}else console.error("Operación no válida:",e.operation),r&&r(null,{mensaje:"Operación no válida."})}async function async_getEntityCategoriasNegocio(e={},r){try{var o=e.token||getToken();if(!o)throw new Error("Token de autenticación no disponible.");var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/getNegociosCategorias"):a("Error al obtener la URL del servidor.")})}),t={token:o,limitinit:e.limitinit??0,limit_last:e.limit_last??10,Like:e.Like??"",OrderBy:e.OrderBy??"nombre ASC"},n=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(t)}),i=await n.json();if(!n.ok)throw new Error(i.message||"No se pudo recuperar la información de categorías de negocio.");r&&r(i||[],null)}catch(e){console.error("Error en async_getEntityCategoriasNegocio:",e),r&&r(null,{mensaje:e.message})}}function getEtiquetaDesdeSelect(e){var r=e.options[e.selectedIndex]?.text?.trim()||"",e=e.value?.trim();return etiquetasFijas[r]||(""===e?0:isNaN(e)?e:parseInt(e))}function obtenerEtiquetaVisible(e){var r=e.Etiqueta?.toString().trim(),e=(e.idevents_category,e.events_category_name?.trim()),o=Object.fromEntries(Object.entries(etiquetasFijas).map(([e,r])=>[r,e]));return o[r]||(r&&isNaN(r)?r:!isNaN(r)&&0<+r&&e?e:null)}function seleccionarEtiquetaEnCombo(e,o){var e=$("#"+e),r=e.find("option").filter((e,r)=>r.textContent.trim()===o);0{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/updateCallStatus"):a("Error al obtener la URL del servidor.")})}),t={token:o,data:{IdCalls:e.IdCalls,status:e.status}},n=await(await fetch(a,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(t)})).json();r&&r(n,null)}catch(e){console.error("Error en async_updateCallStatus:",e),r&&r(null,{mensaje:e.message})}}function parseDateTime(e,r={}){var{assumeDMY:r=!0}=r;if(!e)return null;if(e instanceof Date)return isNaN(e)?null:e;e=String(e).trim();if(/[-/]\-?0+1\b/.test(e)||/\/\-0+1\b/.test(e)){var o=e.match(/\/(\-?\d{1,4})\b/);if(o&&Number(o[1])<=0)return null}var a,t,n,i,s,l,o=e.match(/^(\d{4})-(\d{2})-(\d{2})(?:[ T](\d{2}):(\d{2})(?::(\d{2}))?)?$/);return o?([,s,t,a,l="0",n="0",i="0"]=o,s=new Date(Number(s),Number(t)-1,Number(a),Number(l),Number(n),Number(i)),isNaN(s)?null:s):(o=e.match(/^(\d{1,2})\/(\d{1,2})\/(\-?\d{1,4})(?:[ T](\d{1,2}):(\d{2})(?::(\d{2}))?)?$/))?([,t,a,l,n="0",i="0",s="0"]=o,l=Number(l),!Number.isFinite(l)||l<=0||(l=new Date(l,Number(a)-1,Number(t),Number(n),Number(i),Number(s)),isNaN(l))?null:l):(o=e.match(/^(\d{1,2})\/(\d{1,2})\/(\d{4})(?:[ T](\d{1,2}):(\d{2})(?::(\d{2}))?)?$/))&&!r?([,a,t,n,i="0",s="0",l="0"]=o,r=new Date(Number(n),Number(a)-1,Number(t),Number(i),Number(s),Number(l)),isNaN(r)?null:r):(o=new Date(e),isNaN(o.getTime())?null:o)}async function getAdjuntosProcesadosFromDropzone(e){var r=e.files.filter(e=>e instanceof File),e=e.files.filter(e=>e.url),r=r.map(e=>convertFileToBase64(e)),r=await Promise.all(r),e=e.map(e=>e.url);return[...r.filter(Boolean),...e]}function convertFileToBase64_new(a){return new Promise((r,o)=>{if(a instanceof File||a instanceof Blob){let e=new FileReader;e.onload=()=>r(e.result),e.onerror=o,e.readAsDataURL(a)}else console.warn(" Archivo no válido para conversión base64:",a),r(null)})}async function procesarAdjuntosDesdeDropzone(e){var r,o=[];for(r of e.files)if(r instanceof File||r instanceof Blob){let e=await convertFileToBase64(r);var a=await new Promise((o,a)=>{async_fetch_FileUpload(e,(e,r)=>{e?(console.error(" Error al subir archivo:",e),a(e)):(console.log(" Archivo subido:",r.url),o(r.url))})});o.push(a)}else r.url?(console.log("📎 Archivo remoto mantenido:",r.url),o.push(r.url)):console.warn("⚠️ Archivo inválido omitido:",r);return o}function animateCounters(){document.querySelectorAll("#countHoy, #countFuturos, #countAtrasados, #countTotales").forEach(e=>{let r=parseInt(e.textContent),o=0,a=Math.ceil(r/30),t=setInterval(()=>{(o+=a)>=r?(e.textContent=r,clearInterval(t)):e.textContent=o},20)})}async function async_manageEntitySeguimiento(e,r){try{var o=getToken();if(!o)throw new Error("Token de autenticación no disponible.");if(!["alta","modificacion","baja"].includes(e.operation))throw new Error(`Operación inválida: '${e.operation}'. Use 'alta', 'modificacion' o 'baja'.`);if(!e.data||"object"!=typeof e.data)throw new Error("El parámetro 'data' es obligatorio y debe ser un objeto válido.");var a={...e.data};if("alta"===e.operation)a.NuevoUpdate=1,a.Delete=99;else if("modificacion"===e.operation){if(!a.id)throw new Error("El campo 'id' es obligatorio para la modificación.");a.NuevoUpdate=0,a.Delete=99}else if("baja"===e.operation){if(!a.id)throw new Error("El campo 'id' es obligatorio para la baja.");a.NuevoUpdate=99,a.Delete=1}var t=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/setSeguimiento"):a("Error al obtener la URL del servidor.")})}),n={token:o,data:a},i=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(n)})).json();r&&r(i,null)}catch(e){console.error("Error en async_manageEntitySeguimiento:",e),r&&r(null,{mensaje:e.message})}}async function getEntity_Seguimientos_SSE(r,o,a,t){try{var n=r.token||await getToken();if(!n)throw new Error("Token no válido o no encontrado.");var i=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/getSeguimientos"):a(r||"Error al recuperar URL del servidor.")})}),s=JSON.stringify({token:n,entidad_tipo:r.entidad_tipo||null,entidad_id:r.entidad_id||null,idUsuario:r.idUsuario||null,fecha_limite:r.fecha_limite||null}),l=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+n},body:s});if(!l.ok)throw new Error("Error en la solicitud: "+l.statusText);var c=l.body.getReader(),d=new TextDecoder("utf-8");let e="";for(var u=[];;){var{done:p,value:m}=await c.read();if(p)break;var g,f=(e+=d.decode(m,{stream:!0})).split("\n\n");e=f.pop();for(g of f)if(g.startsWith("data: "))try{var v=JSON.parse(g.replace("data: ",""));Array.isArray(v.data)&&0===v.data.length||(u.push(v),o&&o(v))}catch(e){console.warn("Error al parsear JSON en SSE:",e)}}a&&a(u)}catch(e){console.error("Error en getEntity_Seguimientos_SSE:",e),t&&t(e)}}let plantillaIndex=0;function agregarPlantilla(){var e=document.getElementById("plantillasContainer"),r=document.createElement("div");r.className="plantilla-item border rounded p-3 mb-3 bg-body-secondary",r.innerHTML=`
    `,e.appendChild(r),plantillaIndex++,[].slice.call(r.querySelectorAll('[data-bs-toggle="tooltip"]')).map(function(e){return new bootstrap.Tooltip(e)})}function eliminarPlantilla(e){e=e.closest(".border");e&&e.remove()}function openFollowUpModal({entidad_tipo:e,entidad_id:r,titulo:o,descripcion:a,idUsuario:t}){document.getElementById("entidad_tipo").value=e,document.getElementById("entidad_id").value=r,document.getElementById("idUsuario").value=t,setFollowUpTitulo(e,o||""),document.getElementById("descripcion").value=a||"",document.getElementById("fecha_inicio").value="",document.getElementById("fecha_fin").value="",document.getElementById("intervalo").value=1,document.getElementById("frecuencia").value="diaria",$("#usuario_asignado").val(null).trigger("change"),document.getElementById("plantillasContainer").innerHTML="",$("#followUpModal").modal("show");try{null!=r&&loadSeguimientosForEntity({entidad_tipo:e,entidad_id:r})}catch(e){console.warn("No se pudieron cargar seguimientos SSE:",e)}}function setFollowUpTitulo(e,r){var o=document.getElementById("titulo");let a="Seguimiento";"oportunidad"===e?a="Seguimiento de la oportunidad: "+r:"negocio"===e?a="Seguimiento del negocio: "+r:"cliente"===e?a="Seguimiento del cliente: "+r:"evento"===e&&(a="Seguimiento del evento: "+r),o.value=a}function obtenerPlantillas(){let s=[];return document.querySelectorAll("#plantillasContainer .plantilla-item").forEach(r=>{var e=e=>r.querySelector(e),o=Number(e("[name='orden']")?.value??0)||0,a=Number(e("[name='offset_dias']")?.value??0)||0,t=e("[name='tipo']")?.value||"whatsapp",n=e("[name='canal']")?.value||"bot",i=(e("[name='asunto']")?.value||"").trim(),e=(e("[name='mensaje']")?.value||"").trim();e&&s.push({orden:o,offset_dias:a,tipo:t,canal:n,asunto:i,mensaje:e})}),s.sort((e,r)=>e.orden-r.orden),s}async function loadSeguimientosForEntity({entidad_tipo:e="negocio",entidad_id:a,fecha_limite:r}){var o,t;if(a||0===a)return r||((o=new Date).setDate(o.getDate()+30),t=e=>String(e).padStart(2,"0"),r=`${o.getFullYear()}-${t(o.getMonth()+1)}-${t(o.getDate())} ${t(o.getHours())}:${t(o.getMinutes())}:00`),console.log("La nueva loadSeguimientosForEntity "),new Promise(r=>{let o=[];getEntity_Seguimientos_SSE({entidad_tipo:e,entidad_id:Number(a)},e=>{e?.data?.length&&(o=[...o,...e.data])},()=>{try{renderPlantillasFromSeguimientos(o)}catch(e){console.warn("Render de plantillas falló:",e)}r(o)},e=>{console.error("SSE seguimientos error:",e),r([])})})}function renderPlantillasFromSeguimientos(e){Array.isArray(e)&&e.length&&actualizarModalFollowUp(e)}function setInputDate(e,r){e=document.getElementById(e);if(e){var o=(o=r)?"string"==typeof o&&o.includes(" ")&&!o.includes("T")?new Date(o.replace(" ","T")):(o=new Date(o),isNaN(o)?null:o):null;if(e._flatpickr&&"function"==typeof e._flatpickr.setDate)e._flatpickr.setDate(o||r,!0);else{try{if(window.tempusDominus){var a=window.tempusDominus.findTempusDominus(e);if(a)return void(o?a.dates.setValue(o):e.value=r??"")}}catch(e){}a=window.jQuery;if(a&&"function"==typeof a(e).data){var t=a(e).data("DateTimePicker");if(t&&"function"==typeof t.date)return void t.date(o||r)}if(a&&"function"==typeof a(e).datetimepicker)try{return void a(e).datetimepicker("setOptions",{value:r})}catch(e){}e.value=o?(t=e=>String(e).padStart(2,"0"),`${(a=o).getFullYear()}-${t(a.getMonth()+1)}-${t(a.getDate())} ${t(a.getHours())}:${t(a.getMinutes())}:`+t(a.getSeconds())):r??""}}}function actualizarModalFollowUp(a){if(a){var n=Array.isArray(a)?a[0]:a;if(n&&"object"==typeof n){a=window.jQuery;var i=(e,r)=>{e=document.getElementById(e);e&&(e.value=r??"")};let t=e=>{if(!e)return null;try{var r,o;return e instanceof Date?isNaN(e)?null:e:(r="string"==typeof e?e.includes("T")?e:e.replace(" ","T"):String(e),o=new Date(r),isNaN(o)?null:o)}catch{return null}};var s=e=>{var r,e=t(e);return e?(r=e=>String(e).padStart(2,"0"),e.getFullYear()+`-${r(e.getMonth()+1)}-${r(e.getDate())} ${r(e.getHours())}:`+r(e.getMinutes())):""};let r=e=>{var r,e=t(e);return e?(r=e=>String(e).padStart(2,"0"),`${e.getFullYear()}-${r(e.getMonth()+1)}-`+r(e.getDate())):""};i("entidad_tipo",n.entidad_tipo),i("entidad_id",n.entidad_id),i("idUsuario",n.creado_por),i("titulo",n.titulo),i("descripcion",n.descripcion),("function"==typeof setInputDate?(setInputDate("fecha_inicio",s(n.fecha_inicio)),setInputDate):(i("fecha_inicio",s(n.fecha_inicio)),i))("fecha_fin",s(n.fecha_fin)),i("frecuencia",n.frecuencia||"diaria"),i("intervalo",n.intervalo??1);let e=[];Array.isArray(n.usuario_asignado)?e=n.usuario_asignado.map(String):"string"==typeof n.usuario_asignado&&(e=n.usuario_asignado.split(",").map(e=>e.trim()).filter(Boolean)),a("#usuario_asignado").length&&a("#usuario_asignado").val(e).trigger("change");var s=Array.isArray(n.plantillas)?[...n.plantillas]:[],l=new Set(s.filter(e=>e&&e.fecha_disparo).map(e=>r(e.fecha_disparo)).filter(Boolean));let o=s.reduce((e,r)=>Number.isFinite(r?.orden)?Math.max(e,r.orden):e,0)+1;var c,d=t(n.fecha_inicio)||t(n.proximas_fechas?.[0])||new Date;if(Array.isArray(n.proximas_fechas)&&n.proximas_fechas.length){var u,p=[];for(u of n.proximas_fechas){var m=r(u);!m||l.has(m)||p.push({id:null,seguimiento_id:n.id??null,orden:o++,tipo:"",canal:"",asunto:"",mensaje:"",offset_dias:(m=d,c=u,m=t(m),c=t(c),m&&c?(m=Date.UTC(m.getFullYear(),m.getMonth(),m.getDate()),c=Date.UTC(c.getFullYear(),c.getMonth(),c.getDate()),Math.round((c-m)/864e5)):0),fecha_disparo:u,_placeholder:!0})}s.push(...p)}s.sort((e,r)=>{var o=Number.isFinite(e?.orden)?e.orden:Number.MAX_SAFE_INTEGER,a=Number.isFinite(r?.orden)?r.orden:Number.MAX_SAFE_INTEGER;return o!==a?o-a:(t(e?.fecha_disparo)?.getTime()??1/0)-(t(r?.fecha_disparo)?.getTime()??1/0)}),renderPlantillas(s,"plantillasContainer")}}}function renderPlantillas(e,r){r=document.getElementById(r);if(r){let i=e=>String(e??"").replace(/[&<>"']/g,e=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[e]),s=[{v:"whatsapp",t:"WhatsApp"},{v:"email",t:"Email"},{v:"sms",t:"SMS"},{v:"push",t:"Push"}],l=[{v:"bot",t:"Bot"},{v:"sistema",t:"Sistema"},{v:"manual",t:"Manual"}],c=(e,r,o)=>{let a=String(r??"").toLowerCase();return``};e=(e||[]).map((e,r)=>{var o=!!e._placeholder,a=o?"border border-2 border-dashed rounded-2":"border rounded-2",t=e?.orden??r+1,n=e?.fecha_disparo?(e=>{if(!e)return"";try{var r,o=new Date(e.replace(/ /g,"T"));return Number.isNaN(o.getTime())?"":(r=e=>String(e).padStart(2,"0"),o.getFullYear()+`-${r(o.getMonth()+1)}-${r(o.getDate())}T${r(o.getHours())}:`+r(o.getMinutes()))}catch{return""}})(e.fecha_disparo):"";return`
    #${i(t)} ${o?'Pendiente':""} ${i(e.fecha_disparo||"")}
    ${c("tipo",String(e?.tipo??"").toLowerCase(),s)}
    ${c("canal",String(e?.canal??"").toLowerCase(),l)}
    `}).join("");r.innerHTML=e||'
    No hay plantillas.
    ',r.addEventListener("click",e=>{var e=e.target.closest('[data-action="eliminar"]');e&&(e=e.closest("[data-index]"))&&e.remove()},{passive:!0}),window.bootstrap?.Tooltip&&[...r.querySelectorAll('[data-bs-toggle="tooltip"]')].forEach(e=>new bootstrap.Tooltip(e))}}function toValueDateTimeLocal(e){var r,e="string"==typeof e&&!1===e.includes("Z")&&/[-+]\d{2}:?\d{2}$/.test(e)?new Date(e):new Date("string"==typeof e&&e.includes("T")?e:e&&String(e).replace(" ","T"));return e instanceof Date&&!isNaN(e)?(r=e=>String(e).padStart(2,"0"),`${e.getFullYear()}-${r(e.getMonth()+1)}-${r(e.getDate())}T${r(e.getHours())}:`+r(e.getMinutes())):""}function computePercent(e,r,o){var a=e[r]?.value??0,t=e[0]?.value??0,r=0===r?a:e[r-1]?.value??0,e=e.reduce((e,r)=>e+(r.value??0),0);return"fromTop"===o?t?a/t*100:0:"step"===o?r?a/r*100:0:e?a/e*100:0}function formatSubLabel(e,r,o,a=1){return(e[r]?.value??0)+` • ${computePercent(e,r,o).toFixed(a)}%`}function populateSelectOptions(e,r,o=""){if(!e)throw new Error("selectEl es requerido.");if(!Array.isArray(r))throw new Error("options debe ser un Array.");var a,t,n="function"==typeof window.$&&window.$(e).data("select2");n?window.$(e).empty():e.innerHTML="";for({value:a,label:t}of r){var i=document.createElement("option");i.value=a??"",i.textContent=t??String(a??""),o&&String(o)===String(i.value)&&(i.selected=!0),e.appendChild(i)}n?(n=r.map(e=>({id:e.value??"",text:e.label??""})),window.$(e).select2({data:n}),o&&window.$(e).val(String(o)).trigger("change")):e.dispatchEvent(new Event("change",{bubbles:!0}))}function bindNumericInput(e,r={}){let a="string"==typeof e?document.querySelector(e):e;if(!a)return void console.warn("[bindNumericInput] input no encontrado:",e);let{decimals:i=!0,maxDecimals:s=2,decimalSeparator:l="auto",required:o=!1}=r,t=a.parentElement?.querySelector?.(".invalid-feedback")??null,n=e=>{if(!e)return"";let o=String(e);if(i){if("dot"===l&&(o=o.replace(/,/g,".")),"comma"===l&&(o=o.replace(/\./g,",")),"auto"===l){let e=!1,r="";for(var a of o)/\d/.test(a)?r+=a:"."!==a&&","!==a||e||(r+=a,e=!0);o=r}else{var t,n="comma"===l?",":".";let e=!1,r="";for(t of o)/\d/.test(t)?r+=t:t!==n||e||(r+=t,e=!0);o=r}/^[\.,]/.test(o)&&(o=("comma"===l?"0,":"0.")+o.slice(1));var e="comma"===l?/,(\d*)$/:/\.(\d*)$/,r=o.match(e);r&&"string"==typeof r[1]&&r[1].length>s&&(r=r[1].slice(0,s),o=o.replace(e,("comma"===l?",":".")+r))}else o=o.replace(/\D+/g,"");return o},c=()=>{var e=a.value.trim();let r="";o&&!e&&(r="El monto es obligatorio."),(r=e&&!(i?/^\d+(?:[.,]\d{1,2})?$/:/^\d+$/).test(e)?i?"Formato inválido. Use números y hasta 2 decimales.":"Solo se permiten números.":r)?(a.classList.add("is-invalid"),t&&(t.textContent=r)):(a.classList.remove("is-invalid"),t&&(t.textContent=""))};a.addEventListener("input",()=>{var e=n(a.value);if(a.value!==e){var r=a.selectionStart??a.value.length,e=(a.selectionEnd??a.value.length,a.setRangeText(e,0,a.value.length,"end"),Math.min(e.length,r));try{a.setSelectionRange(e,e)}catch(e){}}c()}),a.addEventListener("paste",e=>{e.preventDefault();var e=(e.clipboardData||window.clipboardData).getData("text")||"",e=n(e),r=a.selectionStart??a.value.length,o=a.selectionEnd??a.value.length;a.setRangeText(e,r,o,"end"),c()}),a.addEventListener("blur",c),a.value=n(a.value),c()}function getMontoAsNumber(e){e=(e.value||"").replace(",",".");return e?Number(e):NaN}async function async_getResponseWhats(e={},r){try{var o=e.token||getToken();if(!o)throw new Error("Token de autenticación no disponible.");if(!e.SrvIdActive)throw new Error("El identificador del servicio (SrvIdActive) es obligatorio.");var a=await new Promise((o,a)=>{ServicioURLManager.getUrlServicios((e,r)=>{!r&&e&&e[0]?.Url?o(e[0].Url+"/getResponseWhats"):a("Error al obtener la URL del servidor.")})}),t={token:o,SrvIdActive:e.SrvIdActive},n=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(t)}),i=await n.json();if(!n.ok)throw new Error(i.message||"No se pudo obtener la respuesta del servicio.");r&&r(i||[],null)}catch(e){console.error("Error en async_getResponseWhats:",e),r&&r(null,{mensaje:e.message})}}let validateMobile=e=>null!=e&&(e=String(e).trim())&&"0"!==e?e:null;function sseNoData(e){var r;return!(!e||"object"!=typeof e)&&(r=e.data,Array.isArray(r)?r.some(e=>e&&204===e.code):r&&"object"==typeof r?204===r.code:204===e.code)}function extractLastIdMessage(r){try{if(!r)return null;var o=e=>e&&"object"==typeof e&&(e=e.last_IdMessage??e.last_idmessage??e.lastIdMessage??e.IdMessage??e.idmessage,e=Number(e),Number.isFinite(e))?e:null;if(r.data&&"object"==typeof r.data&&!Array.isArray(r.data))return o(r.data);if(Array.isArray(r.data)){let e=null;for(var a of r.data){var t=o(a&&"object"==typeof a&&a.data&&"object"==typeof a.data?a.data:a);null!=t&&(e=null==e?t:Math.max(e,t))}return e}return o(r)}catch(e){return null}}async function showMessage(e){return new Promise((r,o)=>{getLastMessage({token:getToken(),Movil:e},e=>{console.log("Dato recibido:",e),Swal.close(),r(e)},e=>console.log("Transmisión completa:",e),e=>{console.error("Error SSE:",e),Swal.close(),o(e)})})}function normalizeHistoryChunk(e){var r;return e&&"object"==typeof e?(r=Number(e.code??0),e=e.data,204===r?{code:r,data:[]}:Array.isArray(e)?{code:r,data:e}:e&&"object"==typeof e?{code:r,data:[e]}:{code:r,data:[]}):{code:0,data:[]}}async function getLastMessages(c,d,u="",r={}){let{limit:p=10,retryOnEmpty:m=!0,containerId:g="chatHistory",emptyAlertId:f="emptyChatAlert",onRendered:v=()=>{},onEmpty:h=()=>{},onError:w=()=>{},actions:y={}}=r;try{let r=validateMobile(c);if(!r)throw new Error("Móvil inválido en getLastMessages.");if(!Number.isFinite(d))throw new Error("lastIdMessage inválido.");let t=getToken();if(!t)throw new Error("Token no válido o no encontrado.");let o=document.getElementById(g),a=document.getElementById(f);o&&(o.innerHTML=""),a&&a.classList.add("d-none");var E=document.getElementById("contactName");E&&(E.innerText=u||"");let n=[],i=!1;let s=e=>{fillChatModal(e,u,r,{containerId:g,emptyAlertId:f,onRendered:v,actions:y});try{$(".chat-history-body").unblock()}catch(e){}},l=(e="")=>{a&&a.classList.remove("d-none"),o&&(o.innerHTML="");try{$(".chat-history-body").unblock()}catch(e){}"function"==typeof h&&h({reason:e,sawNoNew:i}),console.log("Historial vacío.",i?"SSE indicó 204.":e)};fetchMessageHistorySSE({token:t,WhaId:r,Id:Number(d),limitinit:0,limit_last:Number(p)},e=>{var{code:e,data:r}=normalizeHistoryChunk(e);204===e?i=!0:200===e&&Array.isArray(r)&&r.length&&n.push(...r)},async()=>{if(0{var{code:e,data:r}=normalizeHistoryChunk(e);204===e?a=!0:200===e&&Array.isArray(r)&&r.length&&o.push(...r)},()=>{0{console.error("Error SSE (history fallback):",e);try{Swal.close()}catch(e){}"function"==typeof w&&w(e),l("error fallback")})}else l("sin reintento")},e=>{console.error("Error SSE (history):",e);try{Swal.close()}catch(e){}"function"==typeof w&&w(e),l("error sse")})}catch(e){console.error("Error en getLastMessages:",e),"function"==typeof r.onError&&r.onError(e);c=document.getElementById(r.emptyAlertId||"emptyChatAlert"),E=document.getElementById(r.containerId||"chatHistory");c&&c.classList.remove("d-none"),E&&(E.innerHTML="");try{$(".chat-history-body").unblock()}catch(e){}}}