<?php

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

    protected $table_names = array(
        'CA_NOVEDAD_REV_TIT_V'
    ); //tablas para construir el sql, por medio de joins
    protected $table_join_ids = array(); //si posee tablas para joins, identificar la relacion de los campos con las tablas
    protected $fields = array(
        'CA_NOVEDAD_REV_TIT_V' =>
        array(
            'id_novedad_rev_tit' => 'id_novedad_rev_tit',
            'id_titulo' => 'id_titulo',
            'id_anual_etapa' => 'id_anual_etapa',
            'id_estado_rev' => 'id_estado_rev',
            'id_usuario_rev' => 'id_usuario_rev',
            'fecha_rev' => 'fecha_rev',
            'observaciones' => 'observaciones',
            'id_liq_canon' => 'id_liq_canon',
            'vigencia' => 'vigencia',
            'id_usuario_liq' => 'id_usuario_liq',
            'fecha_liq' => 'fecha_liq',
            'descripcion' => 'descripcion',
            'estado' => 'estado',
            'aplica_liquidacion' => 'aplica_liquidacion',
            'solicitud_en_proceso' => 'solicitud_en_proceso',
            'cod_titulo' => 'cod_titulo',
            'fecha_inscripcion_rmn' => 'fecha_inscripcion_rmn',
            'id_competencia' => 'id_competencia',
            'desc_competencia' => 'desc_competencia',
            'id_modalidad' => 'id_modalidad',
            'desc_mod' => 'desc_mod',
            'id_norma' => 'id_norma',
            'desc_norma' => 'desc_norma',
            'area_actual' => 'area_actual',
            'fecha_inicio' => 'fecha_inicio',
            'fecha_fin' => 'fecha_fin',
            'anualidad' => 'anualidad',
            'fecha' => 'fecha',
            'estado_liq' => 'estado_liq',
            'anulado' => 'anulado',
            'motivo_anu' => 'motivo_anu',
            'fecha_anula' => 'fecha_anula',
            'id_usuario_anula' => 'id_usuario_anula',
            'motivo_cierre' => 'motivo_cierre',
            'fecha_cierre' => 'fecha_cierre',
            'id_usuario_cierre' => 'id_usuario_cierre'
        )
    ); //por cada tabla especificar los campos del select
    protected $fields_orderBy = array(
        'fecha_rev', 'aplica_liquidacion desc', 'descripcion', 'cod_titulo', 'fecha_inicio', 'anualidad'
    ); //campos para el ordenamiento de la consulta


    /*
     * OPCIONES DE FILTRO:
     *
     * LIKEALLPLUS- busqueda comparativa de la cadena dividida por los espacios en blanco en cualquier posición
     * LIKEALL - busqueda comparativa de la cadena en cualquier posición
     * LIKE - busqueda en la cadena que inicie por la variable de filtro
     *
     * _filtroNull / para filtro de not null o null - type debe ser is - para todas las variables
     * TYPE NULL / para filtro de not null o null con el valor de campo desde gwt
     * rownum,start - rownum,end / estos campos para uso del Grid live GWT, numero fijo de filas de consulta
     */
    protected $table_field_conditions = array(
        'CA_NOVEDAD_REV_TIT_V' =>
        array(
            'id_novedad_rev_tit,a' => array('!=' => array(-1)),
            'id_novedad_rev_tit,b' => array('=' => array('id_novedad_rev_tit')),
            'id_titulo' => array('=' => array('id_titulo')),
            'id_anual_etapa' => array('=' => array('id_anual_etapa')),
            'id_estado_rev' => array('=' => array('id_estado_rev')),
            'fecha_rev' => array('BETWEENFECHA' => array('fecha_ini', 'fecha_fin')),
            'id_competencia' => array('=' => array('id_competencia')),
            'cod_titulo' => array('=' => array('cod_titulo')),
            'rownum,start' => array('>' => array('_startRow')),
            'rownum,end' => array('<=' => array('_endRow'))/* ,
          'rownum,start' => array('>' => array(0)),
          'rownum,end' => array('<=' => array(75)) */
        )
    ); //por cada tabla se dan los campos, opcion de filtro y variable que entra para los posibles filtros
    protected $table_field_or_conditions = array(
    ); // filtros de condicion or
//    protected $query_qualifier = 'DISTINCT'; //Para eliminar filas repetidas

    /*
     * Variable manejo de log
     */
    //true - consulta de menu administracion
    protected $is_admin = true;
    //si es servicio para filtro agregar campo
//    protected $filtro = 'Perfiles';
    //true - la tabla principal de busqueda no es una vista
    protected $is_filtro = true;

    /**
     * Construccion de observacion perzonalizada
     * 
     * Toda variable para tomarla del request con el formato:
     * &request-variable&
     * 
     * false - observacion por defecto
     *
     * @var string 
     */
    protected $observacion_list = false;
    protected $observacion_add = false;
    protected $observacion_update = false;
    protected $observacion_remove = false;

    /**
     * Generar planilla de novedad de revision
     *
     * @param sfRequest $request A request object
     */
    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");

        //Session de fecha
        $sql = <<<EOD
ALTER SESSION SET NLS_DATE_FORMAT = "YYYY-MM-DD"    
EOD;

        CN_TABLE::executeSQL($sql);

        $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
        $this->conn->beginTransaction();

        $id_liq_canon = 0;
        $id_det_liq_canon = 0;

        $fecha_actual = CN_TABLE::fechaSistema();
        $vigencia_actual = date('Y');
        $progress_key = $request['progress_key'] . $request['username'];
        $id_usuario_log = $request['id_usuario_log'];

        /*
         * Manejo de errores
         */
        try {

            $fecha_ini = $request['fecha_ini'];
            $fecha_fin = $request['fecha_fin'];

            //Competencia
            $whereCompetencia = " ";
            if (isset($request['id_competencia'])) {
                $whereCompetencia = " AND tab0.id_competencia = " . $request['id_competencia'];
            }

            //Competencia
            $whereTitulo = " ";
            if (isset($request['id_titulo'])) {
                $whereTitulo = " AND tab0.id_titulo = " . $request['id_titulo'];
            }

            //id_estado_rev
            $whereEstadoRev = " ";
            if (isset($request['id_estado_rev'])) {
                $whereEstadoRev = " AND tab0.id_estado_rev = " . $request['id_estado_rev'];
            }


            /*
             * Consulta novedades segun filtro
             * Verifica que no tenga liq_can o este anulado
             * Que aplique liquidacion el estado de novedad
             */
            $sql = <<<EOD
select distinct 
tab0.*,
to_char(tab0.fecha_rev,'yyyy') as id_anho,
to_char(tab0.fecha_rev,'mm') as id_mes,
nvl(ult.valor,0) as valor_liq_ant,
formu.formula,
tab0.area_actual as area,
tab0.anualidades_Etapa_inicial as anu_etapa_inicial

from(

    SELECT   
    tab0.*
    FROM CA_NOVEDAD_REV_TIT_V tab0 

    WHERE  
    trunc(tab0.fecha_rev) between to_date('$fecha_ini', 'YYYY-MM-DD') and to_date('$fecha_fin','YYYY-MM-DD')
    and (
      tab0.id_liq_canon is null
      or 
      tab0.anulado = 1
    )
    and tab0.aplica_liquidacion = 1
    $whereCompetencia
    $whereTitulo
    $whereEstadoRev 

)tab0

left join CA_ULTIMO_VALOR_TIT_V ult
on ult.id_titulo = tab0.id_titulo

left join CA_FORMULA formu
on formu.id_etapa = tab0.id_etapa
and formu.id_norma = tab0.id_norma

ORDER BY 
tab0.id_competencia,
tab0.cod_titulo   
EOD;

            $record_nov = CN_TABLE::executeSQL($sql);

            if (count($record_nov) == 0) {
                throw new Exception("No hay registros para generar nuevas plantillas segun filtros, favor verificar.");
            }

            /**
             * Consecutivo liq canon
             */
            $sql = <<<EOD
select * from ca_table_vig_seq where id_vigencia = $vigencia_actual and nom_entidad = 'CA_LIQ_CANON'    
EOD;

            $record = CN_TABLE::executeSQL($sql);

            if (count($record) > 0) {
                $id_liq_canon = $record[0]['seq'];
            } else {
                $id_liq_canon = 1;
                $sql = <<<EOD
Insert into CA_TABLE_VIG_SEQ (ID_VIGENCIA,NOM_ENTIDAD,SEQ) values ('$vigencia_actual','CA_LIQ_CANON','$id_liq_canon') 
EOD;
                $this->conn->execute($sql);
            }

            /**
             * Consecutivo det liq canon
             */
            $sql = <<<EOD
select * from ca_table_vig_seq where id_vigencia = $vigencia_actual and nom_entidad = 'CA_DET_LIQ_CANON'  
EOD;

            $record = CN_TABLE::executeSQL($sql);

            if (count($record) > 0) {
                $id_det_liq_canon = $record[0]['seq'];
            } else {
                $id_det_liq_canon = 1;
                $sql = <<<EOD
Insert into CA_TABLE_VIG_SEQ (ID_VIGENCIA,NOM_ENTIDAD,SEQ) values ('$vigencia_actual','CA_DET_LIQ_CANON','$id_det_liq_canon') 
EOD;
                $this->conn->execute($sql);
            }

            $id_competencia_tag = 0;
            $maximo_cant_tag = 0;
            $maximo_cant = 20;

            //Recorre cada registro y genera planilla
            foreach ($record_nov as $value_nov) {

                $id_anho = $value_nov['id_anho'];
                $id_mes = $value_nov['id_mes'];
                $id_competencia = $value_nov['id_competencia'];
                $id_novedad_rev_tit = $value_nov['id_novedad_rev_tit'];

                $maximo_cant_tag++;

                //Por cada competencia y maximo cant 20 una planilla
                if ($id_competencia != $id_competencia_tag) {

                    //aumenta consecutivo
                    $id_liq_canon++;

                    $id_competencia_tag = $id_competencia;

                    $sql = <<<EOD
Insert into CA_LIQ_CANON (ID_LIQ_CANON,VIGENCIA,FECHA,ESTADO,MOTIVO_ANU,FECHA_ANULA,ID_USUARIO_ANULA,
    AUTOMATICO,ANULADO,MOTIVO_CIERRE,FECHA_CIERRE,ID_USUARIO_CIERRE,ID_COMPETENCIA,AFECTA_CARTERA,ID_VIGENCIA_AUTO,ID_MESES_AUTO) 
values ('$id_liq_canon','$vigencia_actual',to_date('$fecha_actual','YYYY-MM-DD'),'1',null,null,null,
    '1','0',null,null,null,'$id_competencia','1','$id_anho','$id_mes')
EOD;
                    $this->conn->execute($sql);

                    /**
                     * LOG de CANON
                     */
                    $request['id_tabla'] = $id_liq_canon;
                    //Operaciones: 1-CONSULTAR, 2-ACTUALIZAR, 3-ADICIONAR, 4-ELIMINAR, 5-ANULAR
                    $id_ope_bd = 3;
                    //obtener id maestro tabla
                    $id_mae_bd = CN_TABLE::consultarIdTablaBD('CA_LIQ_CANON');
                    //registro de consulta en tabla de log- la observacion puede o no enviarse ($request, $id_ope_bd, $id_mae_bd, $observacion)
                    $liq = $request['id_liq_canon'];
                    CN_TABLE::registrarLog($request, $id_ope_bd, $id_mae_bd, "Se creo la planilla de liquidación número $id_liq_canon y se crearon los detalles.");

                    //Supera el maximo cant
                    if ($maximo_cant_tag >= $maximo_cant) {
                        $id_competencia_tag = 0;
                    }
                }

                $id_det_liq_canon++;
                $id_titulo = $value_nov['id_titulo'];
                $id_etapa = $value_nov['id_etapa'];
                $id_anual_etapa = $value_nov['id_anual_etapa'];
                $anualidad = $value_nov['anualidad'];
                $id_smdlv = $value_nov['id_smdlv'];
                $area_actual = $value_nov['area_actual'];

                /**
                 * Calcular valor de liquidacion
                 */
                if ($value_nov['formula'] != null) {

                    $formula = $value_nov['formula'];

                    $sql = <<<EOD
select * from ca_variable 
EOD;
                    $record = CN_TABLE::executeSQL($sql);

                    /**
                     * Reemplazo de variables
                     */
                    $formula = CN_TABLE::reemplazoVariables($formula, $record);

                    /**
                     * Reemplazo de valores
                     */
                    $formula = CN_TABLE::reemplazoValores($formula, $value_nov);

                    /**
                     * Calculo de formula
                     */
                    $formulas = explode("if", $formula);

                    $result_val = 0;
                    for ($i = 1; $i < count($formulas); $i++) {

                        $formula_tag = str_replace(';', '', $formulas[$i]);
                        $formula = CN_TABLE::cambioFormula($formula_tag);

                        //throw new Exception("formula::" . $formula);

                        $result = CN_TABLE::aplicarEval($formula);

                        //No cumple con la condicion
                        if ($result == '-9999' || $result == -9999) {
                            $this->logMessage("[novedad_rev_tit_gen_plan Agrupación] Formula No cumple con la condicion: " . $formula);
                        } else {
                            $result_val = $result;
                        }
                    }

                    //Redondear valor
                    $valor = round($result_val, 0);
                    
                    //throw new Exception("valor formula::" . $valor);
                } else {
                    $valor = $value_nov['valor_liq_ant'];
                }
                //throw new Exception("valor::" . $valor);

                /**
                 * Detalle de la planilla
                 */
                $sql = <<<EOD
Insert into CA_DET_LIQ_CANON (ID_DET_LIQ_CANON,VIGENCIA,ID_LIQ_CANON,ID_TITULO,ID_ETAPA,ID_ANUAL_ETAPA,
    ID_USUARIO_APRUEBA,ID_SMDLV,ID_USUARIO_ANULA,AREA,ANUALIDAD,VALOR,
        FECHA_APRUEBA,FECHA_ANULA,APROBADO,ANULADO,MOTIVO_ANU) 
values ('$id_det_liq_canon','$vigencia_actual','$id_liq_canon','$id_titulo','$id_etapa','$id_anual_etapa',
    $id_usuario_log,'$id_smdlv',null,'$area_actual','$anualidad','$valor',
        to_date('$fecha_actual','YYYY-MM-DD'),null,'1','0',null)  
EOD;
                $this->conn->execute($sql);


                /**
                 * Actualiza novedad revision
                 */
                $sql = <<<EOD
update ca_novedad_rev_tit 
set id_liq_canon = $id_liq_canon, vigencia = $vigencia_actual, id_usuario_liq = $id_usuario_log, fecha_liq = sysdate
where
id_novedad_rev_tit = $id_novedad_rev_tit 
EOD;
                $this->conn->execute($sql);
            }

            //Actualiza consecutivo
            $sql = <<<EOD
update ca_table_vig_seq set seq = $id_liq_canon where id_vigencia = $vigencia_actual and nom_entidad = 'CA_LIQ_CANON'
EOD;
            $this->conn->execute($sql);

            $sql = <<<EOD
update ca_table_vig_seq set seq = $id_det_liq_canon where id_vigencia = $vigencia_actual and nom_entidad = 'CA_DET_LIQ_CANON'
EOD;
            $this->conn->execute($sql);

            //Fin MemcacheHandler
            MemcacheHandler::getInstance()->set($progress_key, 100);

            //COMMIT DE TODAS LAS TRANSACCIONES
            $this->conn->commit();

            $this->status = 0;
            $this->list_data = array();
            $this->logMessage("[novedad_rev_tit_gen_plan] Generación exitosa.");
        } catch (Exception $e) {

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

            //Fin MemcacheHandler
            MemcacheHandler::getInstance()->set($progress_key, 100);

            $this->status = 3;
            $this->mensajeError = "ERROR!!! " . $e->getMessage();
            $this->list_data = array();
            $this->logMessage("ERROR!!!");
            $this->logMessage("Error: " . $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 - ");

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

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

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

        return $request;
    }

}
