<?php
class GenerarCorteRepoAction extends wtActions
{
    public function execute()
    {
        $s_IdProyecto     = $this->getRequestParameter( 'IdProyecto' );
        $s_FechaCorte     = $this->getRequestParameter( 'Fecha' );

        $a_Respuesta = array( "error" => false );

        if( $s_IdProyecto )
        {
            $con = Conexion::getConexion();
            $con->begin();
            try
            {
                $a_DataRs = array();
                $s_Sql = "SELECT * FROM SR_CotizacionDevolucionCab WHERE IdProyecto={$s_IdProyecto} "; //AND EstadoCorte='P';
                $o_ResultSet = Conexion::getConexion()->prepareStatement( $s_Sql )->executeQuery();
                if( $o_ResultSet->getRecordCount() > 0 )
                {
                    $f_SumaSubTotal = 0;
                    $i_IdProyecto   = intval( $s_IdProyecto );
                    while ( $o_ResultSet->next() )
                    {
                        $a_SQLRow = $o_ResultSet->getRow();

                        $s_IdItem = $a_SQLRow['IdItem'];

                        $o_ALM_ItemMastBN = ALM_ItemMastFN::buscarItemxId( $s_IdItem );

                        //se recupera el precio por alquiler
                        $o_MST_ListaPrecioDetalleFN = new MST_ListaPrecioDetalleFN();
                        //$o_MST_ListaPrecioDetalleFN->setIdTipoLista( 2 ); //ALQUILER
                        //$o_MST_ListaPrecioDetalleFN->setIdRango( $o_ALM_ItemMastBN->getIdRangoAlquiler() ); //RANGO ALQUILER
                        $o_MST_ListaPrecioDetalleFN->setIdTipoLista( 1 ); //VENTA
                        $o_MST_ListaPrecioDetalleFN->setIdRango( $o_ALM_ItemMastBN->getIdRangoVenta() ); //RANGO ALQUILER
                        $o_MST_ListaPrecioDetalleFN->setIdItem( $s_IdItem );
                        $a_MST_ListaPrecioDetalle = $o_MST_ListaPrecioDetalleFN->select();
                        foreach ( $a_MST_ListaPrecioDetalle as $o_TMP_MST_ListaPrecioDetalleBN )
                        {
                            $f_PrecioSinIGV = $o_TMP_MST_ListaPrecioDetalleBN->getPrecioVenta();
                        }

                        //INFORMACION PARA DEVOLUCION
                        $a_RowTMP = array();
                        $s_Sql = "SELECT c.FechaDevolucion FechaInicioAlq, 'DEVOLUCION' Tipo, LPAD( c.DevolucionCabId, 10, '0' ) Documento, d.IdItem, d.ItemDescripcion Descripcion, ( d.CantidadDevolucion ) Cantidad, d.EstadoDevolucionId, d.ComentarioDevolucion,
                                     COALESCE( d.EstadoFacturacion, 'P' ) EstadoFacturacion, d.DevolucionDetId
                                FROM SR_DevolucionCabecera c
                                  LEFT JOIN SR_DevolucionDetalle d ON d.DevolucionCabId=c.DevolucionCabId
                                WHERE 1=1
                                  AND c.IdProyecto={$s_IdProyecto} AND d.IdItem='$s_IdItem' AND d.EstadoDevolucionId='RE' AND COALESCE( d.EstadoFacturacion, 'P' )<>'R' ;"; //AND c.EstadoCorte='P'
                        //pr( $s_Sql ); exit;
                        $o_ResultSet2 = Conexion::getConexion()->prepareStatement( $s_Sql )->executeQuery();
                        while ( $o_ResultSet2->next() )
                        {
                            $a_SQLRow2                          = $o_ResultSet2->getRow();
                            $a_SQLRow2['FechaFinAlq']           = $a_SQLRow2['FechaInicioAlq'];
                            $a_SQLRow2['PrecioUnitarioAlq']     = $f_PrecioSinIGV;
                            $a_SQLRow2['EstadoFacturacionDesc'] = $a_SQLRow2['EstadoFacturacion'] == "P" || $a_SQLRow2['EstadoFacturacion'] == "" ? "PENDIENTE" : "REGISTRADO";

                            $o_SR_EstadoDevolucionFN  = new SR_EstadoDevolucionFN();
                            $o_SR_EstadoDevolucionBN  = $o_SR_EstadoDevolucionFN->selectByPK( $a_SQLRow2['EstadoDevolucionId'] );
                            if( $o_SR_EstadoDevolucionBN )
                            {
                                $s_EstadoDesc = strtoupper( $o_SR_EstadoDevolucionBN->getDescripcion() );
                            }
                            $a_SQLRow2['EstadoDesc'] = $s_EstadoDesc;
                            $a_SQLRow2['Total']      = round( $a_SQLRow2['Cantidad'] * $f_PrecioSinIGV, 2 );

                            $a_DataRs[$s_IdItem][] = $a_SQLRow2;

                            $f_SumaSubTotal = $f_SumaSubTotal + $a_SQLRow2['Total'];
                        }
                    }

                    if( $a_DataRs )
                    {
                        //AHORA SE REGISTRA EL LA FACTURACION PENDIENTE PARA ESTE CORTE
                        $o_SR_EstadoDevolucionFN = new SR_EstadoDevolucionFN();
                        $o_SR_EstadoDevolucionBN = $o_SR_EstadoDevolucionFN->selectByPK( "RE" );
                        //$s_IdItemServ            = $o_SR_EstadoDevolucionBN->getIdItemServicio();
                        $o_ALM_ItemMastBN        = $o_SR_EstadoDevolucionBN->getObjectItem();

                        $s_Sql        = "select coalesce(MAX(GrupoId),1) GrupoId from SR_DevolucionDetCorte WHERE IdProyecto=$s_IdProyecto;";
                        $o_ResultSet2 = Conexion::getConexion()->prepareStatement( $s_Sql )->executeQuery();
                        $o_ResultSet2->next();
                        $i_GrupoId = $o_ResultSet2->getInt( 'GrupoId' );
                        $s_Grupo1  = "GR_".date( "Ymd" )."_$i_GrupoId";

                        if( $o_ALM_ItemMastBN )
                        {
                            $f_MontoIGV   = round( $f_SumaSubTotal * 0.18, 2 );
                            $f_MontoTotal = $f_SumaSubTotal + $f_MontoIGV;

                            $i_Id                         = SR_DevolucionFacturacionDP::recuperarId();
                            $o_SR_DevolucionFacturacionDP = new SR_DevolucionFacturacionDP();
                            $o_SR_DevolucionFacturacionDP->setDevolFactId( $i_Id );
                            $o_SR_DevolucionFacturacionDP->setIdCompania( myUser::getUser()->getIdCompania() );
                            $o_SR_DevolucionFacturacionDP->setIdSucursal( myUser::getUser()->getIdSucursal() );
                            $o_SR_DevolucionFacturacionDP->setIdProyecto( $i_IdProyecto );
                            $o_SR_DevolucionFacturacionDP->setGrupoId( $s_Grupo1 );
                            $o_SR_DevolucionFacturacionDP->setTipoEstado( $o_SR_EstadoDevolucionBN->getEstadoDevolucionId() );
                            $o_SR_DevolucionFacturacionDP->setEstadoDesc( $o_SR_EstadoDevolucionBN->getDescripcion() );
                            $o_SR_DevolucionFacturacionDP->setIdItem( $o_ALM_ItemMastBN->getIdItem() );
                            $o_SR_DevolucionFacturacionDP->setDescripcionItem( $o_ALM_ItemMastBN->getDescripcionCompleta() );
                            $o_SR_DevolucionFacturacionDP->setFechaCorte( date( "Y-m-d" ) );
                            $o_SR_DevolucionFacturacionDP->setSubTotal( $f_SumaSubTotal );
                            $o_SR_DevolucionFacturacionDP->setMontoIGV( $f_MontoIGV );
                            $o_SR_DevolucionFacturacionDP->setMontoTotal( $f_MontoTotal );
                            $o_SR_DevolucionFacturacionDP->setEstado( "P" );
                            $o_SR_DevolucionFacturacionDP->setFechaCreacion( date( "Y-m-d H:i:s" ) );
                            $o_SR_DevolucionFacturacionDP->setUsuarioCreacion( myUser::getUser()->getUserId() );
                            $o_SR_DevolucionFacturacionDP->setUsuarioModificacion( myUser::getUser()->getUserId() );
                            $o_SR_DevolucionFacturacionDP->setFechaModificacion( date( "Y-m-d H:i:s" ) );
                            $o_SR_DevolucionFacturacionDP->save();
                        }
                        else
                        {
                            throw new Exception( "No se encontro el Item de Servicio" );
                        }

                        //pr( $a_DataRs );
                        //AHORA SE ACTUALIZA EL ID PARA RELACIONARLO
                        foreach( $a_DataRs as $a_Data )
                        {
                            foreach( $a_Data as $a_Row )
                            {
                                //pr( $a_Row );
                                $o_SR_DevolucionDetalleDP = new SR_DevolucionDetalleDP();
                                $o_SR_DevolucionDetalleDP->setDevolucionDetId( ( int ) $a_Row[ 'DevolucionDetId' ] );
                                $o_SR_DevolucionDetalleDP->setDevolFactId( $i_Id );
                                $o_SR_DevolucionDetalleDP->setEstadoFacturacion( "R" );
                                $o_SR_DevolucionDetalleDP->setPrecioUnitVentaDevolucion( $a_Row['PrecioUnitarioAlq'] );
                                $o_SR_DevolucionDetalleDP->update();
                            }
                        }
                    }
                }

                $con->commit();
            }
            catch ( Exception $e )
            {
                $con->rollback();
                $a_Respuesta['error'] = true;
                $a_Respuesta['mensaje_error'] = $e->getMessage();
            }
        }

        echo json_encode( $a_Respuesta );

        exit;

    }
}


