<?php

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

    /**
     * Executes list action
     *
     * @param sfRequest $request A request object
     */
    public function executeList(sfWebRequest $request) {

        //Revisar que sea post
        //$this->forward404Unless($request->isMethod('post'));
        //Guardar los parametros del request en el log
        $this->logMessage("---BEGIN Logging request");
        foreach ($request->getPostParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("--------------------------------------------------*  Ip: " . $_SERVER['REMOTE_ADDR']);
        foreach ($request->getGetParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("---END Logging request");

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

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

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


        /*
         * Manejo de errores
         */
        try {

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

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

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

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

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


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



            /*
             * sql que trae los resultados
             * por los filtros, para totalizar las filas
             */
            $sql = <<<EOD
select count(*) as count from (
    
select 
TAB0.ID_AGRUP_CONCEPTO,
TAB0.ORDEN,
TAB0.TIPO_VALOR,
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;


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


            //obtener el listado de agrupaciones
            $sql = <<<EOD
SELECT * FROM ( SELECT row_.*, ROWNUM rownum_ FROM (

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_AGRUP_CONCEPTO,
TAB0.ORDEN,
TAB0.TIPO_VALOR,
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 

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

            $vig_ini = $resultado[0]['vig_ini'];
            $per_ini = $resultado[0]['per_ini'];
            $vig_fin = $resultado[0]['vig_fin'];
            $per_fin = $resultado[0]['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
             * 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;
            $tag_valor_promedio = false;
            if ($records_promedio[0]['promedio'] != 0) {
                $promedio = true;
            }

            /*
             * Se verifica para MIN que revise tambien concepto 55 prima - 20210126
             * Se omite periodos de retro - 20220117::LAVILA
             */
            if ($entidadCliente == 5 && !$promedio) {
                $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_periodo_ajuste is null
        and liqnom.id_concep_nomina = (55) 
    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);

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

            for ($j = 0; $j <= count($resultado) - 1; $j++) {
                $id_concepto = $resultado[$j]['id_concep_nomina'];

                if ($promedio) {
                    $this->logMessage("promedio :: " . $promedio);
                    if ($resultado[$j]['tipo_valor'] == "R") {
                        $resultado[$j]['tipo_valor'] = "P";
                        $tag_valor_promedio = true;
                    } else {
                        $tag_valor_promedio = false;
                    }
                }

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

                $consulta = $record_consulta[$resultado[$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, $resultado[$j]);

                /*
                 * 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 ($resultado[$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 ($resultado[$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 ($resultado[$j]['tipo_valor'] == "P") {


                  //Sql
                  $sql = <<<EOD
                  select NVL(round(sum(valor)/count(valor) ) ,0) as valor from(

                  select sum(valor) as valor, tab.id_anhos, tab.id_meses from(

                  select case when LIQNOM.NUM_DIAS > 0
                  then round( NVL(LIQNOM.VALOR_LIQUIDADO,0) / LIQNOM.NUM_DIAS * 30) else 0  end as valor,
                  per.id_anhos, per.id_meses , LIQNOM.NUM_DIAS ,LIQNOM.VALOR_LIQUIDADO
                  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
                  )tab

                  group by tab.id_anhos, tab.id_meses

                  )
                  EOD;



                  //Ejecutar SQL
                  $conceptos = CN_TABLE::executeSQL($sql);

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

                  if ($resultado[$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 ($resultado[$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 ($resultado[$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;
                  }
                  }
                 */
                $resultado[$j]['valor'] = $valor;
            }

            $this->totalRows = $total_record_count;
            $this->startRow = $rowStart;
            $this->endRow = $rowStart + count($resultado);
            $this->list_data = $resultado;
            $this->logMessage("[planilla_consol_ces] Consulta exitosa.");
        } catch (Exception $e) {

            $this->status = 1;
            $this->totalRows = 0;
            $this->startRow = 0;
            $this->endRow = 0;
            $this->list_data = array();
            $this->logMessage("ERROR!!!");
            $this->logMessage($e->getMessage());
        }
    }

}
