<?php
session_start();
include('config.php');
include($rutaPhp.$rutaHtml.'/maqueta/includes.php');

include($rutaPhp.$rutaHtml.'/acceso/control.php');
include($rutaPhp.$rutaHtml.'/maqueta/arriba.php');

include($rutaPhp.$rutaHtml.'/librerias/teclado.php');
include($rutaPhp.$rutaHtml.'/librerias/calculadora.php');

include($rutaPhp.$rutaHtml.'/librerias/funciones-gs1.php');

unset($_SESSION['errores']);
unset($_SESSION['producto']);

$procedeDePreparacion=(isset($_GET['procedencia']) && $_GET['procedencia']=='preparacion');

if($procedeDePreparacion) {

	$_SESSION['salidaTrazabilidad']['OrdenPreparacion']=$_SESSION['orden']['OrdenPreparacion'];
	$_SESSION['hayIdsPreInformados']=true;
	
	if(isset($_GET['codigosError']) && $_GET['codigosError']) {
	
		$idsDecodificados=base64_decode($_GET['codigosError']);
		
		$_SESSION['errores']=explode('@',$idsDecodificados);
		
		//echo '<p>'.$idsDecodificados.'</p>';
	
	}

}


$formatoLecturasCiegas=(!$_SESSION['hayIdsPreInformados']); //Nota el 28-08-2025 a raiz de la tarea LCT 68610, parece ser que es al reves, que cuando NO hay ids preinformados, las lecturas NO son ciegas, sino asociadas a un producto concreto



//echo '<p>formatoLecturasCiegas: '.$formatoLecturasCiegas.'</p>';

if($formatoLecturasCiegas || $procedeDePreparacion) {

	$temp=base64_decode($_GET['indice']);
	$valores=explode('¬¬¬',$temp);
	$productoCodigo=$valores[0];
	$productoDescripcion=$valores[1];
	$productoPrecinta=$valores[2];
	
	$productoCantidad=$valores[3];
	
	if($_GET['traza']=='si') {
		echo '<p>Producto seleccionado: '.$productoCodigo.'</p>';
		echo '<p>Producto seleccionado precinta: '.$productoPrecinta.'</p>';
	}
	
	if($procedeDePreparacion) {
	
		$peticion='TPDTTrazabilidad#'.$_SESSION['empresa'].'#'.$_SESSION['usuario']['Usuario'].'#DETALLESALIDA#'.$_SESSION['salidaTrazabilidad']['OrdenPreparacion'].';'.$productoCodigo;
		
		$resultado=PedirDatos($wsUsuario,$wsClave,$wsEmpresa,$peticion);
	
		
		if($_GET['traza']=='si') {
			echo "<p>".$peticion."</p>";
			print_r($resultado);
		}
		
		$_SESSION['salidaTrazabilidad']=$resultado[0];
		$_SESSION['productos']=arreglaArrayPXMobileProxiumResult($_SESSION['salidaTrazabilidad']['Productos']);
		
	}
	
}


?>

<h2 class="desplazamientoSuperiorMenu">Trazabilidad de Tabaco en Orden de Preparación Nº <?php echo $_SESSION['salidaTrazabilidad']['OrdenPreparacion']; ?></h2>

<?php



if($_POST['procesoEntradaPlay']=='1') {

	//TPDTTrazabilidad#PXPU#FTP#LECTURA#E1900301;1;100,A,KKKKKKK

	$cadenaLecturas='';
	$cadenaPrecintas='';
	foreach($_SESSION['lecturas'] as $lectura) {
	
		///21-10-2024 Parametrizado posible Base64
		$cadenaLecturas.=codificaTTT($lectura['CodigoEscaneado']).'@';
		$cadenaPrecintas.=$lectura['Precinta'].'@';
		
	}
	
	$peticion='TPDTTrazabilidad#'.$_SESSION['empresa'].'#'.$_SESSION['usuario']['Usuario'].'#LECTURASALIDA#'.$_SESSION['salidaTrazabilidad']['OrdenPreparacion'].';'.$cadenaLecturas.';'.$cadenaPrecintas;
	
	$resultado=PedirDatos($wsUsuario,$wsClave,$wsEmpresa,$peticion);

	if($_GET['traza']=='si') {
		echo "<p>Proceso de grabación de salida</p>";
		print_r($_SESSION['lecturas']);
		echo "<p>".$peticion."</p>";
		print_r($resultado);
	}
	
	$valores=explode('#',$resultado[0]['Error']);
	if($valores[0]=='0') {
	
		?><p><img src="<?php echo DIR_IMAGENES; ?>/iconos/ok.png" width="50" height="50" /><br />Lectura realizada correctamente.</p><?php
		
		unset($_SESSION['producto']);
		unset($_SESSION['lecturas']);
		
		if(!$formatoLecturasCiegas) {
		
			//Recarga
			$peticion='TPDTTrazabilidad#'.$_SESSION['empresa'].'#'.$_SESSION['usuario']['Usuario'].'#DETALLESALIDA#'.$_SESSION['salidaTrazabilidad']['OrdenPreparacion'];
			$resultado=PedirDatos($wsUsuario,$wsClave,$wsEmpresa,$peticion);
				
			if($_GET['traza']=='si') {
				echo "<p>".$peticion."</p>";
				print_r($resultado);
			}
				
			$_SESSION['salidaTrazabilidad']=$resultado[0];
			$_SESSION['productos']=arreglaArrayPXMobileProxiumResult($_SESSION['salidaTrazabilidad']['Productos']);
			
		}
		
	}
	else if( $valores[0]=='3' || $valores[0]=='5' ) {
	
		//ERROR PARCIAL
	
		$_SESSION['errores']=explode('@',decodificaTTT($valores[1]));
		
		if( $valores[0]=='3' ) $mensaje='No han podido registrarse todas las lecturas.<br /><br />Los identificadores señalados en rojo no son válidos,<br>porque no están en stock o porque están en otra orden';
		else if( $valores[0]=='5' ) $mensaje='No han podido registrarse todas las lecturas.<br /><br />Los identificadores señalados en rojo no son válidos,<br>porque su régimen no coincide con el régimen de la orden';
		
		?><script>alert('<?php echo $mensaje; ?>.',null,'error');</script><?php
		
		//echo '<p>Traza lecturas despues de error 3</p>';
		//print_r($_SESSION['lecturas']);
		//echo '<p>Errores:</p>';
		//print_r($_SESSION['errores']);
		//echo '<hr>';
		
		//Discriminamos en las lecturas actuales
		$temp=array();
		foreach($_SESSION['lecturas'] as $lectura) if(in_array($lectura['CodigoEscaneado'],$_SESSION['errores'])) $temp[]=$lectura;
		$_SESSION['lecturas']=$temp;
		
		//echo '<p>Traza lecturas despues de error 3 DESPUES</p>';
		//print_r($_SESSION['lecturas']);
		//echo '<hr>';
		
		if(!$formatoLecturasCiegas) {
		
			//Recarga
			$peticion='TPDTTrazabilidad#'.$_SESSION['empresa'].'#'.$_SESSION['usuario']['Usuario'].'#DETALLESALIDA#'.$_SESSION['salidaTrazabilidad']['OrdenPreparacion'];
			$resultado=PedirDatos($wsUsuario,$wsClave,$wsEmpresa,$peticion);
				
			if($_GET['traza']=='si') {
				echo "<p>".$peticion."</p>";
				print_r($resultado);
			}
				
			$_SESSION['salidaTrazabilidad']=$resultado[0];
			$_SESSION['productos']=arreglaArrayPXMobileProxiumResult($_SESSION['salidaTrazabilidad']['Productos']);
			
		}
		
	}
	else if($valores[0]=='4') {
		
		//MENSAJE CONTROLADO. ERROR 4 = Leido ok y toda la orden ha sido finalizada. Se desbloquea (stop) automáticamente
		
		?>
		<script>
			alert("<?php echo $valores[1]; ?>",null,'ok')
			.done(function(){
				<?php if(isset($_SESSION['redireccionTTT']['salida'])){ ?>
				window.location='ordenes-preparacion.php';
				<?php } else { ?>
				window.location='trazabilidad-tabaco-salidas.php';
				<?php } ?>
			});
        </script>
		<?php
		
	}
	else {
		?><p class="error"><img src="<?php echo DIR_IMAGENES; ?>/iconos/error.png" width="50" height="50" /><br />ERROR: <?php echo $valores[1]; ?></p><?php
	}
	

}
else { // NO procede de la lectura PLAY de entrada

	if(!$procedeDePreparacion) { //En el caso de proceder de una OP, las lecturas no se reinician por si quisieran añadir más.
	
		unset($_SESSION['lecturas']);
	
	}

}



?>
        
<form id="formulario" name="formulario" method="post" action="">
    
	<input type="hidden" name="procesoEntradaPlay" id="procesoEntradaPlay" value="0" />
    <input type="hidden" name="cadenaLecturasActuales" id="cadenaLecturasActuales" value="" />

</form>

	<h3>Producto a Leer</h3>
	
    <?php if($formatoLecturasCiegas || $procedeDePreparacion) { ?>
    
    <table class="tablaFormateada" >
        <tr>
            <th>Código</th>
            <th>Descripción</th>
            <th>Precinta</th>
            <?php if($procedeDePreparacion) { ?>
            <th>Cantidad</th>
            <?php } ?>
        </tr>
        <tr>
            <td><?php echo $productoCodigo; ?></td>
            <td><?php echo $productoDescripcion; ?></td>
            <td align="center"><?php echo $productoPrecinta; ?></td>
            <?php if($procedeDePreparacion) { ?>
             <td><?php echo $productoCantidad; ?></td>
            <?php } ?>
    	</tr>
    </table>
    <br />
    
    <?php } ?>

	<?php if(!$formatoLecturasCiegas && !$procedeDePreparacion) { ?>
	<p class="mini"><span class="error">Nota:</span> Para un mayor control de cantidades, los bloques de lectura de IDs consecutivos deben corresponder a un mismo producto.</p>
    <?php } ?>
    
    
<div id="bloqueContenedor" class="bloqueContenedorGS1">
				
		<p class="sinMargen">Lectura de Id.:</p>
		<div id="bloqueLectura" class="campoOrdenPreparacionBloque">
			<img src="<?php echo DIR_IMAGENES; ?>/teclado.png" alt="Mostrar teclado" class="iconoTeclado" id="tecladoLectura" /><input name="lecturaGS1" type="text" class="campo campoOrdenPreparacion campoLecturaGS1" id="lecturaGS1" autocomplete="off"/>
			<img src="<?php echo DIR_IMAGENES; ?>/x.png" alt="Borrar" id="borrarLectura" class="campoOrdenPreparacionBorrar campoOrdenPreparacionBorrarGS1" contador="1"/>
		</div>


		<div id="lecturasActuales" style="display:none"></div>


		<?php if(is_array($idsLeidosAnteriormente) && count($idsLeidosAnteriormente)>0) { ?>

			<?php $total=0; ?>
    
            <p>Resumen de lecturas ya registradas en Proxium:</p>
            
            <table class="tablaFormateada">
            <tr>
                <th>Id</th>
                <th>Formato</th>
                <th>Precinta</th>
                <th>Cantidad</th>
            </tr>
            <?php foreach($idsLeidosAnteriormente as $lectura) { ?>
                <tr>
                    <td align="left"><?php echo formateaTTT($lectura['CodigoEscaneado']); ?></td>
                    <td><?php
                        $arrayTemp=unserialize(FORMATOS_TRAZABILIDAD);
                        echo $arrayTemp[$lectura['Formato']];
                    ?>
                    </td>
                    <td align="center"><?php echo $lectura['Precinta']; ?></td>
                    <td align="right"><?php echo $lectura['Cantidad']; ?></td>
                </tr>
                <?php $total+=(int)$lectura['Cantidad']; ?>
            <?php } ?>
            <tr>
                <td colspan="3" align="right">Lecturas registradas:</td>
                <td align="right"><strong><?php if(is_array($idsLeidosAnteriormente)) echo count($idsLeidosAnteriormente); ?></strong></td>
            </tr>
            <tr>
                <td colspan="3" align="right">Total cantidad registrada:</td>
                <td align="right"><strong><?php echo $total; ?></strong></td>
            </tr>
            </table>
            
		<?php } //Fin si hay ids leidos anteriormente ?>
        
		<?php if($procedeDePreparacion) { ?>
        
        <p><input type="button" name="volverAPreparacion" id="volverAPreparacion" value="Volver a la preparacion" class="boton"/></p>
        
        <?php } ?>

<script>

function cargaInformacionLecturasActuales() {

	console.log('function cargaInformacionLecturasActuales');
	
	$.post( "<?php echo $rutaHtml; ?>/contenidos/trazabilidad-tabaco-lecturas-salida.php", { 'accion' : 'listado' <?php if($formatoLecturasCiegas) { ?> , 'formatoLecturasCiegas' : true<?php } ?> })
	.done(function(data) {
	
		$('#lecturasActuales').html(data);
		$('#lecturasActuales').show();
		
		$('#popupCargando').hide();
		
	});
	
}

function compruebaCantidades(precinta) {

	console.log('COMPROBACION de que queda suficiente cantidad');
	
	let lecturaCodificada=btoa($('#lecturaGS1').val());
	
	console.log('<?php echo $rutaHtml; ?>/contenidos/trazabilidad-tabaco-lecturas-salida.php?accion=evaluarcantidad&id='+lecturaCodificada+'&precinta='+precinta);
							
	$.post( "<?php echo $rutaHtml; ?>/contenidos/trazabilidad-tabaco-lecturas-salida.php", { 'accion' : 'evaluarcantidad' , 'id' : lecturaCodificada , 'precinta' : precinta })
	.done(function(data) {
	
		console.log('Resultado de comprobar cantidades: '+data);
		
		$('#popupCargando').hide();
		
		if(data!='0') {
			reiniciaLectura();
			var valores=data.split('#');
			if(valores[2]==0) {
				alert('ERROR: Este identificador <strong>'+$('#lecturaGS1').val()+'</strong> es válido, pero no queda más cantidad pendiente de registrar para este producto.',$('#lecturaGS1'),'error');
			}
			else {
				alert('ERROR: El identificador <strong>'+$('#lecturaGS1').val()+'</strong> es válido, pero la cantidad '+valores[0]+'<br>excede la cantidad pendiente de registrar para este producto<br>('+valores[2]+' de un total de '+valores[1]+').',$('#lecturaGS1'),'error');
			}
		}
		else {
			guardaLectura(precinta);
		}
		
	});

}

function guardaLectura(precinta) {

	console.log('function guardaLectura');
	
	let lecturaCodificada=btoa($('#lecturaGS1').val());

	$.post( "<?php echo $rutaHtml; ?>/contenidos/trazabilidad-tabaco-lecturas-salida.php", { 'accion' : 'leer' , 'id' : lecturaCodificada , 'precinta' : precinta <?php if($formatoLecturasCiegas) { ?>, 'formatoLecturasCiegas' : true<?php } ?> })
	.done(function(data) {
				
		cargaInformacionLecturasActuales();
		reiniciaLectura();
								
	});
	
}


////////////////////////////////////Procedimiento de interpretación de códigos

var lecturaScanner=new Array(); //array global para almacenar las pulsaciones de teclas obtenidas desde el scanner, cuando se comporta así (scanner externo bluetooth como teclado)
var cadenaLectura='';
var esLecturaGS1Correcta=false;


function reiniciaLectura() {

	console.log('function reiniciaLectura');
	
	lecturaScanner=new Array();
	cadenaLectura='';
	esLecturaGS1Correcta=false;
	
	$('#lecturaGS1').val('');
	
	$('#lecturaGS1').focus();
}

////////////////////////////////////


$(document).ready(function() {

	<?php if($procedeDePreparacion) { ?>
	
	$('#volverAPreparacion').on('click',function(){
	
		$('#popupCargando').show();
		window.location='<?php echo $rutaHtml; ?>/orden-preparacion-proceso-S.php';
	
	});
	
	<?php } ?>
	
	/////////////////////////////////////////////////////Gestion campo lectura

	$('#tecladoLectura').on('click',function(){
		$('#teclado').show();
		$('#valor').val( $('#lecturaGS1').val() );
		$('#valorOculto').val( $('#lecturaGS1').val() );
		$('#enter').attr('campoValor','lecturaGS1');
		$('#enter').attr('forzarEnter','si');
	});
			
	
	<?php if(!$desactivaScannerBluetooth) { ?>
	
	$('#lecturaGS1').on('keydown',function(e){
	
		e.preventDefault();
		var resultado='';
		
		if(e.which==13 || e.key=='Enter') {
			$('#lecturaGS1').trigger('change');
		}
		else lecturaScanner.push( [ String.fromCharCode(e.which) , e.which , e.key ] );
	}); 
	
	<?php } ?>	
	
	$('#lecturaGS1').on('change',function(){
				
		//Método que detecta que se ha hecho una nueva lectura.
		//tenemos que comprobar si procede del scanner o procede del teclado emergente
				


		//27-9-2021 Version ultima con escaneres integrados sin separadores
		
		var lecturaFinal='';

		<?php if( ($desactivaScannerBluetooth || $lecturaEspecial) && !$lecturaSinSeparadores ) { ?>
		lecturaFinal=transformaLecturaManualAlFormatoScanner( $('#lecturaGS1').val() );
		<?php } else if($lecturaSinSeparadores) { ?>
			if( $('#lecturaGS1').val().indexOf('(')!=-1 ) { 
				lecturaFinal=transformaLecturaManualAlFormatoScanner( $('#lecturaGS1').val() );
			}
			else {
				<?php if($caracterSeparadorGs1){ ?>
				lecturaFinal=extraeBloquesSinSeparadorCaracterSeparador( $('#lecturaGS1').val() , <?php echo $caracterSeparadorGs1; ?> );
				<?php } else { ?>
				lecturaFinal=extraeBloquesSinSeparador( $('#lecturaGS1').val() );
				<?php } ?>
			}
		<?php } else { ?>
		if(lecturaScanner.length > 0) {
			lecturaFinal=limpiaLecturaDesdeScanner( lecturaScanner );
		}
		else {
			lecturaFinal=transformaLecturaManualAlFormatoScanner( $('#lecturaGS1').val() );
		}
		<?php } ?>
		
		var resultado=pintaLecturaHumana( lecturaFinal );
		
		
		console.log('####### resultado: '+resultado);

		
		if(resultado=='error')  {
			alert('Error en la lectura. Código TTT no reconocido.',null,'error')
			.done(function(){
				reiniciaLectura();
			});
		}
		else if(resultado!='') {
			
			$('#lecturaGS1').val( resultado );
			
			let resultadoCodificado=btoa(resultado);
			
			$('#popupCargando').show();
			
			console.log('COMPROBACION de que el id no haya sido leido anteriormente en esta misma pantalla');
			console.log('comprobamos --> '+$('#lecturaGS1').val());
					
			$.post( "<?php echo $rutaHtml; ?>/contenidos/trazabilidad-tabaco-lecturas-salida.php", { 'accion' : 'comprobar' , 'id' : resultadoCodificado })
			.done(function(data) {
			
				console.log('Resultado de la comprobación: '+data);
				
				if(data!='1') {
					$('#popupCargando').hide();
					reiniciaLectura();
					alert('ERROR: Este identificador ya ha sido leido anteriormente.',$('#lecturaGS1'),'error');
				}
				else  {
				
					<?php if(!$formatoLecturasCiegas) { ?>
				
					console.log('COMPROBACION de que el id está disponible en el listado de productos');
				
					$.post( "<?php echo $rutaHtml; ?>/contenidos/trazabilidad-tabaco-lecturas-salida.php", { 'accion' : 'disponibilidad' , 'id' : resultadoCodificado })
					.done(function(data) {
					
						var valores=data.split('#');
						
						console.log(data);
					
						if(valores[0]=='0') {
							$('#popupCargando').hide();
							
							<?php if($procedeDePreparacion) { ?>
							let mensaje='Este identificador no está registrado en el sistema,<br>no corresponde a ningún producto incluido en la salida<br>o corresponde a un régimen distinto.';
							<?php } else { ?>
							let mensaje='Este identificador no se encuentra en stock<br>o no corresponde al producto seleccionado.';
							<?php } ?>
							
							alert('ERROR: '+mensaje+'<br><br>'+htmlEncode($('#lecturaGS1').val()),$('#lecturaGS1'),'error')
							.done(function(){
								reiniciaLectura();
							});
						}
						else {
						
							console.log('Cuántos se han encontrado: '+valores[0]);
							
							
							if(parseInt(valores[0])>1) {
							
								$('#popupCargando').hide();
								confirm('Atención, este producto está disponible con dos tipos de precintas.<br><br>Por favor, selecciona a cuál corresponde.','informacion','CP','SP')
								.done(function(){
									//CP
									compruebaCantidades('CP');
								})
								.fail(function(){
									//SP
									compruebaCantidades('SP');
								});
								
							
							}
							else {
							
								console.log('Precinta unica: '+valores[1]);
							
								compruebaCantidades(valores[1]);
								
							}
						}
						
					});
					
					<?php } else  { //fin si no son lecturas ciegas: hay ids informados ?>
					
					guardaLectura('<?php echo $productoPrecinta; ?>');
					
					<?php } ?>
					
				}
									
			});
			
		}
		
	});
			
	$('#borrarLectura').on('click',function(){
		reiniciaLectura();
	});
	
	<?php if(!$procedeDePreparacion) { //07-01-2025 cuando viene de preparacion directa, el play tiene otro comportamiento distinto ?>
	
	$('#botonLectura').on("click",function(e){
		
		e.preventDefault();
		
		$.post( "<?php echo $rutaHtml; ?>/contenidos/trazabilidad-tabaco-lecturas-salida.php", { 'accion' : 'contar' })
		.done(function(data) {
			if(data>0) {
				confirm('Se va a proceder a enviar Proxium las lecturas actuales.<br>¿Deseas continuar?')
				.done(function(){
					$('#popupCargando').show();
					$('#procesoEntradaPlay').val(1);
					$('#formulario').submit();
				});
			}
			else {
				alert('No hay ninguna lectura pendiente de enviar a Proxium.');
			}
		});

	});
	
	<?php } ?>
	
	$(document).on('click','.cancelarLectura',function(){
	
		var lectura=$(this).attr('lectura');
		
		confirm('¿Deseas cancelar la lectura del Id: '+atob(lectura),'advertencia')
		.done(function(){
			$('#popupCargando').show();
			$.post( "<?php echo $rutaHtml; ?>/contenidos/trazabilidad-tabaco-lecturas-salida.php", { 'accion' : 'cancelar' , 'id' : lectura })
			.done(function(data) {
				cargaInformacionLecturasActuales();
				$('#lecturaGS1').focus();
			});
		});
	});
	
	
	
	
	

			
	
	//Carga inicial si no se ha cambiado de producto
	cargaInformacionLecturasActuales();
	
	
	reiniciaLectura();
	
});

</script>

<?php

if($procedeDePreparacion) { //7-1-2026 TICKET 26072054 + TAREA INTERNA 72058
	include($rutaPhp.$rutaHtml.'/maqueta/menu-trazabilidad-tabaco-salida-desde-preparacion.php');
}
else {
	include($rutaPhp.$rutaHtml.'/maqueta/menu-trazabilidad-tabaco-salida.php');
}

include($rutaPhp.$rutaHtml.'/maqueta/abajo.php');
?>
