<?php

/**
 * nov_devol_exced actions.
 *
 * @package    cartera
 * @subpackage nov_devol_exced
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class nov_devol_excedActions extends sfQuery {
    /*
     * ------------VARIABLES PARA SERVICIOS DE CONSULTA - LIST
     */

    protected $table_names = array(
        'CA_NOV_DEVOL_EXCED',
        'TS_TD',
        'INTERCEROS'
    ); //tablas para construir el sql, por medio de joins
    protected $table_join_ids = array(
        'TS_TD, LEFT' =>
        array(
            'id_ts_td-id' => 'CA_NOV_DEVOL_EXCED'
        ),
        'INTERCEROS' =>
        array(
            'id_mae_ter' => 'CA_NOV_DEVOL_EXCED'
        )
    ); //si posee tablas para joins, identificar la relacion de los campos con las tablas
    protected $fields = array(
        'CA_NOV_DEVOL_EXCED' =>
        array(
            'id_nov_devol_exced' => 'id_nov_devol_exced',
            'id_mae_ter' => 'id_mae_ter',
            'fecha_proceso' => 'fecha_proceso',
            'num_doc' => 'num_doc',
            'id_ts_td' => 'id_ts_td',
            'fecha_doc' => 'fecha_doc',
            'observaciones' => 'observaciones',
            'estado' => 'estado',
            'fecha_anu' => 'fecha_anu',
            'motivo_anu' => 'motivo_anu'
        ),
        'TS_TD' =>
        array(
            'documento' => 'documento',
            'descripcion' => 'descripcion_td'
        ),
        'INTERCEROS' =>
        array(
            'num_doc' => 'nitocc',
            'razon_soc' => 'razon_soc',
            'num_doc,||, - ,||,razon_soc' => 'tercero'
        )
    ); //por cada tabla especificar los campos del select
    protected $table_field_conditions = array(
        'CA_NOV_DEVOL_EXCED' => array(
            'id_nov_devol_exced,a' => array('!=' => array(-1)),
            'id_nov_devol_exced,b' => array('=' => array('id_nov_devol_exced')),
            'id_mae_ter' => array('=' => array('id_mae_ter')),
            'fecha_proceso' => array('BETWEENFECHA' => array('fecha_ini', 'fecha_fin')),
            'num_doc' => array('=' => array('num_doc')),
            'id_ts_td' => array('=' => array('id_ts_td')),
            'estado' => array('=' => array('estado')),
            'rownum,start' => array('>' => array('_startRow')),
            'rownum,end' => array('<=' => array('_endRow'))
        )
    ); //por cada tabla se dan los campos, opcion de filtro y variable que entra para los posibles filtros
    protected $fields_orderBy = array(
        'id_nov_devol_exced'
    ); //campos para el ordenamiento de la consulta
    //protected $table_field_obligatory = array('id_nov_devol_exced'); //campos obligatorios de filtro - estan en el request

    /*
     * Variables manejo de log
     */
    //true - consulta de administracion
    protected $is_admin = false;
    //true - la tabla principal de busqueda no es una vista
    protected $is_filtro = true;



    /*
     * ------------VARIABLES PARA SERVICIOS CRUD
     */
    protected $id_name = 'id_nov_devol_exced'; //identificador de la tabla
    protected $id_names = array('id_nov_devol_exced'); //llave primaria
    protected $field_names = array('id_nov_devol_exced', 'id_mae_ter', 'fecha_proceso',
        'num_doc', 'id_ts_td', 'fecha_doc', 'observaciones', 'estado', 'fecha_anu', 'motivo_anu'); //campos de la tabla, sin la llave primaria
    protected $table_name = 'CA_NOV_DEVOL_EXCED'; //tabla en la cual se aplican los cambios
    protected $has_activo = true; //si posee campo en la tabla de nombre activo ---- ESTADO PARA REGALIAS
    protected $has_vigencia = false; //si posee vigencia
    protected $has_cen_op = false; //si posee centro de operacion
    protected $has_id_cia = false; //si posee compañia
    protected $has_secuencia = true; //si posee secuencia la tabla


    /*
     * Manejo de registro log
     */
    protected $id_unico = 'id_nov_devol_exced'; //identificador unico de la tabla

    // 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;
    }

    /**
     * Metodo para add la novedad
     *
     * @param sfWebRequest $request
     */

    public function executeAdd(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");

        //manejo de errores
        try {


            $usuario = $request['username'];

            if (isset($request['excedentes'])) {

                $excedentes = $request['excedentes'];


                /*
                 * Variables obligatorias
                 */
                $id_mae_ter = $request['id_mae_ter'];
                $fecha_proceso = $request['fecha_proceso'];

                $num_doc = 'null';
                if (isset($request['num_doc'])) {
                    $num_doc = $request['num_doc'];
                }

                $id_ts_td = 'null';
                if (isset($request['id_ts_td'])) {
                    $id_ts_td = $request['id_ts_td'];
                }

                $fecha_doc = '';
                if (isset($request['fecha_doc'])) {
                    $fecha_doc = $request['fecha_doc'];
                }

                $observaciones = '';
                if (isset($request['observaciones'])) {
                    $observaciones = $request['observaciones'];
                }

                /**
                 * add novedad
                 */
                //sentencia sql
                $sql = <<<EOD
insert into ca_nov_devol_exced (id_mae_ter, fecha_proceso, num_doc, id_ts_td, 
    fecha_doc, observaciones, estado, fecha_anu, motivo_anu) 
values ( $id_mae_ter, to_date('$fecha_proceso', 'yyyy-mm-dd'), $num_doc, $id_ts_td,
    to_date('$fecha_doc', 'yyyy-mm-dd'), '$observaciones', 1,  null, null )
EOD;

                //ejecuta el sql
                CN_TABLE::executeSQL($sql);

                /*
                 * Obtener registro nuevo de la novedad
                 */
                //sentencia sql
                $sql = <<<EOD
select * from ca_nov_devol_exced where id_mae_ter = $id_mae_ter order by id_nov_devol_exced desc 
EOD;
                //ejecuta el sql
                $result = CN_TABLE::executeSQL($sql);
                $id_nov_devol_exced = $result[0]['id_nov_devol_exced'];

                /*
                 * Actualizar excedentes
                 */
                //dividir los excedentes
                $datos_excedentes = explode('/', $excedentes);

                //Variable que calcula el valor total de la novedad.
                $total_novedad = 0;

                foreach ($datos_excedentes as $value) {
                    $this->logMessage('Datos_excedentes: ' . $value);


                    //dividir id y valor
                    $value_excedentes = explode('-', $value);
                    $value_id = $value_excedentes[0];
                    $value_valor = $value_excedentes[1];
                    $total_novedad+=$value_valor;

                    //sentencia sql
                    $sql = <<<EOD
select * from ca_excedentes
where id_excedente = $value_id  
EOD;
                    //ejecuta el sql
                    $result = CN_TABLE::executeSQL($sql);
                    $valor_exced = $result[0]['valor'];

                    if ($value_valor == $valor_exced) {

                        /*
                         * actualizar excedente con la novedad
                         */
                        //sentencia sql
                        $sql = <<<EOD
update ca_excedentes set en_uso = 1, id_nov_devol_exced = $id_nov_devol_exced 
    where id_excedente = $value_id
EOD;

                        //ejecuta el sql
                        CN_TABLE::executeSQL($sql);
                    } else {

                        /*
                         * actualizar excedente con la novedad y crear nuevo excedente con la novedad
                         * y el valor de la novedad
                         */
                        //sentencia sql
                        $sql = <<<EOD
update ca_excedentes set en_uso = 1, id_nov_devol_exced = $id_nov_devol_exced, valor = $value_valor 
    where id_excedente = $value_id
EOD;

                        //ejecuta el sql
                        CN_TABLE::executeSQL($sql);

                        $id_credito = $result[0]['id_credito'];
                        $valor = $valor_exced - $value_valor;

                        /*
                         * Crea nuevo registro con el valor que falta del excedente usado
                         */
                        //sentencia sql
                        $sql = <<<EOD
Insert into CA_EXCEDENTES (ID_EXCEDENTE,ID_CREDITO,VALOR,EN_USO,
    ID_CREDITO_APLICADO,ID_NOV_DEVOL_EXCED) 
        values (null, $id_credito, $valor, 0, null, null) 
EOD;

                        //ejecuta el sql
                        CN_TABLE::executeSQL($sql);
                    }
                }

                /*
                 * Actualizacion 12 de Septiembre de 2014
                 * Se adiciona a la funcionalidad de novedad, el servicio para registrar la nota de tesoreria.
                 * 
                 */

                //TRAIGO EL CONCEPTO DE TESORERIA.

                $sql = <<<EOD
select * from ts_concep_notas
where devolucion = 1 
EOD;
                //ejecuta el sql
                $result = CN_TABLE::executeSQL($sql);
                $id_concepto = $result[0]['id_concepto'];

                
                $total = round(($total_novedad/1.004),0);
                
                $valor_ded = $total*4/100;
                //CREO LA NOTA DE TESORERIA
                
                $sql = <<<EOD
Insert into TS_NOT_TESO (ID_NOT_TESO,ID_VIGENCIA,VIGENCIA,ID_CONCEPTO,ID_TIP_DOC,NUMERO,FECHA,ID_TERCERO,VR_BRUTO,VR_IVA,TOTAL,OBSERVACIONES,
VR_NETO_ACREEDOR,FECHA_PROCESO,USUARIO,FECHA_SYS,ESTADO) 
        values (null, 1, TO_CHAR(to_date('$fecha_proceso', 'yyyy-mm-dd'),'yyyy'),$id_concepto,$id_ts_td,$num_doc,to_date('$fecha_doc', 'yyyy-mm-dd'),$id_mae_ter,
            $total_novedad,$valor_ded,$total,'$observaciones',$total,to_date('$fecha_proceso', 'yyyy-mm-dd'),'$usuario',sysdate,null) 
EOD;

                //ejecuta el sql
                CN_TABLE::executeSQL($sql);
                
                $sql  = <<<EOD
select tab0.* from ts_not_teso tab0 where tab0.id_concepto = $id_concepto and tab0.id_tip_doc = $id_ts_td
             and tab0.numero = $num_doc and tab0.id_tercero= $id_mae_ter
                 
EOD;
                        
        $result = CN_TABLE::executeSQL($sql);
        
        
        $id_not_teso = $result[0]['id_not_teso'];
        
        //SE CREA LA DEDUCCION CORRESPONDIENTE AL 4 X MIL PARA EL REGISTRO DE LA ORDEN DE PAGO.
        
        $sql  = <<<EOD
select tab0.* from ts_im tab0 where tab0.aplica_devolucion=1
EOD;
        $result = CN_TABLE::executeSQL($sql);
        
        $id_im = $result[0]['id'];
        $tipo_impuesto = $result[0]['desccorta'];
        
        $sql = <<<EOD
INSERT INTO TS_NOT_DEDUCCIONES(ID_NOT_TESO,TIPO_IMPUESTO,BASE_IMPUESTO,TARIFA_IMPUESTO,VALOR_IMPUESTO,FECHA_PROCESO,ID_VIGENCIA,VIGENCIA,ID_IM,ID_MAE_TER)
            VALUES($id_not_teso,'$tipo_impuesto',$total,0,$valor_ded,to_date('$fecha_proceso','YYYY-MM-DD'),1,
                TO_CHAR(to_date('$fecha_proceso', 'yyyy-mm-dd'),'yyyy'),$id_im,$id_mae_ter)
EOD;
        //ejecuta el sql
                CN_TABLE::executeSQL($sql);



                $mensaje = "[NOVEDAD] Novedad de excedentes exitosa.";
                $this->status = 0;
                $this->mensajeError = $mensaje;
                $this->list_data = array();
                $this->logMessage($mensaje);
            } else {
                $mensaje = "[NOVEDAD] Faltan registros de excedentes.";
                $this->status = 1;
                $this->mensajeError = $mensaje;
                $this->list_data = array();
                $this->logMessage($mensaje);
            }
        } catch (Exception $e) {

            $this->status = 1;
            $this->mensajeError = "ERROR!!!";
            $this->list_data = array();
            $this->logMessage("ERROR!!!");
            $this->logMessage($e->getMessage());
        }
    }

}
