> ## Knowledge Base Index
> Fetch the complete knowledge base index at: https://docs.flokzu.com/sitemap.xml
> Use this file to discover available pages before exploring further.
> Pure-Markdown content can be obtained by appending a '.md' suffix to the content URLs listed in the sitemap (without the trailing slash).

# Scripts Avanzados

# Validar datos con algoritmos conocidos

### Validar documento de identidad
Algunos países utilizan algoritmos de validación para sus documentos de identidad nacional, los cuales pueden ser implementados mediante javascript en Flokzu.

```javascript
function validarCI(){
var CI = Flokzu.getFieldValue( [[Número de Documento]] ); 
var patron = /[\.\-]/ig; 
CI = CI.replace(patron, ""); 
var Coefs = [2,9,8,7,6,3,4,1]; 
var arrayCI = CI.split( "" ); 
var suma = 0;
var largo = CI.length;
	for (i=0;i<largo-1;i++){
	suma = suma + Coefs[i]*arrayCI[i];
	}
	suma = suma + Coefs[7]*arrayCI[largo-1]; 	
		if ( (suma % 10) != 0 ){
		swal({type : 'error' , title : 'Error!' , text: 'Alerta: Cédula incorrecta'});
	}
}
Flokzu.onChange( [[Número de Documento]], validarCI);
```

### Para validar un documento de identidad que se encuentra en un campo tipo tabla.

```javascript
function verificarCI(msg, data){
	var Array_CI = $(Flokzu.getAllColumnValues( [[Tabla::Columna]] ));
	var Cantidad_Registros = ( Array_CI ).length;
	for(i=0; i<Cantidad_Registros; i++){
    	CI = Array_CI[i].innerText;
    	Resultado_CI = validarCI(CI);
    	if(Resultado_CI == false){
        	Flokzu.error( [[Campo]] , "La cédula "+CI+" no es válida." );
   		 swal({type : 'error' , title : 'Error!' , text: "La cédula "+CI+" no es válida."});
   	 }
    }
}
Flokzu.onTableChange([[Tabla::Columna]], verificarCI);
```

# Fechas
### Calcular la diferencia en días, meses y años entre dos fechas.

```javascript
function cambiarFecha(msg, data){

var fecha1 = dateFns.parse(Flokzu.getFieldValue([[fecha1]]), 'yyyy/MM/dd', new Date());
var fecha2 = dateFns.parse(Flokzu.getFieldValue([[fecha2]]), 'yyyy/MM/dd', new Date());
var anios = dateFns.differenceInYears(fecha2, fecha1);


fecha1 = dateFns.addYears(fecha1, anios);
var meses= dateFns.differenceInMonths(fecha2,fecha1);


fecha1=dateFns.addMonths(fecha1,meses);
var dias=dateFns.differenceInDays(fecha2,fecha1);



Flokzu.setFieldValue([[dia]], dias);
Flokzu.setFieldValue([[mes]], meses);
Flokzu.setFieldValue([[años]], anios);
}

Flokzu.onChange([[fecha2]], cambiarFecha);
Flokzu.onChange([[fecha1]], cambiarFecha);
```

||| IMPORTANTE: El campo Fecha 1 tiene que ser anterior a Fecha 2

# Identificador

Obtener el identificador de una instancia de proceso e insertarla en un campo
```javascript
function copiarReferencia(){
   var x = $('#fkz_ref').text();
   x = x.substring(x.lastIndexOf('-') + 1)
   Flokzu.setFieldValue([[CAMPO]] , x);
}

Flokzu.onInit(copiarReferencia);
```

||| Solamente válido para tareas que no sean la inicial (pues no existe instancia hasta ese momento).

### Personalizar el identificador
Por ejemplo: agregar el año al identificador ABC-123, 2020-ABC-123:

```javascript
function identificador(){
    var id=Flokzu.getFieldValue([[ID ]])
    var num=id + "-" + dateFns.format(new Date(), 'yyyy')
    Flokzu.setFieldValue([[ID personalizado]],num)
}
Flokzu.onInit(identificador);
```

# TABLAS

### Iterar y copiar celdas de un campo tabla en campo de tipo texto

```javascript
function iterarColumna1(msg, data){   
  var filaCounter = 1;
    $( Flokzu.getAllColumnValues( [[Tabla::Columna]] ) ).each(  
        function(){  
            var colValue = $(this).attr('value');
            if(filaCounter == 1){
                Flokzu.setFieldValue([[Campo Texto 1]],colValue);
            }else if (filaCounter == 2){
                Flokzu.setFieldValue([[Campo Texto 2]],colValue);
            }else if (filaCounter == 3){
                Flokzu.setFieldValue([[Campo Texto 3]],colValue);
            }
            filaCounter ++;
		}
	)
}
Flokzu.onAction(iterarColumna1);
```

Ejemplo:

```javascript
function iterarTabla(msg, data){   
    $( Flokzu.getAllColumnValues( [[campo::columna]] ) ).each( 
        function(){  
            //Lanza un alert con el valor.
            alert( $(this).attr('value') ); 
        }
    );   
}
Flokzu.onTableChange( [[campo::columna]] , iterarTabla );
```

### Iterar una columna de tipo fecha de una tabla y setear un campo como la mínima fecha de esa columna 

```javascript
function vencimientoTD1(msg, data){ 
    Flokzu.setFieldValue([[Balance Vigente Hasta]],''); 
    $( Flokzu.getAllColumnValues([[Balance::Fecha Cierre Balance]])).each( 
        function(){  
            var fecha = dateFns.parse($(this).attr('value'), "dd/MM/yyyy", new Date());
            var vencimiento = dateFns.parse(Flokzu.getFieldValue([[Balance Vigente Hasta]]), "dd/MM/yyyy", new Date());
            if(Flokzu.getFieldValue([[Balance Vigente Hasta]])=='' || dateFns.isBefore(vencimiento, fecha)){
                Flokzu.setFieldValue([[Balance Vigente Hasta]],$(this).attr('value'));
 
            } else {
 
            }
        }
    );   
}
Flokzu.onTableChange([[Balance::Fecha Cierre Balance]], vencimientoTD1);
```

# Otros
### Botones - Requerir u ocultar un campo según un botón seleccionado

```javascript
function solicitarCausal(msg, button) {
       if (button == 'Eliminar') {
       Flokzu.setRequired([[Causal de Eliminación]]);
    }
}
Flokzu.onAction(solicitarCausal);
```

### Sweet Alert con botones y tres mensajes de alerta 

```javascript
function sweetAlert() {
       var campo1= Flokzu.getFieldValue([[Nombre campo 1]]);
       var campo2= Flokzu.getFieldValue([[Nombre campo 2]]);
       if (campo1=="Si" && campo2=="Si"){
			
		    swal({
			  title: "Insertar aquí el título",
			  text: "Insertar aquí el mensaje",
			  type: "warning",
			  showCancelButton: true,
			  confirmButtonColor: "#DD6B55", //botón de confirmar de color rojo
			  confirmButtonText: "Si",
			  cancelButtonText: "No",
			  closeOnConfirm: false,
			  closeOnCancel: false
			},
			function(isConfirm){
			  if (isConfirm) {
				swal("Ok!", "Insertar aquí el mensaje", "success");
				} else {
				swal("Verifique!", "Insertar aquí el mensaje" , "error");
			  }
			});
			

        }
}
Flokzu.onChange([[campo1]], sweetAlert);
Flokzu.onChange([[campo2]], sweetAlert); 
```

### Modificar formato de número, poner símbolo de moneda y decimales

```javascript
const number = 123456.789;

console.log(new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(number));
// expected output: "123.456,79 €"

// the Japanese yen doesn't use a minor unit
console.log(new Intl.NumberFormat('ja-JP', { style: 'currency', currency: 'JPY' }).format(number));
// expected output: "￥123,457"

// limit to three significant digits
console.log(new Intl.NumberFormat('en-IN', { maximumSignificantDigits: 3 }).format(number));
// expected output: "1,23,000"
```





