<?php
if( !isset( $_REQUEST['call_require'] ) )
{
    define( 'SF_ROOT_DIR', "../../" );
    define( 'SF_APP',      'sys' );
    
    require_once( SF_ROOT_DIR.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'configGlobal.php' );
}

set_memory_max_time();

if( !isset( $_REQUEST["IdItem"] ) || !isset( $_REQUEST["IdAlmacen"] ) || !isset( $_REQUEST["FechaInicio"] ) || !isset( $_REQUEST["FechaFin"] ) )
{
    $a_Rs["error"] = true;
    $a_Rs["mensaje_error"] = "Por favor se necesita los parametros: IdItem, IdAlmacen, FechaInicio, FechaFin";
    echo json_encode( $a_Rs );
    exit;
}

$o_DBConnect = Conexion::getConexion();

//PARA LIMPIAR EL COSTO
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//update ALM_Kardex set PrecioCosto=null, CostoTotal=null, SaldoCantidad=null, SaldoPrecioCosto=null, SaldoCostoTotal=null WHERE 1=1 AND IdCompania='1' AND IdAlmacen='A1301' AND IdItem in ('00002','00001');

/*
SELECT *
FROM ALM_Kardex
where 1=1
and IdAlmacen='A1303'
 AND IdItem='00002'
-- AND IdTransaccion='VTA'
-- AND IdFecha>='2021-03-13' AND IdFecha<='2021-04-30'
-- AND NumeroDocumentoFiscal LIKE '%2140'
ORDER BY 4
LIMIT 100;
*/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

$s_IdCompania  = $_REQUEST["IdCompania"];
$s_IdItem      = $_REQUEST["IdItem"];
$s_IdAlmacen   = $_REQUEST["IdAlmacen"];
$s_FechaInicio = $_REQUEST["FechaInicio"];
$s_FechaFin    = $_REQUEST["FechaFin"];

if( !function_exists( "actualizarCostosSaldos" ) )
{
    function actualizarCostosSaldos( $a_Valores, $a_Filtro )
    {
        $s_Sql = "
                    UPDATE ALM_Kardex SET 
                        PrecioCosto={$a_Valores['PrecioCosto']}, CostoTotal={$a_Valores['CostoTotal']}, SaldoCantidad={$a_Valores['SaldoCantidad']}, 
                        SaldoPrecioCosto={$a_Valores['SaldoPrecioCosto']}, SaldoCostoTotal={$a_Valores['SaldoCostoTotal']}, ParentRef='{$a_Valores['Parent']}'
                    WHERE 1=1
                        AND IdCompania='{$a_Filtro['IdCompania']}'
                        AND IdAlmacen='{$a_Filtro['IdAlmacen']}'
                        AND IdItem='{$a_Filtro['IdItem']}'
                        AND IdFecha='{$a_Filtro['IdFecha']}'
                        AND ReferenciaTipoDocumento='{$a_Filtro['ReferenciaTipoDocumento']}'
                        AND ReferenciaNumeroDocumento='{$a_Filtro['ReferenciaNumeroDocumento']}'
                        AND ReferenciaSecuencia='{$a_Filtro['ReferenciaSecuencia']}';
        ";
        Conexion::getConexion()->createStatement()->executeQuery( $s_Sql );
    }
}

//PRIMERO REVISAR ULTIMO COSTO
$s_Sql = "
            SELECT *
            FROM ALM_Kardex
            WHERE 1=1
            AND IdCompania='$s_IdCompania'
            AND IdAlmacen='$s_IdAlmacen'
            AND IdItem='$s_IdItem'
            AND PrecioCosto>0
            AND IdFecha<'$s_FechaFin'
            ORDER BY IdFecha Desc
            LIMIT 1
            ;
";
//pr($s_Sql);
$o_ResultSet = Conexion::getConexion()->prepareStatement( $s_Sql )->executeQuery();
if( $o_ResultSet->getRecordCount() > 0 )
{
    $o_ResultSet->next();
    $a_Row = $o_ResultSet->getRow();
    $o_Row = ( object ) $a_Row;
    $s_FechaInicio = substr( $o_Row->IdFecha, 0, 10 );
}
else 
{

    $s_Sql = "
                SELECT 
                    IdAlmacen, IdCompania, IdItem, IdCondicion, IdLote, IdFecha, IdTransaccion,
                    ( SELECT IngresoEgresoFlag FROM ALM_TransaccionMast WHERE IdTransaccion=ALM_Kardex.IdTransaccion ) TipoOperacion,
                    -- ( SELECT PrecioCosto FROM ALM_ItemMast WHERE IdItem=ALM_Kardex.IdItem ) PrecioCosto,
                    PrecioUnitario PrecioCosto,
                    Cantidad, ReferenciaTipoDocumento, ReferenciaNumeroDocumento, ReferenciaSecuencia, ParentRef
                FROM ALM_Kardex
                WHERE 1=1
                    AND IdCompania='$s_IdCompania'
                    AND IdAlmacen='$s_IdAlmacen'
                    AND IdItem='$s_IdItem'
                    AND IdFecha<'$s_FechaFin'
                ORDER BY IdFecha
                LIMIT 1
                ;
    ";
    $o_ResultSet = Conexion::getConexion()->prepareStatement( $s_Sql )->executeQuery();
    
    if( $o_ResultSet->getRecordCount() > 0 )
    {
        $o_ResultSet->next();
        $a_Row = $o_ResultSet->getRow();
        $o_row = ( object ) $a_Row;
        
        $s_FechaInicio = substr( $o_row->IdFecha, 0, 10 );
        
        /////////////////////////////////////////////////////////////////////////////
        //LLAVES
        $s_IdAlmacen                 = $o_row->IdAlmacen;
        $s_IdCompania                = $o_row->IdCompania;
        $s_IdItem                    = $o_row->IdItem;
        $s_IdCondicion               = $o_row->IdCondicion;
        $s_IdLote                    = $o_row->IdLote;
        $s_IdFecha                   = $o_row->IdFecha;
        $s_IdTransaccion             = $o_row->IdTransaccion;
        
        $s_ReferenciaTipoDocumento   = $o_row->ReferenciaTipoDocumento;
        $s_ReferenciaNumeroDocumento = $o_row->ReferenciaNumeroDocumento;
        $s_ReferenciaSecuencia       = $o_row->ReferenciaSecuencia;
        
        $s_ParentRef                 = $s_IdAlmacen."_".$s_IdCompania."_".$s_IdItem."_".$s_IdFecha."_".$s_ReferenciaTipoDocumento."_".$s_ReferenciaNumeroDocumento."_".$s_ReferenciaSecuencia;
        $s_ParentKey                 = $o_row->ParentRef;
        /////////////////////////////////////////////////////////////////////////////
        
        $s_TipoOperacion    = $o_row->TipoOperacion;
        $f_Cantidad         = floatval( $o_row->Cantidad );
        $f_PrecioCosto      = floatval( $o_row->PrecioCosto );
        if( !$f_PrecioCosto )
        {
            $a_data = ALM_KardexFN::buscarUltimoPrecioUnitario( $s_IdCompania, $s_IdAlmacen, $s_IdItem, $s_IdLote );
            $f_PrecioCosto = floatval( $a_data['PrecioUnitario'] );
        }

        $f_CostoTotal       = round( $f_PrecioCosto * $f_Cantidad, 2 );
        $f_SaldoCantidad    = $f_Cantidad;
        $f_SaldoCostoTotal  = $f_CostoTotal;
        $f_SaldoPrecioCosto = round( $f_SaldoCostoTotal / $f_SaldoCantidad, 2 );
        
        if( $s_IdTransaccion == "STI" )
        {
            $s_ParentRef = "";
        }
        
        actualizarCostosSaldos
        (
            array( "PrecioCosto"=>$f_PrecioCosto, "CostoTotal"=>$f_CostoTotal, "SaldoCantidad"=>$f_SaldoCantidad, "SaldoPrecioCosto"=>$f_SaldoPrecioCosto, "SaldoCostoTotal"=>$f_SaldoCostoTotal, "Parent"=>$s_ParentRef ),
            array( "IdAlmacen"=>$s_IdAlmacen, "IdCompania"=>$s_IdCompania, "IdItem"=>$s_IdItem, "IdFecha"=>$s_IdFecha, "ReferenciaTipoDocumento"=>$s_ReferenciaTipoDocumento, "ReferenciaNumeroDocumento"=>$s_ReferenciaNumeroDocumento, "ReferenciaSecuencia"=>$s_ReferenciaSecuencia )
        );
        
    }
}
//////////////////////////////
$s_Sql = "
SELECT 
    IdAlmacen, IdCompania, IdItem, IdCondicion, IdLote, IdFecha, IdTransaccion,
    ( SELECT IngresoEgresoFlag FROM ALM_TransaccionMast WHERE IdTransaccion=ALM_Kardex.IdTransaccion ) TipoOperacion,
    Cantidad, PrecioUnitario, PrecioCosto, CostoTotal, SaldoCantidad, SaldoPrecioCosto, SaldoCostoTotal,
    ReferenciaTipoDocumento, ReferenciaNumeroDocumento, ReferenciaSecuencia
FROM ALM_Kardex
WHERE 1=1
    AND IdCompania       =  '$s_IdCompania'
    AND IdItem           =  '$s_IdItem'
    AND IdAlmacen        =  '$s_IdAlmacen'
    AND LEFT(IdFecha,10) >= '$s_FechaInicio'
    AND LEFT(IdFecha,10) <= '$s_FechaFin'
ORDER BY IdFecha;
";
pr( $s_Sql );
$o_ResultSet = Conexion::getConexion()->prepareStatement( $s_Sql )->executeQuery();
pr( "---------------------------------------------------------------------------------------------------------------------------------------------------" );

$f_SaldoCantidad_Ant    = 0;
$f_SaldoPrecioCosto_Ant = 0;
$f_SaldoCostoTotal_Ant  = 0;

if( $o_ResultSet->getRecordCount() > 0 )
{
    $i = 1;
    while( $o_ResultSet->next() )
    {
        $a_Row = $o_ResultSet->getRow();
        $o_row = ( object ) $a_Row;
        //pr( $o_row );
        $b_Control = false;
        
        /////////////////////////////////////////////////////////////////////////////
        //LLAVES
        $s_IdAlmacen                 = $o_row->IdAlmacen;
        $s_IdCompania                = $o_row->IdCompania;
        $s_IdItem                    = $o_row->IdItem;
        $s_IdCondicion               = $o_row->IdCondicion;
        $s_IdLote                    = $o_row->IdLote;
        $s_IdFecha                   = $o_row->IdFecha;
        $s_IdTransaccion             = $o_row->IdTransaccion;
        
        $s_ReferenciaTipoDocumento   = $o_row->ReferenciaTipoDocumento;
        $s_ReferenciaNumeroDocumento = $o_row->ReferenciaNumeroDocumento;
        $s_ReferenciaSecuencia       = $o_row->ReferenciaSecuencia;
        
        $s_ParentKey                 = $s_IdAlmacen."_".$s_IdCompania."_".$s_IdItem."_".$s_IdFecha."_".$s_ReferenciaTipoDocumento."_".$s_ReferenciaNumeroDocumento."_".$s_ReferenciaSecuencia;
        /////////////////////////////////////////////////////////////////////////////
        
        $s_TipoOperacion    = $o_row->TipoOperacion;
        $s_IdTransaccion    = $o_row->IdTransaccion;
        $s_IdFecha          = $o_row->IdFecha;
        
        $f_Cantidad         = $o_row->Cantidad;
        $f_PrecioUnitario   = $o_row->PrecioUnitario;
        
        $f_PrecioCosto      = $o_row->PrecioCosto;
        $f_CostoTotal       = $o_row->CostoTotal;
        $f_SaldoCantidad    = $o_row->SaldoCantidad;
        $f_SaldoPrecioCosto = $o_row->SaldoPrecioCosto;
        $f_SaldoCostoTotal  = $o_row->SaldoCostoTotal;
                
        if( $f_PrecioCosto <= 0 )
        //if( $i > 1 )
        {
            //exclusiones
            if( $s_IdTransaccion == "ROC" )
            {
                //$f_PrecioCosto = $f_PrecioUnitario;
            }
            if( $s_IdTransaccion == "IBO" )
            {
                $f_PrecioUnitario = 0.01;
            }
            
            if( $s_TipoOperacion == ALM_TransaccionCabeceraBN::TIPO_INGRESO )
            {                
                if( $f_SaldoPrecioCosto_Ant == $f_PrecioUnitario )
                {
                    $f_PrecioCosto       = $f_PrecioUnitario;
                    $f_CostoTotal        = round( $f_Cantidad * $f_PrecioUnitario, 2 );
                    $f_SaldoCantidad     = $f_SaldoCantidad_Ant + $f_Cantidad;
                    $f_SaldoPrecioCosto  = $f_PrecioUnitario;
                    $f_SaldoCostoTotal   = round( $f_SaldoCantidad * $f_SaldoPrecioCosto, 2 );
                }
                else
                {
                    pr( "Diferente" );
                    
                    $f_PrecioCosto       = $f_PrecioUnitario;
                    $f_CostoTotal        = round( $f_Cantidad * $f_PrecioUnitario, 2 );
                    $f_SaldoCantidad     = $f_SaldoCantidad_Ant + $f_Cantidad;
                    $f_SumaCostoTotales  = $f_SaldoCostoTotal_Ant + $f_CostoTotal;
                    $f_SaldoPrecioCosto  = utilMath::fnround( $f_SumaCostoTotales / $f_SaldoCantidad, 2 );
                    $f_SaldoCostoTotal   = round( $f_SaldoCantidad * $f_SaldoPrecioCosto, 2 );
                }
            }
            else
            {
                $f_PrecioCosto       = $f_PrecioUnitario;
                $f_CostoTotal        = round( $f_Cantidad * $f_PrecioUnitario, 2 );
                $f_SaldoCantidad     = $f_SaldoCantidad_Ant - $f_Cantidad;
                $f_SaldoPrecioCosto  = $f_PrecioUnitario;
                $f_SaldoCostoTotal   = round( $f_SaldoCantidad * $f_SaldoPrecioCosto, 2 );
            }
            
            $a_Valores = array
            ( 
                    "TipoOpe" => $s_TipoOperacion,
                    "CantIng" => $f_Cantidad, "PrecioCosto"=>$f_PrecioCosto, "CostoTotal"=>$f_CostoTotal, 
                    "SaldoCantidad"=>$f_SaldoCantidad, "SaldoPrecioCosto"=>$f_SaldoPrecioCosto, "SaldoCostoTotal"=>$f_SaldoCostoTotal, 
                    "Parent"=>$s_ParentRef 
            );
            $a_Filtro  = array( "IdAlmacen"=>$s_IdAlmacen, "IdCompania"=>$s_IdCompania, "IdItem"=>$s_IdItem, "IdFecha"=>$s_IdFecha, "ReferenciaTipoDocumento"=>$s_ReferenciaTipoDocumento, "ReferenciaNumeroDocumento"=>$s_ReferenciaNumeroDocumento, "ReferenciaSecuencia"=>$s_ReferenciaSecuencia );
            
            pr( $a_Valores );
            //pr( $a_Filtro );
            pr( "---------------------------------------------------------------------------------------------------------------------------------------------------" );
            
            actualizarCostosSaldos( $a_Valores, $a_Filtro );
            
            $b_Control = true;
        }
        else 
        {
            $a_Valores = array
            (
                    "TipoOpe" => $s_TipoOperacion,
                    "CantIng" => $f_Cantidad, "PrecioCosto"=>$f_PrecioCosto, "CostoTotal"=>$f_CostoTotal,
                    "SaldoCantidad"=>$f_SaldoCantidad, "SaldoPrecioCosto"=>$f_SaldoPrecioCosto, "SaldoCostoTotal"=>$f_SaldoCostoTotal,
                    "Parent"=>""
            );
            pr( $a_Valores );
            pr( "---------------------------------------------------------------------------------------------------------------------------------------------------" );
        }
        
        if( $b_Control )
        {
            $f_SaldoCantidad_Ant    = $f_SaldoCantidad;
            $f_SaldoPrecioCosto_Ant = $f_SaldoPrecioCosto;
            $f_SaldoCostoTotal_Ant  = $f_SaldoCostoTotal;
        }
        else 
        {
            $f_SaldoCantidad_Ant    = $f_SaldoCantidad;
            $f_SaldoPrecioCosto_Ant = $f_SaldoPrecioCosto;
            $f_SaldoCostoTotal_Ant  = $f_SaldoCostoTotal;
        }
        
        $s_ParentRef = $s_ParentKey;
        $i++;
    }
}

$f_PrecioCosto      = "";
$f_CostoTotal       = "";
$f_SaldoCantidad    = "";
$f_SaldoCostoTotal  = "";
$f_SaldoPrecioCosto = "";

$f_SaldoCantidad_Ant    = "";
$f_SaldoPrecioCosto_Ant = "";
$f_SaldoCostoTotal_Ant  = "";

$b_Result = true;
?>