<?php

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

    /**
     * 
     * @param sfWebRequest $request
     */
    public function executePdf(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");

        try {

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


            /*
             * Obtener consultas glodal
             */
            //Sql
            $sql = <<<EOD
select * from NO_CONSULTA 
EOD;
            //Ejecutar SQL
            $record_consul = CN_TABLE::executeSQL($sql);
            $record_consulta = array();

            if (count($record_consul) > 0) {
                foreach ($record_consul as $key => $value) {
                    $record_consulta[$value['caracter']] = $value;

//                    $this->logMessage("Caracter - " . $value['caracter']);
                }
            }

            $id_periodo = $request['id_periodo_filtro'];
            $id_agrup_concepto = $request['id_agrup_concepto'];
            $nombre_periodo = $request['nombre_periodo'];

            //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 = 1;
            $whereFuncionarioTipoDoc = "";
            if (isset($request['id_tipo_doc'])) {
                $id_tipo_doc = $request['id_tipo_doc'];
                $whereFuncionarioTipoDoc = " AND tab0.id_tipo_doc = " . $request['id_tipo_doc'];
            }

            //Sql
            $sql = <<<EOD
select
extract(YEAR FROM (select fecha_ini from no_periodo where id_periodo = $id_periodo)) as vig_ini,
1 as per_ini,
extract(YEAR FROM (select fecha_fin from no_periodo where id_periodo = $id_periodo)) as vig_fin,
extract(MONTH FROM (select fecha_fin from no_periodo where id_periodo = $id_periodo)) as per_fin,   
TAB0.ID_CESANTIA as ID_CESANTIA, TAB0.ID_PERIODO as ID_PERIODO, TAB0.ID_TIPO_DOC as ID_TIPO_DOC, 
TAB0.NUM_DOC as NUM_DOC, TAB0.ID_CONCEP_NOMINA as ID_CONCEP_NOMINA, TAB0.VALOR_LIQUIDADO as VALOR_LIQUIDADO, 
TAB0.NUM_DIAS as NUM_DIAS, 
TAB0.VALOR_BASE as VALOR_BASE, 
TAB0.VALOR_CONSOLIDADO as VALOR_CONSOLIDADO, TAB0.VALOR_APLICADO as VALOR_APLICADO, 
TAB0.VALOR_AJUSTE as VALOR_AJUSTE, TAB1.DESCRIPCION as DESCRIPCION, TAB1.ABREVIACION as ABREVIACION, 
TAB2.PRIMER_NOMBRE as PRIMER_NOMBRE, TAB2.SEGUNDO_NOMBRE as SEGUNDO_NOMBRE, 
TAB2.PRIMER_APELLIDO as PRIMER_APELLIDO, TAB2.SEGUNDO_APELLIDO as SEGUNDO_APELLIDO, 
TAB2.PRIMER_NOMBRE||' '||TAB2.SEGUNDO_NOMBRE as NOMBRE, 
tab2.nombre_apellido,
TAB3.ID_ANHOS as ID_ANHOS, 
TAB3.ID_MESES as ID_MESES, TAB3.ID_ANHOS||' '||TAB3.ID_MESES as PERIODO_MES, 
TAB4.ASIGNACION_BASICA as ASIGNACION_BASICA, TAB8.CODDEPTO as CODDEPTO, TAB9.CODMUN_TEXT as CODMUN_TEXT,
tab10.fecha_ingreso, tab10.fecha_termina, tab10.fecha_retiro

from NO_CESANTIA tab0  

join TIPO_DOCUMENTO TAB1 on TAB0.ID_TIPO_DOC = TAB1.ID_TIPO_DOC  
JOIN NO_DATOS_FUNCIONARIO_V tab2 ON tAB0.ID_TIPO_DOC = TAB2.ID_TIPO_DOC and TAB0.NUM_DOC = TAB2.NUM_DOC  
join NO_PERIODO TAB3 on TAB0.ID_PERIODO = TAB3.ID_PERIODO  
LEFT JOIN NO_LIQUIDA_V tab4 ON tab0.id_tipo_doc = tab4.id_tipo_dOC and TAB0.NUM_DOC = TAB4.NUM_DOC and TAB0.ID_PERIODO = TAB4.ID_PERIODO  
left join NO_ESTADO_FUNC_V TAB5 on TAB0.ID_TIPO_DOC = TAB5.ID_TIPO_DOC and TAB0.NUM_DOC = TAB5.NUM_DOC and TAB0.ID_PERIODO = TAB5.PERIODO
left join no_nombramiento tab10 ON tab10.id_tipo_doc = tab0.id_tipo_doc and tab10.num_doc = tab0.num_doc and tab10.id_dp = tab5.id_dp
left join NO_DP_V TAB6 on TAB5.ID_DP = TAB6.ID_DP  
left join CENTRO_OPERACION TAB7 on TAB5.ID_CEN_OP = TAB7.ID_CEN_OP  left join DEPARTAMENTO TAB8 on TAB7.ID_DEPTO = TAB8.ID_DEPTO  
left join MUNICIPIOS TAB9 on TAB7.CODMUN = TAB9.CODMUN 

where 
tab0.id_periodo = $id_periodo and tab0.CONSOLIDADO = 1
$whereFuncionarioNumDoc $whereFuncionarioTipoDoc

order by tab0.ID_PERIODO , tab0.ID_TIPO_DOC , tab0.NUM_DOC 
EOD;
            //Ejecutar SQL
            $funcionarios = CN_TABLE::executeSQL($sql);

            //Sql
            $sql = <<<EOD
select tab0.*,tab1.* 
from no_agrup_deta tab0
left join no_concep_nomina tab1 ON tab1.id_concep_nomina = tab0.id_concep_nomina
where tab0.id_agrup_concepto = $id_agrup_concepto
order by tab1.codigo 
EOD;
            //Ejecutar SQL
            $agrupaciones = CN_TABLE::executeSQL($sql);

            $arreglo = array();

            for ($i = 0; $i < count($funcionarios); $i++) {
                $valor = 0;
                $num_dias = 0;
                $id_tipo_doc = $funcionarios[$i]['id_tipo_doc'];
                $num_doc = $funcionarios[$i]['num_doc'];
                $vig_ini = $funcionarios[$i]['vig_ini'];
                $per_ini = $funcionarios[$i]['per_ini'];
                $vig_fin = $funcionarios[$i]['vig_fin'];
                $per_fin = $funcionarios[$i]['per_fin'];


                /*
                 * Verificar si para un funcionario cambia la asignacion basica en los ultimos 3 meses
                 * Valida si es por promedio o el ultimo salario pagado - 20140128
                 * Valida el caso de los funcionarios que tienen una novedad de encargo y terminación para la misma fecha - 20150211
                 */
//                    $sql = <<<EOD
//select tab.ult_valor - tab.valor as promedio from(
//
//select 
//SUM( case when LIQNOM.ID_PERIODO  = $id_periodo then round(LIQNOM.VALOR_LIQUIDADO/LIQNOM.NUM_DIAS*30) else 0 end ) as ult_valor,
//round( ( NVL(SUM(LIQNOM.VALOR_LIQUIDADO),0) / SUM(NVL(LIQNOM.NUM_DIAS,0)) ) * 30 )  as VALOR  
//from NO_LIQUIDA_NOMINA LIQNOM  
//join NO_PERIODO PER on PER.ID_PERIODO = LIQNOM.ID_PERIODO 
//where 1 = 1 and PER.ID_ANHOS || LPAD(PER.ID_MESES, 2, '0') 
//between  $vig_ini || LPAD( $per_fin-2, 2, '0')  and $vig_fin || LPAD( $per_fin, 2, '0')  
//and liqnom.num_doc = '$num_doc'  and liqnom.id_tipo_doc = $id_tipo_doc  
//    and liqnom.id_concep_nomina = (select NO_PARAM_CONCEP.ID_CONCEP_BASICA from NO_PARAM_CONCEP)   
//
//)tab
//EOD;


                $sql = <<<EOD
select tab.ult_valor - round(tab.valor/cant) as promedio from(

    select 
    
    SUM( case when LIQNOM.PERIODO  = $id_periodo then round(LIQNOM.valor) else 0 end )/
    (case when sum( case when LIQNOM.PERIODO  = $id_periodo then 1 else 0 end ) > 0 then sum( case when LIQNOM.PERIODO  = $id_periodo then 1 else 0 end ) else 1 end) as ult_valor,
    round( ( NVL(SUM(LIQNOM.valor),0)  ) )  as VALOR,
    count(LIQNOM.valor) as cant
    
    from no_concepto_periodo LIQNOM  
    join NO_PERIODO PER on PER.ID_PERIODO = LIQNOM.PERIODO 
    where 1 = 1 and PER.ID_ANHOS || LPAD(PER.ID_MESES, 2, '0') 
    between  $vig_ini || LPAD( $per_fin-2, 2, '0')  and $vig_fin || LPAD( $per_fin, 2, '0')  
    and liqnom.num_doc = '$num_doc'  and liqnom.id_tipo_doc = $id_tipo_doc  
        and liqnom.id_concep_nomina = (select NO_PARAM_CONCEP.ID_CONCEP_BASICA from NO_PARAM_CONCEP) 
    and (
        case 
        when LIQNOM.num_dias > 0  then 1 
        when LIQNOM.num_dias = 0  and  liqnom.fecha_desde <= liqnom.fecha_hasta then 1 
        else 0 end
    ) = 1

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

                $promedio = false;
                $tag_valor_promedio = false;
                if ($records_promedio[0]['promedio'] != 0) {
                    $promedio = true;
                }

                for ($j = 0; $j <= count($agrupaciones) - 1; $j++) {

                    if ($agrupaciones[$j]['tipo_valor'] == "P") {
                        $agrupaciones[$j]['tipo_valor'] = "R";
                    }

                    $id_concepto = $agrupaciones[$j]['id_concep_nomina'];
                    $concepto = $agrupaciones[$j]['abreviatura'];

                    if ($promedio) {
                        if ($agrupaciones[$j]['tipo_valor'] == "R") {
                            $agrupaciones[$j]['tipo_valor'] = "P";
                            $tag_valor_promedio = true;
                        } else {
                            $tag_valor_promedio = false;
                        }
                    }

                    $tipo_valor = $agrupaciones[$j]['tipo_valor'];
                    $this->logMessage("Tipo_valor :: " . $tipo_valor);

                    $consulta = $record_consulta[$agrupaciones[$j]['tipo_valor']]['consulta'];
                    /*
                     * Variables y estructura para manejo de consultas con variables bind - 20130829
                     */
                    //Reemplazo de $ por : para variables bind
//                $consulta = str_replace('$', ':', $consulta);
                    //Reemplazo de id_concep_nomina
                    $consulta = str_replace('$id_concep_nomina', $id_concepto, $consulta);
                    $consulta = str_replace('$num_doc', $num_doc, $consulta);
                    $consulta = str_replace('$id_tipo_doc', $id_tipo_doc, $consulta);
                    $consulta = str_replace('$id_periodo', $id_periodo, $consulta);
                    $consulta = str_replace('$periodo', $id_periodo, $consulta);
                    $consulta = str_replace('$tag', 1, $consulta);
                    $consulta = str_replace('$tg_retro', 1, $consulta);

                    /*
                     * Reemplaza en la consulta los filtros y valores del SQL, que vienen en el record
                     * Ejemplo: select raz_soc from id_cia where id_cia = $id_cia
                     * Reemplaza $id_cia por el valor en el record
                     */
                    $consulta = CN_TABLE::reemplazoConsulta($consulta, $funcionarios[$i]);

                    /*
                     * Ejecutar SQL de consulta
                     * select nvl(sum(valor_liquidado),0) as valor from no_liquida_nomina where id_periodo = :periodo - ejemplo bind
                     */
                    //Sql
                    $sql = <<<EOD
$consulta  
EOD;
                    $conceptos = CN_TABLE::executeSQL($sql);
                    if (count($conceptos) > 0) {

                        /**
                         * Se crea tabla para guardar el valor promedio y tomarlo de hay - 20160208
                         */
                        //Sql
                        $sql = <<<EOD
select 
id_liquida_promedio,
id_anhos,
id_tipo_doc,
num_doc,
id_concep_nomina,
caracter,
case when valor_promedio = -1 then 0 else valor_promedio end as valor_promedio
from no_liquida_promedio
where id_anhos = $vig_fin
and id_tipo_doc = $id_tipo_doc
and num_doc = '$num_doc'
and caracter in ( case when '$tipo_valor' = 'R' then 'P' else '$tipo_valor' end , case when '$tipo_valor' != 'R' then '' else '$tipo_valor' end )
and id_concep_nomina = $id_concepto     
EOD;
                        $rec_promedio = CN_TABLE::executeSQL($sql);
                        if (count($rec_promedio) > 0 /* && $tag_valor_promedio */) {
                            $this->logMessage("rec_promedio :: " . count($rec_promedio));
                            $valor = $rec_promedio[0]['valor_promedio'];
                        } else {
                            $valor = $conceptos[0]['valor'];
                        }
                    } else {
                        $valor = 0;
                    }

                    /*
                      if ($agrupaciones[$j]['tipo_valor'] == "C") {


                      //Sql
                      $sql = <<<EOD
                      select nvl(valor,0) AS VALOR
                      from no_concepto_func
                      where id_tipo_doc = $id_tipo_doc and num_doc = '$num_doc'
                      and id_concep_nomina = $id_concepto and estado = 1 and actual = 1
                      EOD;
                      //Ejecutar SQL
                      $conceptos = CN_TABLE::executeSQL($sql);

                      if (count($conceptos) > 0) {
                      $valor = $conceptos[0]['valor'];
                      } else {
                      $valor = 0;
                      }
                      }

                      if ($agrupaciones[$j]['tipo_valor'] == "U") {


                      //Sql
                      $sql = <<<EOD
                      select nvl(valor,0) AS VALOR
                      from no_ultimo_valor
                      where id_tipo_doc = $id_tipo_doc and num_doc = '$num_doc'
                      and id_concep_nomina = $id_concepto
                      EOD;
                      //Ejecutar SQL
                      $conceptos = CN_TABLE::executeSQL($sql);

                      if (count($conceptos) > 0) {
                      $valor = $conceptos[0]['valor'];
                      } else {
                      $valor = 0;
                      }
                      }

                      if ($agrupaciones[$j]['tipo_valor'] == "P") {

                      //tipov valor K - promedio valor tabla
                      //Sql
                      $sql = <<<EOD
                      select nvl(valor, (select nvl(valor,0) from( SELECT tab.*, ROW_NUMBER() OVER ( PARTITION BY tab.num_doc ORDER BY TAB.FECHA_HASTA desc ) as rn
                      from no_concepto_periodo tab where periodo = $id_periodo and num_doc = $num_doc and id_tipo_doc = $id_tipo_doc and id_concep_nomina = $id_concepto  )
                      where rn = 1 ) ) as valor
                      from( SELECT tab.*, ROW_NUMBER() OVER ( PARTITION BY tab.num_doc ORDER BY TAB.id_promedio_periodo desc ) as rn
                      from no_promedio_periodo tab
                      where id_periodo = $id_periodo and num_doc = $num_doc and id_tipo_doc = $id_tipo_doc and id_concep_nomina = $id_concepto  ) where rn = 1
                      EOD;
                      //Sql
                      $sql = <<<EOD
                      select nvl( round( ( NVL(SUM(LIQNOM.VALOR_LIQUIDADO),0) / SUM(NVL(LIQNOM.NUM_DIAS,0)) ) * 30 ) ,0) as VALOR
                      from no_liquida_nomina liqnom  join no_periodo per on per.id_periodo = liqnom.id_periodo where    1 = 1 and per.id_anhos || lpad(per.id_meses, 2, '0')
                      between  $vig_ini || lpad( $per_ini, 2, '0')  and $vig_fin || lpad( $per_fin, 2, '0')
                      and liqnom.num_doc = $num_doc  and liqnom.id_tipo_doc = $id_tipo_doc  and liqnom.id_concep_nomina = $id_concepto
                      EOD;
                      //Ejecutar SQL
                      $conceptos = CN_TABLE::executeSQL($sql);

                      if (count($conceptos) > 0) {
                      $valor = $conceptos[0]['valor'];
                      } else {
                      $valor = 0;
                      }
                      }

                      if ($agrupaciones[$j]['tipo_valor'] == "R") {


                      //Sql
                      $sql = <<<EOD
                      select valor from(
                      SELECT
                      tab.*,
                      ROW_NUMBER() OVER ( PARTITION BY tab.num_doc ORDER BY TAB.FECHA_HASTA desc ) as rn
                      from no_concepto_periodo tab
                      where periodo = $id_periodo and num_doc = $num_doc
                      and id_tipo_doc = $id_tipo_doc and id_concep_nomina = $id_concepto
                      ) where rn = 1
                      EOD;
                      //Ejecutar SQL
                      $conceptos = CN_TABLE::executeSQL($sql);

                      if (count($conceptos) > 0) {
                      $valor = $conceptos[0]['valor'];
                      } else {
                      $valor = 0;
                      }
                      }

                      if ($agrupaciones[$j]['tipo_valor'] == "V") {


                      //Sql
                      $sql = <<<EOD
                      select nvl(sum(liqnom.valor_liquidado),0) as valor
                      from no_liquida_nomina liqnom
                      join no_periodo per on per.id_periodo = liqnom.id_periodo
                      where    1 = 1 and per.id_anhos || lpad(per.id_meses, 2, '0')
                      between  $vig_ini || lpad( $per_ini, 2, '0')  and $vig_fin || lpad( $per_fin, 2, '0')
                      and liqnom.num_doc = $num_doc  and liqnom.id_tipo_doc = $id_tipo_doc
                      and liqnom.id_concep_nomina = $id_concepto
                      EOD;
                      //Ejecutar SQL
                      $conceptos = CN_TABLE::executeSQL($sql);

                      if (count($conceptos) > 0) {
                      $valor = $conceptos[0]['valor'];
                      } else {
                      $valor = 0;
                      }
                      }

                      if ($agrupaciones[$j]['tipo_valor'] == "M") {

                      //Sql
                      $sql = <<<EOD
                      select nvl(valor_liquidado,0) AS VALOR, num_dias AS NUM_DIAS
                      from no_liquida_nomina
                      where id_tipo_doc = $id_tipo_doc and num_doc = '$num_doc'
                      and id_concep_nomina = $id_concepto and id_periodo = $id_periodo
                      EOD;
                      //Ejecutar SQL
                      $conceptos = CN_TABLE::executeSQL($sql);

                      if (count($conceptos) > 0) {
                      $valor = $conceptos[0]['valor'];
                      $num_dias = $conceptos[0]['num_dias'];
                      } else {
                      $valor = 0;
                      $num_dias = 0;
                      }
                      }
                     */
                    $fecha_ingreso = $funcionarios[$i]['fecha_ingreso'];

                    $arreglo[$i]['num_doc'] = $funcionarios[$i]['num_doc'];
                    $arreglo[$i]['nombre'] = $funcionarios[$i]['nombre_apellido'];
                    $arreglo[$i]['fecha_ingreso'] = $fecha_ingreso;
                    $arreglo[$i]['fecha_termina'] = "";
//                    $arreglo[$i]['num_dias'] = $num_dias;
                    $arreglo[$i]['num_dias'] = $funcionarios[$i]['num_dias'];
                    $arreglo[$i]['valor_consolidado'] = $funcionarios[$i]['valor_consolidado'];
                    $arreglo[$i]['valor_aplicado'] = $funcionarios[$i]['valor_aplicado'];


                    $arreglo[$i][$concepto] = $valor;
                }
            }

            $pdf = new CDPDF('L', 'mm', 'letter');
            $pdf->SetFont('Times', 'B', 8);
            $pdf->SetFillColor(255);
            $pdf->SetTextColor(0);
            // Header
            $pdf->AddPage();

            $pdf->SetFont('Times', 'B', 14);

            $pdf->Cell(250, 8, "Planilla Conceptos Consolidado Cesantias", 0, 1, 'C');
            $pdf->Cell(250, 8, $nombre_periodo, 0, 1, 'C');
            $pdf->ln();
            $pdf->SetFont('Times', '', 6);


            $html = '<table border="1"><tr><td>aaa</td></tr></table>';



            $html = '<table border="1">';
            $html.='<tr>';

            foreach ($arreglo[0] as $key => $value) {

                $html.='<td style="text-align:center;background-color:rgb(100, 100, 100); color: rgb(255, 255, 255);">' . $key . '</td>';
            }
            $html.='</tr>';

            foreach ($arreglo as $key => $value) {
                $html.='<tr>';

                foreach ($value as $key => $registro) {
                    if (!is_numeric($registro)) {

                        if ($key == "fecha_ingreso" || $key == "fecha_termina") {
                            $html.='<td style="text-align:center">' . $registro . '</td>';
                        } else {

                            $html.='<td>' . $registro . '</td>';
                        }
                    } else {
                        if ($key == "num_doc" || $key == "num_dias") {
                            $html.='<td  style="text-align:center">' . $registro . '</td>';
                        } else {
                            $html.='<td  style="text-align:right">' . number_format($registro, 2) . '</td>';
                        }
                    }
                }
                $html.='</tr>';
            }

            $html.='</table>';


            $pdf->writeHTML($html, true, false, true, false, '');
            $pdf->Output("Planilla Conceptos Consolidado Cesantias", "D");
            die();
        } catch (Exception $exc) {
            echo $exc->getTraceAsString();
            die();
        }
    }

    /**
     * 
     * @param sfWebRequest $request
     */
    public function executeExcel(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");

        try {

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


            /*
             * Obtener consultas glodal
             */
            //Sql
            $sql = <<<EOD
select * from NO_CONSULTA 
EOD;
            //Ejecutar SQL
            $record_consul = CN_TABLE::executeSQL($sql);
            $record_consulta = array();

            if (count($record_consul) > 0) {
                foreach ($record_consul as $key => $value) {
                    $record_consulta[$value['caracter']] = $value;

//                    $this->logMessage("Caracter - " . $value['caracter']);
                }
            }

            $id_periodo = $request['id_periodo_filtro'];
            $id_agrup_concepto = $request['id_agrup_concepto'];
            $nombre_periodo = $request['nombre_periodo'];

            //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 = 1;
            $whereFuncionarioTipoDoc = "";
            if (isset($request['id_tipo_doc'])) {
                $id_tipo_doc = $request['id_tipo_doc'];
                $whereFuncionarioTipoDoc = " AND tab0.id_tipo_doc = " . $request['id_tipo_doc'];
            }

            //Sql
            $sql = <<<EOD
select
extract(YEAR FROM (select fecha_ini from no_periodo where id_periodo = $id_periodo)) as vig_ini,
1 as per_ini,
extract(YEAR FROM (select fecha_fin from no_periodo where id_periodo = $id_periodo)) as vig_fin,
extract(MONTH FROM (select fecha_fin from no_periodo where id_periodo = $id_periodo)) as per_fin,   
TAB0.ID_CESANTIA as ID_CESANTIA, TAB0.ID_PERIODO as ID_PERIODO, TAB0.ID_TIPO_DOC as ID_TIPO_DOC, 
TAB0.NUM_DOC as NUM_DOC, TAB0.ID_CONCEP_NOMINA as ID_CONCEP_NOMINA, TAB0.VALOR_LIQUIDADO as VALOR_LIQUIDADO, 
TAB0.NUM_DIAS as NUM_DIAS, 
TAB0.VALOR_BASE as VALOR_BASE, 
TAB0.VALOR_CONSOLIDADO as VALOR_CONSOLIDADO, TAB0.VALOR_APLICADO as VALOR_APLICADO, 
TAB0.VALOR_AJUSTE as VALOR_AJUSTE, TAB1.DESCRIPCION as DESCRIPCION, TAB1.ABREVIACION as ABREVIACION, 
TAB2.PRIMER_NOMBRE as PRIMER_NOMBRE, TAB2.SEGUNDO_NOMBRE as SEGUNDO_NOMBRE, 
TAB2.PRIMER_APELLIDO as PRIMER_APELLIDO, TAB2.SEGUNDO_APELLIDO as SEGUNDO_APELLIDO, 
TAB2.PRIMER_NOMBRE||' '||TAB2.SEGUNDO_NOMBRE as NOMBRE, 
tab2.nombre_apellido,
TAB3.ID_ANHOS as ID_ANHOS, 
TAB3.ID_MESES as ID_MESES, TAB3.ID_ANHOS||' '||TAB3.ID_MESES as PERIODO_MES, 
TAB4.ASIGNACION_BASICA as ASIGNACION_BASICA, TAB8.CODDEPTO as CODDEPTO, TAB9.CODMUN_TEXT as CODMUN_TEXT,
tab10.fecha_ingreso, tab10.fecha_termina, tab10.fecha_retiro

from NO_CESANTIA tab0  

join TIPO_DOCUMENTO TAB1 on TAB0.ID_TIPO_DOC = TAB1.ID_TIPO_DOC  
JOIN NO_DATOS_FUNCIONARIO_V tab2 ON tAB0.ID_TIPO_DOC = TAB2.ID_TIPO_DOC and TAB0.NUM_DOC = TAB2.NUM_DOC  
join NO_PERIODO TAB3 on TAB0.ID_PERIODO = TAB3.ID_PERIODO  
LEFT JOIN NO_LIQUIDA_V tab4 ON tab0.id_tipo_doc = tab4.id_tipo_dOC and TAB0.NUM_DOC = TAB4.NUM_DOC and TAB0.ID_PERIODO = TAB4.ID_PERIODO  
left join NO_ESTADO_FUNC_V TAB5 on TAB0.ID_TIPO_DOC = TAB5.ID_TIPO_DOC and TAB0.NUM_DOC = TAB5.NUM_DOC and TAB0.ID_PERIODO = TAB5.PERIODO
left join no_nombramiento tab10 ON tab10.id_tipo_doc = tab0.id_tipo_doc and tab10.num_doc = tab0.num_doc and tab10.id_dp = tab5.id_dp
left join NO_DP_V TAB6 on TAB5.ID_DP = TAB6.ID_DP  
left join CENTRO_OPERACION TAB7 on TAB5.ID_CEN_OP = TAB7.ID_CEN_OP  left join DEPARTAMENTO TAB8 on TAB7.ID_DEPTO = TAB8.ID_DEPTO  
left join MUNICIPIOS TAB9 on TAB7.CODMUN = TAB9.CODMUN 

where 
tab0.id_periodo = $id_periodo and tab0.CONSOLIDADO = 1
$whereFuncionarioNumDoc $whereFuncionarioTipoDoc

order by tab0.ID_PERIODO , tab0.ID_TIPO_DOC , tab0.NUM_DOC 
EOD;
            //Ejecutar SQL
            $funcionarios = CN_TABLE::executeSQL($sql);

            //Sql
            $sql = <<<EOD
select tab0.*,tab1.* 
from no_agrup_deta tab0
left join no_concep_nomina tab1 ON tab1.id_concep_nomina = tab0.id_concep_nomina
where tab0.id_agrup_concepto = $id_agrup_concepto 
EOD;
            //Ejecutar SQL
            $agrupaciones = CN_TABLE::executeSQL($sql);

            $arreglo = array();

            for ($i = 0; $i < count($funcionarios); $i++) {
                $valor = 0;
                $num_dias = 0;
                $id_tipo_doc = $funcionarios[$i]['id_tipo_doc'];
                $num_doc = $funcionarios[$i]['num_doc'];
                $vig_ini = $funcionarios[$i]['vig_ini'];
                $per_ini = $funcionarios[$i]['per_ini'];
                $vig_fin = $funcionarios[$i]['vig_fin'];
                $per_fin = $funcionarios[$i]['per_fin'];


                /*
                 * Verificar si para un funcionario cambia la asignacion basica en los ultimos 3 meses
                 * Valida si es por promedio o el ultimo salario pagado - 20140128
                 */
//                    $sql = <<<EOD
//select tab.ult_valor - tab.valor as promedio from(
//
//select 
//SUM( case when LIQNOM.ID_PERIODO  = $id_periodo then round(LIQNOM.VALOR_LIQUIDADO/LIQNOM.NUM_DIAS*30) else 0 end ) as ult_valor,
//round( ( NVL(SUM(LIQNOM.VALOR_LIQUIDADO),0) / SUM(NVL(LIQNOM.NUM_DIAS,0)) ) * 30 )  as VALOR  
//from NO_LIQUIDA_NOMINA LIQNOM  
//join NO_PERIODO PER on PER.ID_PERIODO = LIQNOM.ID_PERIODO 
//where 1 = 1 and PER.ID_ANHOS || LPAD(PER.ID_MESES, 2, '0') 
//between  $vig_ini || LPAD( $per_fin-2, 2, '0')  and $vig_fin || LPAD( $per_fin, 2, '0')  
//and liqnom.num_doc = '$num_doc'  and liqnom.id_tipo_doc = $id_tipo_doc  
//    and liqnom.id_concep_nomina = (select NO_PARAM_CONCEP.ID_CONCEP_BASICA from NO_PARAM_CONCEP)   
//
//)tab
//EOD;


                $sql = <<<EOD
select tab.ult_valor - round(tab.valor/cant) as promedio from(

    select 
    
    SUM( case when LIQNOM.PERIODO  = $id_periodo then round(LIQNOM.valor) else 0 end )/
    (case when sum( case when LIQNOM.PERIODO  = $id_periodo then 1 else 0 end ) > 0 then sum( case when LIQNOM.PERIODO  = $id_periodo then 1 else 0 end ) else 1 end) as ult_valor,
    round( ( NVL(SUM(LIQNOM.valor),0)  ) )  as VALOR,
    count(LIQNOM.valor) as cant
    
    from no_concepto_periodo LIQNOM  
    join NO_PERIODO PER on PER.ID_PERIODO = LIQNOM.PERIODO 
    where 1 = 1 and PER.ID_ANHOS || LPAD(PER.ID_MESES, 2, '0') 
    between  $vig_ini || LPAD( $per_fin-2, 2, '0')  and $vig_fin || LPAD( $per_fin, 2, '0')  
    and liqnom.num_doc = '$num_doc'  and liqnom.id_tipo_doc = $id_tipo_doc  
        and liqnom.id_concep_nomina = (select NO_PARAM_CONCEP.ID_CONCEP_BASICA from NO_PARAM_CONCEP) 
    and (
        case 
        when LIQNOM.num_dias > 0  then 1 
        when LIQNOM.num_dias = 0  and  liqnom.fecha_desde <= liqnom.fecha_hasta then 1 
        else 0 end
    ) = 1   

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

                $promedio = false;
                $tag_valor_promedio = false;
                if ($records_promedio[0]['promedio'] != 0) {
                    $promedio = true;
                }

                for ($j = 0; $j <= count($agrupaciones) - 1; $j++) {

                    if ($agrupaciones[$j]['tipo_valor'] == "P") {
                        $agrupaciones[$j]['tipo_valor'] = "R";
                    }


                    $id_concepto = $agrupaciones[$j]['id_concep_nomina'];
                    $concepto = $agrupaciones[$j]['abreviatura'];

                    $this->logMessage("---------------------------------------");
                    $this->logMessage("$i :: $num_doc :: $id_concepto :: $concepto :: " . $agrupaciones[$j]['tipo_valor']);
                    $this->logMessage("---------------------------------------");

                    if ($promedio) {
                        if ($agrupaciones[$j]['tipo_valor'] == "R") {
                            $agrupaciones[$j]['tipo_valor'] = "P";
                            $tag_valor_promedio = true;
                        } else {
                            $tag_valor_promedio = false;
                        }
                    }

                    $tipo_valor = $agrupaciones[$j]['tipo_valor'];
                    $this->logMessage("Tipo_valor :: " . $tipo_valor);

                    $consulta = $record_consulta[$agrupaciones[$j]['tipo_valor']]['consulta'];
                    /*
                     * Variables y estructura para manejo de consultas con variables bind - 20130829
                     */
                    //Reemplazo de $ por : para variables bind
//                $consulta = str_replace('$', ':', $consulta);
                    //Reemplazo de id_concep_nomina
                    $consulta = str_replace('$id_concep_nomina', $id_concepto, $consulta);
                    $consulta = str_replace('$num_doc', $num_doc, $consulta);
                    $consulta = str_replace('$id_tipo_doc', $id_tipo_doc, $consulta);
                    $consulta = str_replace('$id_periodo', $id_periodo, $consulta);
                    $consulta = str_replace('$periodo', $id_periodo, $consulta);
                    $consulta = str_replace('$tag', 1, $consulta);
                    $consulta = str_replace('$tg_retro', 1, $consulta);

                    /*
                     * Reemplaza en la consulta los filtros y valores del SQL, que vienen en el record
                     * Ejemplo: select raz_soc from id_cia where id_cia = $id_cia
                     * Reemplaza $id_cia por el valor en el record
                     */
                    $consulta = CN_TABLE::reemplazoConsulta($consulta, $funcionarios[$i]);

                    /*
                     * Ejecutar SQL de consulta
                     * select nvl(sum(valor_liquidado),0) as valor from no_liquida_nomina where id_periodo = :periodo - ejemplo bind
                     */
                    //Sql
                    $sql = <<<EOD
$consulta  
EOD;
                    $conceptos = CN_TABLE::executeSQL($sql);
                    if (count($conceptos) > 0) {


                        /**
                         * Se crea tabla para guardar el valor promedio y tomarlo de hay - 20160208
                         */
                        //Sql
                        $sql = <<<EOD
select 
id_liquida_promedio,
id_anhos,
id_tipo_doc,
num_doc,
id_concep_nomina,
caracter,
case when valor_promedio = -1 then 0 else valor_promedio end as valor_promedio
from no_liquida_promedio
where id_anhos = $vig_fin
and id_tipo_doc = $id_tipo_doc
and num_doc = '$num_doc'
and caracter in ( case when '$tipo_valor' = 'R' then 'P' else '$tipo_valor' end , case when '$tipo_valor' != 'R' then '' else '$tipo_valor' end )
and id_concep_nomina = $id_concepto     
EOD;
                        $rec_promedio = CN_TABLE::executeSQL($sql);
                        if (count($rec_promedio) > 0 /* && $tag_valor_promedio */) {
                            $this->logMessage("rec_promedio :: " . count($rec_promedio));
                            $valor = $rec_promedio[0]['valor_promedio'];
                        } else {
                            $valor = $conceptos[0]['valor'];
                        }
                    } else {
                        $valor = 0;
                    }


                    /*
                      if ($agrupaciones[$j]['tipo_valor'] == "C") {


                      //Sql
                      $sql = <<<EOD
                      select nvl(valor,0) AS VALOR
                      from no_concepto_func
                      where id_tipo_doc = $id_tipo_doc and num_doc = '$num_doc'
                      and id_concep_nomina = $id_concepto and estado = 1 and actual = 1
                      EOD;
                      //Ejecutar SQL
                      $conceptos = CN_TABLE::executeSQL($sql);

                      if (count($conceptos) > 0) {
                      $valor = $conceptos[0]['valor'];
                      } else {
                      $valor = 0;
                      }
                      }

                      if ($agrupaciones[$j]['tipo_valor'] == "U") {


                      //Sql
                      $sql = <<<EOD
                      select nvl(valor,0) AS VALOR
                      from no_ultimo_valor
                      where id_tipo_doc = $id_tipo_doc and num_doc = '$num_doc'
                      and id_concep_nomina = $id_concepto
                      EOD;
                      //Ejecutar SQL
                      $conceptos = CN_TABLE::executeSQL($sql);

                      if (count($conceptos) > 0) {
                      $valor = $conceptos[0]['valor'];
                      } else {
                      $valor = 0;
                      }
                      }

                      if ($agrupaciones[$j]['tipo_valor'] == "P") {

                      //tipov valor K - promedio valor tabla
                      //Sql
                      $sql = <<<EOD
                      select nvl(valor, (select nvl(valor,0) from( SELECT tab.*, ROW_NUMBER() OVER ( PARTITION BY tab.num_doc ORDER BY TAB.FECHA_HASTA desc ) as rn
                      from no_concepto_periodo tab where periodo = $id_periodo and num_doc = $num_doc and id_tipo_doc = $id_tipo_doc and id_concep_nomina = $id_concepto  )
                      where rn = 1 ) ) as valor
                      from( SELECT tab.*, ROW_NUMBER() OVER ( PARTITION BY tab.num_doc ORDER BY TAB.id_promedio_periodo desc ) as rn
                      from no_promedio_periodo tab
                      where id_periodo = $id_periodo and num_doc = $num_doc and id_tipo_doc = $id_tipo_doc and id_concep_nomina = $id_concepto  ) where rn = 1
                      EOD;
                      //Sql
                      $sql = <<<EOD
                      select nvl( round( ( NVL(SUM(LIQNOM.VALOR_LIQUIDADO),0) / SUM(NVL(LIQNOM.NUM_DIAS,0)) ) * 30 ) ,0) as VALOR
                      from no_liquida_nomina liqnom  join no_periodo per on per.id_periodo = liqnom.id_periodo where    1 = 1 and per.id_anhos || lpad(per.id_meses, 2, '0')
                      between  $vig_ini || lpad( $per_ini, 2, '0')  and $vig_fin || lpad( $per_fin, 2, '0')
                      and liqnom.num_doc = $num_doc  and liqnom.id_tipo_doc = $id_tipo_doc  and liqnom.id_concep_nomina = $id_concepto
                      EOD;
                      //Ejecutar SQL
                      $conceptos = CN_TABLE::executeSQL($sql);

                      if (count($conceptos) > 0) {
                      $valor = $conceptos[0]['valor'];
                      } else {
                      $valor = 0;
                      }
                      }

                      if ($agrupaciones[$j]['tipo_valor'] == "R") {


                      //Sql
                      $sql = <<<EOD
                      select valor from(
                      SELECT
                      tab.*,
                      ROW_NUMBER() OVER ( PARTITION BY tab.num_doc ORDER BY TAB.FECHA_HASTA desc ) as rn
                      from no_concepto_periodo tab
                      where periodo = $id_periodo and num_doc = $num_doc
                      and id_tipo_doc = $id_tipo_doc and id_concep_nomina = $id_concepto
                      ) where rn = 1
                      EOD;
                      //Ejecutar SQL
                      $conceptos = CN_TABLE::executeSQL($sql);

                      if (count($conceptos) > 0) {
                      $valor = $conceptos[0]['valor'];
                      } else {
                      $valor = 0;
                      }
                      }

                      if ($agrupaciones[$j]['tipo_valor'] == "V") {


                      //Sql
                      $sql = <<<EOD
                      select nvl(sum(liqnom.valor_liquidado),0) as valor
                      from no_liquida_nomina liqnom
                      join no_periodo per on per.id_periodo = liqnom.id_periodo
                      where    1 = 1 and per.id_anhos || lpad(per.id_meses, 2, '0')
                      between  $vig_ini || lpad( $per_ini, 2, '0')  and $vig_fin || lpad( $per_fin, 2, '0')
                      and liqnom.num_doc = $num_doc  and liqnom.id_tipo_doc = $id_tipo_doc
                      and liqnom.id_concep_nomina = $id_concepto
                      EOD;
                      //Ejecutar SQL
                      $conceptos = CN_TABLE::executeSQL($sql);

                      if (count($conceptos) > 0) {
                      $valor = $conceptos[0]['valor'];
                      } else {
                      $valor = 0;
                      }
                      }

                      if ($agrupaciones[$j]['tipo_valor'] == "M") {

                      //Sql
                      $sql = <<<EOD
                      select nvl(valor_liquidado,0) AS VALOR, num_dias AS NUM_DIAS
                      from no_liquida_nomina
                      where id_tipo_doc = $id_tipo_doc and num_doc = '$num_doc'
                      and id_concep_nomina = $id_concepto and id_periodo = $id_periodo
                      EOD;
                      //Ejecutar SQL
                      $conceptos = CN_TABLE::executeSQL($sql);

                      if (count($conceptos) > 0) {
                      $valor = $conceptos[0]['valor'];
                      $num_dias = $conceptos[0]['num_dias'];
                      } else {
                      $valor = 0;
                      $num_dias = 0;
                      }
                      }
                     */
                    $fecha_ingreso = $funcionarios[$i]['fecha_ingreso'];

                    $arreglo[$i]['num_doc'] = $funcionarios[$i]['num_doc'];
                    $arreglo[$i]['nombre'] = $funcionarios[$i]['nombre_apellido'];
                    $arreglo[$i]['fecha_ingreso'] = $fecha_ingreso;
                    $arreglo[$i]['fecha_termina'] = "";
//                    $arreglo[$i]['num_dias'] = $num_dias;
                    $arreglo[$i]['num_dias'] = $funcionarios[$i]['num_dias'];
                    $arreglo[$i]['valor_consolidado'] = $funcionarios[$i]['valor_consolidado'];
                    $arreglo[$i]['valor_aplicado'] = $funcionarios[$i]['valor_aplicado'];


                    $arreglo[$i][$concepto] = $valor;
                }
            }

            $pdf = new CDPDF('L', 'mm', 'letter');
            $pdf->SetFont('Times', 'B', 8);
            $pdf->SetFillColor(255);
            $pdf->SetTextColor(0);
            // Header
            $pdf->AddPage();

            $pdf->SetFont('Times', 'B', 14);

            $pdf->Cell(250, 8, "Planilla Conceptos Consolidado Cesantias", 0, 1, 'C');
            $pdf->Cell(250, 8, $nombre_periodo, 0, 1, 'C');
            $pdf->ln();
            $pdf->SetFont('Times', '', 6);


            $html = '<table border="1"><tr><td>aaa</td></tr></table>';



            $html = '<table border="1">';
            $html.='<tr>';

            foreach ($arreglo[0] as $key => $value) {

                $html.='<td style="text-align:center;background-color:rgb(100, 100, 100); color: rgb(255, 255, 255);">' . $key . '</td>';
            }
            $html.='</tr>';

            foreach ($arreglo as $key => $value) {
                $html.='<tr>';

                foreach ($value as $key => $registro) {
                    if (!is_numeric($registro)) {

                        if ($key == "fecha_ingreso" || $key == "fecha_termina") {
                            $html.='<td style="text-align:center">' . $registro . '</td>';
                        } else {

                            $html.='<td>' . $registro . '</td>';
                        }
                    } else {
                        if ($key == "num_doc" || $key == "num_dias") {
                            $html.='<td  style="text-align:center">' . $registro . '</td>';
                        } else {
                            $html.='<td  style="text-align:right">' . number_format($registro, 2, ',', '.') . '</td>';
                        }
                    }
                }
                $html.='</tr>';
            }

            $html.='</table>';

            $nombre = "Planilla Conceptos Consolidado Cesantias.xls";
            header("Content-type: application/vnd.ms-excel; name='excel'");
            header("Content-Disposition: filename=" . $nombre);
            header("Pragma: no-cache");
            header("Expires: 0");
            echo $html;
            die();
        } catch (Exception $exc) {
            echo $exc->getTraceAsString();
            die();
        }
    }

}
