<?php

function creaIndiceNSInterno($producto,$palet) {

	$idioma='-';
	$lote='-';
	$caducidad='-';
	$precinta='-';
	
	$datos=$producto['Datos']['PXMobileProxiumResult'];
	foreach($datos as $dato) {
		switch($dato['Codigo']) {
			case 'IDI': $idioma=$dato['Valor']; break;
			case 'LT': $lote=$dato['Valor']; break;
			case 'FCAD': $caducidad=$dato['Valor']; break;
			case 'PRECEMP': $precinta=$dato['Valor']; break;
		}
	}
	
	//CONSTRUCCION INDICE
	//Art¬Idioma¬Ubicacion¬Palet¬Lote¬Caducidad¬Precinta¬Estado¬Entrada¬Linea
	$indice=$producto['Producto'].'¬'.$idioma.'¬'.$producto['Ubicacion'].'¬'.$palet.'¬'.$lote.'¬'.$caducidad.'¬'.$precinta.'¬'.$producto['EstadoAlmacen'].'¬'.$producto['Entrada'].'¬'.$producto['LineaEntrada'];
	
	return $indice;

}

function grabaLog($texto){

    global $logActivar;
    global $logRuta;
    global $logArchivo;



    if(isset($logActivar) && $logActivar) {

        if(!is_dir($logRuta)) mkdir($logRuta);
        $rutaCompleta=$logRuta.'/'.$logArchivo;

        if(is_object($texto) || is_array($texto)) $texto=json_encode($texto);

        //$cuando=date('Y-m-d h:i:s u');
        $now=DateTime::createFromFormat('U.u',microtime(true));
        $cuando=$now->format("m-d-Y H:i:s   u   ");
        
        $log=fopen($rutaCompleta,'a');
        $resultado=fwrite($log, $cuando.' >>> Main >>> '.$texto.PHP_EOL);

    	fclose($log);

    }
    

}

function grabaLogArray($array) {
	foreach($array as $item) {
		if(is_array($item)) grabaLogArray($item);
		else grabaLog($item);
	}
}

function reemplazaCaracteresEntidades($cadena) {
	$dataInicial=$cadena;
	$dataLimpio=str_replace('&','&amp;',$dataInicial);
	$dataLimpio=str_replace('<','&lt;',$dataLimpio);
	$dataLimpio=str_replace('>','&gt;',$dataLimpio);
	return $dataLimpio;
}

function reemplazaCaracteresEntidadesArray($array) {
	$arrayLimpio=array();
	if(is_array($array)) {
		foreach($array as $clave=>$item) {
			if(is_array($item)) $arrayLimpio[$clave]=reemplazaCaracteresEntidadesArray($item);
			else $arrayLimpio[$clave]=reemplazaCaracteresEntidades($item);
		}
	}
	return $arrayLimpio;
}

function codificaTTT($codigo) {

	if($_SESSION['parametrosSGA']['CifrarIdsTTT']=='S') return base64_encode($codigo);
	else return $codigo;

}

function decodificaTTT($codigo) {

	if($_SESSION['parametrosSGA']['CifrarIdsTTT']=='S') return base64_decode($codigo);
	else return $codigo;

}


function construyeIndiceProductoTraspasar($producto,$desdeListadoDevolucion=false) {
		
			$indice='';
		
			//06-03-2024 construyo "etiquetas" para obtener datos, ya que en cada listado el nombre de los atributos son distintos
		
			if($desdeListadoDevolucion) $etiqueta='CodProducto';
			else $etiqueta='Producto';
			$indice.='-'.limpiaCodigo($producto[$etiqueta]);
			
			if($producto['Entrada']=='-') $entradaGrabar='SinEntrada-'.$contador;
			else $entradaGrabar=$producto['Entrada'];
			
			$indice.='-'.$entradaGrabar;
			
			$indice.='-'.$producto['LineaEntrada'];
			
			if($desdeListadoDevolucion) {
				foreach($_SESSION['comportamientos'] as $comportamiento) {
					$etiqueta=$comportamiento['NombreSQL'];
					if($etiqueta=='FechaCaducidad') $etiqueta='Caducidad';
					if($etiqueta=='NumSerie') $etiqueta='Serie';
					$indice.='-'.limpiaCodigo( $producto[$etiqueta] );
				}
			}
			else {
				$datos=$producto['Datos']['PXMobileProxiumResult'];
				foreach($_SESSION['comportamientos'] as $comportamiento) {
					foreach($datos as $dato) {
						if($dato['Codigo']==$comportamiento['Codigo']) {
							$indice.='-'.limpiaCodigo($dato['Valor']);
							break;
						}
						
					}
				}
			}
			
			if($desdeListadoDevolucion) {
				$estado=$producto['Estado'];
				if($estado=='Libre') $estado='L';
				if($estado=='Bloqueado') $estado='B';
			}
			else {
				$estado=$producto['EstadoAlmacen'];
			}
			$indice.='-'.$estado;
			
			return $indice;
	
}

function quitaSaltos($cadena) {

	$cadena=preg_replace('/[\r\n|\n|\r]+/','',$cadena);
	return $cadena;

}

//Esta funcion reemplaza caracteres que dan error cuando se utilizan como parte de los indices de referencia del DOM en javascript
//por ejemplo, en listados para desleer, en el que en cada campo de cantidad se utilizan los comportamientos (codigo, lote, etc.) como parte
//del nombre del campo
// --> operacion-logistica-transformacion-cierre.php
// --> recepcion-compra-desleer.php
function limpiaCodigo($codigo) {
	$codigo=str_replace(' ','---',$codigo);
	$codigo=str_replace('/','---',$codigo);
	$codigo=str_replace('+','---',$codigo);
	$codigo=str_replace('&','---',$codigo);
	$codigo=str_replace('%','---',$codigo);
	$codigo=str_replace('*','---',$codigo);
	$codigo=str_replace('$','---',$codigo);
	$codigo=str_replace('[','---',$codigo);
	$codigo=str_replace(']','---',$codigo);
	$codigo=str_replace('(','---',$codigo);
	$codigo=str_replace(')','---',$codigo);
	$codigo=str_replace('"','---',$codigo);
	$codigo=str_replace('?','---',$codigo);
	$codigo=str_replace('¿','---',$codigo);
	$codigo=str_replace('!','---',$codigo);
	$codigo=str_replace('¡','---',$codigo);
	$codigo=str_replace('=','---',$codigo);
	$codigo=str_replace('.','---',$codigo);
	$codigo=str_replace(',','---',$codigo);
	return $codigo;
}

function limpiaNombreArchivo($cadena) {

	$a = array('\\','/',':','*','"','<','>','|');
	$b = array(' ',' ',' ',' ',' ',' ',' ',' ');

	return str_replace($a,$b,$cadena);

}

function iconoDocumento($nombreArchivo) {

	$valores=explode('.',$nombreArchivo);
	$extension=$valores[count($valores)-1];
	
	switch($extension) {
		case 'png':
		case 'jpg':
		case 'jpeg':
		case 'gif':
		case 'bmp':	$icono='imagen'; break;
		
		case 'xls':
		case 'xlsx': $icono='excel'; break;
		
		case 'txt':
		case 'doc':
		case 'docs':
		case 'rtf': $icono='documento'; break;
		
		case 'pdf': $icono='pdf'; break;
		
		default: $icono='neutro';
	}
	
	return '<img src="'.DIR_IMAGENES.'/documentos/'.$icono.'.png" width="50" height="50">';

}

function formateaNumeroParaProxium($cadena){

	$cadena=str_replace('.','',$cadena);
	$cadena=str_replace(',','.',$cadena);
	
	return $cadena;

}

function formateaNumeroCantidad($numero) {
	
	return number_format((float)$numero,2,',','.');

}

function formateaNumeroPeso($numero) {
	
	return number_format((float)$numero,3,',','.');

}

function formateaNumeroDecimalBasico($numero,$numDecimales) {
	if($numero) {
		$numero=(float)$numero;
		return number_format($numero,$numDecimales,',','.');
	}
}

function formateaNumeroDecimal($numero,$formatoMAE=false,$numDecimalesMAE=3,$formatoCeroNegativos=false,$mostrarCeros=false) {

	if($numero) {

		$valores=explode('.',$numero);
		
		if($formatoMAE) {
		
			if(!$valores[0]) {
				if( strlen($valores[1])>$numDecimalesMAE ) $devolucion=number_format($numero,$numDecimalesMAE,',','.');
				else $devolucion='0,'.$valores[1];
			}
			else if($valores[1]) {
				if( strlen($valores[1])>3 ) {
					$devolucion=number_format($numero,3,',','.');
					//Si devuelve por ejemplo 1.000 reformateamos sin decimales
					$valor=(float)$devolucion;
					$decimal=($valor-intval($valor));
					if($decimal==0) $devolucion=number_format($numero,0,',','.');
				}
				else $devolucion=number_format($valores[0],0,'','.').','.$valores[1];
			}
			else {
				$devolucion=number_format($valores[0],0,'','.');
			}
			
			if($formatoCeroNegativos) {
				if($devolucion<0) $devolucion='<span class="negrita error">'.$devolucion.'</span>';
			}
			
		}
		else {
			if(!$valores[0]) $devolucion='0.'.$valores[1];
			else if(isset($valores[1]) && $valores[1]) {
				$devolucion=$valores[0].'.'.$valores[1];
				//Si devuelve por ejemplo 1.000 reformateamos sin decimales
				if( (int)$valores[1]== 0 ) $devolucion=$valores[0];
			}
			else $devolucion=$numero;
		}
		
	
	}
	else if($formatoCeroNegativos || $mostrarCeros) $devolucion='0';
	else $devolucion='';
	
	
	
	return $devolucion;
}

function convierteSaltosBr($texto) {
			
	$caracterReemplazo="<br>";
	
	$texto=str_replace(PHP_EOL,$caracterReemplazo,$texto);
	$texto=str_replace('\n',$caracterReemplazo,$texto);
	$texto=preg_replace("/[\r\n|\n|\r]+/",$caracterReemplazo,$texto);
				
	return $texto;
			
}

function arreglaSaltos($texto) {
			
	$caracterReemplazo="[-]";
				
	$respuesta=str_replace(PHP_EOL,$caracterReemplazo,$texto);
	$respuesta=preg_replace("/[\r\n|\n|\r]+/",'',$respuesta); //Añadimos esto porque en Elite hace el reemplazo y pone [-] pero deja otro caracter residual que sigue interpretandose como un salto en el archivo de inserción en caché. En nuestro servidor de prototipos no ocurre.
				
	return $respuesta;
			
}

function arreglaSaltosLimpiaCaracteresProhibidos($texto) {
	
	$texto=arreglaSaltos($texto);
	
	$texto=str_replace(';','',$texto);
	$texto=str_replace('#','',$texto);
	
	return $texto;
}

function formateaGS1($dato,$formato,$opciones=NULL,$caracteresEspeciales=NULL) {

	switch($formato) {
	
		case 'fecha':
			if($dato!='000000' && $dato!='' && !is_null($dato)) {
			
				$dia=substr($dato,4,2);
				$mes=substr($dato,2,2);
				$ano=substr($dato,0,2);
				
				if($dia=='00' || !$dia) $dia=date('d',(mktime(0,0,0,$mes+1,1,$ano)-1));
				
				$devolucion=$dia.'/'.$mes.'/20'.$ano;
			}
			break;
		case 'numero':
			//$opciones contiene decimales aquí
			if($opciones) $devolucion=(int)substr($dato,0,strlen($dato)-$opciones).".".substr($dato,-$opciones);
			else $devolucion=(int)$dato;
			break;
		case 'palet':
			if($opciones) {
				
				$rango=explode(',',$opciones);
				//Extracción standard según rango
				$devolucion=substr( $dato , $rango[0]-1 , $rango[1]-$rango[0]+1 );
				
				if($caracteresEspeciales==1) {
					//Si el primer caracter es un 0, se extra un caracter más de la izquierda
					if($devolucion[0]=='0') {
						$rango[0]--;
						$rango[1]--;
						$devolucion=substr( $dato , $rango[0]-1 , $rango[1]-$rango[0]+1 );
					}
				}
			}
			else $devolucion=$dato;
			break;
		default:
			$devolucion=$dato;
	}
	//$devolucion='kk';
	return $devolucion;

}



function formateaTTT___($codigo) {

	$codigo=str_replace('(','<br>(',$codigo);
	if(substr($codigo,0,4)=='<br>') $codigo=substr($codigo,4,strlen($codigo));
	return $codigo;
}

function formateaTTT($codigo) {

	$codigosTTT=array('00','01','240','21','235','8008');
	
	foreach($codigosTTT as $item) {
		
		$buscar='('.$item.')';
		
		$posicion=strpos($codigo,$buscar);
		
		if($posicion>0) {
			$codigo=substr($codigo,0,$posicion).'<br>'.substr($codigo,$posicion,strlen($codigo));
		}
		
	}
	
	return $codigo;
	
}


function convierteCodigoEmbalaje($Codigo,$EmbalajePrimario) {

	global $informarUnidadesPorCaja;

	if($informarUnidadesPorCaja) {
	
		$codigoOriginal=substr($Codigo,0,strlen($Codigo)-2);
		$ultimosCaracteres=substr($Codigo,strlen($Codigo)-2,2);
		
		if( (int)$ultimosCaracteres < $EmbalajePrimario ) {
		
			if( $EmbalajePrimario<10 ) $ultimosCaracteres="0".$EmbalajePrimario;
			else $ultimosCaracteres=$EmbalajePrimario;
			
			return $codigoOriginal.$ultimosCaracteres;
		
		}
		else return $Codigo;
	
	}
	else return $Codigo;

}

function enviaGuion($valor) {

	if( $valor=='' || is_null($valor) ) return '-';
	else return $valor;	

}


function enviaCajasOrdenPreparacion() {

	/*
	global $conexionBdd;
	global $mysqlPrefix;
	
	global $wsUsuario;
	global $wsClave;

	$cadenaEnvio='';
	
	$temp=$conexionBdd->prepare("SELECT * FROM ".$mysqlPrefix."PreparacionCajas WHERE NOrden=?");
	$temp->execute(array($_SESSION['orden']['OrdenPreparacion']));
	
	if($temp->rowCount()>0) {
	
		foreach($temp as $caja) {

		
			$cadenaEnvio.='*PXOrdenPreparacionLogistCaja'.PHP_EOL;
			
			$cadenaEnvio.='Empresa='.$_SESSION['orden']['Empresa'].PHP_EOL;
			$cadenaEnvio.='NOrden='.$_SESSION['orden']['OrdenPreparacion'].PHP_EOL;
			$cadenaEnvio.='NumCaja='.$caja['NumCaja'].PHP_EOL;
			
			$temp2=$conexionBdd->prepare("SELECT * FROM ".$mysqlPrefix."PreparacionProductos WHERE NOrden=? AND NumCaja=?");
			$temp2->execute(array($_SESSION['orden']['OrdenPreparacion'],$caja['NumCaja']));
			
			foreach($temp2 as $producto) {
			
				$cadenaEnvio.='*PXOrdenPreparacionLogistCajaProductos'.PHP_EOL;
				$cadenaEnvio.='Codigo='.$producto['Codigo'].PHP_EOL;
				$cadenaEnvio.='Vers=0'.PHP_EOL;
				$cadenaEnvio.='Pers=0'.PHP_EOL;
				
				$cadenaEnvio.='Idioma='.enviaGuion($producto['Idioma']).PHP_EOL;
				$cadenaEnvio.='Precinta='.enviaGuion($producto['Precinta']).PHP_EOL;
				$cadenaEnvio.='Ubicacion='.enviaGuion($producto['Ubicacion']).PHP_EOL;
				$cadenaEnvio.='Contenedor='.enviaGuion($producto['Contenedor']).PHP_EOL;
				$cadenaEnvio.='NumLote='.enviaGuion($producto['Lote']).PHP_EOL;
				$cadenaEnvio.='FechaCaducidad='.enviaGuion($producto['FechaCaducidad']).PHP_EOL;
				$cadenaEnvio.='NumSerie='.enviaGuion($producto['NumSerie']).PHP_EOL;
				
				$cadenaEnvio.='NumEntrada='.$producto['NumEntrada'].PHP_EOL;
				$cadenaEnvio.='LinEntrada='.$producto['LinEntrada'].PHP_EOL;
				$cadenaEnvio.='Cantidad='.$producto['Cantidad'].PHP_EOL;
			
			}
			
			$cadenaEnvio.='*FIN'.PHP_EOL;
		
		}
	
		//echo nl2br($cadenaEnvio);
		
		$resultado=EnviarDatos($wsUsuario,$wsClave,base64_encode(utf8_decode($cadenaEnvio)));
	
		//echo "<p>RESULTADO OBTENIDO</p>";
		//print_r($resultado['EnviarDatosResult']);
	
		return $resultado['EnviarDatosResult'];
		
	}
	else return "1#Ok";
	*/
}


function booleanParaProxium($valor) {
	if ($valor) return 'S';
	else return 'N';
}

function booleanParaMysql($valor) {
	if ($valor=='S') return 1;
	else return 0;
}

function convierteArrayEnCadena($array) {

	if(!empty($array) && !is_null($array)) {
		$resultado='';
		foreach($array as $valor) $resultado.=$valor.',';
		if(strlen($resultado)>0) $resultado=trim($resultado,',');
	}
	else $resultado=NULL;
	return $resultado;

}

function convierteCadenaEnArray($cadena) {

	$resultado=explode(',',$cadena);
	return $resultado;

}

function fechaDesdeProxium($cadena) {

	if($cadena=='-') return $cadena;
	else if(!empty($cadena) && !is_null($cadena) && $cadena!='' && $cadena>0) return substr($cadena,0,4)."-".substr($cadena,4,2)."-".substr($cadena,6,2);
}

function fechaParaProxium($cadena) {

	global $DateTimeNoSoportado;

	if(!empty($cadena) && !is_null($cadena) && $cadena!='' && $cadena>0) {
	
		//22-3-2022 añadido en config.php porque en Benimar no soporta DateTime por version php
		if($DateTimeNoSoportado) {
		
			return date('Ymd',strtotime($cadena));
		
		}
		else {
		
			$date = new DateTime($cadena);
			return $date->format('Ymd');
			
		}
	
		//Para fechas muy lejanas, se desborda no funciona
		//return date('Ymd',strtotime($cadena));
		
	}
}

function fechaNacionalDesdeProxiumGuiones($cadena) {

	global $DateTimeNoSoportado;
	
	if($cadena=='-')  return $cadena;
	else {

		if(!empty($cadena) && !is_null($cadena) && $cadena!='' && $cadena>0) {
			
			//22-3-2022 añadido en config.php porque en Benimar no soporta DateTime por version php
			if($DateTimeNoSoportado) {
			
				$cadenaFormateada=fechaDesdeProxium($cadena);
				return date("d-m-Y",strtotime($cadena));
			
			}
			else {
			
				$date = new DateTime($cadena);
				return $date->format('d-m-Y');
				
			}
		
			//Para fechas muy lejanas, se desborda no funciona
			//return date("d/m/Y",strtotime($cadena));
			
		}
		
	}

}

function fechaNacional($cadena) {

	global $DateTimeNoSoportado;

	if($cadena=='-') return $cadena;
	else if(!empty($cadena) && !is_null($cadena) && $cadena!='' && $cadena>0) {
		
		//22-3-2022 añadido en config.php porque en Benimar no soporta DateTime por version php
		if($DateTimeNoSoportado) {
		
			$cadenaFormateada=fechaDesdeProxium($cadena);
			return date("d/m/Y",strtotime($cadena));
		
		}
		else {
		
			$date = new DateTime($cadena);
			return $date->format('d/m/Y');
			
		}
	
		//Para fechas muy lejanas, se desborda no funciona
		//return date("d/m/Y",strtotime($cadena));
		
	}
	
}

function fechaMysql($cadena) { 

	if(!empty($cadena) && !is_null($cadena) && $cadena!='' && $cadena>0) {
		$cadena=explode('/',$cadena);
		return $cadena[2].'-'.$cadena[1].'-'.$cadena[0];
	}
}

function horaNacional($cadena) {

	$cadena=(string)$cadena;

	//if(!empty($cadena) && !is_null($cadena) && $cadena!='' && $cadena>0) return date("H:i",strtotime($cadena));
	if(!empty($cadena) && !is_null($cadena) && $cadena!='') return date("H:i",strtotime($cadena));
	
}

function traduce_hora($original)
{
	if(!empty($original) && !is_null($original) && $original!='' && $original>0) {
	
		for($contador=0;$contador<=strlen($original);$contador++) {
			$caracter=substr($original,$contador,1);
			if ($caracter==":" || $caracter=="." || $caracter=="'") $sep_hora=$contador;
		}
		$hora=(int)substr($original,0,$sep_hora);
		$minutos=(int)substr($original,$sep_hora+1,strlen($original));
		
		if($hora<10) $hora="0".$hora;
		if($minutos<10) $minutos="0".$minutos;
		
		$resultado=$hora.":".$minutos;
		return $resultado;
	}
}

function traduce_fecha($original)
{
	if(!empty($original) && !is_null($original) && $original!='' && $original>0) {
	
		$contador=0;
		$dia=true;
		while ($contador<=strlen($original))
		{
			$caracter=substr($original,$contador,1);
			if ($caracter=="/" || $caracter=="-" || $caracter==".")
			{
				if ($dia)
				{
					$sep_dia=$contador;
					$dia=false;
				}
				else $sep_mes=$contador;
			}
			$contador++;
		}
		$ano=(int)substr($original,$sep_mes+1,strlen($original));
		
		if (strlen($ano)<4)
		{
			$anoactual=substr(date("Y"),2,2);
			if ($ano>$anoactual) $ano=1900+$ano; else $ano=2000+$ano;
		} 
		
		$resultado=$ano."-".substr($original,$sep_dia+1,$sep_mes-$sep_dia-1)."-".substr($original,0,$sep_dia);
		return $resultado;
	}
}

function formateaTipo($valor,$tipo) {
	switch($tipo) {
		case 'F':
			//08-10-2020 encontramos el error en VCD de que la fecha no está en formato proxium, sino en español, porque el dato procede de una importación que graba mal el dato
			if($valor=='-') return $valor;
			else if(strpos($valor,'/')===false) return fechaNacional(fechaDesdeProxium($valor));
			else return $valor;
			break;
		default:
			return $valor;
	}
}

function cifrarClaveUsuario($clave) {

	$claveCifrada=0;
	$contador=1;
	
	for($i=strlen($clave)-1;$i>=0;$i--) {
	
		$claveCifrada=$claveCifrada+(pow(ord($clave[$i]),$contador));
		$contador++;
	}
	
	return $claveCifrada;
	
}

?>