<?php

/**
 * gen_renuncia actions. last mod 06/08/12 $fecha_actual
 *
 * @package    canon
 * @subpackage gen_renuncia
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class gen_renunciaActions extends sfQuery {

    public $conn;

    /**
     * Metodo list de accesos
     *
     * @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");


        $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
        $this->conn->beginTransaction();
        /*
         * Manejo de errores
         */
        try {

             $fecha_actual = CN_TABLE::fechaSistema();
            /*
             * Paginacion
             */
            if (isset($request['_startRow'])) {
                $rowStart = $request['_startRow'];
            } else {
                $rowStart = 0;
            }

            if (isset($request['_endRow'])) {
                $rowEnd = $request['_endRow'];
            } else {
                $rowEnd = 75;
            }

            /*
             * variables de filtro
             */
            $username = 'sin usuario';
            $whereUserName = ' ';
            if (isset($request['username'])) {
                $username = $request['username'];
                $whereUserName = " AND tab0.username = '" . $request['username'] . "' ";
            }
            if (isset($request['id_titulo'])) {
                $whereTitulo = " AND tab0.id_titulo = '" . $request['id_titulo'] . "' ";
                $titulo_param = $request['id_titulo'];
            }
            if (isset($request['id_etapa'])) {
                $whereEtapa = " AND tab0.id_etapa >= '" . $request['id_etapa'] . "' ";
                $etapa_param = $request['id_etapa'];
            }
            if (isset($request['anu'])) {
                $anualidades_param = $request['anu'];
                $anualidades_param = explode(",", $anualidades_param);
                $anualidad_ini_param = explode("-", $anualidades_param[0]);
            }

            if (isset($request['id_novedad'])) {
                $whereNovedad = " AND tab0.id_novedad = '" . $request['id_novedad'] . "' ";
                $novedad_param = $request['id_novedad'];
            }


            //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_titulo etapa');
            //registro de consulta en tabla de log- la observacion puede o no enviarse ($request, $id_ope_bd, $id_mae_bd, $observacion)
            $sql = CN_TABLE::registrarLog($request, $id_ope_bd, $id_mae_bd, "Generación de renuncia para el título: " . $titulo_param);


            //Tiempo en dias de la suspension
            $dias_param = $this->diferenciaDates($anualidades_param);
            $tam_anus = sizeof($anualidades_param);

            $this->logMessage("Diferencias dias $dias_param");

            /*
             * sql que trae los resultados
             * por los filtros, para totalizar las filas
             */
            $sql = <<<EOD
select count(*) as count from(

SELECT DISTINCT

tab0.id_titulo_etapa, tab0.id_titulo, tab0.id_etapa as id_etapa, tab0.id_novedad, tab0.fecha_inicio, tab0.fecha_fin, tab0.fecha_inscripcion as fecha_inscripcion, tab0.anualidades, tab0.estado as est, tab0.actual

FROM ca_titulo_etapa tab0 JOIN ca_anual_etapa tab1 ON tab0.id_titulo_etapa=tab1.id_titulo_etapa 
                
WHERE tab0.actual=1 AND tab1.anualidad >= '$anualidad_ini_param[0]' $whereTitulo $whereEtapa 
    
ORDER BY id_etapa
    
)tabla
EOD;

            $total_record_count = CN_TABLE::executeSQL($sql,true);
            $total_record_count = $total_record_count[0]["count"];

            //validar si hay registros
            if ($total_record_count > 0) {

                $this->logMessage($total_record_count);

                $sql = <<<EOD
SELECT * FROM ( SELECT row_.*, ROWNUM rownum_ FROM (
 
SELECT DISTINCT

tab0.id_titulo_etapa, tab0.id_titulo, tab0.id_etapa as id_etapa, tab0.id_novedad, tab0.fecha_inicio, tab0.fecha_fin, tab0.fecha_inscripcion as fecha_inscripcion, tab0.anualidades, tab0.estado as est, tab0.actual

FROM ca_titulo_etapa tab0 JOIN ca_anual_etapa tab1 ON tab0.id_titulo_etapa=tab1.id_titulo_etapa 
                
WHERE tab0.actual=1 AND tab1.anualidad >= '$anualidad_ini_param[0]' $whereTitulo $whereEtapa 
                
ORDER BY id_etapa                

) row_ WHERE ROWNUM <=  $rowEnd   ) where rownum_ >  $rowStart 
EOD;

                //ejecuta y obtiene el resultado del sql
                $records = CN_TABLE::executeSQL($sql, true);

                $i = 0;
                foreach ($records as $value) {

                    $this->logMessage($i);

                    //TITULO ETAPA
                    $tituloEtapaIdAnt = $records[$i]["id_titulo_etapa"];
                    $etapa = $records[$i]["id_etapa"];
                    $fecha_inicio = $records[$i]["fecha_inicio"];
                    $fecha_fin = $records[$i]["fecha_fin"];
                    $fecha_inscripcion = $records[$i]["fecha_inscripcion"];
                    $anualidades = $records[$i]["anualidades"];
                    $estado = $records[$i]["est"];
                    $actual = 1;

                    //CA_TITULO_ETAPA

                    if ($etapa_param == $etapa) {
                        /**
                         * Se crea una fila nueva para la etapa actual con las nuevas anualidades calculadas con el tiempo de suspension
                         */
                        $sql = <<<EOD

INSERT INTO CA_TITULO_ETAPA (id_titulo_etapa, id_titulo, id_etapa, id_novedad, fecha_inicio, fecha_fin,fecha_inscripcion, anualidades, estado, actual )
VALUES (NULL ,$titulo_param, $etapa, $novedad_param, to_date('$fecha_inicio', 'YYYY-MM-DD HH24:MI:SS'), to_date('$fecha_fin', 'YYYY-MM-DD HH24:MI:SS')- interval '$dias_param' day(5), '$fecha_inscripcion', $anualidades - $tam_anus, $estado, $actual)

EOD;
                        $this->conn->execute($sql);

                        $this->logMessage("Inserto CA_TITULO_ETAPA actual nueva");

                        /**
                         * Obtener ultimo id
                         */
                        $sql = <<<EOD
   
SELECT MAX(id_titulo_etapa) AS id_titulo_etapa FROM ca_titulo_etapa

EOD;
                        $tituloEtapaIdAct = CN_TABLE::executeSQL($sql, true);
                        $tituloEtapaIdAct = $tituloEtapaIdAct[0]["id_titulo_etapa"];

                        /**
                         * Se actualiza el título etapa histórico
                         */
                        $this->actualizarTituloEtapaHistorico($titulo_param, $tituloEtapaIdAct, $fecha_inicio);

                        /**
                         * Se actualiza la fila de titulo_etapa que ahora no será de la proyeccion actual
                         */
                        $this->actualizarTituloEtapa($tituloEtapaIdAnt);
                    } else {
                        /**
                         * Se crea una fila nueva para la etapa actual con las nuevas anualidades calculadas con el tiempo de suspension
                         */
                        $sql = <<<EOD

INSERT INTO CA_TITULO_ETAPA (id_titulo_etapa, id_titulo, id_etapa, id_novedad, fecha_inicio, fecha_fin,fecha_inscripcion, anualidades, estado, actual )
VALUES (NULL ,$titulo_param, $etapa, $novedad_param, to_date('$fecha_inicio', 'YYYY-MM-DD HH24:MI:SS')- interval '$dias_param' day(5), to_date('$fecha_fin', 'YYYY-MM-DD HH24:MI:SS')- interval '$dias_param' day(5), '$fecha_inscripcion', $anualidades, $estado, $actual)

EOD;
                        $this->conn->execute($sql);

                        $this->logMessage("Inserto CA_TITULO_ETAPA actual nueva");

                        /**
                         * Obtener ultimo id
                         */
                        $sql = <<<EOD
   
SELECT MAX(id_titulo_etapa) AS id_titulo_etapa FROM ca_titulo_etapa

EOD;
                        $tituloEtapaIdAct = CN_TABLE::executeSQL($sql, true);
                        $tituloEtapaIdAct = $tituloEtapaIdAct[0]["id_titulo_etapa"];

                        /**
                         * Se actualiza el título etapa histórico
                         */
                        $this->actualizarTituloEtapaHistorico($titulo_param, $tituloEtapaIdAct, $fecha_inicio);
                        /**
                         * Se actualiza la fila de titulo_etapa que ahora no será de la proyeccion actual
                         */
                        $this->actualizarTituloEtapa($tituloEtapaIdAnt);
                    }

                    if ($etapa_param == $etapa) {
                        /**
                         * Buscar proyeccion anterior en anual_etapa, actualizarla para que ya no sea la actual
                         */
                        $sql = <<<EOD

select count(*) as count from( 
                    
SELECT id_anual_etapa, id_titulo_etapa, id_titulo, anualidad, fecha_inicio, fecha_fin, estado as est, liquidado as liq, impreso as imp FROM CA_ANUAL_ETAPA WHERE id_titulo_etapa=$tituloEtapaIdAnt and anualidad<'$anualidad_ini_param[0]' ORDER BY fecha_fin asc

)tabla
EOD;
                        $total_record_count = CN_TABLE::executeSQL($sql, true);
                        $total_record_count = $total_record_count[0]["count"];

                        if ($total_record_count > 0) {

                            $sql = <<<EOD
SELECT * FROM ( SELECT row_.*, ROWNUM rownum_ FROM (
            
SELECT id_anual_etapa, id_titulo_etapa, id_titulo, anualidad, fecha_inicio, fecha_fin, estado as est, liquidado as liq, impreso as imp FROM CA_ANUAL_ETAPA WHERE id_titulo_etapa=$tituloEtapaIdAnt and anualidad<'$anualidad_ini_param[0]' ORDER BY fecha_fin asc
            
) row_ WHERE ROWNUM <=  $rowEnd   ) where rownum_ >  $rowStart
EOD;

                            $recordsAnual = CN_TABLE::executeSQL($sql, true);

                            foreach ($recordsAnual as $value) {

                                $liquidado_anu = $value["liq"];
                                $impreso_anu = $value["imp"];
                                $anualidad_anu = $value["anualidad"];
                                $fecha_inicio_anu = $value["fecha_inicio"];
                                $fecha_fin_anu = $value["fecha_fin"];
                                $estado_anu = $value["est"];

                                $sql = <<<EOD
   
INSERT INTO CA_ANUAL_ETAPA ( ID_ANUAL_ETAPA, ID_TITULO_ETAPA, ID_TITULO, ANUALIDAD, FECHA_INICIO, FECHA_FIN, ESTADO, LIQUIDADO, IMPRESO)
VALUES(NULL, $tituloEtapaIdAct, $titulo_param, $anualidad_anu, to_date('$fecha_inicio_anu'), to_date('$fecha_fin_anu'), $estado_anu, $liquidado_anu, $impreso_anu)

EOD;
                                $this->conn->execute($sql);


                                $this->logMessage("Inserto CA_ANUAL_ETAPA nuevas");
                            }
                        } else {
                            //NO hay registros en anual etapa
                            $this->logMessage("[GEN_RENUNCIA] No hay registros en anual etapa");
                            $this->logMessage("[GEN_RENUNCIA] Generación exitosa.");
                        }
                    } else {
                        /**
                         * Buscar proyeccion anterior en anual_etapa, actualizarla para que ya no sea la actual
                         */
                        $sql = <<<EOD

select count(*) as count from( 
                    
SELECT id_anual_etapa, id_titulo_etapa, id_titulo, anualidad, fecha_inicio, fecha_fin, estado as est, liquidado as liq, impreso as imp FROM CA_ANUAL_ETAPA WHERE id_titulo_etapa=$tituloEtapaIdAnt  ORDER BY fecha_fin asc

)tabla
EOD;
                        $total_record_count = CN_TABLE::executeSQL($sql, true);
                        $total_record_count = $total_record_count[0]["count"];

                        if ($total_record_count > 0) {

                            $sql = <<<EOD
SELECT * FROM ( SELECT row_.*, ROWNUM rownum_ FROM (
            
SELECT id_anual_etapa, id_titulo_etapa, id_titulo, anualidad, fecha_inicio, fecha_fin, estado as est, liquidado as liq, impreso as imp FROM CA_ANUAL_ETAPA WHERE id_titulo_etapa=$tituloEtapaIdAnt  ORDER BY fecha_fin asc
            
) row_ WHERE ROWNUM <=  $rowEnd   ) where rownum_ >  $rowStart
EOD;

                            $recordsAnual = CN_TABLE::executeSQL($sql, true);

                            foreach ($recordsAnual as $value) {

                                $liquidado_anu = $value["liq"];
                                $impreso_anu = $value["imp"];
                                $anualidad_anu = $value["anualidad"];
                                $fecha_inicio_anu = $value["fecha_inicio"];
                                $fecha_fin_anu = $value["fecha_fin"];
                                $estado_anu = $value["est"];

                                $sql = <<<EOD
   
INSERT INTO CA_ANUAL_ETAPA ( ID_ANUAL_ETAPA, ID_TITULO_ETAPA, ID_TITULO, ANUALIDAD, FECHA_INICIO, FECHA_FIN, ESTADO, LIQUIDADO, IMPRESO)
VALUES(NULL, $tituloEtapaIdAct, $titulo_param, $anualidad_anu, to_date('$fecha_inicio_anu'), to_date('$fecha_fin_anu'), $estado_anu, $liquidado_anu, $impreso_anu)

EOD;
                                $this->conn->execute($sql);


                                $this->logMessage("Inserto CA_ANUAL_ETAPA nuevas");
                            }
                        } else {
                            //NO hay registros en anual etapa
                            $this->logMessage("[GEN_RENUNCIA] No hay registros en anual etapa");
                            $this->logMessage("[GEN_RENUNCIA] Generación exitosa.");
                        }
                    }

                    $i = $i + 1;
                }

                if ($rowEnd > $total_record_count) {
                    $rowEnd = $total_record_count;
                }

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

                $this->totalRows = $total_record_count;
                $this->startRow = $rowStart;
                $this->endRow = $rowEnd;
                $this->status = 0;
                $this->list_data = $records;
                $this->logMessage("[GEN_RENUNCIA] Consulta exitosa");
            } else {

                $this->logMessage("[GEN_RENUNCIA] ERROR!!!");
            }
        } catch (Exception $e) {

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

    public function modalidadTitulo($id_titulo) {
        $sql = <<<EOD

SELECT id_modalidad FROM rmn_titulo_modalidad WHERE id_titulo=$id_titulo


EOD;
        $records = CN_TABLE::executeSQL($sql, true);

        return $records[0]["id_modalidad"];
    }

    public function numEtapasModalidad($id_modalidad) {
        $sql = <<<EOD

SELECT MAX(id_etapa) as count FROM ca_etapa_modalidad WHERE id_modalidad=$id_modalidad

EOD;
        $records = CN_TABLE::executeSQL($sql, true);

        return $records[0]["count"];
    }

    public function actualizarAnualidades($id_titulo_etapa) {
        /**
         * Actualizar las antiguas anualidades para que pasen a ser una proyeccion pasada
         */
        $sql = <<<EOD

UPDATE ca_anual_etapa tab0
SET tab0.estado=0
WHERE tab0.id_titulo_etapa=$id_titulo_etapa

EOD;
        $this->conn->execute($sql);

        $this->logMessage("Actualizo CA_ANUAL_ETAPA");
    }

    public function actualizarTituloEtapa($id_titulo_etapa) {

        /**
         * Se actualiza la fila de titulo_etapa que ahora no será de la proyeccion actual, el estado no se actualiza
         */
        $sql = <<<EOD
        
UPDATE ca_titulo_etapa tab0
SET tab0.actual=0
WHERE tab0.id_titulo_etapa=$id_titulo_etapa

EOD;

        $this->conn->execute($sql);

        $this->logMessage("Actualizo CA_TITULO_ETAPA");
    }

    public function diferenciaDates($data) {


        $count = sizeof($data);

        $fecha_inicial = $data[0];
        $fecha_inicial = explode("-", $fecha_inicial);
        $fecha_inicial = str_replace("(", "", $fecha_inicial[1]);

        $fecha_final = $data[$count - 1];
        $fecha_final = explode("-", $fecha_final);
        $fecha_final = str_replace(")", "", $fecha_final[2]);


        /**
         * Se actualiza la fila de titulo_etapa que ahora no será de la proyeccion actual, el estado no se actualiza
         */
        $sql = <<<EOD
        
SELECT to_date('$fecha_final' , 'dd/mm/yyyy')- to_date('$fecha_inicial' , 'dd/mm/yyyy') AS dias FROM dual

EOD;

        $res = CN_TABLE::executeSQL($sql, true);

        $diasRes = $res[0]["dias"] - 1;

        return $diasRes;
    }

    /**
     * Se mantiene actualizado la historia de los etapa_titulos
     */
    public function actualizarTituloEtapaHistorico($titulo, $titulo_etapa, $vig) {



        //Revisar si existe una proyección histórica para el título 
        $sql = <<<EOD
        
SELECT COUNT(*) AS count 
FROM ca_titulo_etapa_hist 
WHERE id_titulo=$titulo

EOD;

        $total_count = CN_TABLE::executeSQL($sql, true);
        $total_count = $total_count[0]["count"];

        if ($total_count == 0) {
            //Primer historico inserta con 1
            $num_sec_max = 1;
        } else {
            //max(num_proyeccion) + 1 como nuevo consecutivo
            $sql = <<<EOD
   
SELECT MAX(mun_sec) AS max 
FROM ca_titulo_etapa_hist 
WHERE id_titulo=$titulo
             
EOD;

            $max = CN_TABLE::executeSQL($sql, true);
            $max = $max[0]["max"];
            $max = $max + 1;
            $num_sec_max = $max;
        }

        $sql = <<<EOD
   
             INSERT
INTO CA_TITULO_ETAPA_HIST
  (
    ID_TITULO,
    MUN_SEC,
    ID_TITULO_ETAPA,
    VIGENCIA
  )
  VALUES
 ($titulo,$num_sec_max,$titulo_etapa, EXTRACT(YEAR FROM to_date('$vig', 'YYYY-MM-DD HH24:MI:SS')))
             
EOD;

        $this->conn->execute($sql);

        $this->logMessage("Actualizo histórico CA_TITULO_ETAPA");
    }

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

}
