<?php

/**
 * generar_certif_ingre_reten_rango_proy actions.
 *
 * @package    nomina
 * @subpackage generar_certif_ingre_reten_rango_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_rango_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_ini = $request['anho_ini'];
            $id_anhos_fin = $request['anho_fin'];
            $id_meses_ini = $request['mes_ini'];
            $id_meses_fin = $request['mes_fin'];
            $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_RGPROY tab0 
    WHERE tab0.id_anhos_ini = $id_anhos_ini
            and tab0.id_anhos_fin = $id_anhos_fin
            and tab0.id_meses_ini = $id_meses_ini
            and tab0.id_meses_fin = $id_meses_fin
$whereFuncionarioNumDoc $whereFuncionarioTipoDoc
EOD;
            //Se cambia para borrar toda la tabla y no dejar registros antiguos - 20210712::LAVILA
            $sql = <<<EOD
TRUNCATE TABLE NO_CERTIF_INGRE_RETEN_RGPROY 
EOD;
            //Ejecutar SQL
            CN_TABLE::executeSQL($sql);
            MemcacheHandler::getInstance()->set($progress_key, 15);

            /*
             *  Borrar datos de names para rango de fechas filtro
             */
            //Sql
            $sql = <<<EOD
DELETE FROM NO_CERTIF_RAN_PROY_NAMES tab0 
    WHERE tab0.id_anhos_ini = $id_anhos_ini
            and tab0.id_anhos_fin = $id_anhos_fin
            and tab0.id_meses_ini = $id_meses_ini
            and tab0.id_meses_fin = $id_meses_fin 
EOD;
            //Se cambia para borrar toda la tabla y no dejar registros antiguos - 20210712::LAVILA
            $sql = <<<EOD
TRUNCATE TABLE NO_CERTIF_RAN_PROY_NAMES 
EOD;
            //Ejecutar SQL
            CN_TABLE::executeSQL($sql);
            MemcacheHandler::getInstance()->set($progress_key, 30);

            /**
             * 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_ini, $id_anhos_fin, $id_meses_ini, $id_meses_fin, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $agrup, 1, $whereTipoConcepto);
            }
            MemcacheHandler::getInstance()->set($progress_key, 70);


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

                //Metodo que completa los registros
                $this->generar($id_anhos_ini, $id_anhos_fin, $id_meses_ini, $id_meses_fin, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $agrup_rete, 0, $whereTipoConcepto);
            }
            MemcacheHandler::getInstance()->set($progress_key, 80);

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

            //Metodo que completa los registros
            $this->generarAutoliquida($id_anhos_ini, $id_anhos_fin, $id_meses_ini, $id_meses_fin, $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);


            /*
             * COMMIT DE TODAS LAS TRANSACCIONES
             */
            $this->conn->commit();
            $this->status = 0;
            $this->list_data = array();
            $this->logMessage("[generar_certif_ingre_reten_rango_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_rango_proy] Ocurrio un error: " . $e->getMessage();
            $this->list_data = array();
            $this->logMessage("[generar_certif_ingre_reten_rango_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_ini, $id_anhos_fin, $id_meses_ini, $id_meses_fin, $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
                )";
        }

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

        /**
         * Generar igualdad año-mes por 12 meses - 20190507
         */
        $anho_1 = $id_anhos_ini;
        $mes_1 = $id_meses_ini;
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_1, $mes_1);
        $anho_2 = $fecha_anhos['id_anhos'];
        $mes_2 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_2, $mes_2);
        $anho_3 = $fecha_anhos['id_anhos'];
        $mes_3 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_3, $mes_3);
        $anho_4 = $fecha_anhos['id_anhos'];
        $mes_4 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_4, $mes_4);
        $anho_5 = $fecha_anhos['id_anhos'];
        $mes_5 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_5, $mes_5);
        $anho_6 = $fecha_anhos['id_anhos'];
        $mes_6 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_6, $mes_6);
        $anho_7 = $fecha_anhos['id_anhos'];
        $mes_7 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_7, $mes_7);
        $anho_8 = $fecha_anhos['id_anhos'];
        $mes_8 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_8, $mes_8);
        $anho_9 = $fecha_anhos['id_anhos'];
        $mes_9 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_9, $mes_9);
        $anho_10 = $fecha_anhos['id_anhos'];
        $mes_10 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_10, $mes_10);
        $anho_11 = $fecha_anhos['id_anhos'];
        $mes_11 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_11, $mes_11);
        $anho_12 = $fecha_anhos['id_anhos'];
        $mes_12 = $fecha_anhos['id_meses'];

        /*
         * 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_RGPROY (
ID_CERTIF_INGRE_RETEN_RGPROY,
ID_TIPO_DOC,
NUM_DOC,
ID_ANHOS_INI,
ID_ANHOS_FIN,
ID_MESES_INI,
ID_MESES_FIN,
ID_CONCEP_NOMINA,
VALOR_MES1,
VALOR_MES2,
VALOR_MES3,
VALOR_MES4,
VALOR_MES5,
VALOR_MES6,
VALOR_MES7,
VALOR_MES8,
VALOR_MES9,
VALOR_MES10,
VALOR_MES11,
VALOR_MES12,
VALOR_TOTAL,
AGRUPACION_ORDEN
   ) 
(

select 
null as id_certif_ingre_reten_ran,
id_tipo_doc,
num_doc,
id_anhos_ini,
id_anhos_fin,
id_meses_ini,
id_meses_fin,
id_concep_nomina,

sum( valor_mes1) as valor_mes1,
sum( valor_mes2) as valor_mes2,
sum( valor_mes3) as valor_mes3,
sum( valor_mes4) as valor_mes4,
sum( valor_mes5) as valor_mes5,
sum( valor_mes6) as valor_mes6,
sum( valor_mes7) as valor_mes7,
sum( valor_mes8) as valor_mes8,
sum( valor_mes9) as valor_mes9,
sum( valor_mes10) as valor_mes10,
sum( valor_mes11) as valor_mes11,
sum( valor_mes12) as valor_mes12,

sum( valor_total) as valor_total,

nvl( -1 ,0) as agrupacion_orden

from (
    
    select 
    tab0.id_tipo_doc,
    tab0.num_doc,
    $id_anhos_ini as id_anhos_ini,
    $id_anhos_fin as id_anhos_fin,
    $id_meses_ini as id_meses_ini,
    $id_meses_fin as id_meses_fin,
    tab0.id_concep_nomina,
    
    nvl( case when tab0.periodo = $anho_1 || lpad($mes_1, 2, '0') then tab0.valor else null end ,0) as valor_mes1,
    nvl( case when tab0.periodo = $anho_2 || lpad($mes_2, 2, '0') then tab0.valor else null end ,0) as valor_mes2,
    nvl( case when tab0.periodo = $anho_3 || lpad($mes_3, 2, '0') then tab0.valor else null end ,0) as valor_mes3,
    nvl( case when tab0.periodo = $anho_4 || lpad($mes_4, 2, '0') then tab0.valor else null end ,0) as valor_mes4,
    nvl( case when tab0.periodo = $anho_5 || lpad($mes_5, 2, '0') then tab0.valor else null end ,0) as valor_mes5,
    nvl( case when tab0.periodo = $anho_6 || lpad($mes_6, 2, '0') then tab0.valor else null end ,0) as valor_mes6,
    nvl( case when tab0.periodo = $anho_7 || lpad($mes_7, 2, '0') then tab0.valor else null end ,0) as valor_mes7,
    nvl( case when tab0.periodo = $anho_8 || lpad($mes_8, 2, '0') then tab0.valor else null end ,0) as valor_mes8,
    nvl( case when tab0.periodo = $anho_9 || lpad($mes_9, 2, '0') then tab0.valor else null end ,0) as valor_mes9,
    nvl( case when tab0.periodo = $anho_10 || lpad($mes_10, 2, '0') then tab0.valor else null end ,0) as valor_mes10,
    nvl( case when tab0.periodo = $anho_11 || lpad($mes_11, 2, '0') then tab0.valor else null end ,0) as valor_mes11,
    nvl( case when tab0.periodo = $anho_12 || lpad($mes_12, 2, '0') then tab0.valor else null end ,0) as valor_mes12,
    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_ini,
id_anhos_fin,
id_meses_ini,
id_meses_fin,
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_ini
     * @param type $id_anhos_fin
     * @param type $id_meses_ini
     * @param type $id_meses_fin
     * @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 generar($id_anhos_ini, $id_anhos_fin, $id_meses_ini, $id_meses_fin, $fecha_ini, $fecha_fin, $num_doc, $whereFuncionarioNumDoc, $id_tipo_doc, $whereFuncionarioTipoDoc, $agrup, $agrupOrden, $whereTipoConcepto) {

        $this->logMessage("[generar_certif_ingre_reten_rango_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 ";
            //}
        }

        /**
         * Generar igualdad año-mes por 12 meses - 20190507
         */
        $anho_1 = $id_anhos_ini;
        $mes_1 = $id_meses_ini;
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_1, $mes_1);
        $anho_2 = $fecha_anhos['id_anhos'];
        $mes_2 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_2, $mes_2);
        $anho_3 = $fecha_anhos['id_anhos'];
        $mes_3 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_3, $mes_3);
        $anho_4 = $fecha_anhos['id_anhos'];
        $mes_4 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_4, $mes_4);
        $anho_5 = $fecha_anhos['id_anhos'];
        $mes_5 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_5, $mes_5);
        $anho_6 = $fecha_anhos['id_anhos'];
        $mes_6 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_6, $mes_6);
        $anho_7 = $fecha_anhos['id_anhos'];
        $mes_7 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_7, $mes_7);
        $anho_8 = $fecha_anhos['id_anhos'];
        $mes_8 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_8, $mes_8);
        $anho_9 = $fecha_anhos['id_anhos'];
        $mes_9 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_9, $mes_9);
        $anho_10 = $fecha_anhos['id_anhos'];
        $mes_10 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_10, $mes_10);
        $anho_11 = $fecha_anhos['id_anhos'];
        $mes_11 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_11, $mes_11);
        $anho_12 = $fecha_anhos['id_anhos'];
        $mes_12 = $fecha_anhos['id_meses'];

        $sql = <<<EOD
Insert into NO_CERTIF_RAN_PROY_NAMES (
    ID_ANHOS_INI,ID_ANHOS_FIN,ID_MESES_INI,
    ID_MESES_FIN,VALOR_MES1,VALOR_MES2,VALOR_MES3,VALOR_MES4,VALOR_MES5,VALOR_MES6,
    VALOR_MES7,VALOR_MES8,VALOR_MES9,VALOR_MES10,VALOR_MES11,VALOR_MES12
) 
    
values (
    '$id_anhos_ini','$id_anhos_fin','$id_meses_ini','$id_meses_fin',
    (SELECT descripcion FROM meses where id_meses = $mes_1) ||'-'|| $anho_1 ,
    (SELECT descripcion FROM meses where id_meses = $mes_2) ||'-'|| $anho_2 ,
    (SELECT descripcion FROM meses where id_meses = $mes_3) ||'-'|| $anho_3 ,
    (SELECT descripcion FROM meses where id_meses = $mes_4) ||'-'|| $anho_4 ,
    (SELECT descripcion FROM meses where id_meses = $mes_5) ||'-'|| $anho_5 ,
    (SELECT descripcion FROM meses where id_meses = $mes_6) ||'-'|| $anho_6 ,
    (SELECT descripcion FROM meses where id_meses = $mes_7) ||'-'|| $anho_7 ,
    (SELECT descripcion FROM meses where id_meses = $mes_8) ||'-'|| $anho_8 ,
    (SELECT descripcion FROM meses where id_meses = $mes_9) ||'-'|| $anho_9 ,
    (SELECT descripcion FROM meses where id_meses = $mes_10) ||'-'|| $anho_10 ,
    (SELECT descripcion FROM meses where id_meses = $mes_11) ||'-'|| $anho_11 ,
    (SELECT descripcion FROM meses where id_meses = $mes_12) ||'-'|| $anho_12 
)                
EOD;
        //Ejecutar SQL
        CN_TABLE::executeSQL($sql);

        /*
         * insert into NO_CERTIF_INGRE_RETEN_RGPROY ;
         */
        //Sql
        $sql = <<<EOD
insert into NO_CERTIF_INGRE_RETEN_RGPROY (
ID_CERTIF_INGRE_RETEN_RGPROY,
ID_TIPO_DOC,
NUM_DOC,
ID_ANHOS_INI,
ID_ANHOS_FIN,
ID_MESES_INI,
ID_MESES_FIN,
ID_CONCEP_NOMINA,
VALOR_MES1,
VALOR_MES2,
VALOR_MES3,
VALOR_MES4,
VALOR_MES5,
VALOR_MES6,
VALOR_MES7,
VALOR_MES8,
VALOR_MES9,
VALOR_MES10,
VALOR_MES11,
VALOR_MES12,
VALOR_TOTAL,
AGRUPACION_ORDEN,
NUM_DIAS  
   ) 

(


select 
null as id_certif_ingre_reten_ran,
id_tipo_doc,
num_doc,
id_anhos_ini,
id_anhos_fin,
id_meses_ini,
id_meses_fin,
id_concep_nomina,

sum( valor_mes1) as valor_mes1,
sum( valor_mes2) as valor_mes2,
sum( valor_mes3) as valor_mes3,
sum( valor_mes4) as valor_mes4,
sum( valor_mes5) as valor_mes5,
sum( valor_mes6) as valor_mes6,
sum( valor_mes7) as valor_mes7,
sum( valor_mes8) as valor_mes8,
sum( valor_mes9) as valor_mes9,
sum( valor_mes10) as valor_mes10,
sum( valor_mes11) as valor_mes11,
sum( valor_mes12) as valor_mes12,

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_ini as id_anhos_ini,
    $id_anhos_fin as id_anhos_fin,
    $id_meses_ini as id_meses_ini,
    $id_meses_fin as id_meses_fin,
    tab0.id_concep_nomina,

    nvl( case when tab0.id_periodo = $anho_1 || lpad($mes_1, 2, '0') then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_mes1,
    nvl( case when tab0.id_periodo = $anho_2 || lpad($mes_2, 2, '0') then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_mes2,
    nvl( case when tab0.id_periodo = $anho_3 || lpad($mes_3, 2, '0') then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_mes3,
    nvl( case when tab0.id_periodo = $anho_4 || lpad($mes_4, 2, '0') then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_mes4,
    nvl( case when tab0.id_periodo = $anho_5 || lpad($mes_5, 2, '0') then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_mes5,
    nvl( case when tab0.id_periodo = $anho_6 || lpad($mes_6, 2, '0') then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_mes6,
    nvl( case when tab0.id_periodo = $anho_7 || lpad($mes_7, 2, '0') then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_mes7,
    nvl( case when tab0.id_periodo = $anho_8 || lpad($mes_8, 2, '0') then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_mes8,
    nvl( case when tab0.id_periodo = $anho_9 || lpad($mes_9, 2, '0') then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_mes9,
    nvl( case when tab0.id_periodo = $anho_10 || lpad($mes_10, 2, '0') then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_mes10,
    nvl( case when tab0.id_periodo = $anho_11 || lpad($mes_11, 2, '0') then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_mes11,
    nvl( case when tab0.id_periodo = $anho_12  || lpad($mes_12, 2, '0') then tab0.valor_liquidado else null end * (case when $varAgrup = 1 then 1 else -1 end) ,0) as valor_mes12,
    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_ini,
id_anhos_fin,
id_meses_ini,
id_meses_fin,
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_ini, $id_anhos_fin, $id_meses_ini, $id_meses_fin, $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 ";
        }

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

        /**
         * Generar igualdad año-mes por 12 meses - 20190507
         */
        $anho_1 = $id_anhos_ini;
        $mes_1 = $id_meses_ini;
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_1, $mes_1);
        $anho_2 = $fecha_anhos['id_anhos'];
        $mes_2 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_2, $mes_2);
        $anho_3 = $fecha_anhos['id_anhos'];
        $mes_3 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_3, $mes_3);
        $anho_4 = $fecha_anhos['id_anhos'];
        $mes_4 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_4, $mes_4);
        $anho_5 = $fecha_anhos['id_anhos'];
        $mes_5 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_5, $mes_5);
        $anho_6 = $fecha_anhos['id_anhos'];
        $mes_6 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_6, $mes_6);
        $anho_7 = $fecha_anhos['id_anhos'];
        $mes_7 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_7, $mes_7);
        $anho_8 = $fecha_anhos['id_anhos'];
        $mes_8 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_8, $mes_8);
        $anho_9 = $fecha_anhos['id_anhos'];
        $mes_9 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_9, $mes_9);
        $anho_10 = $fecha_anhos['id_anhos'];
        $mes_10 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_10, $mes_10);
        $anho_11 = $fecha_anhos['id_anhos'];
        $mes_11 = $fecha_anhos['id_meses'];
        $fecha_anhos = CN_TABLE::fechaSiguiente($anho_11, $mes_11);
        $anho_12 = $fecha_anhos['id_anhos'];
        $mes_12 = $fecha_anhos['id_meses'];

        /*
         * 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_RGPROY (
ID_CERTIF_INGRE_RETEN_RGPROY,
ID_TIPO_DOC,
NUM_DOC,
ID_ANHOS_INI,
ID_ANHOS_FIN,
ID_MESES_INI,
ID_MESES_FIN,
ID_CONCEP_NOMINA,
VALOR_MES1,
VALOR_MES2,
VALOR_MES3,
VALOR_MES4,
VALOR_MES5,
VALOR_MES6,
VALOR_MES7,
VALOR_MES8,
VALOR_MES9,
VALOR_MES10,
VALOR_MES11,
VALOR_MES12,
VALOR_TOTAL,
AGRUPACION_ORDEN
   ) 
                
(



select 
null as id_certif_ingre_reten_proy,
id_tipo_doc,
num_doc,
id_anhos_ini,
id_anhos_fin,
id_meses_ini,
id_meses_fin,
id_concep_nomina,

sum( valor_mes1) as valor_mes1,
sum( valor_mes2) as valor_mes2,
sum( valor_mes3) as valor_mes3,
sum( valor_mes4) as valor_mes4,
sum( valor_mes5) as valor_mes5,
sum( valor_mes6) as valor_mes6,
sum( valor_mes7) as valor_mes7,
sum( valor_mes8) as valor_mes8,
sum( valor_mes9) as valor_mes9,
sum( valor_mes10) as valor_mes10,
sum( valor_mes11) as valor_mes11,
sum( valor_mes12) as valor_mes12,

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_ini as id_anhos_ini,
    $id_anhos_fin as id_anhos_fin,
    $id_meses_ini as id_meses_ini,
    $id_meses_fin as id_meses_fin,
    tab0.id_concep_nomina,
    tab0.tipo_planilla,

    nvl( case when tab0.id_periodo = $anho_1 || lpad($mes_1, 2, '0') then tab0.aporte_patrono else null end ,0) as valor_mes1,
    nvl( case when tab0.id_periodo = $anho_2 || lpad($mes_2, 2, '0') then tab0.aporte_patrono else null end ,0) as valor_mes2,
    nvl( case when tab0.id_periodo = $anho_3 || lpad($mes_3, 2, '0') then tab0.aporte_patrono else null end ,0) as valor_mes3,
    nvl( case when tab0.id_periodo = $anho_4 || lpad($mes_4, 2, '0') then tab0.aporte_patrono else null end ,0) as valor_mes4,
    nvl( case when tab0.id_periodo = $anho_5 || lpad($mes_5, 2, '0') then tab0.aporte_patrono else null end ,0) as valor_mes5,
    nvl( case when tab0.id_periodo = $anho_6 || lpad($mes_6, 2, '0') then tab0.aporte_patrono else null end ,0) as valor_mes6,
    nvl( case when tab0.id_periodo = $anho_7 || lpad($mes_7, 2, '0') then tab0.aporte_patrono else null end ,0) as valor_mes7,
    nvl( case when tab0.id_periodo = $anho_8 || lpad($mes_8, 2, '0') then tab0.aporte_patrono else null end ,0) as valor_mes8,
    nvl( case when tab0.id_periodo = $anho_9 || lpad($mes_9, 2, '0') then tab0.aporte_patrono else null end ,0) as valor_mes9,
    nvl( case when tab0.id_periodo = $anho_10 || lpad($mes_10, 2, '0') then tab0.aporte_patrono else null end ,0) as valor_mes10,
    nvl( case when tab0.id_periodo = $anho_11 || lpad($mes_11, 2, '0') then tab0.aporte_patrono else null end ,0) as valor_mes11,
    nvl( case when tab0.id_periodo = $anho_12 || lpad($mes_12, 2, '0') then tab0.aporte_patrono else null end ,0) as valor_mes12,
    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_ini as id_anhos_ini,
    $id_anhos_fin as id_anhos_fin,
    $id_meses_ini as id_meses_ini,
    $id_meses_fin as id_meses_fin,
    tab0.id_concep_nomina,
    tab0.tipo_planilla,


    nvl( case when tab0.id_periodo = $anho_1 || lpad($mes_1, 2, '0') then tab0.aporte_patrono * (case when tab0.tipo_planilla = 'A' then -1 else 1 end) else null end ,0) as valor_mes1,
    nvl( case when tab0.id_periodo = $anho_2 || lpad($mes_2, 2, '0') then tab0.aporte_patrono * (case when tab0.tipo_planilla = 'A' then -1 else 1 end) else null end ,0) as valor_mes2,
    nvl( case when tab0.id_periodo = $anho_3 || lpad($mes_3, 2, '0') then tab0.aporte_patrono * (case when tab0.tipo_planilla = 'A' then -1 else 1 end) else null end ,0) as valor_mes3,
    nvl( case when tab0.id_periodo = $anho_4 || lpad($mes_4, 2, '0') then tab0.aporte_patrono * (case when tab0.tipo_planilla = 'A' then -1 else 1 end) else null end ,0) as valor_mes4,
    nvl( case when tab0.id_periodo = $anho_5 || lpad($mes_5, 2, '0') then tab0.aporte_patrono * (case when tab0.tipo_planilla = 'A' then -1 else 1 end) else null end ,0) as valor_mes5,
    nvl( case when tab0.id_periodo = $anho_6 || lpad($mes_6, 2, '0') then tab0.aporte_patrono * (case when tab0.tipo_planilla = 'A' then -1 else 1 end) else null end ,0) as valor_mes6,
    nvl( case when tab0.id_periodo = $anho_7 || lpad($mes_7, 2, '0') then tab0.aporte_patrono * (case when tab0.tipo_planilla = 'A' then -1 else 1 end) else null end ,0) as valor_mes7,
    nvl( case when tab0.id_periodo = $anho_8 || lpad($mes_8, 2, '0') then tab0.aporte_patrono * (case when tab0.tipo_planilla = 'A' then -1 else 1 end) else null end ,0) as valor_mes8,
    nvl( case when tab0.id_periodo = $anho_9 || lpad($mes_9, 2, '0') then tab0.aporte_patrono * (case when tab0.tipo_planilla = 'A' then -1 else 1 end) else null end ,0) as valor_mes9,
    nvl( case when tab0.id_periodo = $anho_10 || lpad($mes_10, 2, '0') then tab0.aporte_patrono * (case when tab0.tipo_planilla = 'A' then -1 else 1 end) else null end ,0) as valor_mes10,
    nvl( case when tab0.id_periodo = $anho_11 || lpad($mes_11, 2, '0') then tab0.aporte_patrono * (case when tab0.tipo_planilla = 'A' then -1 else 1 end) else null end ,0) as valor_mes11,
    nvl( case when tab0.id_periodo = $anho_12 || lpad($mes_12, 2, '0') then tab0.aporte_patrono * (case when tab0.tipo_planilla = 'A' then -1 else 1 end) else null end ,0) as valor_mes12,
    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_ini,
id_anhos_fin,
id_meses_ini,
id_meses_fin,
id_concep_nomina,
id_clase_fondo

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

}

