<?php
class SaveOrdenProdFinalAction extends wtActions
{
    public function execute()
    {
        $i_Id = ( int ) $this->getRequestParameter( 'i_Id' );
        
        $con = Conexion::getConexion();
        $con->begin();
        
        try
        {
            $TipoProc       = $this->getRequestParameter( 's_TipoProc' );
            $Secuencia      = $this->getRequestParameter( 'Secuencia' );
            $IdAdicional    = $this->getRequestParameter( 'id_adicional' );
            $IdItem         = $this->getRequestParameter( 'IdItem' );
            $IdAlmacen      = $this->getRequestParameter( 'IdAlmacen' );
            $IdLote         = $this->getRequestParameter( 'IdLote' );
            $CantidadPedida = $this->getRequestParameter( 'CantidadPedida' );
            $CantidadxCaja  = $this->getRequestParameter( 'CantidadxCaja' );
            //$PrecioUnitario = floatval( $this->getRequestParameter( 'PrecioUnitario' ) ); //se tiene que modificar si se hace el proceso de bajar precio
            //$NoAfecImpuesto = $this->getRequestParameter( 'NoAfectoImpuestoVentasFlag' );
            
            $o_ALM_ItemMastFN = new ALM_ItemMastFN();
            $o_ALM_ItemMastBN = $o_ALM_ItemMastFN->selectByPK( $IdItem );
            
            switch ( $TipoProc )
            {
                case "delparent":
                    
                    $s_ProFinalId = $this->getRequestParameter( 'id_parent' );
                    
                    $o_VTA_ProductoFinalDetDP = new VTA_ProductoFinalDetDP();
                    $o_VTA_ProductoFinalDetDP->setProFinalId( ( int ) $s_ProFinalId );
                    $o_VTA_ProductoFinalDetDP->deleteAll();
                    
                    $o_VTA_ProductoFinalDP = new VTA_ProductoFinalDP();
                    $o_VTA_ProductoFinalDP->setProFinalId( ( int ) $s_ProFinalId );
                    $o_VTA_ProductoFinalDP->delete();
                    
                    VTA_OrdenDP::actualizarCabaceraMontos2( ( int ) $i_Id );
                    
                break;
                case "nvodet":
                    
                    $o_VTA_OrdenFN = new VTA_OrdenFN();
                    $o_VTA_OrdenBN = $o_VTA_OrdenFN->selectByPK( $i_Id );
                    
                    $CantidadPedida = 1;
                    if( $CantidadxCaja )
                    {
                        $CantidadPedida = floatval( $CantidadxCaja );
                    }
                    //nuevo
                    $i_ProFinalDetId = VTA_ProductoFinalDetDP::recuperarId();
                    $s_Secuencia     = VTA_ProductoFinalDetDP::recuperarSecuencia( $IdAdicional );
                    
                    //////////////////////////////////////////////////////////////////////////////////////////
                    //SE RECUPERA VALOR DE IGV ACTUAL
                    $f_ValorIGV       = GSS_ParametroMastFN::getValorPorTipo( "AL", "IGV" ); //0.18
                    $f_ValorIGVMasUno = $f_ValorIGV + 1;  //1.18
                    //////////////////////////////////////////////////////////////////////////////////////////
                    
                    $o_VTA_ProductoFinalDetDP = new VTA_ProductoFinalDetDP();
                    $o_VTA_ProductoFinalDetDP->setProFinalDetId( $i_ProFinalDetId );
                    $o_VTA_ProductoFinalDetDP->setProFinalId( ( int ) $IdAdicional );
                    $o_VTA_ProductoFinalDetDP->setOrdenId( ( int ) $i_Id );
                    $o_VTA_ProductoFinalDetDP->setSecuencia( $s_Secuencia );
                    $o_VTA_ProductoFinalDetDP->setIdItem( $IdItem );
                    $o_VTA_ProductoFinalDetDP->setIdAlmacen( $IdAlmacen );
                    $o_VTA_ProductoFinalDetDP->setIdUnidad( 58 );
                    $o_VTA_ProductoFinalDetDP->setDetalleDescripcion( $o_ALM_ItemMastBN->getDescripcionCompleta() );
                    $o_VTA_ProductoFinalDetDP->setCantidad( $CantidadPedida );
                    $o_VTA_ProductoFinalDetDP->setPesoUnitario( $o_ALM_ItemMastBN->getPesoGramos() );
                    $o_VTA_ProductoFinalDetDP->setPesoTotal( $CantidadPedida * $o_ALM_ItemMastBN->getPesoGramos() );
                    
                    //////////////////////////////////////////////////////////////////////////////////////////
                    $o_VTA_OrdenDetalleBN = new VTA_OrdenDetalleBN();
                    $o_VTA_OrdenDetalleBN->setItemCod( $IdItem );
                    $o_VTA_OrdenDetalleBN->setOrdenId( ( int ) $i_Id );
                    $o_VTA_OrdenDetalleBN->setItemTipo( VTA_OrdenDetalleBN::TIPO_PRODUCTO );
                    $o_VTA_OrdenDetalleBN->setForzarIdTipoLista( 1 ); //primero se busca precio para venta
                    //$o_VTA_OrdenDetalleBN->setForzarIdRango( 2 );
                    
                    $o_CotizacionesDetalleBL = new CotizacionesDetalleBL();
                    $o_CotizacionesDetalleBL->validarDetalleExisteItem( $o_VTA_OrdenDetalleBN );
                    //pr( $o_VTA_OrdenDetalleBN ); exit;
                    
                    $f_PrecioUnidadConIGV   = $o_VTA_OrdenDetalleBN->getPrecioUnidadIncImpuesto();
                    $f_ImpuestoUnidad       = $o_VTA_OrdenDetalleBN->getOrdenDetalleImpuestoUnidad();
                    $f_PrecioUnidad         = $o_VTA_OrdenDetalleBN->getOrdenDetallePrecioUnidad();
                    
                    if( $o_VTA_OrdenBN->esGravadaConImpuesto() )
                    {
                        $f_MontoTotalNeto           = round( $f_PrecioUnidadConIGV * $CantidadPedida, 2 );
                        $f_MontoSubTotal            = round( $f_MontoTotalNeto / $f_ValorIGVMasUno, 2 );
                        $f_MontoSubTotalImpuesto    = round( $f_MontoTotalNeto - $f_MontoSubTotal, 2 );
                    }
                    else
                    {
                        $f_MontoTotalNeto           = round( $f_PrecioUnidadConIGV * $CantidadPedida, 2 );
                        $f_MontoSubTotal            = $f_MontoTotalNeto;
                        $f_MontoSubTotalImpuesto    = 0;
                    }
                    
                    //////////////////////////////////////////////////////////////////////////////////////////
                    
                    $o_VTA_ProductoFinalDetDP->setPrecioUnitarioVal( $f_PrecioUnidad );
                    $o_VTA_ProductoFinalDetDP->setImpuestoUnitarioVal( $f_ImpuestoUnidad );
                    $o_VTA_ProductoFinalDetDP->setPrecioUnitarioConIGVVal( $f_PrecioUnidadConIGV );
                    $o_VTA_ProductoFinalDetDP->setMontoSubTotalVal( $f_MontoSubTotal );
                    $o_VTA_ProductoFinalDetDP->setImpuestoTotalVal( $f_MontoSubTotalImpuesto );
                    $o_VTA_ProductoFinalDetDP->setTotalConIGVVal( $f_MontoTotalNeto );
                    
                    //////////////////////////////////////////////////////////////////////////////////////////
                    $o_VTA_OrdenDetalleBN = new VTA_OrdenDetalleBN();
                    $o_VTA_OrdenDetalleBN->setItemCod( $IdItem );
                    $o_VTA_OrdenDetalleBN->setOrdenId( ( int ) $i_Id );
                    $o_VTA_OrdenDetalleBN->setItemTipo( VTA_OrdenDetalleBN::TIPO_PRODUCTO );
                    $o_VTA_OrdenDetalleBN->setForzarIdTipoLista( 2 );//ahora se busca precio para alquiler
                    //$o_VTA_OrdenDetalleBN->setForzarIdRango( 2 );
                    
                    $o_CotizacionesDetalleBL = new CotizacionesDetalleBL();
                    $o_CotizacionesDetalleBL->validarDetalleExisteItem( $o_VTA_OrdenDetalleBN );
                    
                    $f_PrecioUnidadConIGV   = $o_VTA_OrdenDetalleBN->getPrecioUnidadIncImpuesto();
                    $f_ImpuestoUnidad       = $o_VTA_OrdenDetalleBN->getOrdenDetalleImpuestoUnidad();
                    $f_PrecioUnidad         = $o_VTA_OrdenDetalleBN->getOrdenDetallePrecioUnidad();
                    
                    if( $o_VTA_OrdenBN->esGravadaConImpuesto() )
                    {
                        $f_MontoTotalNeto           = $f_PrecioUnidadConIGV * $CantidadPedida;
                        $f_MontoSubTotal            = round( $f_MontoTotalNeto / $f_ValorIGVMasUno, 2 );
                        $f_MontoSubTotalImpuesto    = round( $f_MontoTotalNeto - $f_MontoSubTotal, 2 );
                    }
                    else
                    {
                        $f_MontoTotalNeto           = round( $f_PrecioUnidadConIGV * $CantidadPedida, 2 );
                        $f_MontoSubTotal            = $f_MontoTotalNeto;
                        $f_MontoSubTotalImpuesto    = 0;
                    }
                    
                    //////////////////////////////////////////////////////////////////////////////////////////
                    
                    $o_VTA_ProductoFinalDetDP->setPrecioUnitarioAlq( $f_PrecioUnidad );
                    $o_VTA_ProductoFinalDetDP->setImpuestoUnitarioAlq( $f_ImpuestoUnidad );
                    $o_VTA_ProductoFinalDetDP->setPrecioUnitarioConIGVAlq( $f_PrecioUnidadConIGV );
                    $o_VTA_ProductoFinalDetDP->setMontoSubTotalAlq( $f_MontoSubTotal );
                    $o_VTA_ProductoFinalDetDP->setImpuestoTotalAlq( $f_MontoSubTotalImpuesto );
                    $o_VTA_ProductoFinalDetDP->setTotalConIGVAlq( $f_MontoTotalNeto );
                    
                    $o_VTA_ProductoFinalDetDP->setUsuarioCreacion( myUser::getUser()->getUserId() );
                    $o_VTA_ProductoFinalDetDP->setFechaCreacion( date( "Y-m-d H:i:s" ) );
                    $o_VTA_ProductoFinalDetDP->setUsuarioModificacion( myUser::getUser()->getUserId() );
                    $o_VTA_ProductoFinalDetDP->setFechaModificacion( date( "Y-m-d H:i:s" ) );
                    $o_VTA_ProductoFinalDetDP->save();
                    
                break;
                case "upddet":
                    
                    $o_VTA_OrdenFN = new VTA_OrdenFN();
                    $o_VTA_OrdenBN = $o_VTA_OrdenFN->selectByPK( $i_Id );
                    
                    $i_ProFinalDetId = intval( $Secuencia );
                    $CantidadPedida  = floatval( $CantidadPedida );
                    
                    //////////////////////////////////////////////////////////////////////////////////////////
                    //SE RECUPERA VALOR DE IGV ACTUAL
                    $f_ValorIGV       = GSS_ParametroMastFN::getValorPorTipo( "AL", "IGV" ); //0.18
                    $f_ValorIGVMasUno = $f_ValorIGV + 1;  //1.18
                    //////////////////////////////////////////////////////////////////////////////////////////
                    
                    $o_VTA_ProductoFinalDetDP = new VTA_ProductoFinalDetDP();
                    $o_VTA_ProductoFinalDetDP->setProFinalDetId( $i_ProFinalDetId );
                    $o_VTA_ProductoFinalDetDP->setCantidad( $CantidadPedida );
                    $o_VTA_ProductoFinalDetDP->setPesoTotal( $CantidadPedida * $o_ALM_ItemMastBN->getPesoGramos() );

                    //////////////////////////////////////////////////////////////////////////////////////////
                    $o_VTA_OrdenDetalleBN = new VTA_OrdenDetalleBN();
                    $o_VTA_OrdenDetalleBN->setItemCod( $IdItem );
                    $o_VTA_OrdenDetalleBN->setOrdenId( ( int ) $i_Id );
                    $o_VTA_OrdenDetalleBN->setItemTipo( VTA_OrdenDetalleBN::TIPO_PRODUCTO );
                    $o_VTA_OrdenDetalleBN->setForzarIdTipoLista( 1 );
                    //$o_VTA_OrdenDetalleBN->setForzarIdRango( 2 );
                    
                    $o_CotizacionesDetalleBL = new CotizacionesDetalleBL();
                    $o_CotizacionesDetalleBL->validarDetalleExisteItem( $o_VTA_OrdenDetalleBN );
                    
                    $f_PrecioUnidadConIGV   = $o_VTA_OrdenDetalleBN->getPrecioUnidadIncImpuesto();
                    $f_ImpuestoUnidad       = $o_VTA_OrdenDetalleBN->getOrdenDetalleImpuestoUnidad();
                    $f_PrecioUnidad         = $o_VTA_OrdenDetalleBN->getOrdenDetallePrecioUnidad();
                    
                    if( $o_VTA_OrdenBN->esGravadaConImpuesto() )
                    {
                        $f_MontoTotalNeto           = $f_PrecioUnidadConIGV * $CantidadPedida;
                        $f_MontoSubTotal            = round( $f_MontoTotalNeto / $f_ValorIGVMasUno, 2 );
                        $f_MontoSubTotalImpuesto    = round( $f_MontoTotalNeto - $f_MontoSubTotal, 2 );
                    }
                    else
                    {
                        $f_MontoTotalNeto           = round( $f_PrecioUnidadConIGV * $CantidadPedida, 2 );
                        $f_MontoSubTotal            = $f_MontoTotalNeto;
                        $f_MontoSubTotalImpuesto    = 0;
                    }
                    
                    //////////////////////////////////////////////////////////////////////////////////////////
                    
                    $o_VTA_ProductoFinalDetDP->setPrecioUnitarioVal( $f_PrecioUnidad );
                    $o_VTA_ProductoFinalDetDP->setImpuestoUnitarioVal( $f_ImpuestoUnidad );
                    $o_VTA_ProductoFinalDetDP->setPrecioUnitarioConIGVVal( $f_PrecioUnidadConIGV );
                    $o_VTA_ProductoFinalDetDP->setMontoSubTotalVal( $f_MontoSubTotal );
                    $o_VTA_ProductoFinalDetDP->setImpuestoTotalVal( $f_MontoSubTotalImpuesto );
                    $o_VTA_ProductoFinalDetDP->setTotalConIGVVal( $f_MontoTotalNeto );
                    
                    //////////////////////////////////////////////////////////////////////////////////////////
                    $o_VTA_OrdenDetalleBN = new VTA_OrdenDetalleBN();
                    $o_VTA_OrdenDetalleBN->setItemCod( $IdItem );
                    $o_VTA_OrdenDetalleBN->setOrdenId( ( int ) $i_Id );
                    $o_VTA_OrdenDetalleBN->setItemTipo( VTA_OrdenDetalleBN::TIPO_PRODUCTO );
                    $o_VTA_OrdenDetalleBN->setForzarIdTipoLista( 2 );
                    //$o_VTA_OrdenDetalleBN->setForzarIdRango( 2 );
                    
                    $o_CotizacionesDetalleBL = new CotizacionesDetalleBL();
                    $o_CotizacionesDetalleBL->validarDetalleExisteItem( $o_VTA_OrdenDetalleBN );
                    
                    $f_PrecioUnidadConIGV   = $o_VTA_OrdenDetalleBN->getPrecioUnidadIncImpuesto();
                    $f_ImpuestoUnidad       = $o_VTA_OrdenDetalleBN->getOrdenDetalleImpuestoUnidad();
                    $f_PrecioUnidad         = $o_VTA_OrdenDetalleBN->getOrdenDetallePrecioUnidad();
                    
                    if( $o_VTA_OrdenBN->esGravadaConImpuesto() )
                    {
                        $f_MontoTotalNeto           = $f_PrecioUnidadConIGV * $CantidadPedida;
                        $f_MontoSubTotal            = round( $f_MontoTotalNeto / $f_ValorIGVMasUno, 2 );
                        $f_MontoSubTotalImpuesto    = round( $f_MontoTotalNeto - $f_MontoSubTotal, 2 );
                    }
                    else
                    {
                        $f_MontoTotalNeto           = round( $f_PrecioUnidadConIGV * $CantidadPedida, 2 );
                        $f_MontoSubTotal            = $f_MontoTotalNeto;
                        $f_MontoSubTotalImpuesto    = 0;
                    }
                    
                    //////////////////////////////////////////////////////////////////////////////////////////
                    
                    $o_VTA_ProductoFinalDetDP->setPrecioUnitarioAlq( $f_PrecioUnidad );
                    $o_VTA_ProductoFinalDetDP->setImpuestoUnitarioAlq( $f_ImpuestoUnidad );
                    $o_VTA_ProductoFinalDetDP->setPrecioUnitarioConIGVAlq( $f_PrecioUnidadConIGV );
                    $o_VTA_ProductoFinalDetDP->setMontoSubTotalAlq( $f_MontoSubTotal );
                    $o_VTA_ProductoFinalDetDP->setImpuestoTotalAlq( $f_MontoSubTotalImpuesto );
                    $o_VTA_ProductoFinalDetDP->setTotalConIGVAlq( $f_MontoTotalNeto );
                    
                    $o_VTA_ProductoFinalDetDP->setUsuarioModificacion( myUser::getUser()->getUserId() );
                    $o_VTA_ProductoFinalDetDP->setFechaModificacion( date( "Y-m-d H:i:s" ) );
                    $o_VTA_ProductoFinalDetDP->update();
                    
                break;
                case "deldet":
                    
                    $s_ProFinalDetId = $this->getRequestParameter( 'id_det' );
                    
                    $o_VTA_ProductoFinalDetDP = new VTA_ProductoFinalDetDP();
                    $o_VTA_ProductoFinalDetDP->setProFinalDetId( ( int ) $s_ProFinalDetId );
                    $o_VTA_ProductoFinalDetDP->delete();
                    
                break;
            }
            
            $con->commit();
            
            $a_Rs['error']   = false;
            $a_Rs['id']      = $i_Id;
        }
        catch ( Exception $o_Exception )
        {
            $con->rollback();
            $a_Rs['error']        = true;
            $a_Rs['mensaje_error'] = $o_Exception->getMessage();
        }
        
        echo json_encode( $a_Rs );
        return ViewResponse::NONE;
    }
}