<?php

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

    protected $table_names = array(
        'CA_CIRCULARIZACION',
        'CA_CIRCULARIZACION_DETALLE_V',
        'INTERCEROS_V'
    ); //tablas para construir el sql, por medio de joins
    protected $table_join_ids = array(
        'CA_CIRCULARIZACION_DETALLE_V,LEFT' =>
        array(
            'id_circularizacion' => 'CA_CIRCULARIZACION',
            'id_anhos' => 'CA_CIRCULARIZACION'
        ),
        'INTERCEROS_V,LEFT' =>
        array(
            'id_mae_ter' => 'CA_CIRCULARIZACION'
        )
    ); //si posee tablas para joins, identificar la relacion de los campos con las tablas
    protected $fields = array(
        'CA_CIRCULARIZACION' =>
        array(
            'id_circularizacion' => 'id_circularizacion',
            'id_anhos' => 'id_anhos',
            'id_referencia2' => 'id_referencia2',
            'fecha_proceso' => 'fecha_proceso',
            'observaciones' => 'observaciones',
            'usuariolog' => 'usuariolog',
            'estado' => 'estado',
            'fecha_anu' => 'fecha_anu',
            'motivo_anu' => 'motivo_anu',
            'id_anhos_filtro' => 'id_anhos_filtro',
            'id_meses_filtro' => 'id_meses_filtro',
            'id_punto_venta' => 'id_punto_venta',
            'id_mae_ter' => 'id_mae_ter',
            'tope' => 'tope',
            'id_debitos' => 'id_debitos'
        ),
        'CA_CIRCULARIZACION_DETALLE_V' =>
        array(
            'id_circularizacion_detalle' => 'id_circularizacion_detalle',
            'num_doc' => 'num_doc',
            'razon_soc' => 'razon_soc',
            'correo' => 'correo',
            'adjunto' => 'adjunto',
            'enviado' => 'enviado',
            'recibido' => 'recibido'
        ),
        'INTERCEROS_V' =>
        array(
            'num_doc' => 'num_doc_ter',
            'razon_soc' => 'razon_soc_ter',
            'num_doc,||, - ,||,razon_soc' => 'tercero_ter',
            'num_doc,||, - ,||,papellido,||,  ,||,sapellido,||, ,||,pnombre,||, ,||,snombre' => 'nombre_completo_ter'
        )
    ); //por cada tabla especificar los campos del select
    protected $table_field_conditions = array(
        'CA_CIRCULARIZACION' => array(
            'id_circularizacion,a' => array('!=' => array(-1)),
            'id_circularizacion,b' => array('=' => array('id_circularizacion')),
            'id_anhos' => array('=' => array('id_anhos')),
            'id_referencia2,a' => array('LIKEALLPLUS' => array('id_referencia2')),
            'id_referencia2,b' => array('IS' => array('NOT NULL')),
            'fecha_proceso' => array('BETWEENFECHA' => array('fecha_ini', 'fecha_fin')),
            'estado' => array('=' => array('estado')),
            'id_anhos_filtro' => array('=' => array('id_anhos_filtro')),
            'id_meses_filtro' => array('=' => array('id_meses_filtro')),
            'id_punto_venta' => array('=' => array('id_punto_venta')),
            'id_mae_ter' => array('=' => array('id_mae_ter')),
            'rownum,start' => array('>' => array('_startRow')),
            'rownum,end' => array('<=' => array('_endRow'))
        ),
        'CA_CIRCULARIZACION_DETALLE_V' => array(
            'num_doc' => array('LIKEALLPLUS' => array('num_doc')),
            'enviado' => array('=' => array('enviado')),
            'recibido' => array('=' => array('recibido'))
        )
    ); //por cada tabla se dan los campos, opcion de filtro y variable que entra para los posibles filtros
    protected $query_qualifier = 'DISTINCT'; //eliminar filas repetivas de consulta sql
    protected $fields_orderBy = array(
        'id_anhos', 'id_circularizacion', 'fecha_proceso', 'num_doc'
    ); //campos para el ordenamiento de la consulta

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


    /*
     * ------------VARIABLES PARA SERVICIO DE SUMATORIA - SUM
     *
     */
//    protected $summatory_data = array(
//        'CA_CIRCULARIZACION' => array(
//            'fields' => array(
//                'case  when estado = 1 then valor_bruto  else 0 end#valor_bruto',
//                'case  when estado = 1 then valor_iva  else 0 end#valor_iva',
//                'case  when estado = 1 then valor_dcto  else 0 end#valor_dcto',
//                'case  when estado = 1 then valor_total  else 0 end#valor_total',
//                'case  when estado = 1 then valor_moneda  else 0 end#valor_moneda',
//                'trm_debito'),
//            'labels' => array('id_anhos,Total'),
//            'count' => 'sec_debito'
//        ),
//    ); //se especifica por tabla los campos de suma y condiciones de filtro


    /*
     * ------------VARIABLES PARA SERVICIOS CRUD
     */
    protected $id_name = 'id_circularizacion'; //identificador de la tabla
    protected $id_names = array('id_circularizacion', 'id_anhos'); //llave primaria
    protected $field_names = array('id_referencia2', 'fecha_proceso', 'observaciones', 'usuariolog', 'estado', 'fecha_anu',
        'motivo_anu', 'id_anhos_filtro', 'id_meses_filtro', 'id_punto_venta', 'id_mae_ter', 'tope', 'id_debitos'); //campos de la tabla, sin la llave primaria
    protected $table_name = 'CA_CIRCULARIZACION'; //tabla en la cual se aplican los cambios
    protected $has_activo = true; //si posee campo en la tabla de nombre activo ---- ESTADO PARA REGALIAS
    protected $has_vigencia = false; //si posee vigencia
    protected $has_cen_op = false; //si posee centro de operacion
    protected $has_id_cia = false; //si posee compañia
    protected $has_secuencia = true; //si posee secuencia la tabla
    protected $actions_remove = false; //true - Accion remove en vez de anular


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

    /**
     * Crear en un insert into select para todos los registros, y no uno a uno - 20170808
     * 
     * Metodo para Add el circularizacion
     * 
     * ESPECIFICACIONES:
      1.Generar documento (según modelo adjunto a este requerimiento) de circularización para envío por correo electrónico.
      2.El contenido de DEBITOS a reportar en el cuerpo de la circular corresponde a los que tengan saldo por pagar a la fecha de la generación.
      3.Asunto del correo: Cobro Persuasivo TITULO No. xxxxxxxx
      4.Enviar a todos los titulares asociados al titulo (ver consulta de deudores morosos)
      5.Se genera circular por cada titulo minero
      6.Cada envío con correo individual a cada titular
      7.Debe quedar registro de control de la circularización.
     *
     * @param sfWebRequest $request
     */

    public function executeAdd(sfWebRequest $request) {

        //Revisar que sea post
        //$this->forward404Unless($request->isMethod('post'));
        //Guardar los parametros del request en el log
        $this->logMessage("---BEGIN Logging request");
        foreach ($request->getPostParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("--------------------------------------------------/  Ip: " . $_SERVER['REMOTE_ADDR']);
        foreach ($request->getGetParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("---END Logging request");

        /**
         * Abrir nueva conexion con la Base de Datos
         */
        $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
        $this->conn->beginTransaction();

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

        $CODIGOTIMELOG = date('Y') . date('m') . date('d') . date('H') . date('i') . date('s');

        /*
         * Manejo de errores
         */
        try {

            /*
             * (SGC-1, ANM-2, SGR-3, CYC-4, COL-5, INCI-6, LOCAL-7)
             */
            $array = sfYaml::load(dirname(__FILE__) . '/../../../config/app-gwt.yml');

            $int = 0;
            foreach ($array as $routeName => $routeData) {
                //echo $routeName . "\n";
                if ('entidad_cliente' == $routeName) {
                    foreach ($routeData as $key => $value) {
                        //echo $value . "\n";
                        if ($key == 'value') {
                            $entidadCliente = $value;
                        }
                    }
                }
                $int++;
            }


            /*
             * Variables de filtro
             */
            //Periodo
            $id_anhos_filtro = $request['id_anhos_filtro'];
            $id_meses_filtro = $request['id_meses_filtro'];

            $username = $request['username'];
            $progress_key = $request['progress_key'] . $request['username'];


            $id_referencia2 = null;
            $whereTitulo = "";
            if (isset($request['id_referencia2'])) {
                $id_referencia2 = $request['id_referencia2'];
                $whereTitulo = " and debref.id_referencia2 = '" . $id_referencia2 . "'";
            }

            $id_punto_venta = null;
            $wherePuntoVenta = "";
            if (isset($request['id_punto_venta'])) {
                $id_punto_venta = $request['id_punto_venta'];
                $wherePuntoVenta = " AND tab0.id_punto_venta = " . $request['id_punto_venta'];
            }

            $id_mae_ter = null;
            $whereTercero = "";
            if (isset($request['id_mae_ter'])) {
                $id_mae_ter = $request['id_mae_ter'];
                $whereTercero = " AND tab0.id_mae_ter = " . $request['id_mae_ter'];
            }

            $tope = null;
            $whereTope = "";
            if (isset($request['tope'])) {
                $tope = $request['tope'];
                $whereTope = " AND tab0.valor_total < " . $request['tope'];
            }

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

            /**
             * Encontrar registros de debitos por titulo/referencia2
             */
            /**
             * Encontrar registros de debitos por titulo/referencia2
             */
            //Sql
            $sql = <<<EOD
select 
/*
tab0.*,
debref.id_referencia1,
*/
debref.id_referencia2,
to_char(wm_concat(tab0.id_debito)) as id_debitos,
nvl(max(tabcant.cant),0) as cant

from ca_debito_saldos tab0

join ca_debito_ref debref
on tab0.id_debito = debref.id_debito

left join(
    select 
    tabcant.cod_titulo,
    count(tabcant.num_doc) as cant
    
    from(
    
        select  
        titper.id_titulo,
        titper.id_titular,
        titper.id_rol_titulo,
        titper.actual,
        tit.cod_titulo,
        ter.num_doc,
        ter.raz_soc,
        case 
        when inter.mail is not null then inter.mail
        when ter.correo is null then ter.correo_alt else ter.correo end as correo
        
        from rmn_titulo_persona@can.anm.local titper
        
        join rmn_titulo@can.anm.local tit
        on tit.id_titulo = titper.id_titulo
        
        join rmn_persona_v@can.anm.local ter
        on ter.id_persona = titper.id_titular
        
        left join (
          SELECT
           aut.*,
           ROW_NUMBER() OVER (
            partition by aut.num_doc
            ORDER BY aut.num_doc
           ) AS rn
          from interceros_du_dir_v aut
        )inter
        on inter.num_doc = ter.num_doc
        and inter.rn = 1
        
        where
        titper.id_rol_titulo = 26 
        --and titper.actual = 1 
        --and tit.cod_titulo = 'ABF-071'
    
    )tabcant
    
    group by
    tabcant.cod_titulo
)tabcant
on tabcant.cod_titulo = debref.id_referencia2

where 
tab0.estado_ven = 1
and tab0.id_meses_sal = $id_meses_filtro and tab0.id_anhos_sal = $id_anhos_filtro
and tab0.saldo_actual > 0
                    
$whereTitulo
$wherePuntoVenta 
$whereTercero
$whereTope     

having 
to_char(wm_concat(tab0.id_debito)) is not null  
and nvl(max(tabcant.cant),0) > 0                    

group by
debref.id_referencia2

order by
debref.id_referencia2               
EOD;
            //Ejecutar SQL
            $records_deb = CN_TABLE::executeSQL($sql);

            $array_cir = array();
            $i_cir = 0;

            if (count($records_deb) > 0) {

                $this->logMessage("[Cicularización] Existen circularizaciones." . count($records_deb));

                MemcacheHandler::getInstance()->set($progress_key, 1);

                /**
                 * Crear cabecera de circularizacion
                 */
                //Sql 
                $sql = <<<EOD

insert into ca_circularizacion (ID_CIRCULARIZACION,
ID_ANHOS,
ID_REFERENCIA2,
FECHA_PROCESO,
OBSERVACIONES,
USUARIOLOG,
ESTADO,
FECHA_ANU,
MOTIVO_ANU,
ID_ANHOS_FILTRO,
ID_MESES_FILTRO,
ID_PUNTO_VENTA,
ID_MAE_TER,
TOPE,
ID_DEBITOS,
CODIGOTIMELOG)

select 
rownum + tab0.ID_CIRCULARIZACION as ID_CIRCULARIZACION,
tab0.ID_ANHOS,
tab0.ID_REFERENCIA2,
tab0.FECHA_PROCESO,
tab0.OBSERVACIONES,
tab0.USUARIOLOG,
tab0.ESTADO,
tab0.FECHA_ANU,
tab0.MOTIVO_ANU,
tab0.ID_ANHOS_FILTRO,
tab0.ID_MESES_FILTRO,
tab0.ID_PUNTO_VENTA,
tab0.ID_MAE_TER,
tab0.TOPE,
tab0.ID_DEBITOS,
$CODIGOTIMELOG as CODIGOTIMELOG                        
                        
from(

select 
/*
tab0.*,
debref.id_referencia1,
*/
/*
debref.id_referencia2,
to_char(wm_concat(tab0.id_debito)) as id_debitos,
nvl(max(tabcant.cant),0) as cant
*/
--rownum +
(select nvl(max(ID_CIRCULARIZACION),0) from CA_CIRCULARIZACION where ID_ANHOS = to_char(sysdate,'yyyy')) as ID_CIRCULARIZACION,
to_char(sysdate,'yyyy') as ID_ANHOS,
upper(debref.id_referencia2) as ID_REFERENCIA2,
trunc(sysdate) as FECHA_PROCESO,
'$observaciones' as OBSERVACIONES,
'$username' as USUARIOLOG,
1 as ESTADO,
null as FECHA_ANU,
null as MOTIVO_ANU,
'$id_anhos_filtro' as ID_ANHOS_FILTRO,
'$id_meses_filtro' as ID_MESES_FILTRO,
'$id_punto_venta' as ID_PUNTO_VENTA,
'$id_mae_ter' as ID_MAE_TER,
'$tope' as TOPE,
to_char(wm_concat(tab0.id_debito)) as ID_DEBITOS

from ca_debito_saldos tab0

join ca_debito_ref debref
on tab0.id_debito = debref.id_debito

left join(
    select 
    tabcant.cod_titulo,
    count(tabcant.num_doc) as cant
    
    from(
    
        select  
        titper.id_titulo,
        titper.id_titular,
        titper.id_rol_titulo,
        titper.actual,
        tit.cod_titulo,
        ter.num_doc,
        ter.raz_soc,
        case 
        when inter.mail is not null then inter.mail
        when ter.correo is null then ter.correo_alt else ter.correo end as correo
        
        from rmn_titulo_persona@can.anm.local titper
        
        join rmn_titulo@can.anm.local tit
        on tit.id_titulo = titper.id_titulo
        
        join rmn_persona_v@can.anm.local ter
        on ter.id_persona = titper.id_titular
        
        left join (
          SELECT
           aut.*,
           ROW_NUMBER() OVER (
            partition by aut.num_doc
            ORDER BY aut.num_doc
           ) AS rn
          from interceros_du_dir_v aut
        )inter
        on inter.num_doc = ter.num_doc
        and inter.rn = 1
        
        where
        titper.id_rol_titulo = 26 
        --and titper.actual = 1 
        --and tit.cod_titulo = 'ABF-071'
    
    )tabcant
    
    group by
    tabcant.cod_titulo
)tabcant
on tabcant.cod_titulo = debref.id_referencia2

where 
tab0.estado_ven = 1
and tab0.id_meses_sal = $id_meses_filtro and tab0.id_anhos_sal = $id_anhos_filtro
and tab0.saldo_actual > 0
                 
$whereTitulo
$wherePuntoVenta 
$whereTercero
$whereTope     

having 
to_char(wm_concat(tab0.id_debito)) is not null  
and nvl(max(tabcant.cant),0) > 0                    

group by
debref.id_referencia2

order by
debref.id_referencia2  

)tab0   
EOD;
                //Ejecutar SQL
                $this->conn->execute($sql);

                /**
                 * Crear detalle de circularizacion
                 */
                //Sql 
                $sql = <<<EOD
insert into CA_CIRCULARIZACION_DETALLE (
ID_CIRCULARIZACION_DETALLE,
ID_CIRCULARIZACION,
ID_ANHOS,
NUM_DOC,
CORREO,
ADJUNTO,
ENVIADO,
RECIBIDO)

select 
null as ID_CIRCULARIZACION_DETALLE,
circu.id_circularizacion as ID_CIRCULARIZACION,
circu.id_anhos as ID_ANHOS,
det.num_doc as NUM_DOC,
det.correo as CORREO,
'Circularizacion No.' || circu.id_circularizacion || ' de ' || circu.id_anhos || ' ' || circu.id_referencia2 || '.pdf' as ADJUNTO,
0 as ENVIADO,
0 as RECIBIDO

from ca_circularizacion circu

left join(
    select  
    titper.id_titulo,
    titper.id_titular,
    titper.id_rol_titulo,
    titper.actual,
    tit.cod_titulo,
    ter.num_doc,
    ter.raz_soc,
    case 
    when inter.mail is not null then inter.mail
    when ter.correo is null then ter.correo_alt else ter.correo end as correo
    
    from rmn_titulo_persona@can.anm.local titper
    
    join rmn_titulo@can.anm.local tit
    on tit.id_titulo = titper.id_titulo
    
    join rmn_persona_v@can.anm.local ter
    on ter.id_persona = titper.id_titular
    
    left join (
      SELECT
       aut.*,
       ROW_NUMBER() OVER (
        partition by aut.num_doc
        ORDER BY aut.num_doc
       ) AS rn
      from interceros_du_dir_v aut
    )inter
    on inter.num_doc = ter.num_doc
    and inter.rn = 1
    
    where
    titper.id_rol_titulo = 26 
    --and titper.actual = 1 
    --and tit.cod_titulo = '$id_referencia2'
)det
on det.cod_titulo = circu.id_referencia2

where
circu.codigotimelog = $CODIGOTIMELOG
and circu.ID_MESES_FILTRO = $id_meses_filtro and circu.ID_ANHOS_FILTRO = $id_anhos_filtro
and circu.estado = 1

order by
circu.id_circularizacion 
EOD;
                //Ejecutar SQL
                $this->conn->execute($sql);

                MemcacheHandler::getInstance()->set($progress_key, 2);


                /**
                 * Crear debito de circularizacion
                 */
                //Sql 
                $sql = <<<EOD
Insert into CA_CIRCULARIZACION_DEBITO (ID_CIRCULARIZACION_DEBITO,
ID_CIRCULARIZACION,
ID_ANHOS,
ID_DEBITO,
ID_VENCIMIENTO,
VALOR)

select 
null as ID_CIRCULARIZACION_DEBITO,
circu.id_circularizacion as ID_CIRCULARIZACION,
circu.id_anhos as ID_ANHOS,
deb.id_debito as ID_DEBITO,
deb.id_vencimiento as ID_VENCIMIENTO,
deb.valor as VALOR

from ca_circularizacion circu

left join(
    select 
    debref.id_referencia2,
    tab0.id_debito as id_debito,
    tab0.id_vencimiento as id_vencimiento,
    tab0.saldo_actual as valor
    
    from ca_debito_saldos tab0
    
    join ca_debito_ref debref
    on tab0.id_debito = debref.id_debito
    
    where 
    tab0.estado_ven = 1
    and tab0.id_meses_sal = $id_meses_filtro and tab0.id_anhos_sal = $id_anhos_filtro
    and tab0.saldo_actual > 0
    --and debref.id_referencia2 = '$id_referencia2'
    $whereTitulo
    $wherePuntoVenta 
    $whereTercero
    $whereTope 
)deb
on deb.id_referencia2 = circu.id_referencia2

where
circu.codigotimelog = $CODIGOTIMELOG
and circu.ID_MESES_FILTRO = $id_meses_filtro and circu.ID_ANHOS_FILTRO = $id_anhos_filtro 
and circu.estado = 1

order by
circu.id_circularizacion 
EOD;
                //Ejecutar SQL
                $this->conn->execute($sql);

                MemcacheHandler::getInstance()->set($progress_key, 3);

                /**
                 * Select para todas las circularizaciones del proceso - 20170808
                 */
                //Sql
                $sql = <<<EOD
select 
circu.id_circularizacion as ID_CIRCULARIZACION,
circu.id_anhos as ID_ANHOS,
'Circularizacion No.' || circu.id_circularizacion || ' de ' || circu.id_anhos || ' ' || circu.id_referencia2 || '.pdf' as ADJUNTO

from ca_circularizacion circu

where
circu.codigotimelog = $CODIGOTIMELOG
and circu.ID_MESES_FILTRO = $id_meses_filtro and circu.ID_ANHOS_FILTRO = $id_anhos_filtro
and circu.estado = 1

order by
circu.id_circularizacion  
EOD;
                //Ejecutar SQL
                $records_ven = CN_TABLE::executeSQL($sql);
                foreach ($records_ven as $value_ven) {

                    $id_circularizacion = $value_ven['id_circularizacion'];
                    $id_anhos = $value_ven['id_anhos'];
                    $adjunto = $value_ven['adjunto'];

                    //Array de pdfs
                    $array_cir[$i_cir++] = array(
                        'id_circularizacion' => $id_circularizacion,
                        'id_anhos' => $id_anhos,
                        'adjunto' => $adjunto
                    );
                }

                MemcacheHandler::getInstance()->set($progress_key, 4);
            } else {
                throw new Exception("No existen registros pendientes con los datos de filtro, favor verificar.");
            }


            MemcacheHandler::getInstance()->set($progress_key, 5);
            $this->logMessage("[CREDITO_COMPLETO] MemcacheHandler::5");


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

            /**
             * Generacion de PDFs - 20160601
             * http://soporte14.sofhouse.net/jasperphp/whereExecuteReportCartera.php?uri=/reports/cartera/ca_carta_cir_cart&PARAM___ref=com.smartgwt.client.data.Record%408&PARAM_id_circularizacion=3&PARAM_id_anhos=2017&PARAM_adjunto=Circularizacion+No.2+de+2017+ABF-071.pdf&PARAM_tag_ruta=1&format=HTML&PARAM_id_mod=11&PARAM_username=sofhouse&PARAM_nitocc=800189921&PARAM_id_username=946&PARAM_aplica_inventario=false&PARAM_punto_venta_log=62&PARAM_NomPuntoVenta=VF+-+VISITAS+DE+FISCALIZACI%C3%93N&PARAM_EnviarEmail=false&PARAM_AplicaCuenta=false&PARAM_comando=ca_reg_cir_cart&page=0
             */
            $this->logMessage("[CREDITO_COMPLETO] Generacion de PDFs.\n");

            $array = sfYaml::load(dirname(__FILE__) . '/../../../config/app-gwt.yml');

            $int = 0;
            $url = '';
            $url_jasper = '';
            foreach ($array as $routeName => $routeData) {
                //echo $routeName . "\n";
                if ('jasper_url' == $routeName) {
                    foreach ($routeData as $key => $value) {
                        //echo $value . "\n";
                        if ($key == 'value') {
                            $url_jasper = $value;
                        }
                    }
                }
                $int++;
            }

            /*
             * Recorre los registros de circularizacion para crear el pdf - 20170710
             */
            $i = 0;
            $nom_conceptos_a_procesar = count($array_cir);

            // Antes de inicar el proceso largo
            $brecha = 1;
            if ($nom_conceptos_a_procesar > 100)
                $brecha = $nom_conceptos_a_procesar - (0.99 * $nom_conceptos_a_procesar);


            foreach ($array_cir as $value) {

                //URL de envio inicio
                $url = $url_jasper;

                // Guardar un valor en el proceso largo
                if ($i % $brecha == 0) {
                    //validar que no sobrepase el 100 porciento - 20151007
                    if ((round(($i / $nom_conceptos_a_procesar) * 100)) < 100) {
                        MemcacheHandler::getInstance()->set($progress_key, round(($i / $nom_conceptos_a_procesar) * 100, 0));
                    }
                }
                $i++;

                //$url = sfConfig::get('app-gwt_jasper_url');
                //echo $url;
                //$ch = curl_init("http://www.sofhouse.net/");
                /*
                 * $ch = curl_init("http://soporte14.sofhouse.net/jasperphp/whereExecuteReportCartera.php
                 * ?uri=%2Freports%2Fcartera%2Fnota_credito&PARAM_id_credito=33960&PARAM_valor=181480&format=HTML");
                 */
                $url = $url . 'ca_carta_cir_cart&format=PDF&PARAM_id_mod=11&PARAM_username=websafi&PARAM_nitocc=800189921&PARAM_id_username=946';
                $url = $url . '&PARAM_id_circularizacion=' . $value['id_circularizacion'];
                $url = $url . '&PARAM_id_anhos=' . $value['id_anhos'];
                $url = $url . '&PARAM_envio_correo=false&PARAM_tag_adjunto_modulo=true';
                $url = $url . '&PARAM_nombre_reporte=' . str_replace(' ', ':', $value['adjunto']);

                $this->logMessage($url);
                $ch = curl_init($url);

                //Parametros de retorno en cURL
                curl_setopt($ch, CURLOPT_HEADER, 0);
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // Skip SSL Verification
                //Ejecuta la petición
                $rta = curl_exec($ch);
                //Se cierra la conexión
                curl_close($ch);

//                $arrayRespuesta = json_decode($rta, true);
                //Verifica el status, si es diferente de 0, ocurrio un error 
//                if ($arrayRespuesta['response']['status'] != 0) {
//                    $this->logMessage("[Error] Me llamo desde el CURL");
                //echo "<h3>Me llamo desde el cURL</h3>";
//              $mensaje=$arrayRespuesta['response']['data'];
//              $this->status = 3;
//              $a = $mensaje[0]['mensaje'];
//              $b = htmlspecialchars($a, ENT_QUOTES);
//              $this->mensajeError = $b;
//              $this->list_data = array();
//                }

                /*
                 * FIN Generacion de PDFs
                 */
                //URL de envio se limpia
                $url = '';
            }


            MemcacheHandler::getInstance()->set($progress_key, 100);
            $this->logMessage("[CREDITO_COMPLETO] MemcacheHandler::100");

            /**
             * Respuesta JSON
             */
            $this->status = 0;
            $this->list_data = array(
//                array(
//                    'id_circularizacion' => $id_circularizacion,
//                    'id_anhos' => $id_anhos,
//                    'adjunto' => $adjunto
//                )
            );
            $this->logMessage("[Liquidación] Liquidación exitosa");
        } catch (Exception $e) {


            /*
             * ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
             */
            $this->conn->rollback();
            MemcacheHandler::getInstance()->set($progress_key, 100);

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

    /**
     * Metodo para Add el circularizacion
     * 
     * ESPECIFICACIONES:
      1.Generar documento (según modelo adjunto a este requerimiento) de circularización para envío por correo electrónico.
      2.El contenido de DEBITOS a reportar en el cuerpo de la circular corresponde a los que tengan saldo por pagar a la fecha de la generación.
      3.Asunto del correo: Cobro Persuasivo TITULO No. xxxxxxxx
      4.Enviar a todos los titulares asociados al titulo (ver consulta de deudores morosos)
      5.Se genera circular por cada titulo minero
      6.Cada envío con correo individual a cada titular
      7.Debe quedar registro de control de la circularización.
     *
     * @param sfWebRequest $request
     */
    public function executeAdd2(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");

        /**
         * Abrir nueva conexion con la Base de Datos
         */
        $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
        $this->conn->beginTransaction();

        /*
         * 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 {

            /*
             * (SGC-1, ANM-2, SGR-3, CYC-4, COL-5, INCI-6, LOCAL-7)
             */
            $array = sfYaml::load(dirname(__FILE__) . '/../../../config/app-gwt.yml');

            $int = 0;
            foreach ($array as $routeName => $routeData) {
                //echo $routeName . "\n";
                if ('entidad_cliente' == $routeName) {
                    foreach ($routeData as $key => $value) {
                        //echo $value . "\n";
                        if ($key == 'value') {
                            $entidadCliente = $value;
                        }
                    }
                }
                $int++;
            }


            /*
             * Variables de filtro
             */
            //Periodo
            $id_anhos_filtro = $request['id_anhos_filtro'];
            $id_meses_filtro = $request['id_meses_filtro'];

            $username = $request['username'];
            $progress_key = $request['progress_key'] . $request['username'];


            $id_referencia2 = null;
            $whereTitulo = "";
            if (isset($request['id_referencia2'])) {
                $id_referencia2 = $request['id_referencia2'];
                $whereTitulo = " and debref.id_referencia2 = '" . $id_referencia2 . "'";
            }

            $id_punto_venta = null;
            $wherePuntoVenta = "";
            if (isset($request['id_punto_venta'])) {
                $id_punto_venta = $request['id_punto_venta'];
                $wherePuntoVenta = " AND tab0.id_punto_venta = " . $request['id_punto_venta'];
            }

            $id_mae_ter = null;
            $whereTercero = "";
            if (isset($request['id_mae_ter'])) {
                $id_mae_ter = $request['id_mae_ter'];
                $whereTercero = " AND tab0.id_mae_ter = " . $request['id_mae_ter'];
            }

            $tope = null;
            $whereTope = "";
            if (isset($request['tope'])) {
                $tope = $request['tope'];
                $whereTope = " AND tab0.valor_total < " . $request['tope'];
            }

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

            /**
             * Encontrar registros de debitos por titulo/referencia2
             */
            //Sql
            $sql = <<<EOD
select 
/*
tab0.*,
debref.id_referencia1,
*/
debref.id_referencia2,
to_char(wm_concat(tab0.id_debito)) as id_debitos,
nvl(max(tabcant.cant),0) as cant

from ca_debito_saldos tab0

join ca_debito_ref debref
on tab0.id_debito = debref.id_debito

left join(
    select 
    tabcant.cod_titulo,
    count(tabcant.num_doc) as cant
    
    from(
    
        select  
        titper.id_titulo,
        titper.id_titular,
        titper.id_rol_titulo,
        titper.actual,
        tit.cod_titulo,
        ter.num_doc,
        ter.raz_soc,
        case 
        when inter.mail is not null then inter.mail
        when ter.correo is null then ter.correo_alt else ter.correo end as correo
        
        from rmn_titulo_persona@can.anm.local titper
        
        join rmn_titulo@can.anm.local tit
        on tit.id_titulo = titper.id_titulo
        
        join rmn_persona_v@can.anm.local ter
        on ter.id_persona = titper.id_titular
        
        left join (
          SELECT
           aut.*,
           ROW_NUMBER() OVER (
            partition by aut.num_doc
            ORDER BY aut.num_doc
           ) AS rn
          from interceros_du_dir_v aut
        )inter
        on inter.num_doc = ter.num_doc
        and inter.rn = 1
        
        where
        titper.id_rol_titulo = 26 
        --and titper.actual = 1 
        --and tit.cod_titulo = 'ABF-071'
    
    )tabcant
    
    group by
    tabcant.cod_titulo
)tabcant
on tabcant.cod_titulo = debref.id_referencia2

where 
tab0.estado_ven = 1
and tab0.id_meses_sal = $id_meses_filtro and tab0.id_anhos_sal = $id_anhos_filtro
and tab0.saldo_actual > 0
                    
$whereTitulo
$wherePuntoVenta 
$whereTercero
$whereTope     

having 
to_char(wm_concat(tab0.id_debito)) is not null  
--and nvl(max(tabcant.cant),0) > 0                    

group by
debref.id_referencia2

order by
debref.id_referencia2               
EOD;
            //Ejecutar SQL
            $records_deb = CN_TABLE::executeSQL($sql);

            $array_cir = array();
            $i_cir = 0;

            if (count($records_deb) > 0) {


                /*
                 * Recorre los registros de circularizacion - 20170710
                 */
                $i = 1;
                $nom_conceptos_a_procesar = count($records_deb) * 2;

                // Antes de inicar el proceso largo
                $brecha = 1;
                if ($nom_conceptos_a_procesar > 100)
                    $brecha = $nom_conceptos_a_procesar - (0.99 * $nom_conceptos_a_procesar);

                $this->logMessage("[Cicularización] nom_conceptos_a_procesar:: " . $nom_conceptos_a_procesar);
                foreach ($records_deb as $value_deb) {

                    // Guardar un valor en el proceso largo
                    if ($i % $brecha == 0) {
                        //validar que no sobrepase el 100 porciento - 20151007
                        if ((round(($i / $nom_conceptos_a_procesar) * 100)) < 100) {
                            MemcacheHandler::getInstance()->set($progress_key, round(($i / $nom_conceptos_a_procesar) * 100, 0));
                        }
                    }

                    $this->logMessage("[Cicularización] Existen circularizaciones." . $i);
                    $i++;

                    $id_referencia2 = $value_deb['id_referencia2'];
                    $id_debitos = $value_deb['id_debitos'];
                    $cant = $value_deb['cant'];

                    //Valida para que guarde registro solo de titulos con titulares - 20170804
                    if ($cant > 0) {
                        /**
                         * Crear cabecera de circularizacion
                         */
                        //Sql 
                        $sql = <<<EOD
Insert into CA_CIRCULARIZACION (ID_CIRCULARIZACION,ID_ANHOS,ID_REFERENCIA2,FECHA_PROCESO,
    OBSERVACIONES,USUARIOLOG,ESTADO,FECHA_ANU,MOTIVO_ANU,ID_ANHOS_FILTRO,ID_MESES_FILTRO,
        ID_PUNTO_VENTA,ID_MAE_TER,TOPE,ID_DEBITOS) 
    values (null,to_char(sysdate,'yyyy'),upper('$id_referencia2'),trunc(sysdate),
        '$observaciones','$username','1',null,null,'$id_anhos_filtro','$id_meses_filtro',
            '$id_punto_venta','$id_mae_ter','$tope','$id_debitos') 
EOD;
                        //Ejecutar SQL
                        $this->conn->execute($sql);


                        /**
                         * id ultimo insertado
                         */
                        //Sql
                        $sql = <<<EOD
select 
id_circularizacion,
id_anhos
from ca_circularizacion 
where
id_anhos = to_char(sysdate,'yyyy')
and id_referencia2 = '$id_referencia2'   
and id_anhos_filtro = '$id_anhos_filtro' 
and id_meses_filtro = '$id_meses_filtro'                          
order by
id_circularizacion desc,
id_anhos desc
EOD;
                        //Ejecutar SQL
                        $records = CN_TABLE::executeSQL($sql);

                        if (count($records) > 0) {
                            $id_circularizacion = $records[0]['id_circularizacion'];
                            $id_anhos = $records[0]['id_anhos'];
                        } else {
                            throw new Exception("Error al registrar la circularización, favor verificar.");
                        }
                    }


                    /**
                     * Registros de personas por titulo
                     */
                    //Sql
                    $sql = <<<EOD
select  
titper.id_titulo,
titper.id_titular,
titper.id_rol_titulo,
titper.actual,
tit.cod_titulo,
ter.num_doc,
ter.raz_soc,
case 
when inter.mail is not null then inter.mail
when ter.correo is null then ter.correo_alt else ter.correo end as correo

from rmn_titulo_persona@can.anm.local titper

join rmn_titulo@can.anm.local tit
on tit.id_titulo = titper.id_titulo

join rmn_persona_v@can.anm.local ter
on ter.id_persona = titper.id_titular

left join (
  SELECT
   aut.*,
   ROW_NUMBER() OVER (
    partition by aut.num_doc
    ORDER BY aut.num_doc
   ) AS rn
  from interceros_du_dir_v aut
)inter
on inter.num_doc = ter.num_doc
and inter.rn = 1

where
titper.id_rol_titulo = 26 
--and titper.actual = 1 
and tit.cod_titulo = '$id_referencia2'

order by
tit.cod_titulo     
EOD;
                    //Ejecutar SQL
                    $records = CN_TABLE::executeSQL($sql);

                    $adjunto = '';
                    if (count($records) > 0) {

                        foreach ($records as $value) {

                            $num_doc = $value['num_doc'];
                            $correo = $value['correo'];

                            /**
                             * Crear detalle de circularizacion
                             */
                            $adjunto = 'Circularizacion No.' . $id_circularizacion . ' de ' . $id_anhos . ' ' . $id_referencia2 . '.pdf';
                            //Sql 
                            $sql = <<<EOD
Insert into CA_CIRCULARIZACION_DETALLE (ID_CIRCULARIZACION_DETALLE,ID_CIRCULARIZACION,ID_ANHOS,NUM_DOC,CORREO,ADJUNTO,ENVIADO,RECIBIDO) 
    values (null,'$id_circularizacion','$id_anhos','$num_doc','$correo','$adjunto','0','0')
EOD;
                            //Ejecutar SQL
                            $this->conn->execute($sql);
                        }
                    } else {
                        $this->logMessage("Error al registrar detalles de circularización, favor verificar personas asociadas al Titulo $id_referencia2.");

                        //Si es un solo filtro genera error - 20170804
                        if (isset($request['id_referencia2'])) {
                            throw new Exception("Error al registrar detalles de circularización, favor verificar personas asociadas al Titulo $id_referencia2.");
                        }
                    }


                    /**
                     * Crear registros debito
                     *///Valida para que guarde registro solo de titulos con titulares - 20170804
                    if ($cant > 0) {
                        //Sql
                        $sql = <<<EOD
select 
tab0.id_debito as id_debito,
tab0.id_vencimiento as id_vencimiento,
tab0.saldo_actual as valor

from ca_debito_saldos tab0

join ca_debito_ref debref
on tab0.id_debito = debref.id_debito

where 
tab0.estado_ven = 1
and tab0.id_meses_sal = $id_meses_filtro and tab0.id_anhos_sal = $id_anhos_filtro
and tab0.saldo_actual > 0
and debref.id_referencia2 = '$id_referencia2'                 
   
EOD;
                        //Ejecutar SQL
                        $records_ven = CN_TABLE::executeSQL($sql);
                        foreach ($records_ven as $value_ven) {

                            $id_debito = $value_ven['id_debito'];
                            $id_vencimiento = $value_ven['id_vencimiento'];
                            $valor = $value_ven['valor'];

                            /**
                             * Crear debito de circularizacion
                             */
                            //Sql 
                            $sql = <<<EOD
Insert into CA_CIRCULARIZACION_DEBITO (ID_CIRCULARIZACION_DEBITO,ID_CIRCULARIZACION,ID_ANHOS,ID_DEBITO,ID_VENCIMIENTO,VALOR) 
    values (null,'$id_circularizacion','$id_anhos','$id_debito','$id_vencimiento','$valor') 
EOD;
                            //Ejecutar SQL
                            $this->conn->execute($sql);
                        }

                        //Array de pdfs
                        $array_cir[$i_cir++] = array(
                            'id_circularizacion' => $id_circularizacion,
                            'id_anhos' => $id_anhos,
                            'adjunto' => $adjunto
                        );
                    }
                }
            } else {
                throw new Exception("No existen registros pendientes con los datos de filtro, favor verificar.");
            }


            MemcacheHandler::getInstance()->set($progress_key, 50);


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

            /**
             * Generacion de PDFs - 20160601
             * http://soporte14.sofhouse.net/jasperphp/whereExecuteReportCartera.php?uri=/reports/cartera/ca_carta_cir_cart&PARAM___ref=com.smartgwt.client.data.Record%408&PARAM_id_circularizacion=3&PARAM_id_anhos=2017&PARAM_adjunto=Circularizacion+No.2+de+2017+ABF-071.pdf&PARAM_tag_ruta=1&format=HTML&PARAM_id_mod=11&PARAM_username=sofhouse&PARAM_nitocc=800189921&PARAM_id_username=946&PARAM_aplica_inventario=false&PARAM_punto_venta_log=62&PARAM_NomPuntoVenta=VF+-+VISITAS+DE+FISCALIZACI%C3%93N&PARAM_EnviarEmail=false&PARAM_AplicaCuenta=false&PARAM_comando=ca_reg_cir_cart&page=0
             */
            $this->logMessage("[CREDITO_COMPLETO] Generacion de PDFs.\n");

            $array = sfYaml::load(dirname(__FILE__) . '/../../../config/app-gwt.yml');

            $int = 0;
            foreach ($array as $routeName => $routeData) {
                //echo $routeName . "\n";
                if ('jasper_url' == $routeName) {
                    foreach ($routeData as $key => $value) {
                        //echo $value . "\n";
                        if ($key == 'value') {
                            $url = $value;
                        }
                    }
                }
                $int++;
            }

            /*
             * Recorre los registros de circularizacion para crear el pdf - 20170710
             */
            $i = count($array_cir);
            $nom_conceptos_a_procesar = count($array_cir) * 2;

            // Antes de inicar el proceso largo
            $brecha = 1;
            if ($nom_conceptos_a_procesar > 100)
                $brecha = $nom_conceptos_a_procesar - (0.99 * $nom_conceptos_a_procesar);


            foreach ($array_cir as $value) {


                // Guardar un valor en el proceso largo
                if ($i % $brecha == 0) {
                    //validar que no sobrepase el 100 porciento - 20151007
                    if ((round(($i / $nom_conceptos_a_procesar) * 100)) < 100) {
                        MemcacheHandler::getInstance()->set($progress_key, round(($i / $nom_conceptos_a_procesar) * 100, 0));
                    }
                }
                $i++;

                //$url = sfConfig::get('app-gwt_jasper_url');
                //echo $url;
                //$ch = curl_init("http://www.sofhouse.net/");
                /*
                 * $ch = curl_init("http://soporte14.sofhouse.net/jasperphp/whereExecuteReportCartera.php
                 * ?uri=%2Freports%2Fcartera%2Fnota_credito&PARAM_id_credito=33960&PARAM_valor=181480&format=HTML");
                 */
                $url = $url . 'ca_carta_cir_cart&format=PDF&PARAM_id_mod=11&PARAM_username=websafi&PARAM_nitocc=800189921&PARAM_id_username=946';
                $url = $url . '&PARAM_id_circularizacion=' . $value['id_circularizacion'];
                $url = $url . '&PARAM_id_anhos=' . $value['id_anhos'];
                $url = $url . '&PARAM_envio_correo=false&PARAM_tag_adjunto_modulo=true';
                $url = $url . '&PARAM_nombre_reporte=' . str_replace(' ', ':', $value['adjunto']);

                $this->logMessage($url);
                $ch = curl_init($url);

                //Parametros de retorno en cURL
                curl_setopt($ch, CURLOPT_HEADER, 0);

                //Ejecuta la petición
                $rta = curl_exec($ch);
                //Se cierra la conexión
                curl_close($ch);

//                $arrayRespuesta = json_decode($rta, true);
                //Verifica el status, si es diferente de 0, ocurrio un error 
//                if ($arrayRespuesta['response']['status'] != 0) {
//                    $this->logMessage("[Error] Me llamo desde el CURL");
                //echo "<h3>Me llamo desde el cURL</h3>";
//              $mensaje=$arrayRespuesta['response']['data'];
//              $this->status = 3;
//              $a = $mensaje[0]['mensaje'];
//              $b = htmlspecialchars($a, ENT_QUOTES);
//              $this->mensajeError = $b;
//              $this->list_data = array();
//                }
                //FIN Generacion de PDFs
            }


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

            /**
             * Respuesta JSON
             */
            $this->status = 0;
            $this->list_data = array(
//                array(
//                    'id_circularizacion' => $id_circularizacion,
//                    'id_anhos' => $id_anhos,
//                    'adjunto' => $adjunto
//                )
            );
            $this->logMessage("[Liquidación] Liquidación exitosa");
        } catch (Exception $e) {


            /*
             * ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
             */
            $this->conn->rollback();
            MemcacheHandler::getInstance()->set($progress_key, 100);

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

    /**
     * Actualiza para el num_doc y adjunto que ya fue enviado por correo
     * @param sfWebRequest $request
     */
    public function executeUpdate(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");

        /**
         * Abrir nueva conexion con la Base de Datos
         */
        $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
        $this->conn->beginTransaction();

        /*
         * 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 {

            /*
             * Variables de filtro
             */
            //Periodo
            $num_doc = $request['num_doc'];
            $adjunto = str_replace(":;:", " ", $request['adjunto']);


            //Sql 
            $sql = <<<EOD
update ca_circularizacion_detalle set enviado = 1 
where 
num_doc = '$num_doc'
and adjunto = '$adjunto'
EOD;
            //Ejecutar SQL
            $this->conn->execute($sql);

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

            /**
             * Respuesta JSON
             */
            $this->status = 0;
            $this->list_data = array(
//                array(
//                    'id_circularizacion' => $id_circularizacion,
//                    'id_anhos' => $id_anhos,
//                    'adjunto' => $adjunto
//                )
            );
            $this->logMessage("[Liquidación] Liquidación exitosa");
        } catch (Exception $e) {


            /*
             * ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
             */
            $this->conn->rollback();
            MemcacheHandler::getInstance()->set($progress_key, 100);

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

    // 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") {
            if (isset($request['estado'])) {
                $estado = $request['estado'];
                if ($estado == "0") {
                    $request['fecha_anu'] = CN_TABLE::fechaSistema();
                }
            }
        }

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

}
