<?php

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

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

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

            /*
             * Variables de filtro
             */
            $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 no_concepto_periodo_proy
             */
            //Sql
            $sql = <<<EOD
delete from no_concepto_periodo_proy
where
(id_anhos,id_meses,id_tipo_periodo,id_tipo_doc,num_doc)
in(
    SELECT DISTINCT
    per.id_anhos,
    per.id_meses,
    per.id_tipo_periodo,
    tab0.id_tipo_doc,
    tab0.num_doc
    
    FROM no_concepto_periodo tab0
    
    join no_periodo_v per
    on per.id_periodo = tab0.periodo
    
    where
    per.id_anhos = $id_anhos
    $whereFuncionarioNumDoc $whereFuncionarioTipoDoc
) 
EOD;
            //Ejecutar SQL
            //CN_TABLE::executeSQL($sql);//Se omite ya que no se toma lo liquidado original, solo lo proyectado - 20210512::LAVILA
            MemcacheHandler::getInstance()->set($progress_key, 10);

            /*
             *  Borrar no_liquida_nomina_proy
             */
            //Sql
            $sql = <<<EOD
delete from no_liquida_nomina_proy
where
(id_anhos,id_meses,id_tipo_periodo,id_tipo_doc,num_doc)
in(
    SELECT DISTINCT
    per.id_anhos,
    per.id_meses,
    per.id_tipo_periodo,
    tab0.id_tipo_doc,
    tab0.num_doc
    
    FROM no_liquida_nomina tab0
    
    join no_periodo_v per
    on per.id_periodo = tab0.id_periodo
    
    where
    per.id_anhos = $id_anhos
    $whereFuncionarioNumDoc $whereFuncionarioTipoDoc
)
EOD;
            //Ejecutar SQL
            //CN_TABLE::executeSQL($sql);//Se omite ya que no se toma lo liquidado original, solo lo proyectado - 20210512::LAVILA
            MemcacheHandler::getInstance()->set($progress_key, 20);

            /*
             *  insert no_concepto_periodo_proy
             */
            //Sql
            $sql = <<<EOD
insert into no_concepto_periodo_proy

SELECT DISTINCT
null as id_concepto_periodo_proy,
per.id_anhos as id_anhos,
per.id_meses as id_meses,
per.id_tipo_periodo,
per.id_periodo as periodo,
tab0.id_tipo_doc,
tab0.num_doc,
tab0.id_concep_nomina,
tab0.fecha_desde,
tab0.fecha_hasta,
tab0.valor,
tab0.porcentaje,
tab0.num_dias,
tab0.id_periodo_ajuste

FROM no_concepto_periodo tab0

join no_periodo_v per
on per.id_periodo = tab0.periodo

where
per.id_anhos = $id_anhos
$whereFuncionarioNumDoc $whereFuncionarioTipoDoc
EOD;
            //Ejecutar SQL
            //CN_TABLE::executeSQL($sql);//Se omite ya que no se toma lo liquidado original, solo lo proyectado - 20210512::LAVILA
            MemcacheHandler::getInstance()->set($progress_key, 30);

            /*
             *  insert no_liquida_nomina_proy
             */
            //Sql
            $sql = <<<EOD
insert into no_liquida_nomina_proy

SELECT DISTINCT
null as id_liquida_nomina_proy,
tab0.id_tipo_doc,
tab0.num_doc,
tab0.id_concep_nomina,
per.id_anhos,
per.id_meses,
per.id_tipo_periodo,
tab0.id_periodo,
tab0.valor_liquidado,
tab0.fecha_desde,
tab0.fecha_hasta,
tab0.num_dias,
tab0.valor_base,
tab0.porcentaje,
tab0.num_dias_base,
tab0.id_periodo_ajuste,
tab0.valor_liq_extra,
tab0.valor_base_extra

FROM no_liquida_nomina tab0

join no_periodo_v per
on per.id_periodo = tab0.id_periodo

where
per.id_anhos = $id_anhos
$whereFuncionarioNumDoc $whereFuncionarioTipoDoc 
EOD;
            //Ejecutar SQL
            //CN_TABLE::executeSQL($sql);//Se omite ya que no se toma lo liquidado original, solo lo proyectado - 20210512::LAVILA
            MemcacheHandler::getInstance()->set($progress_key, 40);


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

            /**
             * Registro de asignacion basica mensual - valores de concepto periodo --20140929
             */
            if ($entidadCliente != 8 && $entidadCliente != 9) {
                $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, 70);

            /*
             * Cargar datos en tabla NO_CERTIF_INGRE_RETEN_PROY 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);
//            }

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

                //Metodo que completa los registros
                $this->generar($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, 9, $whereTipoConcepto);
//            }
            //Otros ingresos como empleado - 20160513
            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);
            }
            MemcacheHandler::getInstance()->set($progress_key, 90);


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

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


            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 - 20210512
             */
            //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_proy] 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_proy] Ocurrio un error: " . $e->getMessage();
            $this->list_data = array();
            $this->logMessage("[generar_certif_ingre_reten_proy] ERROR!");
            $this->logMessage($e->getMessage());
        }
    }

    /**
     * Registra los datos en NO_CERTIF_INGRE_RETEN_PROY 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_proy] 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_proy (id_certif_ingre_reten_proy,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_proy (id_certif_ingre_reten_proy,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_proy,
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 tab0.id_meses = 1 then tab0.valor else null end ,0) as valor_enero,
    nvl( case when tab0.id_meses = 2 then tab0.valor else null end ,0) as valor_febrero,
    nvl( case when tab0.id_meses = 3 then tab0.valor else null end ,0) as valor_marzo,
    nvl( case when tab0.id_meses = 4 then tab0.valor else null end ,0) as valor_abril,
    nvl( case when tab0.id_meses = 5 then tab0.valor else null end ,0) as valor_mayo,
    nvl( case when tab0.id_meses = 6 then tab0.valor else null end ,0) as valor_junio,
    nvl( case when tab0.id_meses = 7 then tab0.valor else null end ,0) as valor_julio,
    nvl( case when tab0.id_meses = 8 then tab0.valor else null end ,0) as valor_agosto,
    nvl( case when tab0.id_meses = 9 then tab0.valor else null end ,0) as valor_septiembre,
    nvl( case when tab0.id_meses = 10 then tab0.valor else null end ,0) as valor_octubre,
    nvl( case when tab0.id_meses = 11 then tab0.valor else null end ,0) as valor_noviembre,
    nvl( case when tab0.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.id_anhos, aut.id_meses, AUT.FECHA_HASTA desc
        ) AS rn
        from no_concepto_periodo_proy 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_proy_v per
    on tab0.periodo = per.id_periodo
    and per.id_anhos = $id_anhos*/
    
    where
    1 = 1 
    $whereFuncionarioNumDoc $whereFuncionarioTipoDoc
    $whereTipoConcepto  

    and (
    to_date(''|| tab0.id_anhos ||'-'|| tab0.id_meses ||'-01','yyyy-mm-dd') 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_PROY 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_proy] Agrupación: " . $agrup);

        /*
         * (SGC-1, ANM-2, SGR-3, CYC-4, COL-5, INCI-6, LOCAL-7, CEV-8, CEV PUB-9)
         */
        $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++;
        }

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

        /*
         * Para ACF, VOL y Reten queda segun operador del concepto - 20200921
         */
        if ($agrupOrden == 21 || $agrupOrden == 22 || $agrupOrden == 5) {
            //if ($entidadCliente == 8 || $entidadCliente == 9) 
            $varAgrup = " concep.operador ";
            //}
        }

        /*
         * insert into no_certif_ingre_reten_proy (id_certif_ingre_reten_proy,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');
         */
        //Se adiciona dias para conceptos de agrup 8 - 20210812::LAVILA
        //Sql
        $sql = <<<EOD
insert into no_certif_ingre_reten_proy (id_certif_ingre_reten_proy,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,num_dias) 

(


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

max(case when id_periodo_ajuste = 0 then 8 else nvl( $agrupOrden ,0) end) as agrupacion_orden,

sum(case when id_periodo_ajuste = 0 then num_dias else 0 end) as num_dias 

from (

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

    nvl( case when tab0.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 tab0.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 tab0.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 tab0.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 tab0.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 tab0.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 tab0.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 tab0.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 tab0.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 tab0.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 tab0.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 tab0.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,
    nvl( tab0.num_dias ,0) as num_dias,            
    tab0.id_periodo_ajuste

    from no_liquida_nomina_proy tab0

    join no_concep_nomina concep
    on tab0.id_concep_nomina = concep.id_concep_nomina

    /*join no_periodo_proy_v per
    on tab0.id_periodo = per.id_periodo
    and per.id_anhos = $id_anhos*/
    
    $joinAgrup

    where
    1 = 1 
    $whereFuncionarioNumDoc $whereFuncionarioTipoDoc
    $whereTipoConcepto  

    and (
    to_date(''|| tab0.id_anhos ||'-'|| tab0.id_meses ||'-01','yyyy-mm-dd') 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_proy] 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_proy (id_certif_ingre_reten_proy,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_proy (id_certif_ingre_reten_proy,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_proy,
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 tab0.id_meses = 1 then tab0.aporte_patrono else null end ,0) as valor_enero,
    nvl( case when tab0.id_meses = 2 then tab0.aporte_patrono else null end ,0) as valor_febrero,
    nvl( case when tab0.id_meses = 3 then tab0.aporte_patrono else null end ,0) as valor_marzo,
    nvl( case when tab0.id_meses = 4 then tab0.aporte_patrono else null end ,0) as valor_abril,
    nvl( case when tab0.id_meses = 5 then tab0.aporte_patrono else null end ,0) as valor_mayo,
    nvl( case when tab0.id_meses = 6 then tab0.aporte_patrono else null end ,0) as valor_junio,
    nvl( case when tab0.id_meses = 7 then tab0.aporte_patrono else null end ,0) as valor_julio,
    nvl( case when tab0.id_meses = 8 then tab0.aporte_patrono else null end ,0) as valor_agosto,
    nvl( case when tab0.id_meses = 9 then tab0.aporte_patrono else null end ,0) as valor_septiembre,
    nvl( case when tab0.id_meses = 10 then tab0.aporte_patrono else null end ,0) as valor_octubre,
    nvl( case when tab0.id_meses = 11 then tab0.aporte_patrono else null end ,0) as valor_noviembre,
    nvl( case when tab0.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 18 
      else -1 
    end as id_clase_fondo

    from no_liquida_aporte_proy tab0

    join no_concep_nomina concep
    on tab0.id_concep_nomina = concep.id_concep_nomina

    /*join no_periodo_proy_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 (
    to_date(''|| tab0.id_anhos ||'-'|| tab0.id_meses ||'-01','yyyy-mm-dd') 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 tab0.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 tab0.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 tab0.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 tab0.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 tab0.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 tab0.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 tab0.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 tab0.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 tab0.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 tab0.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 tab0.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 tab0.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_proy tab0

    join no_concep_nomina concep
    on tab0.id_concep_nomina = concep.id_concep_nomina

    /*join no_periodo_proy_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_proy 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_proy where tipo_planilla = 'C')
    $whereFuncionarioNumDoc $whereFuncionarioTipoDoc

    and (
    to_date(''|| tab0.id_anhos ||'-'|| tab0.id_meses ||'-01','yyyy-mm-dd') 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);
    }

}
