<?php

/**
 * validar_prod_inv actions.
 *
 * @package    cartera
 * @subpackage validar_prod_inv
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class validar_prod_invActions extends sfAPIActions {

    /**
     *
     * @param sfWebRequest $request
     */
    public function executeList(sfWebRequest $request) {

        //Revisar que sea post
        //$this->forward404Unless($request->isMethod('post'));
        //Guardar los parametros del request en el log
        $this->logMessage("---BEGIN Logging request");
        foreach ($request->getPostParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("--------------------------------------------------* Ip: " . $_SERVER['REMOTE_ADDR']);
        foreach ($request->getGetParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("---END Logging request");


        /**
         * Abrir nueva conexion con la Base de Datos
         */
        $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
        $this->conn->beginTransaction();

        /*
         * Formato de fecha
         */
        //Sql
        $sql = <<<EOD
ALTER SESSION SET NLS_DATE_FORMAT = "YYYY-MM-DD" 
EOD;
        //Ejecutar SQL
        CN_TABLE::executeSQL($sql);

        try {

            /**
             * Variables de filtro
             */
            $punto_venta_log = $request['punto_venta_log'];
            $codigo_elemento = $request['codigo'];
            $cantidad = $request['cantidad'];

            /**
             * Si aplica inventario - 20150715
             */
            $sql = <<<EOD
select 
ter.num_doc as num_doc_inv,
ter.razon_soc,
es.descripcion as espacio,
ta.descripcion as tipo_almacenamiento,
co.prefijo,
co.nom_cen_op,
pv.* 
from ca_punto_venta pv

left join centro_operacion co
on pv.id_cen_op = co.id_cen_op

left join in_tipo_almacenamiento ta
on ta.id_tipo_almacenamiento = pv.id_tipo_almacenamiento

left join in_espacio es
on pv.id_espacio = es.id_espacio

left join interceros_v ter
on ter.id_mae_ter = pv.id_mae_ter

where 
pv.id_punto_venta = $punto_venta_log 
and pv.aplica_inventario = 1 
EOD;
            //Ejecutar SQL
            $records_pv = CN_TABLE::executeSQL($sql);

            //Validar si el punto aplica inventario
            if (count($records_pv) > 0) {
                $this->logMessage("[validar_prod_inv] El punto de venta aplica inventario.");

                $id_cen_op = $records_pv[0]['id_cen_op'];
                $id_concepto_movimiento = $records_pv[0]['id_concepto_movimiento'];
                $id_mae_ter = $records_pv[0]['id_mae_ter'];
                $id_tipo_almacenamiento = $records_pv[0]['id_tipo_almacenamiento'];
                $id_espacio = $records_pv[0]['id_espacio'];


                $num_doc_inv = $records_pv[0]['num_doc_inv'];
                $razon_soc = $records_pv[0]['razon_soc'];
                $espacio = $records_pv[0]['espacio'];
                $tipo_almacenamiento = $records_pv[0]['tipo_almacenamiento'];
                $prefijo = $records_pv[0]['prefijo'];
                $nom_cen_op = $records_pv[0]['nom_cen_op'];

                //verifica cantidad de elementos
                //Sql
                $sql = <<<EOD
select 
inv.* 
from in_inventario_con inv
where 
inv.id_cen_op = $id_cen_op
and inv.id_espacio = $id_espacio
and  inv.id_mae_ter = $id_mae_ter
and inv.id_tipo_almacenamiento = $id_tipo_almacenamiento

and (inv.id_linea, inv.id_clase, inv.id_catalogo) in ( 
    select 
    invle.id_linea, invle.id_clase, invle.id_catalogo
    from in_codigo_elemento_v invle
    where 
    invle.codigo_elemento = '$codigo_elemento'
) 
EOD;
                //Ejecutar SQL
                $resultado_cod = CN_TABLE::executeSQL($sql);

                if (count($resultado_cod) > 0) {

                    $saldo = $resultado_cod[0]['saldo'];
                    
                    //cantidad mayor al saldo de inventario, no genera registros
                    if ($cantidad <= $saldo) {
                        $this->logMessage("Validar cantidad de productos::" . $codigo_elemento);


                        /*
                         * COMMIT DE TODAS LAS TRANSACCIONES
                         */
                        $this->conn->commit();
                        $this->status = 0;
                        $this->list_data = array();
                        $this->logMessage("[validar_prod_inv] Validar cantidad de productos::" . $codigo_elemento);
                    } else {
                        /**
                         * ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
                         */
                        $this->conn->rollback();

                        /*
                         * Mensaje de error
                         */
                        $mensajeError = <<<EOD
La cantidad ($cantidad) ingresada de productos no se encuentran en el inventario, para el producto $codigo_elemento existe un saldo de ($saldo) elementos.<br><br>    
Para las Especificaciones :: <br><br>Centro de Operación : $nom_cen_op 
                             <br>Tipo Almacenamiento : $tipo_almacenamiento  
                             <br>Espacio : $espacio
                             <br>Responsable : $num_doc_inv - $razon_soc   
EOD;

                        $this->status = 3;
                        $this->list_data = array();
                        $this->mensajeError = $mensajeError;
                        $this->logMessage("[validar_prod_inv] " . $mensajeError);
                    }
                } else {
                    //no esta el producto en inventario
                    $this->logMessage("No esta el codigo_elemento::" . $codigo_elemento);

                    /*
                     * Mensaje de error
                     */
                    $mensajeError = <<<EOD
No esta el codigo_elemento:: $codigo_elemento<br><br>    
Para las Especificaciones :: <br><br>Centro de Operación : $nom_cen_op 
                             <br>Tipo Almacenamiento : $tipo_almacenamiento  
                             <br>Espacio : $espacio
                             <br>Responsable : $num_doc_inv - $razon_soc   
EOD;


                    /**
                     * ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
                     */
                    $this->conn->rollback();

                    /**
                     * Respuesta del servicio
                     */
                    $this->status = 3;
                    $this->mensajeError = $mensajeError;
                    $this->list_data = array();
                }
            } else {
                $this->logMessage("[validar_prod_inv] Validar si el punto aplica inventario.");


                /*
                 * COMMIT DE TODAS LAS TRANSACCIONES
                 */
                $this->conn->commit();
                $this->status = 0;
                $this->list_data = array();
                $this->logMessage("[validar_prod_inv] Validación de producto exitosa.");
            }
        } catch (Exception $e) {

            /**
             * ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
             */
            $this->conn->rollback();

            /**
             * Respuesta del servicio
             */
            $this->status = 1;
            $this->mensajeError = "[validar_prod_inv] Ocurrio un error: " . $e->getMessage();
            $this->list_data = array();
            $this->logMessage("[validar_prod_inv] ERROR!");
            $this->logMessage($e->getMessage());
        }
    }

    // Validate
    /**
     * Ejecuta una validación previa a la ejecución de una operación tipo Add
     *
     * @param sfWebRequest $request
     * @return array 
     */
    protected function validateAdd(sfWebRequest $request) {

        //valor por defecto
        $errors = null;

        /*
         *  Validar la operación, ya sea por SQL
         */

        /*
         *  Generar errores en $errors
         */

        return $errors;
    }

    /**
     * Ejecuta una validación previa a la ejecución de una operación tipo Update
     *
     * @param sfWebRequest $request
     * @return array 
     */
    protected function validateUpdate(sfWebRequest $request) {

        //valor por defecto
        $errors = null;

        /*
         *  Validar la operación, ya sea por SQL
         */

        /*
         *  Generar errores en $errors
         */

        return $errors;
    }

    /**
     * Ejecuta una validación previa a la ejecución de una operación tipo Remove
     *
     * @param sfWebRequest $request
     * @return array 
     */
    protected function validateRemove(sfWebRequest $request) {

        //valor por defecto
        $errors = null;

        /*
         *  Validar la operación, ya sea por SQL
         */

        /*
         *  Generar errores en $errors
         */

        return $errors;
    }

    /**
     * Acciones anteriores a la original
     * 
     * return sfWebRequest Changed Request with additional parameters.
     * 
     * @param type $Action ( ADD, UPDATE, REMOVE )
     * @param sfWebRequest $request
     * @return \sfWebRequest 
     */
    protected function preprocessRequest($Action, sfWebRequest $request) {

        /*
         * Se instancia la clase del manejo del log
         */
        $logger = sfContext::getInstance()->getLogger();
        $logger->info("Entro a preprocessRequest");

        /*
         * Procesar Request
         */
        //accion add
        if ($Action == "ADD") {
            
        }

        //accion update
        if ($Action == "UPDATE") {
            
        }

        //accion remove
        if ($Action == "REMOVE") {
            
        }

        return $request;
    }

    /**
     * Acciones posteriores a la original
     * 
     * return sfWebRequest Changed Request with additional parameters.
     * 
     * @param type $Action ( ADD, UPDATE, REMOVE )
     * @param sfWebRequest $request
     * @return \sfWebRequest 
     */
    protected function postprocessRequest($Action, sfWebRequest $request, $list_data_post) {

        /*
         * Se instancia la clase del manejo del log
         */
        $logger = sfContext::getInstance()->getLogger();
        $logger->info("Entro a postprocessRequest - " . $list_data_post);

        /*
         * Procesar Request
         */
        //accion add
        if ($Action == "ADD") {
            
        }

        //accion update
        if ($Action == "UPDATE") {
            
        }

        //accion remove
        if ($Action == "REMOVE") {
            
        }

        return $request;
    }

}
