<?php

/**
 * gen_nov_suspension actions. Last mod 06/08/12 $fecha_actual
 *
 * @package    canon
 * @subpackage gen_nov_suspension
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class gen_nov_suspensionActions 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");

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

        /*
         * Manejo de errores
         */
        try {

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

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

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

            //variables novedad - 20190827
            $id_usuario_log = '';
            if (isset($request['id_usuario_log'])) {
                $id_usuario_log = $request['id_usuario_log'];
            }
            $doc_soporte = '';
            if (isset($request['doc_soporte'])) {
                $doc_soporte = $request['doc_soporte'];
            }
            $fecha_doc_sop = '';
            if (isset($request['fecha_doc_sop'])) {
                $fecha_doc_sop = $request['fecha_doc_sop'];
            }
            $id_tipo_doc = '';
            if (isset($request['id_tipo_doc'])) {
                $id_tipo_doc = $request['id_tipo_doc'];
            }
            $observaciones = '';
            if (isset($request['observaciones'])) {
                $observaciones = $request['observaciones'];
            }
            $fecha_inicio_nov = '';
            if (isset($request['fecha_ini'])) {
                $fecha_inicio_nov = $request['fecha_ini'];
            }
            $fecha_fin_nov = '';
            if (isset($request['fecha_fin'])) {
                $fecha_fin_etapa_suspen = $fecha_fin_nov = $request['fecha_fin'];
            }

            /*
             * 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['anualidad'])) {
                $whereAnualidad = " AND tab1.anualidad >= '" . $request['anualidad'] . "' ";
                $anualidad_param = $request['anualidad'];
            }
            if (isset($request['fecha_ini'])) {
                $whereFechaIni = " AND tab0.fecha_inicio = '" . $request['fecha_ini'] . "' ";
                $fecha_inicio_param = $request['fecha_ini'];
            }
            if (isset($request['id_novedad'])) {
                $whereNovedad = " AND tab0.id_novedad = '" . $request['id_novedad'] . "' ";
                $novedad_param = $request['id_novedad'];
            }
            if (isset($request['fecha_ini_anu'])) {
                $fecha_ini_anu_param = $request['fecha_ini_anu'];
            }


            //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, "Se generó una suspensión para el título: " . $titulo_param);

            /*
             * Verifica fecha corresponda a una etapa - 20190827
             */
            $sql = <<<EOD
SELECT
    *
FROM ca_titulo_etapa
where
id_etapa = $etapa_param
and to_date('$fecha_inicio_nov','yyyy-mm-dd') BETWEEN fecha_inicio and fecha_fin
EOD;

            $record_val = CN_TABLE::executeSQL($sql, true);
            if (count($record_val) == 0) {

                $sql = <<<EOD
DELETE FROM ca_novedad where id_novedad = '$novedad_param' 
EOD;

                CN_TABLE::executeSQL($sql);

                $this->logMessage("La fecha $fecha_inicio_nov no corresponde a la etapa seleccionada.");
                throw new Exception('La fecha no corresponde a la etapa seleccionada.');
            }


            //Tiempo en dias de la suspension
            //$dias_param = $this->diferenciaDates($fecha_ini_anu_param, $fecha_inicio_param);
            $dias_param = $this->diferenciaDates($fecha_inicio_nov, $fecha_fin_nov);

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

            /*
             * sql que trae los resultados
             * por los filtros, para totalizar las filas
             * Se toman todas las etapa - 20190828
             */
            $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 to_date('$fecha_actual', 'YYYY-MM-DD') < tab1.fecha_inicio 
AND to_date('$fecha_inicio_nov', 'YYYY-MM-DD') BETWEEN tab0.fecha_inicio and tab0.fecha_fin
$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 as fecha_ini, 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 to_date('$fecha_actual', 'YYYY-MM-DD') < tab1.fecha_inicio 
AND to_date('$fecha_inicio_nov', 'YYYY-MM-DD') BETWEEN tab0.fecha_inicio and tab0.fecha_fin
$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"];
                    // $novedad = $records[$i]["id_novedad"];
                    $fecha_inicio = $records[$i]["fecha_ini"];
                    $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 ($anualidad_param == 1 || $i > 0) {
                        /**
                         * Se crea una fila nueva para la etapa actual con las nuevas anualidades calculadas con el tiempo de suspension
                         * 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)
                         */
                        $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, $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'), 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);
                    }

                    /**
                     * 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);
                        $tag_validar_fecha = true;
                        $dias_param_eta = 0;
                        foreach ($recordsAnual as $value) {

                            $id_anual_etapa = $value["id_anual_etapa"];

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

                            /**
                             * Inserta las antiguas anualidades en la nueva proyeccion
                             */
                            //if ($i > 0 || ($etapa_param == $etapa && $anualidad_anu >= $anualidad_param)) {
                            //Antes de generar novedad, luego es desde la fecha fin de la ultima anualidad
                            if ($tag_validar_fecha) {
                                $this->logMessage("Entro a Validacion para fechas");
                                $datetime1 = new DateTime($fecha_inicio_anu);
                                $datetime2 = new DateTime($fecha_fin_anu);
                                $datetime3 = new DateTime($fecha_inicio_nov);
                                if ($datetime1 < $datetime3 && $datetime3 < $datetime2) {
                                    //VALUES(NULL, $tituloEtapaIdAct, $titulo_param, $anualidad_anu, to_date('$fecha_inicio_anu')+ interval '$dias_param' day(5), to_date('$fecha_fin_anu')+ interval '$dias_param' day(5), 
                                    $dias_param_eta = $this->diferenciaDatesEtapa($fecha_inicio_anu, $fecha_fin_anu, $novedad_param, $titulo_param);
                                    $dias_param_eta += $dias_param + 365 - 1; //Dias para completar 365 un año general - 20190828
                                    $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_inicio_anu')+ interval '$dias_param_eta' day(5), 
    $estado_anu, $liquidado_anu, $impreso_anu)

EOD;
                                    $this->conn->execute($sql);
                                    $tag_validar_fecha = false;
                                } else {

                                    $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);
                                }
                            } else {

                                $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_fin_etapa_suspen', 'YYYY-MM-DD HH24:MI:SS')+1, 
    to_date('$fecha_fin_etapa_suspen', 'YYYY-MM-DD HH24:MI:SS')+ interval '1' year, 
        $estado_anu, $liquidado_anu, $impreso_anu)

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

                            $this->logMessage("Inserto CA_ANUAL_ETAPA nuevas");


                            /**
                             * Obtener ultimo id de CA_ANUAL_ETAPA - 20190827
                             */
                            $sql = <<<EOD
   
SELECT MAX(id_anual_etapa) AS id_anual_etapa FROM CA_ANUAL_ETAPA where id_titulo = $titulo_param 

EOD;
                            $anualEtapaIdAct = CN_TABLE::executeSQL($sql, true);
                            $id_anual_etapa_new = $anualEtapaIdAct[0]["id_anual_etapa"];

                            //Obtener la fecha fin
                            $sql = <<<EOD
   
SELECT * FROM CA_ANUAL_ETAPA where id_anual_etapa = $id_anual_etapa_new

EOD;
                            $rec_etapa = CN_TABLE::executeSQL($sql, true);
                            $fecha_fin_etapa_suspen = $rec_etapa[0]["fecha_fin"];

                            $this->actualizarAnualEtapaDeb($id_anual_etapa, $id_anual_etapa_new, $titulo_param);
                        }
                    } else {
                        //NO hay registros en anual etapa
                        $this->logMessage("NO hay registros en anual etapa");
                        $this->logMessage("[GEN_SUSPENSION] Generación exitosa.");
                    }

                    $i = $i + 1;
                }

                //Actualizar la fecha fin de la etapa por años bisiestos - 20190828
                $fecha_fin_nov = $fecha_fin_etapa_suspen;

                $sql = <<<EOD
update ca_titulo_etapa set fecha_fin = to_date('$fecha_fin_nov', 'YYYY-MM-DD HH24:MI:SS') 
    where id_titulo_etapa = $tituloEtapaIdAct 
EOD;
                $this->conn->execute($sql);


                /**
                 * Generar proyeccion para las demas etapas del titulo - 20190828
                 */
                $sql = <<<EOD
select count(*) as count from(

SELECT id_titulo_etapa, id_titulo, id_etapa, id_novedad, fecha_inicio, fecha_fin,fecha_inscripcion, 
    anualidades, estado, actual FROM ca_titulo_etapa tab0 
        WHERE id_titulo=$titulo_param and actual=1 and id_etapa!=$etapa_param

)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_titulo_etapa, id_titulo, id_etapa, id_novedad, fecha_inicio, fecha_fin,fecha_inscripcion, 
    anualidades, estado as est, actual FROM ca_titulo_etapa tab0 
        WHERE id_titulo=$titulo_param and actual=1 and id_etapa!=$etapa_param
            
) row_ WHERE ROWNUM <=  $rowEnd   ) where rownum_ >  $rowStart
EOD;

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

                    foreach ($records as $value) {

                        $tituloEtapaIdAnt = $value["id_titulo_etapa"];
                        $etapa_fin = $records[0]["id_etapa"];
                        $novedad = $records[0]["id_novedad"];
                        $fecha_inicio = $records[0]["fecha_inicio"];
                        $fecha_fin = $records[0]["fecha_fin"];
                        $fecha_inscripcion = $records[0]["fecha_inscripcion"];
                        $anualidades = $records[0]["anualidades"];
                        $estado = $records[0]["est"];
                        $actual = 1;


                        if ($etapa_fin > $etapa_param) {
                            /**
                             * Se crea una fila nueva para la etapa actual con las nuevas anualidades calculadas con el tiempo de modificación
                             */
                            $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_fin, $novedad_param, to_date('$fecha_fin_nov', 'YYYY-MM-DD HH24:MI:SS')+1 , to_date('$fecha_fin_nov', 'YYYY-MM-DD HH24:MI:SS')+ interval '$anualidades' year, 
    '$fecha_inscripcion', $anualidades, $estado, $actual)

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

                            $this->logMessage("Inserto CA_TITULO_ETAPA otras etapas de la proyeccion actual");

                            /**
                             * 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);

                            /**
                             * 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 as anu, fecha_inicio, fecha_fin, 
    estado, liquidado as liqui, impreso as impre  
        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 as anu, fecha_inicio, fecha_fin, 
    estado as estado_anu, liquidado as liqui, impreso as impre  
        FROM CA_ANUAL_ETAPA 
        WHERE id_titulo_etapa=$tituloEtapaIdAnt ORDER BY fecha_fin asc
            
) row_ WHERE ROWNUM <=  $rowEnd   ) where rownum_ >  $rowStart
EOD;

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

                                foreach ($records as $value) {

                                    $id_anual_etapa = $value["id_anual_etapa"];

                                    $anualidad_anu = $value["anu"];
                                    $anho_anu = $anualidad_anu - 1;
                                    $fecha_inicio_anu = $value["fecha_inicio"];
                                    $fecha_fin_anu = $value["fecha_fin"];
                                    $estado_anu = $value["estado_anu"];
                                    $liquidado_anu = $value["liqui"];
                                    $impreso_anu = $value["impre"];

                                    /**
                                     * Inserta las antiguas anualidades en la nueva proyeccion
                                     */
                                    $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_fin_nov', 'YYYY-MM-DD HH24:MI:SS')+1+ interval '$anho_anu' year, 
    to_date('$fecha_fin_nov', 'YYYY-MM-DD HH24:MI:SS')+ interval '$anualidad_anu' year, $estado_anu, $liquidado_anu, $impreso_anu)

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

                                    $this->logMessage("Inserto CA_ANUAL_ETAPA otras nuevas");


                                    /**
                                     * Obtener ultimo id de CA_ANUAL_ETAPA - 20190827
                                     */
                                    $sql = <<<EOD
   
SELECT MAX(id_anual_etapa) AS id_anual_etapa FROM CA_ANUAL_ETAPA where id_titulo = $titulo_param 

EOD;
                                    $anualEtapaIdAct = CN_TABLE::executeSQL($sql, true);
                                    $id_anual_etapa_new = $anualEtapaIdAct[0]["id_anual_etapa"];

                                    $this->actualizarAnualEtapaDeb($id_anual_etapa, $id_anual_etapa_new, $titulo_param);
                                }


                                $this->logMessage("[GEN_SUSPENSION] Generación exitosa.");
                            } else {
                                //no hay anualidades
                                $this->logMessage("No hay anualidades");
                                $this->logMessage("[GEN_SUSPENSION] Generación exitosa.");
                            }
                        } else {
                            //etapas q no se deben modificar
                            $this->logMessage("etapas q no se deben modificar");
                            $this->logMessage("[GEN_SUSPENSION] Generación exitosa.");
                        }
                    }
                } else {

                    //NO hay mas etapas
                    $this->logMessage("NO hay mas etapas");
                    $this->logMessage("[GEN_SUSPENSION] Generación exitosa.");
                }

                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_SUSPENSION] Consulta exitosa");
            } else {
                $this->logMessage("[GEN_SUSPENSION] ERROR!!!");
            }
        } catch (Exception $e) {

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

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

SELECT id_modalidad FROM rmn_titulo_modalidad WHERE id_titulo=$titulo_param

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($titulo_param_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=$titulo_param_etapa

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

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

    public function actualizarTituloEtapa($titulo_param_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=$titulo_param_etapa

EOD;

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

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

    /**
     * 
     * @param type $fechaIni
     * @param type $fechaFin
     * @return type
     */
    public function diferenciaDates($fechaIni, $fechaFin) {

        /**
         * 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('$fechaFin')- to_date('$fechaIni') + 1 AS dias FROM dual

EOD;

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

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

        return $diasRes;
    }

/**
     * Dias para conocer todas las suspenciones con la nueva registrada - 20190828
     * 
     * @param type $fechaIni
     * @param type $fechaFin
     * @param type $novedad_param Novedad actual
     * @param type $titulo_param
     * @return type
     */

    public function diferenciaDatesEtapa($fechaIni, $fechaFin, $novedad_param, $titulo_param) {

        /**
         * 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('$fechaFin')- to_date('$fechaIni') + 1 AS dias FROM dual

EOD;

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

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

        //Dias de otras novedades de suspencion id-10, segun fechas de anualidad - 20190828
        //Solo aprobadas - 20200309
        $sql = <<<EOD
SELECT
sum((fecha_fin - fecha_inicio) + 1) as dias
FROM ca_novedad
where
id_titulo = $titulo_param
and id_novedad != $novedad_param
and id_tipo_novedad = 10
and aprobada = 1
and fecha_inicio BETWEEN to_date('$fechaIni','yyyy-mm-dd') and to_date('$fechaFin','yyyy-mm-dd') 
EOD;

        $res = CN_TABLE::executeSQL($sql, true);
        $diasRes_nov = 0;
        if (count($res) > 0) {
            $diasRes_nov = $res[0]["dias"];
        }

        $this->logMessage("Dias suspencion: " . $diasRes . ", otras novedades suspencion" . $diasRes_nov);

        $diasRes = $diasRes_nov;

        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,
    EN_PROCESO,
    FECHA_MOD,
    OBSERVACIONES
  )
  VALUES
  ($titulo,$num_sec_max,$titulo_etapa, EXTRACT(YEAR FROM to_date('$vig', 'YYYY-MM-DD HH24:MI:SS')),
        0,
        sysdate,
        'Titulo etapa generada desde la novedad de suspension' 
    )
             
EOD;

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

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

    /**
     * Actualizar relacion de etapa debito - 20190827
     * @param type $id_anual_Etapa
     */
    public function actualizarAnualEtapaDeb($id_anual_etapa, $id_anual_etapa_new, $titulo) {

        /**
         * Se actualiza la fila de titulo_etapa que ahora no será de la proyeccion actual, el estado no se actualiza
         */
        $sql = <<<EOD
update ca_anual_etapa_deb set id_anual_etapa = '$id_anual_etapa_new' 
where id_titulo = $titulo and id_anual_etapa = '$id_anual_etapa'  
EOD;

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

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

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

}
