//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// PRGTOOLS ////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function prgtoolsFONT(Fuente) // Permite incorporar fuentes de letras a la aplicación para poder usarlas { let CargaFuente=new FontFace(Fuente,"url(../sys/fonts/"+Fuente+".ttf)"); CargaFuente.load().then(function(FuenteCargada){ document.fonts.add(FuenteCargada); }).catch(error=>{ console.warn("Fuente "+Fuente+": "+error); }); } async function prgtoolsCLIPBOARD(Texto,Tipo) // Permite copiar al portapapeles. Tipo 0=Texto - Tipo 1=Id Imagen - Tipo 2=Link Imagen { let Imagen; switch(Tipo) { case 1: Imagen=document.getElementById(Texto); if(Imagen==null){ AppWindowNotes("No fué posible copiar la imagen en el portapapeles.^#EC0E0E^15"); return; } ProcesaImagen(); break; case 2: Imagen=new Image(); Imagen.src=Texto; Imagen.onload=()=>ProcesaImagen(); Imagen.onerror=()=>{ AppWindowNotes("No fué posible copiar la imagen en el portapapeles.^#EC0E0E^15"); return; } break; default: await navigator.clipboard.writeText(Texto) .then(()=>AppWindowNotes("El texto fué copiado al portapapeles!^^15")) .catch(error=>{ AppWindowNotes("No fué posible copiar el texto al portapapeles!^#EC0E0E^15"); AppWindowNotes(error+"^^15"); }); break; } function CopiaPortaPapeles(blob) { const data=[new ClipboardItem({[blob.type]:blob})]; navigator.clipboard.write(data) .then(()=>AppWindowNotes("La imagen seleccionada se copió al portapapeles.^^15")) .catch(error=>{ AppWindowNotes("No fué posible copiar la imagen portapapeles!^#EC0E0E^15"); AppWindowNotes(error+"^^15"); }); } function ProcesaImagen() { let ImagenTipo=0; if(Imagen.src.indexOf("jpg")!=-1 || Imagen.src.indexOf("jpeg")!=-1){ ImagenTipo=1; } if(Imagen.src.indexOf("png")!=-1){ ImagenTipo=2; } switch(ImagenTipo) { case 0: AppWindowNotes("El formato de imagen no es soportado para copiar al portapapeles!^#EC0E0E^15"); break; case 1: let ImagenNueva=document.createElement("canvas"); let ImagenProcesa=ImagenNueva.getContext("2d"); ImagenNueva.width=parseInt(Imagen.width); ImagenNueva.height=parseInt(Imagen.height); ImagenProcesa.drawImage(Imagen,0,0,Imagen.width,Imagen.height); Imagen.onload=()=>{} Imagen.src=ImagenNueva.toDataURL("image/png"); if(navigator.userAgent.indexOf("Firefox")>-1) { navigator.clipboard.writeText(Imagen.src) .then(()=>{ AppWindowNotes("La imagen seleccionada se copió al portapapeles como texto base64.^^15"); }) .catch(error=>{ AppWindowNotes("No fué posible copiar la imagen portapapeles!^#EC0E0E^15"); AppWindowNotes(error+"^^15"); }); } else { LeeImagen(); } break; default: LeeImagen(); break; } async function LeeImagen(donde) { const response=await fetch(Imagen.src); const blob=await response.blob(); CopiaPortaPapeles(blob); } } } function prgtoolsRECUPERAMATRIZLOCALSTORAGE(Variable) // Devuelve array para utilizar como Data obtenido del localStorage { let LocalArray=localStorage.getItem(Variable); if(LocalArray==null){ return [0]; } return JSON.parse(LocalArray); } function prgtoolsGUARDAMATRIZLOCALSTORAGE(Variable,Data) { if(Data==null){ localStorage.removeItem(Variable); } else { localStorage.setItem(Variable,JSON.stringify(Data)); } } function prgtoolsCOOKIELEE(Cookie) { let CookieArray=decodeURIComponent(document.cookie).split("; "); Cookie+="="; for(let Indice=0;Indice 1.24 { Importe=Number(Importe); if(isNaN(Importe)){ return 0; } return parseFloat(Importe.toFixed(2)); } function prgtoolsREDONDMAX(Importe) // Redondea importes tipo Servidor con Precisión. Ej: 1.2357896 ==> 1.24 { Importe=Number(Importe); if(isNaN(Importe)){ return 0; } let Negativo=Math.sign(Importe)==-1 || Math.sign(Importe)==-0?true:false; let Entero=parseInt(Importe); if(Entero==Importe){ return Entero; } let Decimales=(Importe-Entero); Decimales=Decimales.toFixed(4)+""; Decimales=Negativo?Decimales.substring(1,6):Decimales.substring(0,5); if(Decimales.length!=5){ return !Negativo?Entero+Number(Decimales):Entero-Number(Decimales); } if(parseInt(Decimales.substring(4))<5){ Decimales=Decimales.substring(0,4); return !Negativo?Entero+Number(Decimales):Entero-Number(Decimales); } Decimales=Number(Decimales.substring(0,4))+.01; return !Negativo?Entero+Decimales:Entero-Decimales; } function prgtoolsMV(Importe,Margen) // Calcula margen de venta sobre un importe de costo { Importe=parseFloat(Importe); Margen=parseFloat(Margen); Importe=(Importe*100)/(100-Margen); return parseFloat(Importe.toFixed(2)); } function prgtoolsPST(Importe,Porcentaje,Devolucion) // Calcula porcentaje sobre un importe. Si Devolución es 1 devuelve solo el porcentaje. -1 Resta el porcentaje { Importe=parseFloat(Importe); Porcentaje=parseFloat(Porcentaje); let TotalPorcentaje=(Importe*Porcentaje)/100; if(Devolucion==1){ return parseFloat(TotalPorcentaje.toFixed(2)); } if(Devolucion==-1){ return parseFloat(Importe-TotalPorcentaje); } Importe+=TotalPorcentaje; return parseFloat(Importe.toFixed(2)); } function prgtoolPQT(Importe,Porcentaje) // Quita un porcentaje sobre un importe. { Importe=parseFloat(Importe); Porcentaje=(parseFloat(Porcentaje)+100)/100; Importe/=Porcentaje; return parseFloat(Importe.toFixed(2)); } function prgtoolsNPD(cifra1,cifra2) // Calcula el porcentaje de diferencia entre dos numeros { cifra1=prgtoolsREDOND(cifra1); cifra2=prgtoolsREDOND(cifra2); cifra2=cifra2-cifra1; cifra2=cifra2/cifra1; return cifra2*100; } function prgtoolsNSP(Importe) // Convierte numeros recibidos del Servidor en porcentaje 1.23232 ==> 1,23% { if(isNaN(Importe) || Importe==""){ return "0%"; } return prgtoolsNSL(Importe)+"%"; } function prgtoolsNSNOZERO(Cifra){ if(Cifra=="0"){ return ""; } else { return Cifra; }} // Si recibe un 0 no devuelve nada. Usado para usrbox typetexto][lfil99999 function prgtoolsNSL(Importe,Opcion) // Convierte numeros recibidos del Servidor en locales 12345.45 ==> 12.345,45 { if(Importe==undefined || Importe=="" || Importe==null || isNaN(Importe)){ return ""; } let signo=""; Importe=Number(Importe).toFixed(2).toString(); if(Importe.startsWith("-")){ signo="-"; Importe=Importe.substr(1); } let partes=Importe.split("."); partes[0]=partes[0].replace(/\B(?=(\d{3})+(?!\d))/g,"."); partes[1]=(Opcion==1 && partes[1]=="00")?"":","+partes[1]; return signo+partes[0]+partes[1]; } function prgtoolsNLS(Importe) // Convierte numeros locales en formato servidor 12.345,45 ==> 12345.45 { if(Importe==undefined || Importe=="" || Importe==null){ return 0; } Importe+=""; Importe=Number(Importe.replace(/\./g, "").replace(",",".")); return Number(Importe.toFixed(2)); } function prgtoolsNSAL(Numero) // Convierte numero formato servidor en letras. Ej: 23.45 => veintitres con 45/100 { let data={ letrasCentavos:"",numero:Numero,enteros:Math.floor(Numero),centavos:(((Math.round(Numero*100))-(Math.floor(Numero)*100))) }; if(data.centavos>0){ data.letrasCentavos="CON "+data.centavos+"/100"; } if(data.enteros==0){ return "CERO "+" "+data.letrasCentavos; } if(data.enteros==1){ return data.letrasCentavos; } else { if(Millones(data.enteros).substr(-3)==" UN"){ return Millones(data.enteros)+"O "+data.letrasCentavos; } else { return Millones(data.enteros)+" "+data.letrasCentavos; } } function Unidades(Numero) { switch(Numero) { case 0: return ""; case 1: return "UN"; case 2: return "DOS"; case 3: return "TRES"; case 4: return "CUATRO"; case 5: return "CINCO"; case 6: return "SEIS"; case 7: return "SIETE"; case 8: return "OCHO"; case 9: return "NUEVE"; } } function Decenas(Numero) { let decena=Math.floor(Numero/10); let unidad=Numero-(decena*10); switch(decena) { case 1: switch(unidad) { case 0: return "DIEZ"; case 1: return "ONCE"; case 2: return "DOCE"; case 3: return "TRECE"; case 4: return "CATORCE"; case 5: return "QUINCE"; default: return "DIECI"+Unidades(unidad); } case 2: switch(unidad) { case 0: return "VEINTE"; default: return "VEINTI"+Unidades(unidad); } case 3: return DecenasY("TREINTA",unidad); case 4: return DecenasY("CUARENTA",unidad); case 5: return DecenasY("CINCUENTA",unidad); case 6: return DecenasY("SESENTA",unidad); case 7: return DecenasY("SETENTA",unidad); case 8: return DecenasY("OCHENTA",unidad); case 9: return DecenasY("NOVENTA",unidad); case 0: return Unidades(unidad); } } function DecenasY(strSin,NumeroUnidades){ if(NumeroUnidades>0){ return strSin+" Y "+Unidades(NumeroUnidades); } return strSin; } function Centenas(Numero) { let centenas=Math.floor(Numero/100); let decenas=Numero-(centenas*100); switch(centenas) { case 1: if(decenas>0){ return "CIENTO "+Decenas(decenas); } return "CIEN"; case 2: return "DOSCIENTOS "+Decenas(decenas); case 3: return "TRESCIENTOS "+Decenas(decenas); case 4: return "CUATROCIENTOS "+Decenas(decenas); case 5: return "QUINIENTOS "+Decenas(decenas); case 6: return "SEISCIENTOS "+Decenas(decenas); case 7: return "SETECIENTOS "+Decenas(decenas); case 8: return "OCHOCIENTOS "+Decenas(decenas); case 9: return "NOVECIENTOS "+Decenas(decenas); } return Decenas(decenas); } function Seccion(Numero,divisor,strSingular,strPlural) { let cientos=Math.floor(Numero/divisor); let resto=Numero-(cientos*divisor); let letras=""; if(cientos>0){ if(cientos>1){ letras=Centenas(cientos)+" "+strPlural; } else { letras=strSingular; }} if(resto>0){ letras+=""; } return letras; } function Miles(Numero) { let divisor=1000; let cientos=Math.floor(Numero/divisor); let resto=Numero-(cientos*divisor); let strMiles=Seccion(Numero,divisor,"UN MIL","MIL"); let strCentenas=Centenas(resto); if(strMiles==""){ return strCentenas; } return strMiles+" "+strCentenas; } function Millones(Numero) { let divisor=1000000; let cientos=Math.floor(Numero/divisor); let resto=Numero-(cientos*divisor); let strMillones=Seccion(Numero,divisor,millon(Numero,true),millon(Numero,false)); let strMiles=Miles(resto); if(strMillones==""){ return strMiles; } return strMillones+" "+strMiles; } function millon(Numero,singular) { let letraMillon=""; if(singular==true){ letraMillon="UN MILLON"; } else { letraMillon='MILLONES'; } if(Numero%1000000==0){ letraMillon=letraMillon+" DE"; } return letraMillon; } } function prgtoolsFPD(Fecha) // Devuelve de una fecha el primer día del mes. Ejemplo: 28/02/2019 => 01/02/2019 { let Local=1; if(Fecha.indexOf("/")!=-1){ Local=0; Fecha=prgtoolsFLS(Fecha); } Fecha=Fecha.split("-"); if(Local==1){ return Fecha[0]+"-"+Fecha[1]+"-01"; } else { return "01/"+Fecha[1]+"/"+Fecha[0]; } } function prgtoolsFUD(Fecha,Opcion) // Devuelve de una fecha el último día del mes. Ejemplo: 01/02/2019 => 28/02/2019 { // Si define Opcion d => devuelve solo el dia let Local=1; if(Fecha.indexOf("/")!=-1){ Local=0; Fecha=prgtoolsFLS(Fecha); } Fecha=Fecha.split("-"); const mes=Fecha[1]; const ano=Fecha[0]; let ultimodia=new Date(ano,mes,0).getDate(); if(ultimodia<10){ ultimodia="0"+ultimodia; } if(Opcion==undefined){ if(Local==1){ return ano+"-"+mes+"-"+ultimodia; } else { return ultimodia+"/"+mes+"/"+ano; }} else { if(Opcion.toLowerCase()=="d"){ return ultimodia; }} } function prgtoolsFA(Opcion,Fecha) // Devuelve la fecha actual en formato local 28/06/2017. Utilizar la opcion Fecha para reemplazar la fecha actual { // Si define opcion puede devolver a=año // m=mes // d=dia // am=añomes // amd=añosmesdia // s=formato servidor // h=Hora actual(hora:minutos) if(Fecha==undefined){ Fecha=new Date('2024-12-18 11:00:32'); } // Obtiene fecha del servidor else { if(Fecha.indexOf("/")!=-1){ Fecha=Fecha.split("/"); Fecha=new Date(Fecha[2],Fecha[1],Fecha[0]); } else { Fecha=Fecha.split("-"); Fecha=new Date(Fecha[0],Fecha[1],Fecha[2]); } } let Dia=Fecha.getDate(); if(Dia<10){ Dia="0"+Dia; } let Mes=Fecha.getMonth()+1; if(Mes<10){ Mes="0"+Mes; } if(Opcion==undefined || Opcion==""){ return Dia+"/"+Mes+"/"+Fecha.getFullYear(); } switch(Opcion.toLowerCase()) { case "a": return Fecha.getFullYear(); case "m": return Mes; case "mm": let meses=["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"]; return meses[parseInt(Mes)-1]; case "d": return Dia; case "am": return Fecha.getFullYear()+Mes; case "amd": return Fecha.getFullYear()+Mes+Dia; case "s": return Fecha.getFullYear()+"-"+Mes+"-"+Dia; case "h": let Hora=Fecha.getHours(); if(Hora<10){ Hora="0"+Hora; } // Si necesita la hora en tiempo real al guardar un registro usar como parametro TIME let Minutos=Fecha.getMinutes(); if(Minutos<10){ Minutos="0"+Minutos; } return Hora+":"+Minutos; } } function prgtoolsTIME() // Devuelve la hora actual en format hora:minutos:segundos { let Fecha=new Date('2024-12-18 11:00:32'); // Obtiene fecha del servidor let Hora=Fecha.getHours(); if(Hora<10){ Hora="0"+Hora; } let Minutos=Fecha.getMinutes(); if(Minutos<10){ Minutos="0"+Minutos; } let Segundos=Fecha.getSeconds(); if(Segundos<10){ Segundos="0"+Segundos; } return Hora+":"+Minutos+":"+Segundos; } function prgtoolsFAPC() // Devuelve la fecha actual en formato para comparaciones 2017-06-28 yyyy-mm-dd. Para comparar usar resultado.getTime() { let Fecha=new Date('2024-12-18 11:00:32'); // Obtiene fecha del servidor Fecha=new Date(Fecha.getFullYear(),Fecha.getMonth(),Fecha.getDate()); return Fecha; } function prgtoolsFLC(Fecha) // Convierte una fecha formato local o servidor en formato para comparaciones 28/08/2017 ==> 2017-06-28. Para comparar usar resultado.getTime() { if(Fecha.substr(2,1)!="/"){ Fecha=prgtoolsFSL(Fecha); } Fecha=new Date(Number(Fecha.substr(6)),Number(Fecha.substr(3,2))-1,Number(Fecha.substr(0,2))); // Año,Mes,Dia return Fecha; } function prgtoolsFSD(Fecha,Dias) // Permite modificar fechas en días formato Local o Servidor. Ej: 10/01/2017 -4dias = 06/01/2017 { let Local=1; if(Fecha.substr(2,1)!="/"){ Fecha=prgtoolsFSL(Fecha); Local=0; } Fecha=new Date(Number(Fecha.substr(6)),Number(Fecha.substr(3,2))-1,Number(Fecha.substr(0,2))); // Año,Mes,Dia Fecha.setDate(Fecha.getDate()+Math.floor(Dias)); let Dia=Fecha.getDate(); if(Dia<10){ Dia="0"+Dia; } let Mes=Fecha.getMonth()+1; if(Mes<10){ Mes="0"+Mes; } if(Local==1){ Fecha=Dia+"/"+Mes+"/"+Fecha.getFullYear(); } else { Fecha=Fecha.getFullYear()+"-"+Mes+"-"+Dia; } return Fecha; } function prgtoolsFLS(Fecha) // Convierte una fecha formato local 28/06/2017 en fecha formato servidor 2017-06-28 { Fecha=Fecha.split("/"); return Fecha[2]+"-"+Fecha[1]+"-"+Fecha[0]; } function prgtoolsFSL(Fecha) // Convierte una fecha servidor 2017-06-28 en formato local 28/06/2017 { if(Fecha=="0000-00-00" || Fecha==""){ return ""; } Fecha=Fecha.split("-"); return Fecha[2]+"/"+Fecha[1]+"/"+Fecha[0]; } function prgtoolsFHAÑOS(FechaInicio,FechaFin) // Devuelve string con los años que participan entre dos fechas. Ej: 2012~2013~2014,... Usar en archivos Bigd para historicos { // Si se omite FechaFin devuelve el año de la fecha inicio ingresada if(FechaInicio.indexOf("/")!=-1){ FechaInicio=prgtoolsFLS(FechaInicio); } if(FechaFin==undefined){ return "~"+FechaInicio.substr(0,4); } if(FechaFin.indexOf("/")!=-1){ FechaFin=prgtoolsFLS(FechaFin); } FechaInicio=Number(FechaInicio.substr(0,4)); FechaFin=Number(FechaFin.substr(0,4)); let ListadoAños=""; for(let aux=FechaInicio;aux<=FechaFin;aux++){ ListadoAños+="~"+aux; } return ListadoAños; } function prgtoolsFHAÑOSMES(FechaInicio,FechaFin) // Devuelve string con los años y meses que participan entre dos fechas. Ejemplo: 201901 { // Si se omite FechaFin devuelve el año y mes de la fecha inicio ingresada if(FechaInicio.indexOf("/")!=-1){ FechaInicio=prgtoolsFLS(FechaInicio); } FechaInicio=FechaInicio.split("-"); if(FechaFin==undefined){ return "~"+FechaInicio[0]+FechaInicio[1]; } if(FechaFin.indexOf("/")!=-1){ FechaFin=prgtoolsFLS(FechaFin); } let Resultado=""; const AñoInicio=Number(FechaInicio[0]); let MesInicio=Number(FechaInicio[1]); FechaFin=FechaFin.split("-"); const AñoFin=Number(FechaFin[0]); const MesFin=Number(FechaFin[1]); for(let Año=AñoInicio;Año<=AñoFin;Año++) { while(MesInicio!=13) { Resultado+="~"+Año; if(MesInicio<10){ Resultado+="0" } Resultado+=MesInicio; if(Año==AñoFin && MesInicio==MesFin){ return Resultado; } MesInicio++; } if(MesInicio==13){ MesInicio=1; } } } function prgtoolsFDIF(FechaInicio,FechaFin,Diferencia) // Calcula la diferencia entre dos fechas Local o Servidor. Diferencia= milisegundos -> segundos -> minutos -> horas -> días -> años { if(FechaInicio==undefined || FechaFin==undefined){ return 0; } if(FechaInicio.indexOf("/")!=-1){ FechaInicio=prgtoolsFLS(FechaInicio); } if(FechaFin.indexOf("/")!=-1){ FechaFin=prgtoolsFLS(FechaFin); } if(FechaInicio==FechaFin){ return 0; } FechaInicio=new Date(FechaInicio).getTime(); FechaFin=new Date(FechaFin).getTime(); const Milisegundos=FechaFin-FechaInicio; if(isNaN(Milisegundos)){ return 0;} switch(Diferencia.toLowerCase()) { case "milisegundos": return Milisegundos; case "segundos": return parseInt(Milisegundos/1000); case "minutos": return parseInt(Milisegundos/(1000*60)); case "horas": return parseInt(Milisegundos/(1000*60*60)); case "dias": return parseInt(Milisegundos/(1000*60*60*24)); case "meses": return parseInt(Milisegundos/(1000*60*60*24*30)); case "años": return parseInt(Milisegundos/(1000*60*60*24*30*12)); } } function prgtoolsFNL(Fecha,Opcion) // Convierte una fecha servidor o local numerica en texto. 13/02/2019 => Miercoles 13 de Febrero del 2019 { // Si define Opcion. d=Devuelve el día de la semana. Ej:Lunes - m=Devuelve el mes. Ejemplo:Enero const dias=["Domingo","Lunes","Martes","Miercoles","Jueves","Viernes","Sabado"]; const meses=["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"]; if(Fecha.indexOf("/")!=-1){ Fecha=prgtoolsFLS(Fecha); } Fecha=Fecha.split("-"); const dia=parseInt(Fecha[2]); const mes=parseInt(Fecha[1])-1; const ano=parseInt(Fecha[0]); Fecha=new Date(ano,mes,dia); if(Opcion==undefined){ return dias[Fecha.getUTCDay()]+" "+dia+" de "+meses[mes]+" del "+ano; } switch(Opcion.toLowerCase()) { case "d": return dias[Fecha.getUTCDay()]; case "m": return meses[mes]; } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// PRGTOOLS ////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////