<?php

/**
 * agrup_concep_tot actions.
 *
 * @package    nomina
 * @subpackage agrup_concep_tot
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class agrup_concep_totActions 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
order by caracter 
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'];

            /**
             * Se agrega fecha para calculo de dias y periodos del tipo valor V - 20151105
             */
            $fecha_ini = $request['fecha_ini'];
            $fecha_fin = $request['fecha_fin'];

            $fecha_ini = explode('-', $fecha_ini);
            $fecha_fin = explode('-', $fecha_fin);

            $anho_ini = $fecha_ini[0];
            $mes_ini = $fecha_ini[1];
            $anho_fin = $fecha_ini[0];
            $mes_fin = $fecha_fin[1];

            //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'];
            }
            //area
            if (isset($request['id_ea'])) {
                $whereArea = " AND tab0.id_ea = " . $request['id_ea'];
            } else {
                $whereArea = ' ';
            }
            //cenop
            if (isset($request['id_cen_op'])) {
                $whereCenOp = " AND tab0.id_cen_op = " . $request['id_cen_op'];
            } else {
                $whereCenOp = ' ';
            }

            /*
             * Tag_retro para cuando es retroactivo, para retencion tiene encuenta todo el mes con lo del retroactivo - 20150610
             */
            //Sql
            $sql = <<<EOD
select
1 as tag,
0 as tg_retro,
$anho_ini as vig_ini,
$mes_ini as per_ini,
$anho_fin as vig_fin,
$mes_fin as per_fin,   
tab0.ID_ESTADO_FUNC,
tab0.ID_TIPO_DOC,
tab0.NUM_DOC,
tab0.ID_DP,
tab0.ID_ANHOS,
tab0.ID_MESES,
tab0.PERIODO,
tab0.ACTUAL,
tab0.ID_EA,
tab0.ID_CEN_OP,
tab0.RN, 
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||' '||TAB3.ID_MESES as PERIODO_MES,
tab10.fecha_ingreso, tab10.fecha_termina, tab10.fecha_retiro, 
translate(tab5.descripcion,'áéíóúÁÉÍÓÚñÑ','aeiouAEIOUnN') as area, 
translate(tab7.nom_cen_op,'áéíóúÁÉÍÓÚñÑ','aeiouAEIOUnN') as nom_cen_op, 
translate(tab7.prefijo,'áéíóúÁÉÍÓÚñÑ','aeiouAEIOUnN') as prefijo,
TAB8.CODDEPTO as CODDEPTO, TAB9.CODMUN_TEXT as CODMUN_TEXT,
case when TAB3.id_tipo_periodo in (3,4) then nvl(tabser.num_dias,0) else nvl(tab4.num_dias,0) end as num_dias,
nvl(tab4.num_dias,0) as num_dias_per,
nvl(tabser.num_dias,0) as num_dias_primserv,
TAB3.id_tipo_periodo

from NO_ESTADO_FUNC_V 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.PERIODO = TAB3.ID_PERIODO 
left join no_liquida_nomina tab4 on tab0.id_tipo_doc = tab4.id_tipo_dOC and TAB0.NUM_DOC = TAB4.NUM_DOC and TAB0.PERIODO = TAB4.ID_PERIODO  and tab4.id_concep_nomina = 1
left join no_nombramiento_v tab10 ON tab10.id_tipo_doc = tab0.id_tipo_doc and tab10.num_doc = tab0.num_doc 
left join area tab5 on tab0.id_ea = tab5.id_area
left join NO_DP_V TAB6 on tab0.ID_DP = TAB6.ID_DP  
left join CENTRO_OPERACION TAB7 on tab0.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 

left join no_liquida_nomina tabser on tab0.id_tipo_doc = tabser.id_tipo_dOC and TAB0.NUM_DOC = tabser.NUM_DOC and TAB0.PERIODO = tabser.ID_PERIODO  and tabser.id_concep_nomina in (16,17)

where 
tab0.periodo = $id_periodo 
$whereFuncionarioNumDoc $whereFuncionarioTipoDoc

order by tab0.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'];

                //dias segin ŕima servicios y navidad
                $num_dias_prima = $funcionarios[$i]['num_dias'];
                $id_tipo_periodo = $funcionarios[$i]['id_tipo_periodo'];


                /*
                 * 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
                 * Se omite periodos de retro - 20220117::LAVILA
                 */
//                    $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.id_periodo_ajuste is null
    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;
                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";
                        }
                    }


                    $this->logMessage("Tipo_valor :: " . $agrupaciones[$j]['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_ajuste', '', $consulta);
                    $consulta = str_replace('$id_periodo', $id_periodo, $consulta);
                    $consulta = str_replace('$periodo', $id_periodo, $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) {
                        $valor = $conceptos[0]['valor'];
                    } else {
                        $valor = 0;
                    }

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


                      //Sql
                      $sql = <<<EOD
                      select nvl(sum(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") {


                      //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;
                      //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  sum(valor) as valor from(

                      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 in ( $id_concepto  )

                      union

                      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 in (  (select id_concep_ajuste from no_concep_nomina where id_concep_nomina = $id_concepto) )

                      union

                      select

                      nvl(sum(liqnom.valor_liquidado),0) * -1 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 in (  (select id_concep_rein from no_concep_nomina where 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'];
                    $fecha_termina = $funcionarios[$i]['fecha_termina'];
                    $fecha_ini = $request['fecha_ini'];
                    $fecha_fin = $request['fecha_fin'];


                    /**
                     * Calculo de dias de acuerdo alas fechas del nombramiento y del filtro - 20151106
                     */
                    $date1 = new DateTime($fecha_ini);
                    $date2 = new DateTime($fecha_fin);
                    $date3 = new DateTime($fecha_ingreso);
                    $date4 = new DateTime($fecha_termina);

                    $num_dias = 0;
                    //$fecha_inicial
                    if ($date1 >= $date3) {
                        $fecha_inicial = $fecha_ini;
                    } else {
                        $fecha_inicial = $fecha_ingreso;
                    }
                    //$fecha_final
                    if ($fecha_termina != '' && $fecha_termina != null) {
                        if ($date2 <= $date4) {
                            $fecha_final = $fecha_fin;
                        } else {
                            $fecha_final = $fecha_termina;
                        }
                    } else {
                        $fecha_final = $fecha_fin;
                    }

                    $num_dias = CN_TABLE::diasEntreFechas($fecha_inicial, $fecha_final, false);
                    //dias segin prima servicios y navidad - 20180627
                    if ($id_tipo_periodo == "3" || $id_tipo_periodo == "4") {
                        $num_dias = $num_dias_prima;
                    }

                    $arreglo[$i]['DOCUMENTO'] = $funcionarios[$i]['num_doc'];
                    $arreglo[$i]['NOMBRE'] = $funcionarios[$i]['nombre_apellido'];
                    $arreglo[$i]['AREA'] = $funcionarios[$i]['area'];
                    $arreglo[$i]['CENTRO_OP'] = $funcionarios[$i]['prefijo'];
                    $arreglo[$i]['FECHA_INGRESO'] = $fecha_ingreso;
                    $arreglo[$i]['FECHA_TERMINA'] = $fecha_termina;
                    $arreglo[$i]['DIAS'] = $num_dias;
                    //$arreglo[$i]['DIAS'] = $funcionarios[$i]['num_dias'];


                    $arreglo[$i][$concepto . ' (' . $agrupaciones[$j]['tipo_valor'] . ')'] = $valor;
                }
            }
            ob_end_clean();

            $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 de Conceptos por Agrupación", 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>';


            //echo print_r($arreglo);
            //die();

            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" || $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" || $key == "DOCUMENTO" || $key == "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>';

            $html .= ' <br/>';
            $html .= ' <br/>';
            $html .= ' <br/>';

            //Sql
            $sql = <<<EOD
select * from NO_CONSULTA
order by caracter 
EOD;
            //Ejecutar SQL
            $record_consul = CN_TABLE::executeSQL($sql);

            if (count($record_consul) > 0) {
                $html .= '<table border="1" width="200">';

                $html .= '<tr>';
                $html .= '<td width="30%" style="text-align:center;background-color:rgb(100, 100, 100); color: rgb(255, 255, 255);">Tipo Valor</td>';
                $html .= '<td width="70%" style="text-align:center;background-color:rgb(100, 100, 100); color: rgb(255, 255, 255);">Nombre Valor</td>';
                $html .= '</tr>';

                foreach ($record_consul as $value) {
                    $this->logMessage(":::" . $value['caracter']);
                    $html .= '<tr>';

                    $html .= '<td width="30%" align="center">' . $value['caracter'] . '</td>';
                    $html .= '<td width="70%">' . $value['nombre'] . '</td>';

                    $html .= '</tr>';
                }

                $html .= '</table>';
            }


            $pdf->writeHTML($html, true, false, true, false, '');
            $pdf->Output("Planilla de Conceptos por Agrupacion", "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
order by caracter  
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'];

            /**
             * Se agrega fecha para calculo de dias y periodos del tipo valor V - 20151105
             */
            $fecha_ini = $request['fecha_ini'];
            $fecha_fin = $request['fecha_fin'];

            $fecha_ini = explode('-', $fecha_ini);
            $fecha_fin = explode('-', $fecha_fin);

            $anho_ini = $fecha_ini[0];
            $mes_ini = $fecha_ini[1];
            $anho_fin = $fecha_ini[0];
            $mes_fin = $fecha_fin[1];

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

            /*
             * Tag_retro para cuando es retroactivo, para retencion tiene encuenta todo el mes con lo del retroactivo - 20150610
             */
            //Sql
            $sql = <<<EOD
select
1 as tag,
0 as tg_retro,
$anho_ini as vig_ini,
$mes_ini as per_ini,
$anho_fin as vig_fin,
$mes_fin as per_fin,  
tab0.ID_ESTADO_FUNC,
tab0.ID_TIPO_DOC,
tab0.NUM_DOC,
tab0.ID_DP,
tab0.ID_ANHOS,
tab0.ID_MESES,
tab0.PERIODO,
tab0.ACTUAL,
tab0.ID_EA,
tab0.ID_CEN_OP,
tab0.RN, 
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||' '||TAB3.ID_MESES as PERIODO_MES,
tab10.fecha_ingreso, tab10.fecha_termina, tab10.fecha_retiro, 
translate(tab5.descripcion,'áéíóúÁÉÍÓÚñÑ','aeiouAEIOUnN') as area, 
translate(tab7.nom_cen_op,'áéíóúÁÉÍÓÚñÑ','aeiouAEIOUnN') as nom_cen_op, 
translate(tab7.prefijo,'áéíóúÁÉÍÓÚñÑ','aeiouAEIOUnN') as prefijo,
TAB8.CODDEPTO as CODDEPTO, TAB9.CODMUN_TEXT as CODMUN_TEXT,
case when TAB3.id_tipo_periodo in (3,4) then nvl(tabser.num_dias,0) else nvl(tab4.num_dias,0) end as num_dias,
nvl(tab4.num_dias,0) as num_dias_per,
nvl(tabser.num_dias,0) as num_dias_primserv,
TAB3.id_tipo_periodo

from NO_ESTADO_FUNC_V 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.PERIODO = TAB3.ID_PERIODO 
left join no_liquida_nomina tab4 on tab0.id_tipo_doc = tab4.id_tipo_dOC and TAB0.NUM_DOC = TAB4.NUM_DOC and TAB0.PERIODO = TAB4.ID_PERIODO  and tab4.id_concep_nomina = 1
left join no_nombramiento_v tab10 ON tab10.id_tipo_doc = tab0.id_tipo_doc and tab10.num_doc = tab0.num_doc 
left join area tab5 on tab0.id_ea = tab5.id_area
left join NO_DP_V TAB6 on tab0.ID_DP = TAB6.ID_DP  
left join CENTRO_OPERACION TAB7 on tab0.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 

left join no_liquida_nomina tabser on tab0.id_tipo_doc = tabser.id_tipo_dOC and TAB0.NUM_DOC = tabser.NUM_DOC and TAB0.PERIODO = tabser.ID_PERIODO  and tabser.id_concep_nomina in (16,17)

where 
tab0.periodo = $id_periodo 
$whereFuncionarioNumDoc $whereFuncionarioTipoDoc

order by tab0.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'];

                //dias segin ŕima servicios y navidad
                $num_dias_prima = $funcionarios[$i]['num_dias'];
                $id_tipo_periodo = $funcionarios[$i]['id_tipo_periodo'];

                /*
                 * 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
                 * Se omite periodos de retro - 20220117::LAVILA
                 */
//                    $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.id_periodo_ajuste is null
    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;
                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";
                        }
                    }


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

                    $this->logMessage("Tipo_valor :: " . $agrupaciones[$j]['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_ajuste', '', $consulta);
                    $consulta = str_replace('$id_periodo', $id_periodo, $consulta);
                    $consulta = str_replace('$periodo', $id_periodo, $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) {
                        $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") {


                      //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;
                      //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  sum(valor) as valor from(

                      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 in ( $id_concepto  )

                      union

                      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 in (  (select id_concep_ajuste from no_concep_nomina where id_concep_nomina = $id_concepto) )

                      union

                      select

                      nvl(sum(liqnom.valor_liquidado),0) * -1 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 in (  (select id_concep_rein from no_concep_nomina where 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'];
                    $fecha_termina = $funcionarios[$i]['fecha_termina'];
                    $fecha_ini = $request['fecha_ini'];
                    $fecha_fin = $request['fecha_fin'];


                    /**
                     * Calculo de dias de acuerdo alas fechas del nombramiento y del filtro - 20151106
                     */
                    $date1 = new DateTime($fecha_ini);
                    $date2 = new DateTime($fecha_fin);
                    $date3 = new DateTime($fecha_ingreso);
                    $date4 = new DateTime($fecha_termina);

                    $num_dias = 0;
                    //$fecha_inicial
                    if ($date1 >= $date3) {
                        $fecha_inicial = $fecha_ini;
                    } else {
                        $fecha_inicial = $fecha_ingreso;
                    }
                    //$fecha_final
                    if ($fecha_termina != '' && $fecha_termina != null) {
                        if ($date2 <= $date4) {
                            $fecha_final = $fecha_fin;
                        } else {
                            $fecha_final = $fecha_termina;
                        }
                    } else {
                        $fecha_final = $fecha_fin;
                    }

                    $num_dias = CN_TABLE::diasEntreFechas($fecha_inicial, $fecha_final, false);
                    //dias segin prima servicios y navidad - 20180627
                    if ($id_tipo_periodo == "3" || $id_tipo_periodo == "4") {
                        $num_dias = $num_dias_prima;
                    }

                    $arreglo[$i]['DOCUMENTO'] = $funcionarios[$i]['num_doc'];
                    $arreglo[$i]['NOMBRE'] = $funcionarios[$i]['nombre_apellido'];
                    $arreglo[$i]['AREA'] = $funcionarios[$i]['area'];
                    $arreglo[$i]['CENTRO_OP'] = $funcionarios[$i]['prefijo'];
                    $arreglo[$i]['FECHA_INGRESO'] = $fecha_ingreso;
                    $arreglo[$i]['FECHA_TERMINA'] = $fecha_termina;
                    $arreglo[$i]['DIAS'] = $num_dias;
//                    $arreglo[$i]['DIAS'] = $funcionarios[$i]['num_dias'];


                    $arreglo[$i][$concepto . ' (' . $agrupaciones[$j]['tipo_valor'] . ')'] = $valor;
                }
            }


            $html = '<h1>Planilla de Conceptos por Agrupación</h1>';
            //$html.=' <br/>';
            $html .= '<h2>' . $nombre_periodo . '</h2>';
            $html .= ' <br/>';

            $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" || $key == "FECHA_INGRESO" || $key == "FECHA_TERMINA") {
                            $html .= '<td align="center">' . $registro . '</td>';
                        } else {

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

            $html .= '</table>';

            $html .= ' <br/>';
            $html .= ' <br/>';
            $html .= ' <br/>';

            //Sql
            $sql = <<<EOD
select * from NO_CONSULTA
order by caracter 
EOD;
            //Ejecutar SQL
            $record_consul = CN_TABLE::executeSQL($sql);

            if (count($record_consul) > 0) {
                $html .= '<table border="1" width="200">';

                $html .= '<tr>';
                $html .= '<td width="30%" align="center"">Tipo Valor</td>';
                $html .= '<td width="70%" align="center"">Nombre Valor</td>';
                $html .= '</tr>';

                foreach ($record_consul as $value) {
                    $this->logMessage(":::" . $value['caracter']);
                    $html .= '<tr>';

                    $html .= '<td width="30%" align="center">' . $value['caracter'] . '</td>';
                    $html .= '<td width="70%">' . $value['nombre'] . '</td>';

                    $html .= '</tr>';
                }

                $html .= '</table>';
            }

            $nombre = "Planilla de Conceptos por Agrupación.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();
        }
    }

}
