<?php

/**
 * generar_certif_ingre_reten actions.
 *
 * @package    nomina
 * @subpackage generar_certif_ingre_reten
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class generar_certif_ingre_retenActions extends sfActions {

    protected $usuario_gen = null; //llave unica - solo un valor
    protected $entidadCliente_tag = 0;

    /**
     * Generar registros en BD
     *
     * @param sfRequest $request A request object
     */
    public function executeList(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");

        $records = array();

        /*
         * Log liquidacion
         */
        $logPath = sfConfig::get('sf_log_dir') . '/liquidacion.log';
        $custom_logger = new sfFileLogger(new sfEventDispatcher(), array('file' => $logPath));

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

        try {

            /*
             * Variables de filtro
             */
            $id_periodo = $request['id_periodo'];
            $id_anhos = $request['id_anhos'];
            $fecha_ini = $request['fecha_ini'];
            $fecha_fin = $request['fecha_fin'];
            $fecha_expe = $request['fecha_expe'];
            $progress_key = $request['progress_key'] . $request['username'];
            $this->usuario_gen = $request['id_username'];

            //Funcionario num_doc
            $num_doc = null;
            $whereFuncionarioNumDoc = "";
            if (isset($request['num_doc'])) {
                $num_doc = $request['num_doc'];
                $whereFuncionarioNumDoc = " AND tab0.num_doc = " . $request['num_doc'];
            }
            //Funcionario id_tipo_doc 
            $id_tipo_doc = null;
            $whereFuncionarioTipoDoc = "";
            if (isset($request['id_tipo_doc'])) {
                $id_tipo_doc = $request['id_tipo_doc'];
                $whereFuncionarioTipoDoc = " AND tab0.id_tipo_doc = " . $request['id_tipo_doc'];
            }
            //Tipo Concepto
            $whereTipoConcepto = "";
            if (isset($request['id_tipo_concepto'])) {
                $whereTipoConcepto = " AND concep.id_tipo_concepto = " . $request['id_tipo_concepto'];
            }



            /*
             * variables por defecto para el registro de log
             */
            $id_tabla = 'null';
            $id_vigencia = $id_anhos;
            $id_cen_op = 'null';

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

            //obtener id maestro tabla
            $id_mae_bd = CN_TABLE::consultarIdTablaBD('NO_CERTIF_INGRE_RETEN');

            //indica operacion
            $id_ope_bd = 3;

            //id del maestro tercero
            $id_mae_ter = 1;
            if (isset($request['id_username'])) {
                $id_mae_ter = $request['id_username'];
            }
            $username = 'admin';
            if (isset($request['username'])) {
                if (!is_null($request['username']) && $request['username'] != '') {
                    $username = $request['username'];
                }
            }
            $comando = 'sin comando';
            if (isset($request['comando'])) {
                $comando = $request['comando'];
            }
            //construir observacion
            $observacion = "'Se genera certif de ingresos y reten desde la funcionalidad: " . $comando . "'";

            /*
             * registro de consulta en tabla de log
             */
            $sql = CN_TABLE::registroTableLog($id_tabla, $id_ope_bd, $id_mae_bd, $id_mae_ter, $username, $comando, $observacion);

            /*
             *  Borrar datos anteriores Periodo-Funcionario
             */
            //Sql
            $sql = <<<EOD
DELETE FROM NO_CERTIF_INGRE_RETEN tab0 WHERE tab0.id_anhos = $id_anhos
$whereFuncionarioNumDoc $whereFuncionarioTipoDoc
EOD;
            //Ejecutar SQL
            CN_TABLE::executeSQL($sql);


            /*
             * (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') {
                            $this->entidadCliente_tag = $entidadCliente = $value;
                        }
                    }
                }
                $int++;
            }

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


            /*
             * Cargar datos en tabla NO_CERTIF_INGRE_RETEN por agrupacion
             */
            if (isset($request['agrup_dev'])) {
                $agrup_dev = $request['agrup_dev'];

                //Metodo que completa los registros
                $this->generar($id_anhos, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $agrup_dev, 1, $whereTipoConcepto);
            }
            MemcacheHandler::getInstance()->set($progress_key, 20);

            if (isset($request['agrup_salud'])) {
                $agrup_salud = $request['agrup_salud'];

                //Metodo que completa los registros
                $this->generar($id_anhos, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $agrup_salud, 2, $whereTipoConcepto);
            }
            MemcacheHandler::getInstance()->set($progress_key, 30);

            if (isset($request['agrup_fsp'])) {
                $agrup_fsp = $request['agrup_fsp'];

                //Metodo que completa los registros
                $this->generar($id_anhos, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $agrup_fsp, 3, $whereTipoConcepto);
            }
            MemcacheHandler::getInstance()->set($progress_key, 40);

            if (isset($request['agrup_vol'])) {
                $agrup_vol = $request['agrup_vol'];

                //Metodo que completa los registros
                $this->generar($id_anhos, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $agrup_vol, 4, $whereTipoConcepto);
            }
            MemcacheHandler::getInstance()->set($progress_key, 50);

            if (isset($request['agrup_rete'])) {
                $agrup_rete = $request['agrup_rete'];

                //Metodo que completa los registros
                $this->generar($id_anhos, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $agrup_rete, 5, $whereTipoConcepto);
            }
            MemcacheHandler::getInstance()->set($progress_key, 60);

            if (isset($request['agrup_gasrep'])) {
                $agrup_gasrep = $request['agrup_gasrep'];

                //Metodo que completa los registros
                $this->generar($id_anhos, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $agrup_gasrep, 6, $whereTipoConcepto);
            }
            MemcacheHandler::getInstance()->set($progress_key, 70);

            if (isset($request['agrup_ces'])) {
                $agrup_ces = $request['agrup_ces'];

                //Metodo que completa los registros
                $this->generarCes($id_anhos, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $agrup_ces, 7, $whereTipoConcepto);
            }

            /* Para que tome valores de intereses y retirados CEV - 20200319 */
            if (isset($request['agrup_ces'])) {
                $agrup_ces = $request['agrup_ces'];

                //Metodo que completa los registros
                //Validacion para CEV privada genera en renglon 46 pagadas - 20220311
                if ($entidadCliente == 8) {
                    $this->generar($id_anhos, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $agrup_ces, 7, $whereTipoConcepto);
                } else {
                    $this->generar($id_anhos, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $agrup_ces, 32, $whereTipoConcepto);
                }
            }

            /* Se agrega para el INCI valor consol de cesantias anual - 20150226
             * Se deja para todos el consol anual - 20180309
             * Incidente #28612, Cesantías Consignadas, cambio formato 220 - 20220308::LAVILA
             */
            //if ($entidadCliente == 6 || $entidadCliente == 7) {
            if (isset($request['agrup_ces'])) {
                $agrup_ces = $request['agrup_ces'];
                //Metodo que completa los registros
                $this->generarCesAnual($id_anhos, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $agrup_ces, 32, $whereTipoConcepto);
            }
            //}
            MemcacheHandler::getInstance()->set($progress_key, 80);

            /*
             * Viaticos - 20150212
             */
            if ($entidadCliente == 1 || $entidadCliente == 2 || $entidadCliente == 7) {
                if (isset($request['aplica_viatico']) && $request['aplica_viatico'] == 'true') {
                    //$aplica_viatico = $request['aplica_viatico'];
                    //$this->logMessage("[generar_certif_ingre_reten] aplica_viatico :: " . $aplica_viatico);
                    //Metodo que completa los registros
                    $this->generarViaticos($id_anhos, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, 0, 24, $whereTipoConcepto);
                }
            }
            //Viáticos - 20180316
            if (isset($request['agrup_viaticos'])) {
                $agrup_otring = $request['agrup_viaticos'];

                //Metodo que completa los registros
                $this->generar($id_anhos, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $agrup_otring, 24, $whereTipoConcepto);
            }
            //Otros ingresos como empleado - 20150312
            if (isset($request['agrup_otring'])) {
                $agrup_otring = $request['agrup_otring'];

                //Metodo que completa los registros
                $this->generar($id_anhos, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $agrup_otring, 8, $whereTipoConcepto);
            }

            //Nuevas agrupaciones - 20180306
            if (isset($request['id_agrup_aporte_vol'])) {
                $agrup_otring = $request['id_agrup_aporte_vol'];

                //Metodo que completa los registros
                $this->generar($id_anhos, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $agrup_otring, 21, $whereTipoConcepto);
            }
            if (isset($request['id_agrup_aporte_afc'])) {
                $agrup_otring = $request['id_agrup_aporte_afc'];

                //Metodo que completa los registros
                $this->generar($id_anhos, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $agrup_otring, 22, $whereTipoConcepto);
            }
            if (isset($request['id_agrup_pagos_prestsoc'])) {
                $agrup_otring = $request['id_agrup_pagos_prestsoc'];

                //Metodo que completa los registros
                $this->generar($id_anhos, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $agrup_otring, 23, $whereTipoConcepto);
            }
            if (isset($request['id_agrup_apoyoedu'])) {
                $agrup_otring = $request['id_agrup_apoyoedu'];

                //Metodo que completa los registros
                $this->generar($id_anhos, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $agrup_otring, 25, $whereTipoConcepto);
            }

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


            if (isset($request['tipo_concepto'])) {
                $agrup_rete = 0;

                //Metodo que completa los registros
                $this->generar($id_anhos, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $agrup_rete, 0, $whereTipoConcepto);
            }

            /**
             * Concepto COVID - 20210225
             */
            $sql = <<<EOD
SELECT
    *
FROM no_param_concep
WHERE
id_param_concep = 1 
EOD;

            //Ejecutar SQL
            $record_param = CN_TABLE::executeSQL($sql);
            foreach ($record_param as $value_param) {

                if ($value_param['id_concep_covid_vol'] != null) {
                    $id_concep = $value_param['id_concep_covid_vol'];
                    //Metodo que completa los registros
                    $this->generarConcepto($id_anhos, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $id_concep, 30, $whereTipoConcepto);
                }

                if ($value_param['id_concep_covid_obl'] != null) {
                    $id_concep = $value_param['id_concep_covid_obl'];
                    //Metodo que completa los registros
                    $this->generarConcepto($id_anhos, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $id_concep, 31, $whereTipoConcepto);
                }
            }



//            $custom_logger->info(MemcacheHandler::getInstance()->get($progress_key) . " - Termino Mencache.\n");
            MemcacheHandler::getInstance()->set($progress_key, 100);


            /*
             * Formato DIAN 1001
             * guardar registros en la tabla TS_DIAN_1001 - 20140426
             */
            if (isset($request['tipo_valor'])) {
                $this->generarDian($id_anhos, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $id_periodo);
            }


            //construir observacion
            $observacion = "'Termino generar certif de ingresos y reten desde la funcionalidad: " . $comando . "'";

            /*
             * registro de consulta en tabla de log
             */
            $sql = CN_TABLE::registroTableLog($id_tabla, $id_ope_bd, $id_mae_bd, $id_mae_ter, $username, $comando, $observacion);


            /*
             * COMMIT DE TODAS LAS TRANSACCIONES
             */
            $this->conn->commit();
            $this->status = 0;
            $this->list_data = array();
            $this->logMessage("[generar_certif_ingre_reten] Liquidación exitosa");
        } catch (Exception $e) {
            MemcacheHandler::getInstance()->set($progress_key, 100);

            /*
             * ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
             */
            $this->conn->rollback();
            $this->status = 1;
            $this->mensajeError = "[generar_certif_ingre_reten] Ocurrio un error: " . $e->getMessage();
            $this->list_data = array();
            $this->logMessage("[generar_certif_ingre_reten] ERROR!");
            $this->logMessage($e->getMessage());
        }
    }

    /**
     * Genera registros de dian 1001 - 20140425
     * 
     * @param type $id_anhos
     * @param type $fecha_ini
     * @param type $fecha_fin
     * @param type $num_doc
     * @param type $whereFuncionarioNumDoc
     * @param type $id_tipo_doc
     * @param type $whereFuncionarioTipoDoc
     * @param type $id_periodo
     */
    private function generarDian($id_anhos, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $id_periodo) {

        /*
         * Borrar registros
         */
        //Sql
        $sql = <<<EOD
delete from ts_dian_1001 
where tipo_mod = 1 
EOD;
        //Ejecutar SQL
        CN_TABLE::executeSQL($sql);

        /*
         * Ultimo periodo del año
         */
        //Sql
        $sql = <<<EOD
select * from no_periodo
where id_anhos = $id_anhos
and id_tipo_periodo = 1
order by
id_anhos,
id_meses desc 
EOD;
        //Ejecutar SQL
        $result = CN_TABLE::executeSQL($sql);

        $id_periodo_ult = $result[0]['id_periodo'];

        /*
         * Insertar registros de concepto 5001
         */
        //Sql
        $sql = <<<EOD

insert into ts_dian_1001 (CPT, TDOC, NID, APL1, APL2, NOM1, NOM2, 
DIR, DEPTO, PAIS, PAG_DE, RETF_P, CIUDAD, TIPO_MOD) 

(

select 

5001 as CPT, 
13 as TDOC,
tab.num_doc as NID, 
dat.primer_apellido as APL1, 
dat.segundo_apellido as APL2, 
dat.primer_nombre as NOM1, 
dat.segundo_nombre as NOM2, 
dat.direccion as DIR, 
tab2.coddepto as DEPTO, 
169 as PAIS, 
sum( case when tab.agrupacion_orden = 1 then tab.valor_total else 0 end ) as PAG_DE, 
sum( case when tab.agrupacion_orden = 5 then tab.valor_total else 0 end ) * (-1) as RETF_P, 
lpad(tab1.codmun,5,'0') as CIUDAD, 
1 as TIPO_MOD

from(

select 
tab0.id_certif_ingre_reten,
tab0.id_tipo_doc,
tab0.num_doc,
tab0.id_anhos,
tab0.id_concep_nomina,
                
--tab0.valor_total as valor_total,
case when tab2.operador = 1 then tab0.valor_total else tab0.valor_total * (-1) end as valor_total,
                
tab0.agrupacion_orden
from no_certif_ingre_reten tab0

JOIN NO_CONCEPTOS_V tab2 ON tab0.id_concep_nomina = tab2.id_concep_nomina
                    
where tab0.id_anhos = $id_anhos 
$whereFuncionarioNumDoc
$whereFuncionarioTipoDoc
and ( tab0.agrupacion_orden = 1 or tab0.agrupacion_orden = 5 )

)tab

join no_datos_funcionario_v dat
on tab.id_tipo_doc = dat.id_tipo_doc
and tab.num_doc = dat.num_doc

left join (
  SELECT
   aut.*,
   ROW_NUMBER() OVER (
    partition by aut.num_doc
    ORDER BY aut.id_anhos desc, aut.id_meses desc
   ) AS rnn
  from no_estado_func_v aut
  where aut.id_anhos = $id_anhos
  and aut.actual = 1
)tab0
on tab0.id_tipo_doc = dat.id_tipo_doc
and tab0.num_doc = dat.num_doc
and tab0.rnn = 1

left join centro_operacion tab1 ON tab1.id_cen_op = tab0.id_cen_op
left join departamento tab2 ON tab2.id_depto = tab1.id_depto

group by
tab.num_doc, 
dat.primer_apellido, 
dat.segundo_apellido, 
dat.primer_nombre, 
dat.segundo_nombre, 
dat.direccion,
tab2.coddepto,
tab2.descripcion,
tab1.codmun

)  
EOD;
        //Ejecutar SQL
        CN_TABLE::executeSQL($sql);


        /*
         * Periodos de planilla de correccion
         * Cambio de metodo wm_concat por LISTAGG - error en CEV - 20190201
         */
        //Sql
        $sql = <<<EOD
select 
--to_char(wm_concat(tab.id_periodo)) as per_filtro 
LISTAGG(tab.id_periodo, ',') WITHIN GROUP (ORDER BY tab.id_periodo) as per_filtro
from(

select distinct
tab0.id_periodo
from no_liquida_aporte tab0

join no_periodo tab4
on tab4.id_periodo = tab0.id_periodo

where tab4.id_anhos = $id_anhos
and tab0.tipo_planilla = 'C'

)tab 
EOD;
        //Ejecutar SQL
        $result = CN_TABLE::executeSQL($sql);

        $per_filtro = '0';
        if (isset($result[0]['per_filtro'])) {
            $per_filtro = $result[0]['per_filtro'];
        }


        /*
         * Insertar registros de concepto 5010 - 5011 - 5012
         */
        //sentencia sql
        $sql = <<<EOD

insert into ts_dian_1001 (CPT, TDOC, NID, DV, APL1, APL2, NOM1, NOM2, RAZ,
DIR, DEPTO, PAIS, PAG_DE, PAG_ND, RETF_P, CIUDAD, TIPO_MOD) 

(
select 

case when tab0.id_clase_fondo in (4,5,6,7,8) then '5010'
     when tab0.id_clase_fondo in (2,3) then '5011'
     when tab0.id_clase_fondo in (1) then '5012'
 else '0' end as CPT,
31 as TDOC, 
tab0.num_doc as NID, 
tab0.dv as DV, 
null as APL1, 
null as APL2, 
null as NOM1, 
null as NOM2, 
tab0.FONDO as RAZ,
tab0.direccion as DIR, 
ter.copdepto as DEPTO, 
169 as PAIS, 

case when tab0.id_clase_fondo in (4,5,6) then sum( nvl( tab0.PARAFISCALES ,0) )
     when tab0.id_clase_fondo in (2,3) then sum( nvl( tab0.APORTE_PATRONO_SALUD ,0) ) + sum( nvl( tab0.TOTAL_ARP ,0) )
     when tab0.id_clase_fondo in (1) then sum( nvl( tab0.APORTE_PATRONO_PENSION ,0) )
 else 0 end as PAG_DE, 
case when tab0.id_clase_fondo in (4,5,6) then 0
     when tab0.id_clase_fondo in (2,3) then sum( nvl( tab0.APORTE_FUNC_SALUD ,0) ) + sum( nvl( tab0.UPC_ADICIO ,0) )
     when tab0.id_clase_fondo in (1) then sum( nvl( tab0.APORTE_FUNC_PENSION ,0) )
 else 0 end as PAG_ND,                
                
null as RETF_P, 
null as CIUDAD, 
1 as TIPO_MOD

/*

tab0.id_periodo,tab0.id_clase_fondo,
tab0.id_mae_fondos,
tab0.CODIGO, tab0.FONDO
,sum( nvl( tab0.APORTE_FUNC_PENSION ,0) ) APORTE_FUNC_PENSION
,sum( nvl( tab0.APORTE_PATRONO_PENSION ,0) ) APORTE_PATRONO_PENSION
,sum( nvl( tab0.TOTAL_PENSION ,0) ) TOTAL_PENSION
,sum( nvl( tab0.APORTE_FUNC_SALUD ,0) ) APORTE_FUNC_SALUD
,sum( nvl( tab0.APORTE_PATRONO_SALUD ,0) ) APORTE_PATRONO_SALUD
,sum( nvl( tab0.TOTAL_SALUD ,0) ) TOTAL_SALUD
,sum( nvl( tab0.UPC_ADICIO ,0) ) UPC_ADICIO
,sum( nvl( tab0.APORTE_PATRONO_ARP ,0) ) APORTE_PATRONO_ARP
,sum( nvl( tab0.TOTAL_ARP ,0) ) TOTAL_ARP
,sum( nvl( tab0.PARAFISCALES ,0) ) PARAFISCALES
,sum( nvl( tab0.TOTAL_EMPLEADO ,0) ) TOTAL_EMPLEADO
,sum( nvl( tab0.TOTAL_APORTES ,0) ) TOTAL_APORTES,
(select distinct periodo.periodo from no_liquida_v periodo where periodo.id_periodo = tab0.id_periodo) AS PERIODO,
(select distinct periodo.tipper from no_liquida_v periodo where periodo.id_periodo = tab0.id_periodo) AS TIPPER
*/
FROM(

SELECT
tab3.direccion,
tab3.num_doc,
tab3.dv,
tab3.id_anhos,
tab3.id_periodo,tab3.id_clase_fondo,
tab3.id_mae_fondos,
tab3.CODIGO,tab3.FONDO,
tab3.APORTE_FUNC_PENSION,
tab3.APORTE_PATRONO_PENSION,
tab3.TOTAL_PENSION,
tab3.APORTE_FUNC_SALUD,
tab3.APORTE_PATRONO_SALUD,
tab3.TOTAL_SALUD,
tab3.UPC_ADICIO,
tab3.APORTE_PATRONO_ARP,
tab3.TOTAL_ARP,
tab3.PARAFISCALES,
( nvl( APORTE_FUNC_PENSION ,0)  +  nvl( APORTE_FUNC_SALUD ,0) ) AS TOTAL_EMPLEADO,
( nvl( tab3.TOTAL_PENSION ,0)  +  nvl( tab3.TOTAL_SALUD ,0)  +  nvl( tab3.TOTAL_ARP ,0) +  nvl( tab3.PARAFISCALES ,0) ) AS TOTAL_APORTES

FROM(

select 
tab0.id_liquida_aporte,
tab0.tipo_planilla,
tab4.id_anhos,
tab0.id_periodo as id_periodo, 
tab0.id_clase_fondo,
tab2.direccion,
tab2.num_doc,
tab2.dv,
tab2.id_mae_fondos,
tab2.codigo as codigo,
tab2.razon_social AS FONDO,
case when tab0.id_clase_fondo =1 then tab0.aporte_func
when tab0.id_clase_fondo = 2 then 0
when tab0.id_clase_fondo = 3 then 0
else 0 end AS APORTE_FUNC_PENSION,
case when tab0.id_clase_fondo =1 then tab0.aporte_patrono + tab0.aporte_patrono_licnorem
when tab0.id_clase_fondo = 2 then 0
when tab0.id_clase_fondo = 3 then 0
else 0 end AS APORTE_PATRONO_PENSION,
case when tab0.id_clase_fondo =1 then tab0.aporte_patrono+tab0.aporte_func + tab0.aporte_patrono_licnorem
when tab0.id_clase_fondo = 2 then 0
when tab0.id_clase_fondo = 3 then 0
else 0 end AS TOTAL_PENSION,

case when tab0.id_clase_fondo =1 then 0
when tab0.id_clase_fondo = 2 then tab0.aporte_func
when tab0.id_clase_fondo = 3 then 0
else 0 end AS APORTE_FUNC_SALUD,
case when tab0.id_clase_fondo =1 then 0
when tab0.id_clase_fondo = 2 then tab0.aporte_patrono + tab0.aporte_patrono_licnorem
when tab0.id_clase_fondo = 3 then 0
else 0 end AS APORTE_PATRONO_SALUD,
case when tab0.id_clase_fondo =1 then 0
when tab0.id_clase_fondo = 2 then tab0.aporte_patrono+tab0.aporte_func+tab0.upc_adicio + tab0.aporte_patrono_licnorem
when tab0.id_clase_fondo = 3 then 0
else 0 end AS TOTAL_SALUD,

case when tab0.id_clase_fondo =1 then 0
when tab0.id_clase_fondo = 2 then tab0.upc_adicio
when tab0.id_clase_fondo = 3 then 0
else 0 end AS UPC_ADICIO,

case when tab0.id_clase_fondo =1 then 0
when tab0.id_clase_fondo = 2 then 0
when tab0.id_clase_fondo = 3 then tab0.aporte_patrono
else 0 end AS APORTE_PATRONO_ARP,

case when tab0.id_clase_fondo =1 then 0
when tab0.id_clase_fondo = 2 then 0
when tab0.id_clase_fondo = 3 then tab0.aporte_patrono
else 0 end AS TOTAL_ARP,

case when tab0.id_clase_fondo =1 then 0
when tab0.id_clase_fondo = 2 then 0
when tab0.id_clase_fondo = 3 then 0
else tab0.aporte_patrono end AS PARAFISCALES


from no_liquida_aporte tab0

join no_periodo tab4
on tab4.id_periodo = tab0.id_periodo

left join no_mae_fondos tab2 ON tab2.id_mae_fondos = tab0.id_mae_fondos

where tab0.tipo_planilla in ( 'A' )
$whereFuncionarioNumDoc
$whereFuncionarioTipoDoc
and tab0.id_periodo not in ($per_filtro)

                
                
union

select 
tab0.id_liquida_aporte,
tab0.tipo_planilla,
tab4.id_anhos,
tab0.id_periodo as id_periodo, 
tab0.id_clase_fondo,
tab2.direccion,
tab2.num_doc,
tab2.dv,
tab2.id_mae_fondos,
tab2.codigo as codigo,
tab2.razon_social AS FONDO,

case 
when tab0.id_clase_fondo =1 and tab0.tipo_planilla = 'A' then tab0.aporte_func * (-1)
when tab0.id_clase_fondo =1 and tab0.tipo_planilla = 'C' then tab0.aporte_func
when tab0.id_clase_fondo = 2 then 0
when tab0.id_clase_fondo = 3 then 0
else 0 end as aporte_func_pension,

case 
when tab0.id_clase_fondo =1 and tab0.tipo_planilla = 'A' then tab0.aporte_patrono  * (-1)
when tab0.id_clase_fondo =1 and tab0.tipo_planilla = 'C' then tab0.aporte_patrono
when tab0.id_clase_fondo = 2 then 0
when tab0.id_clase_fondo = 3 then 0
else 0 end as aporte_patrono_pension,

case 
when tab0.id_clase_fondo =1 and tab0.tipo_planilla = 'A' then (tab0.aporte_patrono+tab0.aporte_func)  * (-1)
when tab0.id_clase_fondo =1 and tab0.tipo_planilla = 'C' then tab0.aporte_patrono+tab0.aporte_func
when tab0.id_clase_fondo = 2 then 0
when tab0.id_clase_fondo = 3 then 0
else 0 end AS TOTAL_PENSION,

case 
when tab0.id_clase_fondo =1 then 0
when tab0.id_clase_fondo = 2 and tab0.tipo_planilla = 'A' then tab0.aporte_func  * (-1)
when tab0.id_clase_fondo = 2 and tab0.tipo_planilla = 'C' then tab0.aporte_func
when tab0.id_clase_fondo = 3 then 0
else 0 end as aporte_func_salud,

case 
when tab0.id_clase_fondo =1 then 0
when tab0.id_clase_fondo = 2 and tab0.tipo_planilla = 'A' then tab0.aporte_patrono  * (-1)
when tab0.id_clase_fondo = 2 and tab0.tipo_planilla = 'C' then tab0.aporte_patrono
when tab0.id_clase_fondo = 3 then 0
else 0 end as aporte_patrono_salud,

case 
when tab0.id_clase_fondo =1 then 0
when tab0.id_clase_fondo = 2 and tab0.tipo_planilla = 'A' then (tab0.aporte_patrono+tab0.aporte_func+tab0.upc_adicio)  * (-1)
when tab0.id_clase_fondo = 2 and tab0.tipo_planilla = 'C' then tab0.aporte_patrono+tab0.aporte_func+tab0.upc_adicio
when tab0.id_clase_fondo = 3 then 0
else 0 end AS TOTAL_SALUD,

case 
when tab0.id_clase_fondo =1 then 0
when tab0.id_clase_fondo = 2 and tab0.tipo_planilla = 'A' then tab0.upc_adicio * (-1)
when tab0.id_clase_fondo = 2 and tab0.tipo_planilla = 'C' then tab0.upc_adicio
when tab0.id_clase_fondo = 3 then 0
else 0 end AS UPC_ADICIO,

case 
when tab0.id_clase_fondo =1 then 0
when tab0.id_clase_fondo = 2 then 0
when tab0.id_clase_fondo = 3 and tab0.tipo_planilla = 'A' then tab0.aporte_patrono * (-1)
when tab0.id_clase_fondo = 3 and tab0.tipo_planilla = 'C' then tab0.aporte_patrono
else 0 end AS APORTE_PATRONO_ARP,

case 
when tab0.id_clase_fondo =1 then 0
when tab0.id_clase_fondo = 2 then 0
when tab0.id_clase_fondo = 3 and tab0.tipo_planilla = 'A' then tab0.aporte_patrono * (-1)
when tab0.id_clase_fondo = 3 and tab0.tipo_planilla = 'C' then tab0.aporte_patrono
else 0 end AS TOTAL_ARP,

case when tab0.id_clase_fondo =1 then 0
when tab0.id_clase_fondo = 2 then 0
when tab0.id_clase_fondo = 3 then 0
when tab0.tipo_planilla = 'A' then tab0.aporte_patrono * (-1)
else tab0.aporte_patrono end AS PARAFISCALES


from no_liquida_aporte tab0

join no_periodo tab4
on tab4.id_periodo = tab0.id_periodo

left join no_mae_fondos tab2 ON tab2.id_mae_fondos = tab0.id_mae_fondos

where tab0.tipo_planilla in ( 'C' )
$whereFuncionarioNumDoc
$whereFuncionarioTipoDoc
and tab0.id_periodo in ($per_filtro)
                
    
)tab3

)tab0

left join interceros_du_dir_v ter
on ter.num_doc = to_char(tab0.num_doc)

left join departamentos dep
on dep.coddepto = ter.copdepto

where tab0.id_anhos = $id_anhos 

group by tab0.id_clase_fondo, tab0.id_mae_fondos, tab0.codigo, tab0.fondo,
tab0.num_doc, 
tab0.dv,
tab0.direccion,
ter.copdepto,
dep.desdepto

) 
EOD;
        //ejecuta y obtiene el resultado del sql
        CN_TABLE::executeSQL($sql);
    }

    /**
     * Calcular viaticos de la tabla pr_legalizacion_comis - 20150212
     * @param type $id_anhos
     * @param type $fecha_ini
     * @param type $fecha_fin
     * @param type $num_doc
     * @param type $whereFuncionarioNumDoc
     * @param type $id_tipo_doc
     * @param type $whereFuncionarioTipoDoc
     * @param type $agrup
     * @param type $agrupOrden
     * @param type $whereTipoConcepto
     */
    private function generarViaticos($id_anhos, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $agrup, $agrupOrden, $whereTipoConcepto) {

        /**
         * Se adiciona filtro de viaticos, para que tome solo de TS_CP, las que aplican viaticos - 20160307
         */
        //Sql
        $sql = <<<EOD
insert into no_certif_ingre_reten (id_certif_ingre_reten,id_tipo_doc,num_doc,id_anhos,id_concep_nomina,valor_enero,valor_febrero,valor_marzo,
valor_abril,valor_mayo,valor_junio,valor_julio,valor_agosto,valor_septiembre,valor_octubre,valor_noviembre,valor_diciembre,valor_total,agrupacion_orden,
    usuario_gen,fecha_gen)  

(
                
    select 
    null as id_certif_ingre_reten,
    id_tipo_doc,
    num_doc,
    id_anhos,
    id_concep_nomina,

    sum( valor_enero) as valor_enero,
    sum( valor_febrero) as valor_febrero,
    sum( valor_marzo) as valor_marzo,
    sum( valor_abril) as valor_abril,
    sum( valor_mayo) as valor_mayo,
    sum( valor_junio) as valor_junio,
    sum( valor_julio) as valor_julio,
    sum( valor_agosto) as valor_agosto,
    sum( valor_septiembre) as valor_septiembre,
    sum( valor_octubre) as valor_octubre,
    sum( valor_noviembre) as valor_noviembre,
    sum( valor_diciembre) as valor_diciembre,

    sum( valor_total) as valor_total,

    nvl( $agrupOrden ,0) as agrupacion_orden,
                
    $this->usuario_gen as usuario_gen,
    sysdate as fecha_gen 

    from (
        select 

        dat.id_tipo_doc,
        to_number(dat.num_doc) as num_doc,
        $id_anhos as id_anhos,
        (select no_param_concep.id_concep_viatico from no_param_concep where no_param_concep.id_param_concep = 1) as id_concep_nomina,
        leg.* ,

        nvl( case when EXTRACT(month FROM leg.fecha_gasto) = 1 then nvl( leg.v_bruto ,0) + nvl( leg.v_iva ,0) else null end ,0) as valor_enero,
        nvl( case when EXTRACT(month FROM leg.fecha_gasto) = 2 then nvl( leg.v_bruto ,0) + nvl( leg.v_iva ,0) else null end ,0) as valor_febrero,
        nvl( case when EXTRACT(month FROM leg.fecha_gasto) = 3 then nvl( leg.v_bruto ,0) + nvl( leg.v_iva ,0) else null end ,0) as valor_marzo,
        nvl( case when EXTRACT(month FROM leg.fecha_gasto) = 4 then nvl( leg.v_bruto ,0) + nvl( leg.v_iva ,0) else null end ,0) as valor_abril,
        nvl( case when EXTRACT(month FROM leg.fecha_gasto) = 5 then nvl( leg.v_bruto ,0) + nvl( leg.v_iva ,0) else null end ,0) as valor_mayo,
        nvl( case when EXTRACT(month FROM leg.fecha_gasto) = 6 then nvl( leg.v_bruto ,0) + nvl( leg.v_iva ,0) else null end ,0) as valor_junio,
        nvl( case when EXTRACT(month FROM leg.fecha_gasto) = 7 then nvl( leg.v_bruto ,0) + nvl( leg.v_iva ,0) else null end ,0) as valor_julio,
        nvl( case when EXTRACT(month FROM leg.fecha_gasto) = 8 then nvl( leg.v_bruto ,0) + nvl( leg.v_iva ,0) else null end ,0) as valor_agosto,
        nvl( case when EXTRACT(month FROM leg.fecha_gasto) = 9 then nvl( leg.v_bruto ,0) + nvl( leg.v_iva ,0) else null end ,0) as valor_septiembre,
        nvl( case when EXTRACT(month FROM leg.fecha_gasto) = 10 then nvl( leg.v_bruto ,0) + nvl( leg.v_iva ,0) else null end ,0) as valor_octubre,
        nvl( case when EXTRACT(month FROM leg.fecha_gasto) = 11 then nvl( leg.v_bruto ,0) + nvl( leg.v_iva ,0) else null end ,0) as valor_noviembre,
        nvl( case when EXTRACT(month FROM leg.fecha_gasto) = 12 then nvl( leg.v_bruto ,0) + nvl( leg.v_iva ,0) else null end ,0) as valor_diciembre,
        nvl( leg.v_bruto ,0) + nvl( leg.v_iva ,0) as valor_total

        from pr_legalizacion_comis leg

        left join pr_elementos_gasto ele
        on leg.id_elementos_gasto = ele.id_elementos_gasto

        join interceros_v ter
        on ter.id_mae_ter = leg.id_tercero

        join datos_funcionario dat
        on dat.num_doc = ter.num_doc
        
        LEFT JOIN TS_OBLIGACION obl 
        ON LEG.ID_RP_COMIS =obl.id_rp 
        and leg.secuencia =obl.secuencia 
        and leg.vigencia = obl.ano_fiscal
        and leg.id_vigencia = obl.id_vigencia
        and obl.estado in (1,2)
        
        LEFT JOIN TS_CP clase 
        ON obl.id_clase_cxp = clase.id_cp

        where
        1 = 1 
        and clase.viatico = 1
        and ele.id_concep_nomina in (select no_param_concep.id_concep_viatico from no_param_concep where no_param_concep.id_param_concep = 1)

        and (
        leg.fecha_gasto between to_date('$fecha_ini','yyyy-mm-dd') and to_date('$fecha_fin','yyyy-mm-dd') 
        )
    )tab0     
    where
    1 = 1
    $whereFuncionarioNumDoc $whereFuncionarioTipoDoc

    group by
    tab0.id_tipo_doc,
    tab0.num_doc,
    tab0.id_anhos,
    tab0.id_concep_nomina

)
EOD;
        //Ejecutar SQL
        CN_TABLE::executeSQL($sql);


        /**
         * Viaticos personas al exterior
         */
        //Sql
        $sql = <<<EOD
insert into no_certif_ingre_reten (id_certif_ingre_reten,id_tipo_doc,num_doc,id_anhos,id_concep_nomina,valor_enero,valor_febrero,valor_marzo,
valor_abril,valor_mayo,valor_junio,valor_julio,valor_agosto,valor_septiembre,valor_octubre,valor_noviembre,valor_diciembre,valor_total,agrupacion_orden,
    usuario_gen,fecha_gen)  

(
                
    select 
    null as id_certif_ingre_reten,
    id_tipo_doc,
    num_doc,
    id_anhos,
    id_concep_nomina,

    sum( valor_enero) as valor_enero,
    sum( valor_febrero) as valor_febrero,
    sum( valor_marzo) as valor_marzo,
    sum( valor_abril) as valor_abril,
    sum( valor_mayo) as valor_mayo,
    sum( valor_junio) as valor_junio,
    sum( valor_julio) as valor_julio,
    sum( valor_agosto) as valor_agosto,
    sum( valor_septiembre) as valor_septiembre,
    sum( valor_octubre) as valor_octubre,
    sum( valor_noviembre) as valor_noviembre,
    sum( valor_diciembre) as valor_diciembre,

    sum( valor_total) as valor_total,

    nvl( $agrupOrden ,0) as agrupacion_orden,
                
    $this->usuario_gen as usuario_gen,
    sysdate as fecha_gen

    from (
            select 

            dat.id_tipo_doc,
            to_number(dat.num_doc) as num_doc,
            $id_anhos as id_anhos,
            (select no_param_concep.id_concep_viatico from no_param_concep where no_param_concep.id_param_concep = 1) as id_concep_nomina,
            pag.* ,

           nvl( case when EXTRACT(month FROM emi.fecha_proc) = 1 then nvl( pag.valor ,0)-nvl(reint.valor,0) else null end ,0) as valor_enero,
            nvl( case when EXTRACT(month FROM emi.fecha_proc) = 2 then nvl( pag.valor ,0)-nvl(reint.valor,0) else null end ,0) as valor_febrero,
            nvl( case when EXTRACT(month FROM emi.fecha_proc) = 3 then nvl( pag.valor ,0)-nvl(reint.valor,0) else null end ,0) as valor_marzo,
            nvl( case when EXTRACT(month FROM emi.fecha_proc) = 4 then nvl( pag.valor ,0)-nvl(reint.valor,0) else null end ,0) as valor_abril,
            nvl( case when EXTRACT(month FROM emi.fecha_proc) = 5 then nvl( pag.valor ,0)-nvl(reint.valor,0) else null end ,0) as valor_mayo,
            nvl( case when EXTRACT(month FROM emi.fecha_proc) = 6 then nvl( pag.valor ,0)-nvl(reint.valor,0) else null end ,0) as valor_junio,
            nvl( case when EXTRACT(month FROM emi.fecha_proc) = 7 then nvl( pag.valor ,0)-nvl(reint.valor,0) else null end ,0) as valor_julio,
            nvl( case when EXTRACT(month FROM emi.fecha_proc) = 8 then nvl( pag.valor ,0)-nvl(reint.valor,0) else null end ,0) as valor_agosto,
            nvl( case when EXTRACT(month FROM emi.fecha_proc) = 9 then nvl( pag.valor ,0)-nvl(reint.valor,0) else null end ,0) as valor_septiembre,
            nvl( case when EXTRACT(month FROM emi.fecha_proc) = 10 then nvl( pag.valor ,0)-nvl(reint.valor,0) else null end ,0) as valor_octubre,
            nvl( case when EXTRACT(month FROM emi.fecha_proc) = 11 then nvl( pag.valor ,0)-nvl(reint.valor,0) else null end ,0) as valor_noviembre,
            nvl( case when EXTRACT(month FROM emi.fecha_proc) = 12 then nvl( pag.valor ,0)-nvl(reint.valor,0) else null end ,0) as valor_diciembre,
            nvl( pag.valor ,0) -nvl(reint.valor,0) as valor_total

            from ts_pago_obl pag

            left join ts_emision_pago emi
            on pag.id_emision_pago = emi.id_emision_pago

            left join ts_obligacion obl
            on obl.id_obligacion = pag.id_obligacion
            and obl.id_vigencia = pag.id_vigencia
            and obl.id_vigencia = pag.id_vigencia
            and obl.secuencia = pag.secuencia

            left join(
            
            select tab1.id_pago_obl,tab1.id_vigencia,tab1.vigencia,sum(tab0.VALOR) valor
            
            from pr_deta_rein tab0
            join PR_REINTEGRO tab1 ON tab1.id_reintegro = tab0.id_reintegro and tab1.estado is null 
            group by tab1.id_pago_obl, tab1.id_vigencia, tab1.vigencia
            ) reint ON reint.id_pago_obl = pag.id_pago_obl and reint.id_vigencia = pag.id_vigencia and reint.vigencia = pag.vigencia    
                
            left join ts_cp cp
            on cp.id_cp = obl.id_clase_cxp

            join interceros_v ter
            on ter.id_mae_ter = pag.id_tercero

            join datos_funcionario dat
            on dat.num_doc = ter.num_doc

            where
            1 = 1 
            and pag.id_clase_pago is null
            and pag.estado is null
            and cp.id_concep_nomina in (select no_param_concep.id_concep_viatico from no_param_concep where no_param_concep.id_param_concep = 1)
            and (
            emi.fecha_proc between to_date('$fecha_ini','yyyy-mm-dd') and to_date('$fecha_fin','yyyy-mm-dd') 
            )
    )tab0     
    where
    1 = 1
    $whereFuncionarioNumDoc $whereFuncionarioTipoDoc

    group by
    tab0.id_tipo_doc,
    tab0.num_doc,
    tab0.id_anhos,
    tab0.id_concep_nomina

)
EOD;
        //Ejecutar SQL
        CN_TABLE::executeSQL($sql);

        /*
         * Consulta para los viaticos de SGR
         */
        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++;
            }
            if ($entidadCliente == 1 || $entidadCliente == 2 || $entidadCliente == 7) {

                $usuario_bd = 'ERP_SGR';
//                //Sql
//                $sql = <<<EOD
//select distinct owner from dba_objects where OWNER = '$usuario_bd'  
//EOD;
//                //Ejecutar SQL
//                $result = CN_TABLE::executeSQL($sql);
//                //valida si esta el usuario en la base de datos
//                if (count($result) > 0) {

                /**
                 * Viaticos funcionarios
                 */
                //Sql
                $sql = <<<EOD
insert into no_certif_ingre_reten (id_certif_ingre_reten,id_tipo_doc,num_doc,id_anhos,id_concep_nomina,valor_enero,valor_febrero,valor_marzo,
valor_abril,valor_mayo,valor_junio,valor_julio,valor_agosto,valor_septiembre,valor_octubre,valor_noviembre,valor_diciembre,valor_total,agrupacion_orden,
    usuario_gen,fecha_gen) 

(
                
    select 
    null as id_certif_ingre_reten,
    id_tipo_doc,
    num_doc,
    id_anhos,
    id_concep_nomina,

    sum( valor_enero) as valor_enero,
    sum( valor_febrero) as valor_febrero,
    sum( valor_marzo) as valor_marzo,
    sum( valor_abril) as valor_abril,
    sum( valor_mayo) as valor_mayo,
    sum( valor_junio) as valor_junio,
    sum( valor_julio) as valor_julio,
    sum( valor_agosto) as valor_agosto,
    sum( valor_septiembre) as valor_septiembre,
    sum( valor_octubre) as valor_octubre,
    sum( valor_noviembre) as valor_noviembre,
    sum( valor_diciembre) as valor_diciembre,

    sum( valor_total) as valor_total,

    nvl( $agrupOrden ,0) as agrupacion_orden,
                
    $this->usuario_gen as usuario_gen,
    sysdate as fecha_gen 

    from (
        select 

        dat.id_tipo_doc,
        to_number(dat.num_doc) as num_doc,
        $id_anhos as id_anhos,
        (select no_param_concep.id_concep_viatico from no_param_concep where no_param_concep.id_param_concep = 1) as id_concep_nomina,
        leg.* ,

        nvl( case when EXTRACT(month FROM leg.fecha_gasto) = 1 then nvl( leg.v_bruto ,0) + nvl( leg.v_iva ,0) else null end ,0) as valor_enero,
        nvl( case when EXTRACT(month FROM leg.fecha_gasto) = 2 then nvl( leg.v_bruto ,0) + nvl( leg.v_iva ,0) else null end ,0) as valor_febrero,
        nvl( case when EXTRACT(month FROM leg.fecha_gasto) = 3 then nvl( leg.v_bruto ,0) + nvl( leg.v_iva ,0) else null end ,0) as valor_marzo,
        nvl( case when EXTRACT(month FROM leg.fecha_gasto) = 4 then nvl( leg.v_bruto ,0) + nvl( leg.v_iva ,0) else null end ,0) as valor_abril,
        nvl( case when EXTRACT(month FROM leg.fecha_gasto) = 5 then nvl( leg.v_bruto ,0) + nvl( leg.v_iva ,0) else null end ,0) as valor_mayo,
        nvl( case when EXTRACT(month FROM leg.fecha_gasto) = 6 then nvl( leg.v_bruto ,0) + nvl( leg.v_iva ,0) else null end ,0) as valor_junio,
        nvl( case when EXTRACT(month FROM leg.fecha_gasto) = 7 then nvl( leg.v_bruto ,0) + nvl( leg.v_iva ,0) else null end ,0) as valor_julio,
        nvl( case when EXTRACT(month FROM leg.fecha_gasto) = 8 then nvl( leg.v_bruto ,0) + nvl( leg.v_iva ,0) else null end ,0) as valor_agosto,
        nvl( case when EXTRACT(month FROM leg.fecha_gasto) = 9 then nvl( leg.v_bruto ,0) + nvl( leg.v_iva ,0) else null end ,0) as valor_septiembre,
        nvl( case when EXTRACT(month FROM leg.fecha_gasto) = 10 then nvl( leg.v_bruto ,0) + nvl( leg.v_iva ,0) else null end ,0) as valor_octubre,
        nvl( case when EXTRACT(month FROM leg.fecha_gasto) = 11 then nvl( leg.v_bruto ,0) + nvl( leg.v_iva ,0) else null end ,0) as valor_noviembre,
        nvl( case when EXTRACT(month FROM leg.fecha_gasto) = 12 then nvl( leg.v_bruto ,0) + nvl( leg.v_iva ,0) else null end ,0) as valor_diciembre,
        nvl( leg.v_bruto ,0) + nvl( leg.v_iva ,0) as valor_total

        from $usuario_bd.pr_legalizacion_comis leg

        left join pr_elementos_gasto ele
        on leg.id_elementos_gasto = ele.id_elementos_gasto

        join $usuario_bd.interceros_v ter
        on ter.id_mae_ter = leg.id_tercero

        join datos_funcionario dat
        on dat.num_doc = ter.num_doc

        where
        1 = 1 
        and ele.id_concep_nomina in (select no_param_concep.id_concep_viatico from no_param_concep where no_param_concep.id_param_concep = 1)

        and (
        leg.fecha_gasto between to_date('$fecha_ini','yyyy-mm-dd') and to_date('$fecha_fin','yyyy-mm-dd') 
        )
    )tab0     
    where
    1 = 1
    $whereFuncionarioNumDoc $whereFuncionarioTipoDoc

    group by
    tab0.id_tipo_doc,
    tab0.num_doc,
    tab0.id_anhos,
    tab0.id_concep_nomina

)
EOD;
                //Ejecutar SQL
                CN_TABLE::executeSQL($sql);


                /**
                 * Viaticos personas al exterior
                 */
                //Sql
                $sql = <<<EOD
insert into no_certif_ingre_reten (id_certif_ingre_reten,id_tipo_doc,num_doc,id_anhos,id_concep_nomina,valor_enero,valor_febrero,valor_marzo,
valor_abril,valor_mayo,valor_junio,valor_julio,valor_agosto,valor_septiembre,valor_octubre,valor_noviembre,valor_diciembre,valor_total,agrupacion_orden,
    usuario_gen,fecha_gen)  

(
                
    select 
    null as id_certif_ingre_reten,
    id_tipo_doc,
    num_doc,
    id_anhos,
    id_concep_nomina,

    sum( valor_enero) as valor_enero,
    sum( valor_febrero) as valor_febrero,
    sum( valor_marzo) as valor_marzo,
    sum( valor_abril) as valor_abril,
    sum( valor_mayo) as valor_mayo,
    sum( valor_junio) as valor_junio,
    sum( valor_julio) as valor_julio,
    sum( valor_agosto) as valor_agosto,
    sum( valor_septiembre) as valor_septiembre,
    sum( valor_octubre) as valor_octubre,
    sum( valor_noviembre) as valor_noviembre,
    sum( valor_diciembre) as valor_diciembre,

    sum( valor_total) as valor_total,

    nvl( $agrupOrden ,0) as agrupacion_orden,
                
    $this->usuario_gen as usuario_gen,
    sysdate as fecha_gen 

    from (
            select 

            dat.id_tipo_doc,
            to_number(dat.num_doc) as num_doc,
            $id_anhos as id_anhos,
            (select no_param_concep.id_concep_viatico from no_param_concep where no_param_concep.id_param_concep = 1) as id_concep_nomina,
            pag.* ,

            nvl( case when EXTRACT(month FROM emi.fecha_proc) = 1 then nvl( pag.valor ,0)-nvl(reint.valor,0) else null end ,0) as valor_enero,
            nvl( case when EXTRACT(month FROM emi.fecha_proc) = 2 then nvl( pag.valor ,0)-nvl(reint.valor,0) else null end ,0) as valor_febrero,
            nvl( case when EXTRACT(month FROM emi.fecha_proc) = 3 then nvl( pag.valor ,0)-nvl(reint.valor,0) else null end ,0) as valor_marzo,
            nvl( case when EXTRACT(month FROM emi.fecha_proc) = 4 then nvl( pag.valor ,0)-nvl(reint.valor,0) else null end ,0) as valor_abril,
            nvl( case when EXTRACT(month FROM emi.fecha_proc) = 5 then nvl( pag.valor ,0)-nvl(reint.valor,0) else null end ,0) as valor_mayo,
            nvl( case when EXTRACT(month FROM emi.fecha_proc) = 6 then nvl( pag.valor ,0)-nvl(reint.valor,0) else null end ,0) as valor_junio,
            nvl( case when EXTRACT(month FROM emi.fecha_proc) = 7 then nvl( pag.valor ,0)-nvl(reint.valor,0) else null end ,0) as valor_julio,
            nvl( case when EXTRACT(month FROM emi.fecha_proc) = 8 then nvl( pag.valor ,0)-nvl(reint.valor,0) else null end ,0) as valor_agosto,
            nvl( case when EXTRACT(month FROM emi.fecha_proc) = 9 then nvl( pag.valor ,0)-nvl(reint.valor,0) else null end ,0) as valor_septiembre,
            nvl( case when EXTRACT(month FROM emi.fecha_proc) = 10 then nvl( pag.valor ,0)-nvl(reint.valor,0) else null end ,0) as valor_octubre,
            nvl( case when EXTRACT(month FROM emi.fecha_proc) = 11 then nvl( pag.valor ,0)-nvl(reint.valor,0) else null end ,0) as valor_noviembre,
            nvl( case when EXTRACT(month FROM emi.fecha_proc) = 12 then nvl( pag.valor ,0)-nvl(reint.valor,0) else null end ,0) as valor_diciembre,
            nvl( pag.valor ,0) -nvl(reint.valor,0) as valor_total

            from $usuario_bd.ts_pago_obl pag

            left join $usuario_bd.ts_emision_pago emi
            on pag.id_emision_pago = emi.id_emision_pago

            left join $usuario_bd.ts_obligacion obl
            on obl.id_obligacion = pag.id_obligacion
            and obl.id_vigencia = pag.id_vigencia
            and obl.id_vigencia = pag.id_vigencia
            and obl.secuencia = pag.secuencia

            left join(
            
            select tab1.id_pago_obl,tab1.id_vigencia,tab1.vigencia,sum(tab0.VALOR) valor
            
            from $usuario_bd.pr_deta_rein tab0
            join $usuario_bd.PR_REINTEGRO tab1 ON tab1.id_reintegro = tab0.id_reintegro and tab1.estado is null 
            group by tab1.id_pago_obl, tab1.id_vigencia, tab1.vigencia
            ) reint ON reint.id_pago_obl = pag.id_pago_obl and reint.id_vigencia = pag.id_vigencia and reint.vigencia = pag.vigencia            
                        
            left join ts_cp cp
            on cp.id_cp = obl.id_clase_cxp

            join interceros_v ter
            on ter.id_mae_ter = pag.id_tercero

            join datos_funcionario dat
            on dat.num_doc = ter.num_doc

            where
            1 = 1 
            and pag.id_clase_pago is null
            and pag.estado is null
            and cp.id_concep_nomina in (select no_param_concep.id_concep_viatico from no_param_concep where no_param_concep.id_param_concep = 1)
            and (
            emi.fecha_proc between to_date('$fecha_ini','yyyy-mm-dd') and to_date('$fecha_fin','yyyy-mm-dd') 
            )
    )tab0     
    where
    1 = 1
    $whereFuncionarioNumDoc $whereFuncionarioTipoDoc

    group by
    tab0.id_tipo_doc,
    tab0.num_doc,
    tab0.id_anhos,
    tab0.id_concep_nomina

)
EOD;
                //Ejecutar SQL
                CN_TABLE::executeSQL($sql);
//                } else {
//                    $this->logMessage("[generar_certif_ingre_reten Exception] No existe el usuario BD :: " . $usuario_bd);
//                }
            } else {
                $this->logMessage("[generar_certif_ingre_reten Exception] No aplica para la compañia ");
            }
        } catch (Exception $e) {
            //ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
            //$this->conn->rollback();
            //$this->logMessage("[actualizarSueldos Exception] ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR.");
            $this->logMessage("[generar_certif_ingre_reten Exception] " . $e->getMessage());
        } catch (PDOException $e) {
            //$this->conn->rollback();
            //$this->logMessage("[actualizarSueldos PDOException] ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR.");
            $this->logMessage("[generar_certif_ingre_reten PDOException] " . $e->getMessage());
        }
    }

    /**
     * Registra los datos en NO_CERTIF_INGRE_RETEN por agrupacion DE LAS CESANTIAS
     * 
     * @param type $id_anhos
     * @param type $fecha_ini
     * @param type $fecha_fin
     * @param type $num_doc
     * @param type $whereFuncionarioNumDoc
     * @param type $id_tipo_doc
     * @param type $whereFuncionarioTipoDoc
     * @param type $agrup
     */
    private function generarCes($id_anhos, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $agrup, $agrupOrden, $whereTipoConcepto) {

        $this->logMessage("[generar_certif_ingre_reten] Agrupación CES: " . $agrup);

        $whereAgrup = " ";
        if ($agrup != 0) {
            $whereAgrup = "and tab0.id_concep_nomina in (
                select distinct id_concep_nomina from no_agrup_deta
                where id_agrup_concepto = $agrup
                )";
        }

        /*
         * insert into no_certif_ingre_reten (id_certif_ingre_reten,id_tipo_doc,num_doc,
         * id_anhos,id_concep_nomina,valor_enero,valor_febrero,valor_marzo,valor_abril,
         * valor_mayo,valor_junio,valor_julio,valor_agosto,valor_septiembre,
         * valor_octubre,valor_noviembre,valor_diciembre,valor_total,agrupacion_orden) 
         * values ('8','1','1016057202','2013','62','5','8','4','6','5','49',
         * '4','4','54','9','8','0','30','2');
         */
        /**
         * CERTIFICADO DE INGRESOS Y RETENCIONES,   para cuando se selecciones  CESANTIAS PAGADAS,   tomar:
         * NO_CESANTIA:    CONSOLIDADO=0        suma del campo   VALOR_CONSOLIDADO. - 20140821
         */
        //Sql
        $sql = <<<EOD
insert into no_certif_ingre_reten (id_certif_ingre_reten,id_tipo_doc,num_doc,id_anhos,id_concep_nomina,valor_enero,valor_febrero,valor_marzo,
valor_abril,valor_mayo,valor_junio,valor_julio,valor_agosto,valor_septiembre,valor_octubre,valor_noviembre,valor_diciembre,valor_total,agrupacion_orden,
    usuario_gen,fecha_gen)  

(



select 
null as id_certif_ingre_reten,
id_tipo_doc,
num_doc,
id_anhos,
id_concep_nomina,

sum( valor_enero) as valor_enero,
sum( valor_febrero) as valor_febrero,
sum( valor_marzo) as valor_marzo,
sum( valor_abril) as valor_abril,
sum( valor_mayo) as valor_mayo,
sum( valor_junio) as valor_junio,
sum( valor_julio) as valor_julio,
sum( valor_agosto) as valor_agosto,
sum( valor_septiembre) as valor_septiembre,
sum( valor_octubre) as valor_octubre,
sum( valor_noviembre) as valor_noviembre,
sum( valor_diciembre) as valor_diciembre,

sum( valor_total) as valor_total,

nvl( $agrupOrden ,0) as agrupacion_orden,
                
$this->usuario_gen as usuario_gen,
sysdate as fecha_gen 

from (

select 
tab0.id_tipo_doc,
tab0.num_doc,
$id_anhos as id_anhos,
tab0.id_concep_nomina,

nvl( case when per.id_meses = 1 then tab0.valor_consolidado else null end ,0) as valor_enero,
nvl( case when per.id_meses = 2 then tab0.valor_consolidado else null end ,0) as valor_febrero,
nvl( case when per.id_meses = 3 then tab0.valor_consolidado else null end ,0) as valor_marzo,
nvl( case when per.id_meses = 4 then tab0.valor_consolidado else null end ,0) as valor_abril,
nvl( case when per.id_meses = 5 then tab0.valor_consolidado else null end ,0) as valor_mayo,
nvl( case when per.id_meses = 6 then tab0.valor_consolidado else null end ,0) as valor_junio,
nvl( case when per.id_meses = 7 then tab0.valor_consolidado else null end ,0) as valor_julio,
nvl( case when per.id_meses = 8 then tab0.valor_consolidado else null end ,0) as valor_agosto,
nvl( case when per.id_meses = 9 then tab0.valor_consolidado else null end ,0) as valor_septiembre,
nvl( case when per.id_meses = 10 then tab0.valor_consolidado else null end ,0) as valor_octubre,
nvl( case when per.id_meses = 11 then tab0.valor_consolidado else null end ,0) as valor_noviembre,
nvl( case when per.id_meses = 12 then tab0.valor_consolidado else null end ,0) as valor_diciembre,
nvl( tab0.valor_consolidado ,0) as valor_total

from no_cesantia tab0

join no_concep_nomina concep
on tab0.id_concep_nomina = concep.id_concep_nomina

join no_periodo_v per
on tab0.id_periodo = per.id_periodo
and per.id_anhos = $id_anhos

where
1 = 1 
and tab0.consolidado in (0,2)
$whereFuncionarioNumDoc $whereFuncionarioTipoDoc
$whereTipoConcepto  

and (
per.fecha_ini between to_date('$fecha_ini','yyyy-mm-dd') and to_date('$fecha_fin','yyyy-mm-dd') 
or
per.fecha_fin between to_date('$fecha_ini','yyyy-mm-dd') and to_date('$fecha_fin','yyyy-mm-dd') 
)

$whereAgrup

)

group by
id_tipo_doc,
num_doc,
id_anhos,
id_concep_nomina

)
EOD;
        //Ejecutar SQL
        CN_TABLE::executeSQL($sql);
    }

    /**
     * Registra los datos en NO_CERTIF_INGRE_RETEN_INF por agrupacion DE LAS CESANTIAS
     * Concsolidado cesantias anual, agrupacion de no_param_concep - 20150226
     * Se agrega no_nombramiento_v para no tener encuenta si se retiro en el primer dia del año siguiente, o no tiene fecha de retiro - 20230328::LAVILA
     * 
     * @param type $id_anhos
     * @param type $fecha_ini
     * @param type $fecha_fin
     * @param type $num_doc
     * @param type $whereFuncionarioNumDoc
     * @param type $id_tipo_doc
     * @param type $whereFuncionarioTipoDoc
     * @param type $agrup
     */
    private function generarCesAnual($id_anhos, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $agrup, $agrupOrden, $whereTipoConcepto) {

        $this->logMessage("[generar_certif_ingre_reten_inf] Agrupación CES: " . $agrup);

        $whereAgrup = " ";
        if ($agrup != 0) {
            $whereAgrup = "and tab0.id_concep_nomina in (
                select distinct id_concep_nomina from no_agrup_deta
                where id_agrup_concepto = (select id_agrup_cesanu from no_param_concep where id_param_concep = 1)
                )";
        }

        //CEV, Para la privada se toma consolidadas del año anterior - 20220314::LAVILA
        //Se agrega entidad 1-SGC - 20230328::LAVILA
        $tag_anhos = '';
        if ($this->entidadCliente_tag == 8 || $this->entidadCliente_tag == 1) {
            $tag_anhos = '- 1';
            $fecha_ini = str_replace($id_anhos, ($id_anhos - 1), $fecha_ini);
            $fecha_fin = str_replace($id_anhos, ($id_anhos - 1), $fecha_fin);
        }

        /*
         * insert into no_certif_ingre_reten_inf (id_certif_ingre_reten_inf,id_tipo_doc,num_doc,
         * id_anhos,id_concep_nomina,valor_enero,valor_febrero,valor_marzo,valor_abril,
         * valor_mayo,valor_junio,valor_julio,valor_agosto,valor_septiembre,
         * valor_octubre,valor_noviembre,valor_diciembre,valor_total,agrupacion_orden) 
         * values ('8','1','1016057202','2013','62','5','8','4','6','5','49',
         * '4','4','54','9','8','0','30','2');
         */
        //Sql
        $sql = <<<EOD
insert into no_certif_ingre_reten (id_certif_ingre_reten,id_tipo_doc,num_doc,id_anhos,id_concep_nomina,valor_enero,valor_febrero,valor_marzo,
valor_abril,valor_mayo,valor_junio,valor_julio,valor_agosto,valor_septiembre,valor_octubre,valor_noviembre,valor_diciembre,valor_total,agrupacion_orden,
    usuario_gen,fecha_gen)  

(



select 
null as id_certif_ingre_reten,
id_tipo_doc,
num_doc,
id_anhos,
id_concep_nomina,

sum( valor_enero) as valor_enero,
sum( valor_febrero) as valor_febrero,
sum( valor_marzo) as valor_marzo,
sum( valor_abril) as valor_abril,
sum( valor_mayo) as valor_mayo,
sum( valor_junio) as valor_junio,
sum( valor_julio) as valor_julio,
sum( valor_agosto) as valor_agosto,
sum( valor_septiembre) as valor_septiembre,
sum( valor_octubre) as valor_octubre,
sum( valor_noviembre) as valor_noviembre,
sum( valor_diciembre) as valor_diciembre,

sum( valor_total) as valor_total,

nvl( $agrupOrden ,0) as agrupacion_orden,
                
$this->usuario_gen as usuario_gen,
sysdate as fecha_gen 

from (

    select 
    tab0.id_tipo_doc,
    tab0.num_doc,
    $id_anhos as id_anhos,
    tab0.id_concep_nomina,

    nvl( case when per.id_meses = 1 then tab0.valor_consolidado else null end ,0) as valor_enero,
    nvl( case when per.id_meses = 2 then tab0.valor_consolidado else null end ,0) as valor_febrero,
    nvl( case when per.id_meses = 3 then tab0.valor_consolidado else null end ,0) as valor_marzo,
    nvl( case when per.id_meses = 4 then tab0.valor_consolidado else null end ,0) as valor_abril,
    nvl( case when per.id_meses = 5 then tab0.valor_consolidado else null end ,0) as valor_mayo,
    nvl( case when per.id_meses = 6 then tab0.valor_consolidado else null end ,0) as valor_junio,
    nvl( case when per.id_meses = 7 then tab0.valor_consolidado else null end ,0) as valor_julio,
    nvl( case when per.id_meses = 8 then tab0.valor_consolidado else null end ,0) as valor_agosto,
    nvl( case when per.id_meses = 9 then tab0.valor_consolidado else null end ,0) as valor_septiembre,
    nvl( case when per.id_meses = 10 then tab0.valor_consolidado else null end ,0) as valor_octubre,
    nvl( case when per.id_meses = 11 then tab0.valor_consolidado else null end ,0) as valor_noviembre,
    nvl( case when per.id_meses = 12 then tab0.valor_consolidado else null end ,0) as valor_diciembre,
    nvl( tab0.valor_consolidado ,0) as valor_total

    from no_cesantia tab0

    left join no_nombramiento_v nom
    on nom.num_doc = tab0.num_doc and nom.id_tipo_doc = tab0.id_tipo_doc

    join no_concep_nomina concep
    on tab0.id_concep_nomina = concep.id_concep_nomina

    join no_periodo_v per
    on tab0.id_periodo = per.id_periodo
    and per.id_anhos = $id_anhos $tag_anhos

    where
    1 = 1 
    and tab0.consolidado = 1 
    and nom.rn = 1
    $whereFuncionarioNumDoc $whereFuncionarioTipoDoc
    $whereTipoConcepto  

    and (
    per.fecha_ini between to_date('$fecha_ini','yyyy-mm-dd') and to_date('$fecha_fin','yyyy-mm-dd') 
    or
    per.fecha_fin between to_date('$fecha_ini','yyyy-mm-dd') and to_date('$fecha_fin','yyyy-mm-dd') 
    )
    and ( nom.fecha_retiro != to_date('$fecha_fin','yyyy-mm-dd') + 1 or nom.fecha_retiro is null )

    $whereAgrup

)

group by
id_tipo_doc,
num_doc,
id_anhos,
id_concep_nomina

)
EOD;
        //Ejecutar SQL
        CN_TABLE::executeSQL($sql);
    }

    /**
     * Registra los datos en NO_CERTIF_INGRE_RETEN por agrupacion
     * 
     * @param type $id_anhos
     * @param type $fecha_ini
     * @param type $fecha_fin
     * @param type $num_doc
     * @param type $whereFuncionarioNumDoc
     * @param type $id_tipo_doc
     * @param type $whereFuncionarioTipoDoc
     * @param type $agrup
     */
    private function generarConcepto($id_anhos, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $id_concepto, $agrupOrden, $whereTipoConcepto) {

        $this->logMessage("[generar_certif_ingre_reten] Concpetos: " . $id_concepto);

        $whereAgrup = " ";
        if ($id_concepto != 0) {
            $whereAgrup = "and tab0.id_concep_nomina in ( $id_concepto )";
        }

        /*
         * insert into no_certif_ingre_reten (id_certif_ingre_reten,id_tipo_doc,num_doc,
         * id_anhos,id_concep_nomina,valor_enero,valor_febrero,valor_marzo,valor_abril,
         * valor_mayo,valor_junio,valor_julio,valor_agosto,valor_septiembre,
         * valor_octubre,valor_noviembre,valor_diciembre,valor_total,agrupacion_orden) 
         * values ('8','1','1016057202','2013','62','5','8','4','6','5','49',
         * '4','4','54','9','8','0','30','2');
         */
        //Sql
        $sql = <<<EOD
insert into no_certif_ingre_reten (id_certif_ingre_reten,id_tipo_doc,num_doc,id_anhos,id_concep_nomina,valor_enero,valor_febrero,valor_marzo,
valor_abril,valor_mayo,valor_junio,valor_julio,valor_agosto,valor_septiembre,valor_octubre,valor_noviembre,valor_diciembre,valor_total,agrupacion_orden,
    usuario_gen,fecha_gen)  

(



select 
null as id_certif_ingre_reten,
id_tipo_doc,
num_doc,
id_anhos,
id_concep_nomina,

sum( valor_enero) as valor_enero,
sum( valor_febrero) as valor_febrero,
sum( valor_marzo) as valor_marzo,
sum( valor_abril) as valor_abril,
sum( valor_mayo) as valor_mayo,
sum( valor_junio) as valor_junio,
sum( valor_julio) as valor_julio,
sum( valor_agosto) as valor_agosto,
sum( valor_septiembre) as valor_septiembre,
sum( valor_octubre) as valor_octubre,
sum( valor_noviembre) as valor_noviembre,
sum( valor_diciembre) as valor_diciembre,

sum( valor_total) as valor_total,

nvl( $agrupOrden ,0) as agrupacion_orden,
                
$this->usuario_gen as usuario_gen,
sysdate as fecha_gen 

from (

select 
tab0.id_tipo_doc,
tab0.num_doc,
$id_anhos as id_anhos,
tab0.id_concep_nomina,

nvl( case when per.id_meses = 1 then tab0.valor_liquidado else null end ,0) as valor_enero,
nvl( case when per.id_meses = 2 then tab0.valor_liquidado else null end ,0) as valor_febrero,
nvl( case when per.id_meses = 3 then tab0.valor_liquidado else null end ,0) as valor_marzo,
nvl( case when per.id_meses = 4 then tab0.valor_liquidado else null end ,0) as valor_abril,
nvl( case when per.id_meses = 5 then tab0.valor_liquidado else null end ,0) as valor_mayo,
nvl( case when per.id_meses = 6 then tab0.valor_liquidado else null end ,0) as valor_junio,
nvl( case when per.id_meses = 7 then tab0.valor_liquidado else null end ,0) as valor_julio,
nvl( case when per.id_meses = 8 then tab0.valor_liquidado else null end ,0) as valor_agosto,
nvl( case when per.id_meses = 9 then tab0.valor_liquidado else null end ,0) as valor_septiembre,
nvl( case when per.id_meses = 10 then tab0.valor_liquidado else null end ,0) as valor_octubre,
nvl( case when per.id_meses = 11 then tab0.valor_liquidado else null end ,0) as valor_noviembre,
nvl( case when per.id_meses = 12 then tab0.valor_liquidado else null end ,0) as valor_diciembre,
nvl( tab0.valor_liquidado ,0) as valor_total

from no_liquida_nomina tab0

join no_concep_nomina concep
on tab0.id_concep_nomina = concep.id_concep_nomina

join no_periodo_v per
on tab0.id_periodo = per.id_periodo
and per.id_anhos = $id_anhos

where
1 = 1 
$whereFuncionarioNumDoc $whereFuncionarioTipoDoc
$whereTipoConcepto  

and (
per.fecha_ini between to_date('$fecha_ini','yyyy-mm-dd') and to_date('$fecha_fin','yyyy-mm-dd') 
or
per.fecha_fin between to_date('$fecha_ini','yyyy-mm-dd') and to_date('$fecha_fin','yyyy-mm-dd') 
)

$whereAgrup

)

group by
id_tipo_doc,
num_doc,
id_anhos,
id_concep_nomina

)
EOD;
        //Ejecutar SQL
        CN_TABLE::executeSQL($sql);
    }

    /**
     * Registra los datos en NO_CERTIF_INGRE_RETEN por agrupacion
     * 
     * @param type $id_anhos
     * @param type $fecha_ini
     * @param type $fecha_fin
     * @param type $num_doc
     * @param type $whereFuncionarioNumDoc
     * @param type $id_tipo_doc
     * @param type $whereFuncionarioTipoDoc
     * @param type $agrup
     */
    private function generar($id_anhos, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $agrup, $agrupOrden, $whereTipoConcepto) {

        $this->logMessage("[generar_certif_ingre_reten] Agrupación: " . $agrup);

        $whereAgrup = " ";
        if ($agrup != 0) {
            $whereAgrup = "and tab0.id_concep_nomina in (
                select distinct id_concep_nomina from no_agrup_deta
                where id_agrup_concepto = $agrup
                )";
        }

        /*
         * insert into no_certif_ingre_reten (id_certif_ingre_reten,id_tipo_doc,num_doc,
         * id_anhos,id_concep_nomina,valor_enero,valor_febrero,valor_marzo,valor_abril,
         * valor_mayo,valor_junio,valor_julio,valor_agosto,valor_septiembre,
         * valor_octubre,valor_noviembre,valor_diciembre,valor_total,agrupacion_orden) 
         * values ('8','1','1016057202','2013','62','5','8','4','6','5','49',
         * '4','4','54','9','8','0','30','2');
         */
        //Sql
        $sql = <<<EOD
insert into no_certif_ingre_reten (id_certif_ingre_reten,id_tipo_doc,num_doc,id_anhos,id_concep_nomina,valor_enero,valor_febrero,valor_marzo,
valor_abril,valor_mayo,valor_junio,valor_julio,valor_agosto,valor_septiembre,valor_octubre,valor_noviembre,valor_diciembre,valor_total,agrupacion_orden,
    usuario_gen,fecha_gen) 

(



select 
null as id_certif_ingre_reten,
id_tipo_doc,
num_doc,
id_anhos,
id_concep_nomina,

sum( valor_enero) as valor_enero,
sum( valor_febrero) as valor_febrero,
sum( valor_marzo) as valor_marzo,
sum( valor_abril) as valor_abril,
sum( valor_mayo) as valor_mayo,
sum( valor_junio) as valor_junio,
sum( valor_julio) as valor_julio,
sum( valor_agosto) as valor_agosto,
sum( valor_septiembre) as valor_septiembre,
sum( valor_octubre) as valor_octubre,
sum( valor_noviembre) as valor_noviembre,
sum( valor_diciembre) as valor_diciembre,

sum( valor_total) as valor_total,

nvl( $agrupOrden ,0) as agrupacion_orden,
                
$this->usuario_gen as usuario_gen,
sysdate as fecha_gen                

from (

select 
tab0.id_tipo_doc,
tab0.num_doc,
$id_anhos as id_anhos,
tab0.id_concep_nomina,

nvl( case when per.id_meses = 1 then tab0.valor_liquidado else null end ,0) as valor_enero,
nvl( case when per.id_meses = 2 then tab0.valor_liquidado else null end ,0) as valor_febrero,
nvl( case when per.id_meses = 3 then tab0.valor_liquidado else null end ,0) as valor_marzo,
nvl( case when per.id_meses = 4 then tab0.valor_liquidado else null end ,0) as valor_abril,
nvl( case when per.id_meses = 5 then tab0.valor_liquidado else null end ,0) as valor_mayo,
nvl( case when per.id_meses = 6 then tab0.valor_liquidado else null end ,0) as valor_junio,
nvl( case when per.id_meses = 7 then tab0.valor_liquidado else null end ,0) as valor_julio,
nvl( case when per.id_meses = 8 then tab0.valor_liquidado else null end ,0) as valor_agosto,
nvl( case when per.id_meses = 9 then tab0.valor_liquidado else null end ,0) as valor_septiembre,
nvl( case when per.id_meses = 10 then tab0.valor_liquidado else null end ,0) as valor_octubre,
nvl( case when per.id_meses = 11 then tab0.valor_liquidado else null end ,0) as valor_noviembre,
nvl( case when per.id_meses = 12 then tab0.valor_liquidado else null end ,0) as valor_diciembre,
nvl( tab0.valor_liquidado ,0) as valor_total

from no_liquida_nomina tab0

join no_concep_nomina concep
on tab0.id_concep_nomina = concep.id_concep_nomina

join no_periodo_v per
on tab0.id_periodo = per.id_periodo
and per.id_anhos = $id_anhos

where
1 = 1 
$whereFuncionarioNumDoc $whereFuncionarioTipoDoc
$whereTipoConcepto  

and (
per.fecha_ini between to_date('$fecha_ini','yyyy-mm-dd') and to_date('$fecha_fin','yyyy-mm-dd') 
or
per.fecha_fin between to_date('$fecha_ini','yyyy-mm-dd') and to_date('$fecha_fin','yyyy-mm-dd') 
)

$whereAgrup

)

group by
id_tipo_doc,
num_doc,
id_anhos,
id_concep_nomina

)
EOD;
        //Ejecutar SQL
        CN_TABLE::executeSQL($sql);
    }

    /**
     * Generar no formularios
     *
     * @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");
        }


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

        try {

            /*
             * Variables de filtro
             */
            $id_anhos = $request['id_anhos'];
            $fecha_ini = $request['fecha_ini'];
            $fecha_fin = $request['fecha_fin'];
            $fecha_expe = $request['fecha_expe'];
            $progress_key = $request['progress_key'] . $request['username'];
            $this->usuario_gen = $request['id_username'];

            //Funcionario num_doc
            $num_doc = null;
            $whereFuncionarioNumDoc = "";
            if (isset($request['num_doc'])) {
                $num_doc = $request['num_doc'];
                $whereFuncionarioNumDoc = " AND tab0.num_doc = " . $request['num_doc'];
            }
            //Funcionario id_tipo_doc 
            $id_tipo_doc = null;
            $whereFuncionarioTipoDoc = "";
            if (isset($request['id_tipo_doc'])) {
                $id_tipo_doc = $request['id_tipo_doc'];
                $whereFuncionarioTipoDoc = " AND tab0.id_tipo_doc = " . $request['id_tipo_doc'];
            }
            //Tipo Concepto
            $whereTipoConcepto = "";
            if (isset($request['id_tipo_concepto'])) {
                $whereTipoConcepto = " AND concep.id_tipo_concepto = " . $request['id_tipo_concepto'];
            }


            /*
             * variables por defecto para el registro de log
             */
            $id_tabla = 'null';
            $id_vigencia = $id_anhos;
            $id_cen_op = 'null';

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

            //obtener id maestro tabla
            $id_mae_bd = CN_TABLE::consultarIdTablaBD('NO_CERTIF_INGRE_RETEN');

            //indica operacion de consulta
            $id_ope_bd = 2;

            //id del maestro tercero
            $id_mae_ter = 1;
            if (isset($request['id_username'])) {
                $id_mae_ter = $request['id_username'];
            }
            $username = 'admin';
            if (isset($request['username'])) {
                if (!is_null($request['username']) && $request['username'] != '') {
                    $username = $request['username'];
                }
            }
            $comando = 'sin comando';
            if (isset($request['comando'])) {
                $comando = $request['comando'];
            }
            //construir observacion
            $observacion = "'Se actualiza no de formularios certif desde la funcionalidad: " . $comando . "'";


            /*
             * registro de consulta en tabla de log
             */
            $sql = CN_TABLE::registroTableLog($id_tabla, $id_ope_bd, $id_mae_bd, $id_mae_ter, $username, $comando, $observacion);


            /*
             * Generar consecutivos por persona y vigencia
             */
            //Sql
            $sql = <<<EOD

select distinct id_tipo_doc, num_doc  from(

select 
null as id_certif_ingre_reten,
id_tipo_doc,
num_doc,
id_anhos,
id_concep_nomina,

sum( valor_enero) as valor_enero,
sum( valor_febrero) as valor_febrero,
sum( valor_marzo) as valor_marzo,
sum( valor_abril) as valor_abril,
sum( valor_mayo) as valor_mayo,
sum( valor_junio) as valor_junio,
sum( valor_julio) as valor_julio,
sum( valor_agosto) as valor_agosto,
sum( valor_septiembre) as valor_septiembre,
sum( valor_octubre) as valor_octubre,
sum( valor_noviembre) as valor_noviembre,
sum( valor_diciembre) as valor_diciembre,

sum( valor_total) as valor_total,

nvl( 5 ,0) as agrupacion_orden 

from (

select 
tab0.id_tipo_doc,
tab0.num_doc,
2013 as id_anhos,
tab0.id_concep_nomina,
nvl( case when per.id_meses = 1 then tab0.valor_liquidado else null end ,0) as valor_enero,
nvl( case when per.id_meses = 2 then tab0.valor_liquidado else null end ,0) as valor_febrero,
nvl( case when per.id_meses = 3 then tab0.valor_liquidado else null end ,0) as valor_marzo,
nvl( case when per.id_meses = 4 then tab0.valor_liquidado else null end ,0) as valor_abril,
nvl( case when per.id_meses = 5 then tab0.valor_liquidado else null end ,0) as valor_mayo,
nvl( case when per.id_meses = 6 then tab0.valor_liquidado else null end ,0) as valor_junio,
nvl( case when per.id_meses = 7 then tab0.valor_liquidado else null end ,0) as valor_julio,
nvl( case when per.id_meses = 8 then tab0.valor_liquidado else null end ,0) as valor_agosto,
nvl( case when per.id_meses = 9 then tab0.valor_liquidado else null end ,0) as valor_septiembre,
nvl( case when per.id_meses = 10 then tab0.valor_liquidado else null end ,0) as valor_octubre,
nvl( case when per.id_meses = 11 then tab0.valor_liquidado else null end ,0) as valor_noviembre,
nvl( case when per.id_meses = 12 then tab0.valor_liquidado else null end ,0) as valor_diciembre,
nvl( tab0.valor_liquidado ,0) as valor_total

from no_liquida_nomina tab0

join no_concep_nomina concep
on tab0.id_concep_nomina = concep.id_concep_nomina

join no_periodo_v per
on tab0.id_periodo = per.id_periodo
and per.id_anhos = $id_anhos

where
1 = 1 
$whereFuncionarioNumDoc $whereFuncionarioTipoDoc
$whereTipoConcepto  

and (
per.fecha_ini between to_date('$fecha_ini','yyyy-mm-dd') and to_date('$fecha_fin','yyyy-mm-dd') 
or
per.fecha_fin between to_date('$fecha_ini','yyyy-mm-dd') and to_date('$fecha_fin','yyyy-mm-dd') 
)


)

group by
id_tipo_doc,
num_doc,
id_anhos,
id_concep_nomina

)

order by num_doc

EOD;
            //Ejecutar SQL
            $records = CN_TABLE::executeSQL($sql);

            foreach ($records as $value) {

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

                try {
                    //insertar 
                    $sql = <<<EOD
insert into no_consecutivo_certif (id_consecutivo_certif,id_tipo_doc,num_doc,id_anhos,secuencia,usuario_gen_no,fecha_gen_no) 
    values ( null, $id_tipo_doc, '$num_doc', $id_anhos, (select nvl( max(secuencia) ,0) + 1 from no_consecutivo_certif where id_anhos = $id_anhos),
        $this->usuario_gen,sysdate) 
EOD;
                    //ejecuta sql
                    CN_TABLE::executeSQL($sql);
                } catch (Exception $exc) {
//                    echo $exc->getTraceAsString();
                }
            }


            /*
             * COMMIT DE TODAS LAS TRANSACCIONES
             */
            $this->status = 0;
            $this->list_data = array();
            $this->logMessage("[generar_certif_ingre_reten] Generació exitosa");
        } catch (Exception $e) {
            MemcacheHandler::getInstance()->set($progress_key, 100);

            $this->status = 1;
            $this->mensajeError = "[generar_certif_ingre_reten] Ocurrio un error: " . $e->getMessage();
            $this->list_data = array();
            $this->logMessage("[generar_certif_ingre_reten] ERROR!");
            $this->logMessage($e->getMessage());
        }
    }

}
