<?
include("ApiGlobalFunctions.php");
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

$usuario=$_POST['uid'];
$password=$_POST['key'];
$url=$_POST['url'];
$tipo=$_POST['Tipo'];
$invid=$_POST['InvID'];
$test=$_POST['data'];
$data=json_decode($_POST['data'],true);
$include=includec($url);
include ($include);
$date=date('Y-m-d H:i:s');
error_log("AddRegisterINv. USR: ".$usuario."-- TIPO: ".$tipo."-- INV: ".$invid."-- URL: ".$url."--".print_r($test,true)."\n", 3, "phpInv.log");

if ($tipo === 'Racks' && isset( $data['slot'], $data['seriales']))  {
    $slot = $data['slot'];
    $datarack=SlotData($slot,$url);
    $rack=$datarack[0];
    $slot_id=$datarack[1];
    $seriales = $data['seriales'];
    //echo $rack."--".$slot_id."--".print_r($seriales,true)."<br>";
    $serialesNormalizados = [];
    foreach ($seriales as $s) {
       if (strpos($s, "@@") !== false) {
           @$partes = explode('@@', $s);
           if (count($partes) === 2) {
                $serialesNormalizados[] =[ 
                "serial"   => $partes[0],
                "cantidad" => $partes[1]
                ]; 
           }
        } else {
            $serialesNormalizados[] = [
            "serial"   => $s,
            "cantidad" => 1
            ];
        }
    }    
    print_r($serialesNormalizados,true);
    
    $soloSeriales = array_column($serialesNormalizados, "serial");
    
    $serialesEscapados = array_map(function($s) use ($link) {            
        return "'" . mysqli_real_escape_string($link, $s) . "'";
    }, $soloSeriales);
    
    $listaSeriales = implode(",", $serialesEscapados);
    $cantasset_field=diccionario($url,'QtyAsset');
    $lote_asset=diccionario($url,'LoteB');
    $codprod=diccionario($url,'codproduct');
    $osReserva=diccionario($url,'AssetResv');
    $slotField=diccionario($url,'SlotAsset');
    $rackField=diccionario($url,'RackAsset');
    
    $sql = "SELECT ".$cantasset_field." as 'cantidad_esperada', ".$codprod." as 'codigo', assetstatus, ".$lote_asset." as 'lote', salesorder_no as 'reserva', productname, ".$slotField."  as 'slot', ".$rackField." as 'rack', serialnumber
    FROM vtiger_assets a
    INNER  JOIN vtiger_crmentity c ON c.crmid = a.assetsid
    INNER JOIN vtiger_assetscf acf ON acf.assetsid = a.assetsid
    INNER JOIN vtiger_products p ON p.productid=a.product
    INNER JOIN vtiger_productcf pcf ON pcf.productid=p.productid
    LEFT JOIN vtiger_salesorder so ON so.salesorderid=acf.$osReserva
    WHERE c.deleted = '0'
    AND a.serialnumber IN ($listaSeriales)";
   error_log("SQL : ".$sql."\n", 3, "phpInv.log");
    $result = mysqli_query($link, $sql);
    $mapaExistentes = [];
    while ($row = mysqli_fetch_assoc($result)) {
        $mapaExistentes[$row['serialnumber']] = $row;
    }
       print_r($mapaExistentes,true);
    $validos = [];
    $errores = [];
           
    $mapaExistentes = array_change_key_case($mapaExistentes, CASE_UPPER);       
           
    foreach ($serialesNormalizados as $item) {
        $serial   = $item['serial'];
        $cantidad = $item['cantidad'];
        $errores = [];
        $bi=true;
        
        $serial = strtoupper($serial);
        
        
        if (!isset($mapaExistentes[$serial])) {
            $errores[] = "BI no existe";
            $bi=false;
            //continue;
        }
        if($bi){
            if ($mapaExistentes[$serial]['assetstatus'] !== 'En Stock') {
                $errores[] = "Cambio de Estado";
                //continue;
            }
            if ($mapaExistentes[$serial]['rack'] !== $rack) {
                $errores[] = 'Cambio de Rack';
                //continue;
            }
            if ($mapaExistentes[$serial]['slot'] !== $slot) {
                $errores[] = 'Cambio de Slot';
                //continue;
            }
            if ($mapaExistentes[$serial]['cantidad_esperada'] != $cantidad) {
                $errores[] = 'Cantidad Reportada Diferente';
                //continue;
            }
        }    
        $mensaje = implode(' | ', $errores);
        
        
            // armamos fila para bulk insert
        $validos[] = array(
            $invid,
            $rack,
            $slot,
            $slot_id,
            $serial, // serial asset
            $cantidad, // CANTIDAD ESCANEADA
            isset($mapaExistentes[$serial]['cantidad_esperada']) ? $mapaExistentes[$serial]['cantidad_esperada'] : null, // CANTIDAD EN LOTE
            isset($mapaExistentes[$serial]['assetstatus']) ? $mapaExistentes[$serial]['assetstatus'] : null,
            isset($mapaExistentes[$serial]['lote']) ? $mapaExistentes[$serial]['lote'] : null,
            isset($mapaExistentes[$serial]['reserva']) ? $mapaExistentes[$serial]['reserva'] : null,
            isset($mapaExistentes[$serial]['codigo']) ? $mapaExistentes[$serial]['codigo'] : null,
            isset($mapaExistentes[$serial]['productname']) ? $mapaExistentes[$serial]['productname'] : null,
            $usuario,
            $date,
            'ingreso',
            $mensaje
);
        }


    if (!empty($validos)) {

        foreach ($validos as $fila) {
        // escapamos valores para seguridad
        $escaped = array_map(function($v) use ($link) {
        return "'" . mysqli_real_escape_string($link, $v) . "'";
        }, $fila);

        // armamos una fila del tipo ('val1','val2',...,'val15')
        $valores[] = "(" . implode(",", $escaped) . ")";
        }

        // concatenamos todas las filas
        $valuesSQL = implode(",", $valores);

        // query final (bulk insert)
        $sql = "INSERT INTO registros_inventario (inventarioid, rack, slot, slot_id, serial_asset, quantity_lote, cantidad_esperada, asset_status, tipo_lote, os_reserva, productcode, productname, userid, date, status, mensaje)  VALUES $valuesSQL";
        mysqli_query($link, $sql);
    }
    
    $docs[0]=array('Result'=>'1', 'msj'=>"Register Saved"); 
} else if ($tipo === 'Slots' && isset($data['seriales'])){
    
   $slot = $data['slot'];
    $datarack=SlotData($slot,$url);
    $rack=$datarack[0];
    $slot_id=$datarack[1];
    $seriales = $data['seriales'];
    //echo $rack."--".$slot_id."--".print_r($seriales,true)."<br>";
    $serialesNormalizados = [];
    foreach ($seriales as $s) {
       if (strpos($s, "@@") !== false) {
           @$partes = explode('@@', $s);
           if (count($partes) === 2) {
                $serialesNormalizados[] =[ 
                "serial"   => $partes[0],
                "cantidad" => $partes[1]
                ]; 
           }
        } else {
            $serialesNormalizados[] = [
            "serial"   => $s,
            "cantidad" => 1
            ];
        }
    }    
    $soloSeriales = array_column($serialesNormalizados, "serial");
    
    $serialesEscapados = array_map(function($s) use ($link) {            
        return "'" . mysqli_real_escape_string($link, $s) . "'";
    }, $soloSeriales);
    
    $listaSeriales = implode(",", $serialesEscapados);
    $cantasset_field=diccionario($url,'QtyAsset');
    $lote_asset=diccionario($url,'LoteB');
    $codprod=diccionario($url,'codproduct');
    $osReserva=diccionario($url,'AssetResv');
    $slotField=diccionario($url,'SlotAsset');
    $rackField=diccionario($url,'RackAsset');
    $sql = "SELECT ".$cantasset_field." as 'cantidad_esperada', ".$codprod." as 'codigo', assetstatus, ".$lote_asset." as 'lote', salesorder_no as 'reserva', productname, ".$slotField."  as 'slot', ".$rackField." as 'rack', serialnumber
    FROM vtiger_assets a
    INNER  JOIN vtiger_crmentity c ON c.crmid = a.assetsid
    INNER JOIN vtiger_assetscf acf ON acf.assetsid = a.assetsid
    INNER JOIN vtiger_products p ON p.productid=a.product
    INNER JOIN vtiger_productcf pcf ON pcf.productid=p.productid
    LEFT JOIN vtiger_salesorder so ON so.salesorderid=acf.$osReserva
    WHERE c.deleted = '0'
    AND a.serialnumber IN ($listaSeriales)";
   
    $result = mysqli_query($link, $sql);
    $mapaExistentes = [];
    while ($row = mysqli_fetch_assoc($result)) {
        $mapaExistentes[$row['serialnumber']] = $row;
    }
    
    $validos = [];
    $errores = [];
        
    $mapaExistentes = array_change_key_case($mapaExistentes, CASE_UPPER);       
           
    foreach ($serialesNormalizados as $item) {
        $serial   = $item['serial'];
        $cantidad = $item['cantidad'];
        
        $errores = [];
        $bi=true;
        
        $serial = strtoupper($serial);
        
        
        if (!isset($mapaExistentes[$serial])) {
            $errores[] = "BI no existe";
            $bi=false;
            //continue;
        }
        if($bi){
            if ($mapaExistentes[$serial]['assetstatus'] !== 'En Stock') {
                $errores[] = "Cambio de Estado";
                //continue;
            }
            if ($mapaExistentes[$serial]['rack'] !== $rack) {
                $errores[] = 'Cambio de Rack';
                //continue;
            }
            if ($mapaExistentes[$serial]['slot'] !== $slot) {
                $errores[] = 'Cambio de Slot';
                //continue;
            }
            if ($mapaExistentes[$serial]['cantidad_esperada'] != $cantidad) {
                
                $errores[] = 'Cantidad Reportada Diferente';
                //continue;
            }
        }    
        $mensaje = implode(' | ', $errores);
        
        
            // armamos fila para bulk insert
        $validos[] = array(
            $invid,
            $rack,
            $slot,
            $slot_id,
            $serial, // serial asset
            $cantidad, // CANTIDAD ESCANEADA
            isset($mapaExistentes[$serial]['cantidad_esperada']) ? $mapaExistentes[$serial]['cantidad_esperada'] : null, // CANTIDAD EN LOTE
            isset($mapaExistentes[$serial]['assetstatus']) ? $mapaExistentes[$serial]['assetstatus'] : null,
            isset($mapaExistentes[$serial]['lote']) ? $mapaExistentes[$serial]['lote'] : null,
            isset($mapaExistentes[$serial]['reserva']) ? $mapaExistentes[$serial]['reserva'] : null,
            isset($mapaExistentes[$serial]['codigo']) ? $mapaExistentes[$serial]['codigo'] : null,
            isset($mapaExistentes[$serial]['productname']) ? $mapaExistentes[$serial]['productname'] : null,
            $usuario,
            $date,
            'ingreso',
            $mensaje
);
        }

  
    if (!empty($validos)) {

        foreach ($validos as $fila) {
        // escapamos valores para seguridad
        $escaped = array_map(function($v) use ($link) {
        return "'" . mysqli_real_escape_string($link, $v) . "'";
        }, $fila);

        // armamos una fila del tipo ('val1','val2',...,'val15')
        $valores[] = "(" . implode(",", $escaped) . ")";
        }

        // concatenamos todas las filas
        $valuesSQL = implode(",", $valores);

        // query final (bulk insert)
        $sql = "INSERT INTO registros_inventario (inventarioid, rack, slot, slot_id, serial_asset, quantity_lote, cantidad_esperada, asset_status, tipo_lote, os_reserva, productcode, productname, userid, date, status, mensaje)  VALUES $valuesSQL";
        mysqli_query($link, $sql);
    }
   
    $docs[0]=array('Result'=>'1', 'msj'=>"Register Saved"); 
    
    }else {
    $docs[0]=array('Result'=>'0', 'msj'=>"Estructura del JSON no válida ".$tipo); 
}

echo json_encode(setDataJSON($docs,1));


function safeGet($array, $key, $default = null) {
    return isset($array[$key]) ? $array[$key] : $default;
}

function SlotData($slot,$url){
    $include=includec($url);
    include ($include);
    $query=mysqli_query($link, "SELECT racks_tks_rack, slotsid
    FROM vtiger_slots
    INNER JOIN vtiger_racks ON vtiger_racks.racksid=vtiger_slots.slots_tks_rack
    INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid=vtiger_slots.slotsid
    WHERE deleted='0' AND slots_tks_codigo='$slot'");
    $data=mysqli_fetch_array($query);  
    $rack=$data['racks_tks_rack'];
    $data=array($data['racks_tks_rack'],$data['slotsid']);
    return $data;
}

?>
