<?php

/**
 * gen_nov_prorroga actions.
 *
 * @package    canon
 * @subpackage gen_nov_prorroga
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class gen_nov_prorrogaActions 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 {

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

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

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

            /*
             * variables de filtro
             */
            $whereEtapa = ' ';
            if (isset($request['id_etapa'])) {
                $whereEtapa = " AND tab0.id_etapa = '" . $request['id_etapa'] . "' ";
                $id_etap = $request['id_etapa'];
            }
            $whereAnhos = ' ';
            if (isset($request['anhos'])) {
                $whereAnhos = " AND tab0.anhos = '" . $request['anhos'] . "' ";
                $anhos = $request['anhos'];
            }
            $id_titulo = ' ';
            if (isset($request['id_titulo'])) {
                $id_titulo = "'" . $request['id_titulo'] . "' ";
            }
            $whereNovedad = ' ';
            if (isset($request['id_novedad'])) {
                $whereNovedad = " AND tab0.id_novedad = '" . $request['id_novedad'] . "' ";
                $id_nov = $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, "Se generó una prorroga para el título: " . $request['id_titulo']);



            /*
             * Sql que trae la fila de la etapa acual
             */
            $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 actual=1 and id_titulo=$id_titulo $whereEtapa

)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 actual=1 and id_titulo=$id_titulo $whereEtapa
            
) row_ WHERE ROWNUM <=  $rowEnd   ) where rownum_ >  $rowStart
EOD;

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

                $tituloEtapaIdAnt = $records[0]["id_titulo_etapa"];

                //Para el add

                $etapa = $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"] + $request['anhos'];
                $estado = $records[0]["est"];
                $actual = 1;

                /**
                 * Se crea una fila nueva para la etapa actual con las nuevas anualidades calculadas con el tiempo de prorroga
                 */
                $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 ,$id_titulo, $etapa, $id_nov, to_date('$fecha_inicio','YYYY-MM-DD HH24:MI:SS'), to_date('$fecha_fin', 'YYYY-MM-DD HH24:MI:SS')+ interval '$anhos' year, to_date('$fecha_inscripcion', 'YYYY-MM-DD HH24:MI:SS'), $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($id_titulo, $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"];


                $anualidad_anu = 0;
                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;

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

                    foreach ($records as $value) {

                        $id_anual_etapa = $value["id_anual_etapa"];

                        $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"];


                        /**
                         * 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, $id_titulo, $anualidad_anu, '$fecha_inicio_anu', '$fecha_fin_anu', $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 = $id_titulo 

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);
                    }
                } else {
                    //NO hay registros en anual etapa
                    $this->logMessage("NO hay registros en anual etapa");
                    $this->status = 0;
                    $this->list_data = array();
                    $this->logMessage("[GEN_PRORROGA] Generación exitosa.");
                }

                /**
                 * Insertar las anualidades de la prorroga
                 * 
                 */
                for ($i = 0; $i < $anhos; $i++) {
                    $e = $i + 1;
                    if ($anualidad_anu == 0) {
                        $es = 1;
                    } else {
                        $es = 0;
                    }
                    $anualidad_anu = $anualidad_anu + 1;

                    //Se valida que tome fechas segun corresponde a la prorroga, faltaba 1 dia a la inicial - 20200309
                    $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, $id_titulo, $anualidad_anu, 
    (select fecha_fin + 1 from ca_titulo_etapa where id_titulo_etapa=$tituloEtapaIdAnt) + interval '$i' year, 
    (select fecha_fin from ca_titulo_etapa where id_titulo_etapa=$tituloEtapaIdAnt) + interval '$e' year,
        $es, 0, 0) 
EOD;
                    $this->conn->execute($sql);

                    $this->logMessage("Inserto CA_ANUAL_ETAPA de prorroga");
                }



                /**
                 * Actualizar el resto de etapas para la modalidad en la que se encuentra el titulo
                 */
                $mod = $this->modalidadTitulo($id_titulo);
                $num_etapas = $this->numEtapasModalidad($mod);



                $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=$id_titulo and actual=1 and id_etapa!=$id_etap

)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=$id_titulo and actual=1 and id_etapa!=$id_etap
            
) 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 > $id_etap) {
                            /**
                             * Se crea una fila nueva para la etapa actual con las nuevas anualidades calculadas con el tiempo de prorroga
                             */
                            $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 ,$id_titulo, $etapa_fin, $id_nov, to_date('$fecha_inicio', 'YYYY-MM-DD HH24:MI:SS')+ interval '$anhos' year, to_date('$fecha_fin', 'YYYY-MM-DD HH24:MI:SS')+ interval '$anhos' 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($id_titulo, $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"];
                                    $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, $id_titulo, $anualidad_anu, to_date('$fecha_inicio_anu', 'YYYY-MM-DD HH24:MI:SS')+ interval '$anhos' year, 
    to_date('$fecha_fin_anu', 'YYYY-MM-DD HH24:MI:SS')+ interval '$anhos' 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 = $id_titulo 

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


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

                    //NO hay mas etapas
                    $this->logMessage("NO hay mas etapas");
                    $this->logMessage("[GEN_PRORROGA] Generación exitosa.");
                }
            } else {
                //No titulos en titulo_etapa
                $this->logMessage("No titulos en titulo_etapa");
                $this->logMessage("[GEN_PRORROGA] Generación exitosa.");
            }

            //Colocar el estado actual que va el titulo
            $sql = <<<EOD
 
select te.id_titulo_etapa from ca_titulo_etapa te 
    join ca_anual_etapa a on a.id_titulo_etapa = te.id_titulo_etapa and te.actual =1
where a.estado =1 and liquidado =0 and rownum = 1 and te.id_titulo=$id_titulo
order by a.fecha_inicio

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

            if (count($records) != 0) {
                $records = $records[0]["id_titulo_etapa"];

                //Realizar el update en ca_titulo_etapa

                $sql = <<<EOD
 
UPDATE CA_TITULO_ETAPA
SET estado            =1
WHERE ID_TITULO_ETAPA = $records

EOD;

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


                $sql = <<<EOD
 
UPDATE CA_TITULO_ETAPA
SET estado            =0
WHERE ACTUAL=1 AND ID_TITULO_ETAPA != $records AND ID_TITULO=$id_titulo

EOD;

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


            $this->conn->commit();
            $this->status = 0;
            $this->list_data = array();
        } catch (Exception $e) {

            $this->conn->rollback();
            $this->logMessage("FALLO PRORROGA");
            $this->status = -1;
            $this->list_data = array();
            $this->logMessage("[GEN_PRORROGA] Generación Erronea.");
        }
    }

    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");
    }

    /**
     * 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 prorroga'        
    )              
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) {

        /**
         * 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 = 36089 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;
    }

}
