<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * @package    nomina
 * Description of actions
 * @ Informe de generación de archivos siif nacion
 * @author Manuel Enrique Paredes Lopez
 * @fecha 28-11-2019
 * 
 */
class inf_gen_archivos_siif_nacionActions extends sfActions {
    //put your code here

    /**
     * Executes list action
     *
     * @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");

        /*
         * Paginacion
         */
        if (isset($request['_startRow'])) {
            $rowStart = $request['_startRow'];
        } else {
            $rowStart = 0;
        }

        if (isset($request['_endRow'])) {
            $rowEnd = $request['_endRow'];
        } else {
            $rowEnd = 75;
        }

        //ordenar consulta
        if (isset($request['_sortBy'])) {
            $sortBy = " Order by " . $request['_sortBy'];
        } else {
            $sortBy = 'order by tab0.NUM_DOC';
        }


        /*
         * Manejo de errores
         */
        try {

            /*
             * Variables obligatorias
             */
            $periodo_filtro = $request['id_periodo_filtro'];
            $periodo = $request['id_periodo'];
            $tipo_planilla = $request['tipo_planilla'];

            /*
             * Variables opcionales
             */
            //clase FONDO
            if (isset($request['id_clase_fondo'])) {
                $whereClaseFondo = " AND tab0.id_clase_fondo = " . $request['id_clase_fondo'];
            } else {
                $whereClaseFondo = ' ';
            }

            //Filtro  fondo
            if (isset($request['id_mae_fondos'])) {
                $whereMaeFondos = " AND tab0.id_mae_fondos = " . $request['id_mae_fondos'];
            } else {
                $whereMaeFondos = ' ';
            }


            //whereBanco
            if (isset($request['id_tipo_atributo_contab'])) {
                $whereTAC = " AND tab0.id_tipo_atributo_contab = " . $request['id_tipo_atributo_contab'];
            } else {
                $whereTAC = ' ';
            }
            //Tipo Cuenta
            if (isset($request['tipo_cuenta'])) {
                $whereTipoCuenta = " AND tab0.tipo_cuenta = " . $request['tipo_cuenta'];
            } else {
                $whereTipoCuenta = ' ';
            }


            //sentencia sql
            $sql = <<<EOD
ALTER SESSION SET NLS_DATE_FORMAT = "YYYY-MM-DD"
EOD;
            //ejecuta y obtiene el resultado del sql
            CN_TABLE::executeSQL($sql);


            if ($tipo_planilla == 'A') {
                //sentencia sql
                $consulta = <<<EOD
SELECT ROWNUM,a.* FROM (

    SELECT
    tab0.id_mae_fondos,
    '01' as tipo_documento,
    tab0.nit,
    tab0.tipo_cuenta,
    tab0.fondo,
    sum(tab0.aporte_patrono + tab0.aporte_patrono_licnorem) as total_aporte_patronal,
    sum(tab0.aporte_func) as total_aporte_func
    
    FROM (
    
        select
        tab0.tipo_planilla,
        tab0.id_liquida_aporte,
        tab0.id_clase_fondo,
        tab0.id_mae_fondos,
        tab0.id_concep_nomina,
        tab0.id_tipo_doc,
        tab0.num_doc,
        tab0.valor_base,
        tab0.num_dias,
        tab0.aporte_func,
        tab0.aporte_patrono,
        tab0.aporte_patrono_licnorem,
        tab0.id_cen_op,
        tab0.id_tipo_aporte,
        tab0.porcentaje_func,
        tab0.porcentaje_patrono,
        tab0.tarifa,
        tab0.id_periodo,
        tab0.upc_adicio,
        tab0.valor_base_fsp,
        tab0.id_tae,
        tab1.razon_social as fondo,
            tab1.num_doc as nit,
        tab2.descripcion as clase_fondo,
        tab2.tipo_cuenta,
        tab3.codigo||' - '||tab3.descripcion as concepto
    
        from NO_LIQUIDA_APORTE  tab0
        left join NO_MAE_FONDOS tab1 ON tab1.id_mae_fondos = tab0.id_mae_fondos
        left join NO_CLASE_FONDO tab2 ON tab2.id_clase_fondo = tab0.id_clase_fondo
        left join NO_CONCEP_NOMINA tab3 ON tab3.id_concep_nomina = tab0.id_concep_nomina
        left join pr_rubro_presup_v rub on rub.id_rubro = tab3.id_rubro
    
        where
        tab0.tipo_planilla = 'A'
        AND tab0.id_periodo = $periodo_filtro
        $whereClaseFondo                    
        $whereMaeFondos
        $whereTAC
        $whereTipoCuenta     
    
    
    
    )tab0
    
    where
    1 = 1
    
    group by
    tab0.id_mae_fondos,
    tab0.fondo,
    tab0.nit,
    tab0.tipo_cuenta
    
    order by
    tab0.id_mae_fondos

)a
EOD;
            } else {
                //sentencia sql
                $consulta = <<<EOD
SELECT ROWNUM,a.* FROM (

    SELECT
    tab0.id_mae_fondos,
    '01' as tipo_documento,
    tab0.nit,
    tab0.tipo_cuenta,
    tab0.fondo,
    sum(tab0.aporte_patrono + tab0.aporte_patrono_licnorem) as total_aporte_patronal,
    sum(tab0.aporte_func) as total_aporte_func
    
    FROM (
    
        select
        tab0.tipo_planilla,
        tab0.id_liquida_aporte,
        tab0.id_clase_fondo,
        tab0.id_mae_fondos,
        tab0.id_concep_nomina,
        tab0.id_tipo_doc,
        tab0.num_doc,
        tab0.valor_base,
        tab0.num_dias,
        tab0.aporte_func - nvl(liqa.aporte_func,0) as aporte_func,
        tab0.aporte_patrono - nvl(liqa.aporte_patrono,0) as aporte_patrono,
        tab0.aporte_patrono_licnorem - nvl(liqa.aporte_patrono_licnorem,0) as aporte_patrono_licnorem,
        tab0.id_cen_op,
        tab0.id_tipo_aporte,
        tab0.porcentaje_func,
        tab0.porcentaje_patrono,
        tab0.tarifa,
        tab0.id_periodo,
        tab0.upc_adicio,
        tab0.valor_base_fsp,
        tab0.id_tae,
        tab1.razon_social as fondo,
            tab1.num_doc as nit,
        tab2.descripcion as clase_fondo,
        tab2.tipo_cuenta,
        tab3.codigo||' - '||tab3.descripcion as concepto
    
        from NO_LIQUIDA_APORTE  tab0
        left join NO_MAE_FONDOS tab1 ON tab1.id_mae_fondos = tab0.id_mae_fondos
        left join NO_CLASE_FONDO tab2 ON tab2.id_clase_fondo = tab0.id_clase_fondo
        left join NO_CONCEP_NOMINA tab3 ON tab3.id_concep_nomina = tab0.id_concep_nomina
        left join pr_rubro_presup_v rub on rub.id_rubro = tab3.id_rubro
        
        left join NO_LIQUIDA_APORTE liqa
        on liqa.tipo_planilla = 'A'
        and liqa.id_periodo = tab0.id_periodo
        and liqa.id_clase_fondo = tab0.id_clase_fondo
        and liqa.id_mae_fondos = tab0.id_mae_fondos
        and liqa.id_concep_nomina = tab0.id_concep_nomina
        and liqa.id_tipo_doc = tab0.id_tipo_doc
        and liqa.num_doc = tab0.num_doc
    
        where
        tab0.tipo_planilla = 'C'
        AND tab0.id_periodo = $periodo_filtro
        $whereClaseFondo                    
        $whereMaeFondos
        $whereTAC
        $whereTipoCuenta   
    
    )tab0
    
    where
    1 = 1
    
    group by
    tab0.id_mae_fondos,
    tab0.fondo,
    tab0.nit,
    tab0.tipo_cuenta
    
    order by
    tab0.id_mae_fondos

)a
EOD;
            }



            /*
             * sql que trae los resultados
             */
            $sql = <<<EOD
select count(*) as count from (

$consulta
    
)
EOD;


            $total_record_count = CN_TABLE::executeSQL($sql);
            $total_record_count = $total_record_count[0]["count"];




            $sql = <<<EOD
SELECT * FROM ( SELECT row_.*, ROWNUM rownum_ FROM (

$consulta
                    
) row_ WHERE ROWNUM <=  $rowEnd   ) where rownum_ >  $rowStart
EOD;
            //ejecuta y obtiene el resultado del sql
            $resultado = CN_TABLE::executeSQL($sql);


            $this->totalRows = $total_record_count;
            $this->startRow = $rowStart;
            $this->endRow = $rowStart + count($resultado);
            $this->list_data = $resultado;
            $this->logMessage("[inf_gen_archivos_siif_nacion] Consulta exitosa.");
        } catch (Exception $e) {
            $this->status = 1;
            $this->totalRows = 0;
            $this->startRow = 0;
            $this->endRow = 0;
            $this->list_data = array();
            $this->logMessage("[inf_gen_archivos_siif_nacion] ERROR!!!");
            $this->logMessage($e->getMessage());
        }
    }

}
