<?php

/**
 * inf_prenomina actions.
 *
 * @package    nomina
 * @subpackage inf_prenomina
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class inf_prenominaActions 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;
        }

        //Ordenamiento - 20180710
        $sortBy = 'order by nombre_apellido';
        if (isset($request['ordenBy'])) {
            $sortBy = " Order by " . $request['ordenBy'];
        }
        //ordenar consulta
        if (isset($request['_sortBy'])) {
            $sortBy = " Order by " . $request['_sortBy'];
        }

        /*
         * Manejo de errores
         */
        try {
            /*
             * Variables obligatorias
             */
            $periodo_filtro = $request['id_periodo_filtro'];
            $periodo = $request['id_periodo'];

            /*
             * Variables opcionales
             */
            //Area
            if (isset($request['id_area'])) {
                $whereIdArea = " AND tab0.id_ea = " . $request['id_area'];
            } else {
                $whereIdArea = ' ';
            }
            
            
            //Componente escala
            if (isset($request['id_com_esc'])) {
                $whereIdComponenteS = " AND tab0.id_comp_esc = " . $request['id_com_esc'];
            } else {
                $whereIdComponenteS = ' ';
            }
            
            
            
            //funcionario
            if (isset($request['num_doc'])) {
                $whereFuncionarioNumDoc = " AND tab0.num_doc = " . $request['num_doc'];
            } else {
                $whereFuncionarioNumDoc = ' ';
            }
            //funcionario
            if (isset($request['id_tipo_doc'])) {
                $whereFuncionarioTipoDoc = " AND tab0.id_tipo_doc = " . $request['id_tipo_doc'];
            } else {
                $whereFuncionarioTipoDoc = ' ';
            }
            //centro operacion
            if (isset($request['id_cen_op'])) {
                $whereCenOpe = " AND tab0.id_cen_op = " . $request['id_cen_op'];
            } else {
                $whereCenOpe = ' ';
            }
            
            //planta
            if (isset($request['id_planta'])) {
                $wherePlanta = " AND tab0.id_planta = " . $request['id_planta'];
            } else {
                $wherePlanta = ' ';
            }
            
            
            

            //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);

            /*
             * sql que trae los resultados
             * por los filtros, para totalizar las filas
             * Filtro de conceptos para pago . and concep.pago_func = 1 - 20140428
             * Se toma el centro de operacion del estado funcionario, para traer el actual del mes y no el ultimo del cargo - 20160425
             * Se toma el porcentaje de retencion del periodo mensual - 20170201
             */
            $sql = <<<EOD
select count(*) as count from (

select
tab0.id_tipo_doc,
tab0.num_doc,
tab0.nombre_completo,
tab0.nombre_apellido,
tab0.componente as cargo,
tab0.id_comp_es as id_comp_ess,
tab0.id_comp_esc as id_comp_esc,                        
tab0.id_ea as id_area,                      
tab0.area as dependencia,
tab0.planta_comentario,    
tab0.id_planta,                                   
nvl( tab0.valor_sal , tab0.asignacion_basica ) as asignacion_basica,
tab0.asignacion_basica as ab,
tab0.valor_sal as valor_sal,
nvl(tab0.devengados,0) as devengados,
nvl(tab0.deducidos,0) as deducidos,
nvl(tab0.devengados,0)-nvl(tab0.deducidos,0) as neto,
tab0.id_periodo,
tab0.banco,
tab0.cuenta,
tab0.id_cen_op,
nvl(tab0.centro,'Sin Especificar') as centro,
(select distinct periodo.periodo from no_periodo_v periodo where periodo.id_periodo = $periodo_filtro) as periodo,
nvl(
  (
  select distinct max(concep.porcentaje) as porcentaje
  from no_concepto_periodo concep
  join no_param_concep param on param.id_concep_rete = concep.id_concep_nomina
  where concep.num_doc = tab0.num_doc and concep.periodo in (select no_periodo_v.id_periodo from no_periodo_v 
      where no_periodo_v.id_periodo = $periodo_filtro)
  ),
  (
  select distinct max(concep.porcentaje) as porcentaje
  from no_concepto_periodo concep
  join no_param_concep param on param.id_concep_rete = concep.id_concep_nomina
  where concep.num_doc = tab0.num_doc and concep.periodo in (select no_periodo_v.id_periodo from no_periodo_v 
      where no_periodo_v.id_anhos = (select id_anhos from no_periodo where id_periodo = $periodo_filtro) and  no_periodo_v.id_meses = (select id_meses from no_periodo where id_periodo = $periodo_filtro))
  )
)as retefuente

from(
    
    select
    sal.valor as valor_sal,
    func.id_tipo_doc,
    func.num_doc,
    datos.nombre_completo,
    datos.nombre_apellido,
    cargo.id_comp_es,
    cargo.id_comp_es as id_comp_esc,    
    cargo.id_ea,             
    cargo.componente,
    cargo.area,
    cargo.asignacion_basica,
    deven.valor as devengados,
    deduc.valor as deducidos,
    case when deven.id_periodo is not null then deven.id_periodo else deduc.id_periodo end as id_periodo,
    banco.descripcion as banco,
    pago.num_cuenta as cuenta,
    plantt.comentario as planta_comentario,    
    cargo.id_planta_p as id_planta,    
    nvl( func.id_cen_op ,cargo.id_cen_op) as id_cen_op,
    nvl( cenop.nom_cen_op ,cargo.centro) as centro
    
    from no_estado_func_v func
    
    left join centro_operacion cenop on cenop.id_cen_op = func.id_cen_op
    
    left join no_dp_v cargo on cargo.id_dp = func.id_dp
    left join rh_ap_den_emp depe on depe.id_planta_p=cargo.id_den_emp
    left join rh_ap_planta plantt on plantt.id_planta=depe.id_planta_p    
    left join no_datos_funcionario_v datos on datos.num_doc = func.num_doc and datos.id_tipo_doc = func.id_tipo_doc
    left join(
    
    select liquida.id_tipo_doc,liquida.num_doc,liquida.id_periodo,sum(liquida.valor_liquidado) as valor
    from no_liquida_nomina liquida
    left join no_concep_nomina concep on concep.id_concep_nomina = liquida.id_concep_nomina
                        
    where concep.id_tipo_concepto = 1 and liquida.id_periodo = $periodo_filtro
    and concep.pago_func = 1
                        
    group by liquida.id_tipo_doc,liquida.num_doc,liquida.id_periodo
    
    ) deven on deven.id_tipo_doc = func.id_tipo_doc and deven.num_doc = func.num_doc and deven.id_periodo = func.periodo
    left join(
    
    select liquida.id_tipo_doc,liquida.num_doc,liquida.id_periodo,sum(liquida.valor_liquidado) as valor
    from no_liquida_nomina liquida
    left join no_concep_nomina concep on concep.id_concep_nomina = liquida.id_concep_nomina
    where concep.id_tipo_concepto  !=1 and liquida.id_periodo = $periodo_filtro
    group by liquida.id_tipo_doc,liquida.num_doc,liquida.id_periodo
    
    ) deduc on deduc.id_tipo_doc = func.id_tipo_doc and deduc.num_doc = func.num_doc and deduc.id_periodo = func.periodo
    left join no_pago_func pago on pago.id_tipo_doc = func.id_tipo_doc and pago.num_doc = func.num_doc AND pago.estado = 1
    left join ts_bn banco on banco.id_bn = pago.id_bn
    
    left join (
      SELECT
       aut.*,
       ROW_NUMBER() OVER (
        partition by aut.num_doc
        ORDER BY aut.estado ASC
       ) AS rn
      from no_nombramiento aut
    )nombra
    on nombra.id_tipo_doc = func.id_tipo_doc 
    and nombra.num_doc = func.num_doc
    and nombra.rn = 1
    
    /* Se cambia salario por registro de concepto_periodo, para tener el que se pago en el periodo - 20150609, Se toma el periodo mensaul-20170622*/
    left join (
      SELECT
       aut.*,
       ROW_NUMBER() OVER (
        partition by aut.num_doc
        ORDER BY aut.fecha_hasta desc, aut.id_concepto_periodo desc
       ) AS rn
      from no_concepto_periodo aut
      where 
      aut.periodo in ( 
          select id_periodo from no_periodo_v where id_tipo_periodo = 1 and anho_mes = (select anho_mes from no_periodo_v where id_periodo = $periodo_filtro)
      )  
      and aut.id_concep_nomina = (select no_param_concep.id_concep_basica from no_param_concep where no_param_concep.id_param_concep = 1)
    )sal
    on sal.id_tipo_doc = func.id_tipo_doc 
    and sal.num_doc = func.num_doc
    and sal.rn = 1
    
    where func.periodo = $periodo_filtro 
    /*                    
    and (func.actual = 1 or 
      ( func.actual = 0 and nombra.fecha_retiro 
      between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $periodo_filtro) ,'dd/mm/yyyy')
       and trunc(last_day( TO_DATE('01/'|| (SELECT LPAD(ID_MESES,2,'0') ||'/'||ID_ANHOS FROM NO_PERIODO WHERE ID_PERIODO = $periodo) ,'dd/mm/yyyy') )) + 1
      )
    )
    */                    

)tab0

where 1 = 1
and tab0.id_periodo is not null
$whereFuncionarioNumDoc
$whereFuncionarioTipoDoc
$whereCenOpe
$whereIdArea                    
$whereIdComponenteS
$wherePlanta
)
EOD;


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


            /*
             * Filtro de conceptos para pago . and concep.pago_func = 1 - 20140428
             * Por favor revisar el informe de PRENOMINA,  para que presente toda la información del periodo liquidado  
             * sin validaciones de estado de funcionario.  Debe aplicar únicamente los filtros que tenga la funcionalidad y que se seleccionen. - 20141201
             */
            //obtener el listado de recaudos
            $sql = <<<EOD
SELECT * FROM ( SELECT row_.*, ROWNUM rownum_ FROM (

select
tab0.id_tipo_doc,
tab0.num_doc,
tab0.nombre_completo,
tab0.nombre_apellido,
tab0.componente as cargo,
tab0.id_comp_es as id_comp_ess,
tab0.id_comp_esc as id_comp_esc,                         
tab0.id_ea as id_area,    
tab0.area as dependencia,
tab0.planta_comentario,    
tab0.id_planta,                        
nvl( tab0.valor_sal , tab0.asignacion_basica ) as asignacion_basica,
tab0.asignacion_basica as ab,
tab0.valor_sal as valor_sal,
nvl(tab0.devengados,0) as devengados,
nvl(tab0.deducidos,0) as deducidos,
nvl(tab0.devengados,0)-nvl(tab0.deducidos,0) as neto,
tab0.id_periodo,
tab0.banco,
tab0.cuenta,
tab0.id_cen_op,
nvl(tab0.centro,'Sin Especificar') as centro,
(select distinct periodo.periodo from no_periodo_v periodo where periodo.id_periodo = $periodo_filtro) as periodo,
nvl(
  (
  select distinct max(concep.porcentaje) as porcentaje
  from no_concepto_periodo concep
  join no_param_concep param on param.id_concep_rete = concep.id_concep_nomina
  where concep.num_doc = tab0.num_doc and concep.periodo in (select no_periodo_v.id_periodo from no_periodo_v 
      where no_periodo_v.id_periodo = $periodo_filtro)
  ),
  (
  select distinct max(concep.porcentaje) as porcentaje
  from no_concepto_periodo concep
  join no_param_concep param on param.id_concep_rete = concep.id_concep_nomina
  where concep.num_doc = tab0.num_doc and concep.periodo in (select no_periodo_v.id_periodo from no_periodo_v 
      where no_periodo_v.id_anhos = (select id_anhos from no_periodo where id_periodo = $periodo_filtro) and  no_periodo_v.id_meses = (select id_meses from no_periodo where id_periodo = $periodo_filtro))
  )
)as retefuente

from(
    
    select
    sal.valor as valor_sal,
    func.id_tipo_doc,
    func.num_doc,
    datos.nombre_completo,
    datos.nombre_apellido,
    cargo.componente,
    cargo.id_comp_es,
    cargo.id_comp_es as id_comp_esc,       
    cargo.id_ea,    
    cargo.area,
    cargo.asignacion_basica,
    deven.valor as devengados,
    deduc.valor as deducidos,
    case when deven.id_periodo is not null then deven.id_periodo else deduc.id_periodo end as id_periodo,
    banco.descripcion as banco,
    pago.num_cuenta as cuenta,
    plantt.comentario as planta_comentario,    
    cargo.id_planta_p as id_planta,          
    nvl( func.id_cen_op ,cargo.id_cen_op) as id_cen_op,
    nvl( cenop.nom_cen_op ,cargo.centro) as centro
    
    from no_estado_func_v func
    
    left join centro_operacion cenop on cenop.id_cen_op = func.id_cen_op
    
    left join no_dp_v cargo on cargo.id_dp = func.id_dp
    left join rh_ap_den_emp depe on depe.id_planta_p=cargo.id_den_emp
    left join rh_ap_planta plantt on plantt.id_planta=depe.id_planta_p                        
    left join no_datos_funcionario_v datos on datos.num_doc = func.num_doc and datos.id_tipo_doc = func.id_tipo_doc
    left join(
    
    select liquida.id_tipo_doc,liquida.num_doc,liquida.id_periodo,sum(liquida.valor_liquidado) as valor
    from no_liquida_nomina liquida
    left join no_concep_nomina concep on concep.id_concep_nomina = liquida.id_concep_nomina
                        
    where concep.id_tipo_concepto = 1 and liquida.id_periodo = $periodo_filtro
    and concep.pago_func = 1
                        
    group by liquida.id_tipo_doc,liquida.num_doc,liquida.id_periodo
    
    ) deven on deven.id_tipo_doc = func.id_tipo_doc and deven.num_doc = func.num_doc and deven.id_periodo = func.periodo
    left join(
    
    select liquida.id_tipo_doc,liquida.num_doc,liquida.id_periodo,sum(liquida.valor_liquidado) as valor
    from no_liquida_nomina liquida
    left join no_concep_nomina concep on concep.id_concep_nomina = liquida.id_concep_nomina
    where concep.id_tipo_concepto  !=1 and liquida.id_periodo = $periodo_filtro
    group by liquida.id_tipo_doc,liquida.num_doc,liquida.id_periodo
    
    ) deduc on deduc.id_tipo_doc = func.id_tipo_doc and deduc.num_doc = func.num_doc and deduc.id_periodo = func.periodo
    left join no_pago_func pago on pago.id_tipo_doc = func.id_tipo_doc and pago.num_doc = func.num_doc AND pago.estado = 1
    left join ts_bn banco on banco.id_bn = pago.id_bn
    
    left join (
      SELECT
       aut.*,
       ROW_NUMBER() OVER (
        partition by aut.num_doc
        ORDER BY aut.estado ASC
       ) AS rn
      from no_nombramiento aut
    )nombra
    on nombra.id_tipo_doc = func.id_tipo_doc 
    and nombra.num_doc = func.num_doc
    and nombra.rn = 1
    
    /* Se cambia salario por registro de concepto_periodo, para tener el que se pago en el periodo - 20150609, Se toma el periodo mensaul-20170622*/
    left join (
      SELECT
       aut.*,
       ROW_NUMBER() OVER (
        partition by aut.num_doc
        ORDER BY aut.fecha_hasta desc, aut.id_concepto_periodo desc
       ) AS rn
      from no_concepto_periodo aut
      where 
      aut.periodo in ( 
          select id_periodo from no_periodo_v where id_tipo_periodo = 1 and anho_mes = (select anho_mes from no_periodo_v where id_periodo = $periodo_filtro)
      )  
      and aut.id_concep_nomina = (select no_param_concep.id_concep_basica from no_param_concep where no_param_concep.id_param_concep = 1)
    )sal
    on sal.id_tipo_doc = func.id_tipo_doc 
    and sal.num_doc = func.num_doc
    and sal.rn = 1
    
    where func.periodo = $periodo_filtro 
    /*                    
    and (func.actual = 1 or 
      ( func.actual = 0 and nombra.fecha_retiro 
      between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $periodo_filtro) ,'dd/mm/yyyy')
       and trunc(last_day( TO_DATE('01/'|| (SELECT LPAD(ID_MESES,2,'0') ||'/'||ID_ANHOS FROM NO_PERIODO WHERE ID_PERIODO = $periodo) ,'dd/mm/yyyy') )) + 1
      )
    )
    */                    

)tab0

where 1 = 1
and tab0.id_periodo is not null
$whereFuncionarioNumDoc
$whereFuncionarioTipoDoc
$whereCenOpe   
$whereIdArea   
$whereIdComponenteS     
$wherePlanta    
$sortBy
          
) row_ WHERE ROWNUM <=  $rowEnd   ) where rownum_ >  $rowStart
EOD;
            //ejecuta y obtiene el resultado del sql
            $resultado = CN_TABLE::executeSQL($sql);


            $this->totalRows = $total_record_count;
            $this->startRow = $rowStart;
            $this->endRow = $rowStart + count($resultado);
            $this->list_data = $resultado;
            $this->logMessage("[inf_prenomina] 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());
        }
    }

}
