<?php

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

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

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

            /*
             *  Borrar datos anteriores Periodo-Funcionario
             */
            //Sql
            $sql = <<<EOD
DELETE FROM NO_CERTIF_INGRE_RETEN_INF tab0 WHERE tab0.id_anhos = $id_anhos
$whereFuncionarioNumDoc $whereFuncionarioTipoDoc
EOD;
            //Ejecutar SQL
            CN_TABLE::executeSQL($sql);
            MemcacheHandler::getInstance()->set($progress_key, 15);

            /**
             * Registro de asignacion basica mensua - valores de concepto periodo --20140929
             */
            if (true) {
                $agrup = -1;

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

            /*
             * Cargar datos en tabla NO_CERTIF_INGRE_RETEN_INF 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, 30);

            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, 40);

            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, 50);

            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, 60);

            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, 10);

            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, 80);

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

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

                //Metodo que completa los registros
                $this->generarCesMen($id_anhos, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $agrup_ces_men, 8, $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);
            }

            /**
             * Genera registros de autoliquidacion - 20141121
             */
            if (isset($request['clase_fondo'])) {
                $agrup_rete = 0;

                //Metodo que completa los registros
                $this->generarAutoliquida($id_anhos, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $agrup_rete, 0, $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);
            }


            /*
             * COMMIT DE TODAS LAS TRANSACCIONES
             */
            $this->conn->commit();
            $this->status = 0;
            $this->list_data = array();
            $this->logMessage("[generar_certif_ingre_reten_inf] 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_inf] Ocurrio un error: " . $e->getMessage();
            $this->list_data = array();
            $this->logMessage("[generar_certif_ingre_reten_inf] 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_inf,
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_inf 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
         */
        //Sql
        $sql = <<<EOD
select to_char(wm_concat(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) 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);
    }

    /**
     * Registra los datos en NO_CERTIF_INGRE_RETEN_INF 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_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 = $agrup
                )";
        }

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

(



select 
null as id_certif_ingre_reten_inf,
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 

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 = 0
$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
     * 
     * @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 generarCesMen($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 = $agrup
                )";
        }

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

(



select 
null as id_certif_ingre_reten_inf,
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 

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_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 
$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 (-1) -- 20140929 
     * 
     * @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 generarAsigBasc($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: " . $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_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_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) 

(

select 
null as id_certif_ingre_reten_inf,
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( -1 ,0) as agrupacion_orden 

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 else null end ,0) as valor_enero,
    nvl( case when per.id_meses = 2 then tab0.valor else null end ,0) as valor_febrero,
    nvl( case when per.id_meses = 3 then tab0.valor else null end ,0) as valor_marzo,
    nvl( case when per.id_meses = 4 then tab0.valor else null end ,0) as valor_abril,
    nvl( case when per.id_meses = 5 then tab0.valor else null end ,0) as valor_mayo,
    nvl( case when per.id_meses = 6 then tab0.valor else null end ,0) as valor_junio,
    nvl( case when per.id_meses = 7 then tab0.valor else null end ,0) as valor_julio,
    nvl( case when per.id_meses = 8 then tab0.valor else null end ,0) as valor_agosto,
    nvl( case when per.id_meses = 9 then tab0.valor else null end ,0) as valor_septiembre,
    nvl( case when per.id_meses = 10 then tab0.valor else null end ,0) as valor_octubre,
    nvl( case when per.id_meses = 11 then tab0.valor else null end ,0) as valor_noviembre,
    nvl( case when per.id_meses = 12 then tab0.valor else null end ,0) as valor_diciembre,
    nvl( tab0.valor ,0) as valor_total
    
    from (
        SELECT
        aut.*,
        ROW_NUMBER() OVER (
          partition by aut.num_doc, aut.id_anhos, aut.id_meses
          ORDER BY AUT.PERIODO asc, AUT.FECHA_HASTA desc
        ) AS rn
        from no_concepto_periodo aut
        where
        aut.id_concep_nomina = (select ID_CONCEP_BASICA from NO_PARAM_CONCEP)
        and aut.num_dias >= 0
    ) tab0
    
    join no_concep_nomina concep
    on tab0.id_concep_nomina = concep.id_concep_nomina
    
    join no_periodo_v per
    on tab0.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') 
    )
    
    and tab0.rn = 1

)

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
     * 
     * @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_inf] Agrupación: " . $agrup);

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

            $joinAgrup = "    join no_agrup_deta agrup
    on agrup.id_concep_nomina = tab0.id_concep_nomina
    and agrup.id_agrup_concepto = $agrup";

            $varAgrup = " agrup.operador ";
        }

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

(



select 
null as id_certif_ingre_reten_inf,
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 

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 * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_enero,
    nvl( case when per.id_meses = 2 then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_febrero,
    nvl( case when per.id_meses = 3 then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_marzo,
    nvl( case when per.id_meses = 4 then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_abril,
    nvl( case when per.id_meses = 5 then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_mayo,
    nvl( case when per.id_meses = 6 then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_junio,
    nvl( case when per.id_meses = 7 then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_julio,
    nvl( case when per.id_meses = 8 then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_agosto,
    nvl( case when per.id_meses = 9 then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_septiembre,
    nvl( case when per.id_meses = 10 then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_octubre,
    nvl( case when per.id_meses = 11 then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_noviembre,
    nvl( case when per.id_meses = 12 then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_diciembre,
    nvl( tab0.valor_liquidado * (case when $varAgrup = 1 then 1 else -1 end) ,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
    
    $joinAgrup

    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_INF 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 generarAutoliquida($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: " . $agrup);

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

            $joinAgrup = "    join no_agrup_deta agrup
    on agrup.id_concep_nomina = tab0.id_concep_nomina
    and agrup.id_agrup_concepto = $agrup";

            $varAgrup = " agrup.operador ";
        }

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

(



select 
null as id_certif_ingre_reten_inf,
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( id_clase_fondo ,0) as agrupacion_orden 

from (

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

    nvl( case when per.id_meses = 1 then tab0.aporte_patrono else null end ,0) as valor_enero,
    nvl( case when per.id_meses = 2 then tab0.aporte_patrono else null end ,0) as valor_febrero,
    nvl( case when per.id_meses = 3 then tab0.aporte_patrono else null end ,0) as valor_marzo,
    nvl( case when per.id_meses = 4 then tab0.aporte_patrono else null end ,0) as valor_abril,
    nvl( case when per.id_meses = 5 then tab0.aporte_patrono else null end ,0) as valor_mayo,
    nvl( case when per.id_meses = 6 then tab0.aporte_patrono else null end ,0) as valor_junio,
    nvl( case when per.id_meses = 7 then tab0.aporte_patrono else null end ,0) as valor_julio,
    nvl( case when per.id_meses = 8 then tab0.aporte_patrono else null end ,0) as valor_agosto,
    nvl( case when per.id_meses = 9 then tab0.aporte_patrono else null end ,0) as valor_septiembre,
    nvl( case when per.id_meses = 10 then tab0.aporte_patrono else null end ,0) as valor_octubre,
    nvl( case when per.id_meses = 11 then tab0.aporte_patrono else null end ,0) as valor_noviembre,
    nvl( case when per.id_meses = 12 then tab0.aporte_patrono else null end ,0) as valor_diciembre,
    nvl( tab0.aporte_patrono ,0) as valor_total,
    
    case 
      when tab0.id_clase_fondo = 1 then 13 
      when tab0.id_clase_fondo = 2 then 12 
      when tab0.id_clase_fondo = 3 then 14 
      when tab0.id_clase_fondo = 4 then 17 
      when tab0.id_clase_fondo = 5 then 16 
      when tab0.id_clase_fondo = 6 then 15 
      when tab0.id_clase_fondo = 7 then 19 
      when tab0.id_clase_fondo = 8 then 110 
      else -1 
    end as id_clase_fondo

    from no_liquida_aporte 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.tipo_planilla = 'A'
    $whereFuncionarioNumDoc $whereFuncionarioTipoDoc

    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') 
    )
                
                
    union 
                
    select 
    tab0.id_tipo_doc,
    tab0.num_doc,
    $id_anhos as id_anhos,
    tab0.id_concep_nomina,
    tab0.tipo_planilla,

    nvl( case when per.id_meses = 1 then tab0.aporte_patrono * (case when tab0.tipo_planilla = 'A' then -1 else 1 end) else null end ,0) as valor_enero,
    nvl( case when per.id_meses = 2 then tab0.aporte_patrono * (case when tab0.tipo_planilla = 'A' then -1 else 1 end) else null end ,0) as valor_febrero,
    nvl( case when per.id_meses = 3 then tab0.aporte_patrono * (case when tab0.tipo_planilla = 'A' then -1 else 1 end) else null end ,0) as valor_marzo,
    nvl( case when per.id_meses = 4 then tab0.aporte_patrono * (case when tab0.tipo_planilla = 'A' then -1 else 1 end) else null end ,0) as valor_abril,
    nvl( case when per.id_meses = 5 then tab0.aporte_patrono * (case when tab0.tipo_planilla = 'A' then -1 else 1 end) else null end ,0) as valor_mayo,
    nvl( case when per.id_meses = 6 then tab0.aporte_patrono * (case when tab0.tipo_planilla = 'A' then -1 else 1 end) else null end ,0) as valor_junio,
    nvl( case when per.id_meses = 7 then tab0.aporte_patrono * (case when tab0.tipo_planilla = 'A' then -1 else 1 end) else null end ,0) as valor_julio,
    nvl( case when per.id_meses = 8 then tab0.aporte_patrono * (case when tab0.tipo_planilla = 'A' then -1 else 1 end) else null end ,0) as valor_agosto,
    nvl( case when per.id_meses = 9 then tab0.aporte_patrono * (case when tab0.tipo_planilla = 'A' then -1 else 1 end) else null end ,0) as valor_septiembre,
    nvl( case when per.id_meses = 10 then tab0.aporte_patrono * (case when tab0.tipo_planilla = 'A' then -1 else 1 end) else null end ,0) as valor_octubre,
    nvl( case when per.id_meses = 11 then tab0.aporte_patrono * (case when tab0.tipo_planilla = 'A' then -1 else 1 end) else null end ,0) as valor_noviembre,
    nvl( case when per.id_meses = 12 then tab0.aporte_patrono * (case when tab0.tipo_planilla = 'A' then -1 else 1 end) else null end ,0) as valor_diciembre,
    nvl( tab0.aporte_patrono ,0) * (case when tab0.tipo_planilla = 'A' then -1 else 1 end)  as valor_total,
    
    case 
      when tab0.id_clase_fondo = 1 then 13 
      when tab0.id_clase_fondo = 2 then 12 
      when tab0.id_clase_fondo = 3 then 14 
      when tab0.id_clase_fondo = 4 then 17 
      when tab0.id_clase_fondo = 5 then 16 
      when tab0.id_clase_fondo = 6 then 15 
      when tab0.id_clase_fondo = 7 then 19 
      when tab0.id_clase_fondo = 8 then 110 
      else -1 
    end as id_clase_fondo

    from no_liquida_aporte 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
   
    join (
      (select distinct num_doc, id_periodo from no_liquida_aporte where tipo_planilla = 'C')
    )perpla
    on perpla.num_doc = tab0.num_doc
    and perpla.id_periodo = tab0.id_periodo

    where
    1 = 1 
    --and tab0.id_periodo in (select distinct id_periodo from no_liquida_aporte where tipo_planilla = 'C')
    $whereFuncionarioNumDoc $whereFuncionarioTipoDoc

    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,
id_clase_fondo

)
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'];

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

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

select distinct id_tipo_doc, num_doc  from(

select 
null as id_certif_ingre_reten_inf,
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) 
    values ( null, $id_tipo_doc, '$num_doc', $id_anhos, (select nvl( max(secuencia) ,0) + 1 from no_consecutivo_certif where id_anhos = $id_anhos) ) 
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_inf] Generació exitosa");
        } catch (Exception $e) {
            MemcacheHandler::getInstance()->set($progress_key, 100);

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

}
