<?php

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


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

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

            /*
             * Se agrega log de base para revisar - 20240319::LAVILA
             * variables por defecto para el registro de log
             */
            $id_tabla = 'null';
            $id_vigencia = date('Y');
            $id_cen_op = 'null';

            $id_cia = 'null';
            if (isset($request['id_cia'])) {
                $id_cia = $request['id_cia'];
            }

            //obtener id maestro tabla
            $id_mae_bd = CN_TABLE::consultarIdTablaBD('NO_CONCEPTO_FUNC');

            //indica operacion
            $id_ope_bd = 1;

            //id del maestro tercero
            $id_mae_ter = 1;
            if (isset($request['id_username'])) {
                $id_mae_ter = $request['id_username'];
            }
            $username = 'admin';
            if (isset($request['username'])) {
                if (!is_null($request['username']) && $request['username'] != '') {
                    $username = $request['username'];
                }
            }
            $comando = 'sin comando';
            if (isset($request['comando'])) {
                $comando = $request['comando'];
            }
            //construir observacion
            $observacion = "'Se consulta actualiza_salario: periodo($periodo_filtro), con fecha desde($fecha_desde_a) desde la funcionalidad: " . $comando . "'";

            /*
             * registro de consulta en tabla de log
             */
            $sql = CN_TABLE::registroTableLog($id_tabla, $id_ope_bd, $id_mae_bd, $id_mae_ter, $username, $comando, $observacion);

            //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
             */
            $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.area as dependencia,
tab0.asignacion_basica,
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,
(
select distinct concep.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 = $periodo_filtro
) as retefuente

from(

    select
    func.id_tipo_doc,
    func.num_doc,
    datos.nombre_completo,
    datos.nombre_apellido,
    cargo.componente,
    cargo.area,
    cargo.asignacion_basica,
    deven.valor as devengados,
    deduc.valor as deducidos,
    func.periodo as id_periodo,
    banco.descripcion as banco,
    pago.num_cuenta as cuenta,
    cargo.id_cen_op as id_cen_op,
    cargo.centro as centro

    from no_estado_func_v func

    left join no_dp_v cargo on cargo.id_dp = func.id_dp
    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
    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 DESC
       ) 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

    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   

)
EOD;


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


            //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.area as dependencia,
tab0.asignacion_basica,
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,
(
select distinct concep.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 = $periodo_filtro
) as retefuente

from(

    select
    func.id_tipo_doc,
    func.num_doc,
    datos.nombre_completo,
    datos.nombre_apellido,
    cargo.componente,
    cargo.area,
    cargo.asignacion_basica,
    deven.valor as devengados,
    deduc.valor as deducidos,
    func.periodo as id_periodo,
    banco.descripcion as banco,
    pago.num_cuenta as cuenta,
    cargo.id_cen_op as id_cen_op,
    cargo.centro as centro

    from no_estado_func_v func

    left join no_dp_v cargo on cargo.id_dp = func.id_dp
    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
    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 DESC
       ) 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

    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   
    
$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());
        }
    }

    /**
     * 
     * @param sfWebRequest $request
     */
    public function executeAdd(sfWebRequest $request) {

        $logger = sfContext::getInstance()->getLogger();
        $logger->info("Entro a executeAdd");

        $logPath = sfConfig::get('sf_log_dir') . '/liquidacion.log';
        $custom_logger = new sfFileLogger(new sfEventDispatcher(), array('file' => $logPath));


        /*
         * Manejar Errores
         */
        $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
        $this->conn->beginTransaction();

        $periodo_sql = "";
        $id_concep_func = 0;
        $id_concep_func_max = 0; //Para conocer el ultimo registro y no tener encuenta los nuevos - 20150601

        $sql = <<<EOD
select max(id_concep_func) as id_concep_func from no_concepto_func  
EOD;

        $resultado = CN_TABLE::executeSQL($sql);
        $id_concep_func_max = $resultado[0]['id_concep_func'];

        try {

            //PARAMETROS OBLIGATORIOS
            $periodo_filtro = $request['id_periodo'];
            $periodo = $request['id_periodo_filtro'];
            $fecha_desde_a = $request['fecha_ini'];


            /*
             * Variables opcionales
             */
            //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 = ' ';
            }
            /*
             * Se agrega log de base para revisar - 20240319::LAVILA
             * variables por defecto para el registro de log
             */
            $id_tabla = 'null';
            $id_vigencia = date('Y');
            $id_cen_op = 'null';

            $id_cia = 'null';
            if (isset($request['id_cia'])) {
                $id_cia = $request['id_cia'];
            }

            //obtener id maestro tabla
            $id_mae_bd = CN_TABLE::consultarIdTablaBD('NO_CONCEPTO_FUNC');

            //indica operacion
            $id_ope_bd = 2;

            //id del maestro tercero
            $id_mae_ter = 1;
            if (isset($request['id_username'])) {
                $id_mae_ter = $request['id_username'];
            }
            $username = 'admin';
            if (isset($request['username'])) {
                if (!is_null($request['username']) && $request['username'] != '') {
                    $username = $request['username'];
                }
            }
            $comando = 'sin comando';
            if (isset($request['comando'])) {
                $comando = $request['comando'];
            }
            //construir observacion
            $observacion = "'Se actualiza salario: periodo($periodo_filtro), con fecha desde($fecha_desde_a) desde la funcionalidad: " . $comando . "'";

            /*
             * registro de consulta en tabla de log
             */
            $sql = CN_TABLE::registroTableLog($id_tabla, $id_ope_bd, $id_mae_bd, $id_mae_ter, $username, $comando, $observacion);

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


            //ACTUALIZAR LA TABLA DE NO_CONCEPTO_FUNC ASIGNACION BASICA
            /**
             * Toma registros de concep_func menor a la fecha de actualizacion,
             * validacion para solo tomar fecha hasta que corresponda al año que se esta trabajando o no tenga y es el actual,
             * solo funcionarios activos o que se retiraron despues de la fecha de filtro - 20150601
             */
            $custom_logger->info("[1] ACTUALIZAR LA TABLA DE NO_CONCEPTO_FUNC ASIGNACION BASICA" . "\n");
            $sql = <<<EOD
select tab0.*
from no_concepto_func tab0

where tab0.fecha_desde < to_date('$fecha_desde_a','YYYY-MM-DD') 
and nvl(tab0.fecha_hasta,trunc(sysdate)) >= to_date('$fecha_desde_a','YYYY-MM-DD') 
and tab0.id_concep_nomina = 1                     
$whereFuncionarioNumDoc $whereFuncionarioTipoDoc
                    
and tab0.NUM_DOC in (
    select nom.num_doc from no_nombramiento_v nom 
    where 
    ( nom.estado = 1 )
    or (
    nom.fecha_retiro is not null
    and  trunc( nom.fecha_retiro ) >= to_date('$fecha_desde_a','YYYY-MM-DD') 
    )
)            

order by
tab0.num_doc,
tab0.fecha_desde     
EOD;

            $resultado = CN_TABLE::executeSQL($sql);
            if (count($resultado) > 0) {

                foreach ($resultado as $resul) {

                    $id_concep_func = $resul['id_concep_func'];
                    $id_tipo_doc = $resul['id_tipo_doc'];
                    $num_doc = $resul['num_doc'];
                    $id_concep_nomina = $resul['id_concep_nomina'];
                    $valor = $resul['valor'];
                    $porcentaje = $resul['porcentaje'];
                    $estado_est = $resul['estado'];
                    $actual_est = $resul['actual'];
                    $fecha_desde = $resul['fecha_desde'];
                    $fecha_hasta = $resul['fecha_hasta'];

                    $sql = <<<EOD
update no_concepto_func set fecha_hasta = case when fecha_hasta is null then to_date('$fecha_desde_a','YYYY-MM-DD')-1 else fecha_hasta end, 
    estado = 0, actual = 0 where id_concep_func = $id_concep_func      
EOD;
                    $this->conn->execute($sql);

                    $custom_logger->info("Num_doc::" . $num_doc . " - id_concep_func::" . $id_concep_func . "\n");

                    /**
                     * Se toma el valor del ultimo periodo o se modifica por el de la fecha hasta del registro, si actual es 0 - 20150602
                     */
                    $periodo_sql = <<<EOD
select 
nvl(tab2.asignacion_basica,0)
from no_estado_func_v tab1

left join no_dp_v tab2 ON tab2.id_dp = tab1.id_dp

left join no_nombramiento_v nom
on tab1.num_doc = nom.num_doc
and tab1.id_tipo_doc = nom.id_tipo_doc
                            
where tab1.rn = 1 and tab1.num_doc = $num_doc 

--and tab1.actual = 1 
and (tab1.actual = 1 or
  ( nom.estado = 0 
    and nom.fecha_retiro >= to_date('$fecha_desde_a','YYYY-MM-DD') 
  )
)
                            
AND tab1.periodo in (

    select distinct tab.periodo from(
          SELECT
           tab0.*,
           ROW_NUMBER() OVER (
            partition by tab0.num_doc
            ORDER BY tab0.num_doc, tab0.id_anhos desc, tab0.id_meses desc
           ) AS rn
          from no_estado_func tab0
          join no_periodo per on per.id_periodo = tab0.periodo
          where
          per.id_tipo_periodo = 1
          and tab0.num_Doc = $num_doc
    ) tab
    where  tab.rn = 1

) 
EOD;

                    //si esta activo y actual - 20150601
                    if ($estado_est && $actual_est) {
                        $estado = 1;
                        $actual = 1;
                        if ($fecha_hasta != null) {
                            $fecha_hasta_a = $fecha_hasta;
                        } else {
                            $fecha_hasta_a = "";
                        }
                    } else {
                        $estado = 0;
                        $actual = 0;
                        $fecha_hasta_a = $fecha_hasta;

                        $periodo_sql = "select nvl(asignacion_basica,0) from no_dp_v 
where
id_dp in (
    select id_dp from(
        select 
        aut.*,
        ROW_NUMBER() OVER (
        partition by aut.num_doc
        ORDER BY aut.actual, aut.id_anhos desc, aut.id_meses desc
        ) AS rn 
        from no_estado_func aut
        where aut.num_doc = $num_doc
        and aut.id_anhos = extract(year from to_date('$fecha_hasta_a','YYYY-MM-DD') )
        and aut.id_meses = extract(month from to_date('$fecha_hasta_a','YYYY-MM-DD') )
    )
    where rn = 1 )";
                    }

                    /**
                     * Solo inserta un registro por la asignacion basica - 20150601
                     */
                    $custom_logger->info("Estado::" . $estado . " - Actual::" . $actual . "\n");
                    $sql = <<<EOD
insert into no_concepto_func (ID_TIPO_DOC,NUM_DOC,ID_CONCEP_NOMINA,VALOR,ESTADO,ACTUAL,FECHA_DESDE, FECHA_HASTA)
         VALUES ($id_tipo_doc,$num_doc,$id_concep_nomina,
        ($periodo_sql), $estado, $actual,
        to_date('$fecha_desde_a','YYYY-MM-DD'), to_date('$fecha_hasta_a','YYYY-MM-DD') )
EOD;
                    $this->conn->execute($sql);
                }
            }


            //ACTUALIZAR LA TABLA DE NO_CONCEPTO_FUNC ASIGNACION BASICA
            /**
             * Toma registros de concep_func menor a la fecha de actualizacion,
             * validacion para solo tomar fecha hasta que corresponda al año que se esta trabajando o no tenga y es el actual,
             * solo funcionarios activos o que se retiraron despues de la fecha de filtro - 20150601
             */
            $custom_logger->info("[2] ACTUALIZAR LA TABLA DE NO_CONCEPTO_FUNC ASIGNACION BASICA" . "\n");
            $sql = <<<EOD
select 
tab0.*
from no_concepto_func tab0

where 
tab0.fecha_desde >= to_date('$fecha_desde_a','YYYY-MM-DD') 
and tab0.id_concep_nomina = 1
                     
$whereFuncionarioNumDoc
                    
and tab0.NUM_DOC in (
    select nom.num_doc from no_nombramiento_v nom 
    where 
    ( nom.estado = 1 )
    or (
    nom.fecha_retiro is not null
    and  trunc( nom.fecha_retiro ) >= to_date('$fecha_desde_a','YYYY-MM-DD') 
    )
)  
                    
and tab0.id_concep_func <= $id_concep_func_max                    
                    
order by
tab0.num_doc,
tab0.fecha_desde 
EOD;

            $resultado = CN_TABLE::executeSQL($sql);
            if (count($resultado) > 0) {

                foreach ($resultado as $resul) {

                    $id_concep_func = $resul['id_concep_func'];
                    $id_tipo_doc = $resul['id_tipo_doc'];
                    $num_doc = $resul['num_doc'];
                    $id_concep_nomina = $resul['id_concep_nomina'];
                    $valor = $resul['valor'];
                    $porcentaje = $resul['porcentaje'];
                    $estado_est = $resul['estado'];
                    $actual_est = $resul['actual'];
                    $fecha_desde = $resul['fecha_desde'];
                    $fecha_hasta = $resul['fecha_hasta'];

                    $sql = <<<EOD
update no_concepto_func set fecha_hasta = nvl(fecha_hasta,fecha_desde), estado = 0, actual = 0 
    where id_concep_func = $id_concep_func      
EOD;
                    $this->conn->execute($sql);

                    $custom_logger->info("Num_doc::" . $num_doc . " - id_concep_func::" . $id_concep_func . "\n");

                    /**
                     * Se toma el valor del ultimo periodo o se modifica por el de la fecha hasta del registro, si actual es 0 - 20150602
                     */
                    $periodo_sql = <<<EOD
select 
nvl(tab2.asignacion_basica,0)
from no_estado_func_v tab1

left join no_dp_v tab2 ON tab2.id_dp = tab1.id_dp

left join no_nombramiento_v nom
on tab1.num_doc = nom.num_doc
and tab1.id_tipo_doc = nom.id_tipo_doc
                            
where tab1.rn = 1 and tab1.num_doc = $num_doc 

--and tab1.actual = 1 
and (tab1.actual = 1 or
  ( nom.estado = 0 
    and nom.fecha_retiro >= to_date('$fecha_desde_a','YYYY-MM-DD') 
  )
)
                            
AND tab1.periodo in (

    select distinct tab.periodo from(
          SELECT
           tab0.*,
           ROW_NUMBER() OVER (
            partition by tab0.num_doc
            ORDER BY tab0.num_doc, tab0.id_anhos desc, tab0.id_meses desc
           ) AS rn
          from no_estado_func tab0
          join no_periodo per on per.id_periodo = tab0.periodo
          where
          per.id_tipo_periodo = 1
          and tab0.num_Doc = $num_doc
    ) tab
    where  tab.rn = 1

) 
EOD;

                    //si esta activo y actual - 20150601
                    if ($estado_est && $actual_est) {
                        $estado = 1;
                        $actual = 1;
                        if ($fecha_hasta != null) {
                            $fecha_hasta_a = $fecha_hasta;
                        } else {
                            $fecha_hasta_a = "";
                        }
                    } else {
                        $estado = 0;
                        $actual = 0;
                        $fecha_hasta_a = $fecha_hasta;

                        $periodo_sql = "select nvl(asignacion_basica,0) from no_dp_v 
where
id_dp in (
    select id_dp from(
        select 
        aut.*,
        ROW_NUMBER() OVER (
        partition by aut.num_doc
        ORDER BY aut.actual, aut.id_anhos desc, aut.id_meses desc
        ) AS rn 
        from no_estado_func aut
        where aut.num_doc = $num_doc
        and aut.id_anhos = extract(year from to_date('$fecha_hasta_a','YYYY-MM-DD') )
        and aut.id_meses = extract(month from to_date('$fecha_hasta_a','YYYY-MM-DD') )
    )
    where rn = 1 )";
                    }


                    $date1 = new DateTime($fecha_desde);
                    $date2 = new DateTime($fecha_desde_a);
                    //Verificar fecha mayor a la del filtro - 20150602
                    $fecha_desde_ac = $fecha_desde_a;
                    if ($date1 > $date2) {
                        $fecha_desde_ac = $fecha_desde;
                    }


                    /**
                     * Solo inserta un registro por la asignacion basica - 20150601
                     */
                    $custom_logger->info("Estado::" . $estado . " - Actual::" . $actual . "\n");
                    $sql = <<<EOD
insert into no_concepto_func (ID_TIPO_DOC,NUM_DOC,ID_CONCEP_NOMINA,VALOR,ESTADO,ACTUAL,FECHA_DESDE, FECHA_HASTA)
         VALUES ( $id_tipo_doc,$num_doc,$id_concep_nomina,
    ($periodo_sql),
    $estado, $actual,to_date('$fecha_desde_ac','YYYY-MM-DD'), to_date('$fecha_hasta_a','YYYY-MM-DD') )
EOD;
                    $this->conn->execute($sql);
                }
            }


            //ACTUALIZAR LA TABLA DE NO_CONCEPTO_FUNC CONCEPTOS ASOCIADOS A LA ASIGNACION BASICA
            /**
             * Solo funcionarios activos o que se retiraron despues de la fecha de filtro - 20150601
             */
            $custom_logger->info("[3] ACTUALIZAR LA TABLA DE NO_CONCEPTO_FUNC CONCEPTOS ASOCIADOS A LA ASIGNACION BASICA" . "\n");
            $sql = <<<EOD
update no_concepto_func tab0 set tab0.valor = 

(
select tab2.asignacion_basica
from no_estado_func_v tab1
left join no_dp_v tab2 ON tab2.id_dp = tab1.id_dp
where tab1.rn=1 and tab1.num_doc = tab0.num_doc and tab1.actual = 1 and tab1.periodo = $periodo
) * tab0.porcentaje / 100

where tab0.estado = 1 and tab0.actual = 1 

and exists (select tab1.id_concep_nomina from no_agrup_deta tab1 
    where tab1.id_concep_nomina = tab0.id_concep_nomina and tab1.id_agrup_concepto = 103)

$whereFuncionarioNumDoc 
                    
and tab0.NUM_DOC in (
    select nom.num_doc from no_nombramiento_v nom 
    where 
    ( nom.estado = 1 )
    or (
    nom.fecha_retiro is not null
    and  trunc( nom.fecha_retiro ) >= to_date('$fecha_desde_a','YYYY-MM-DD') 
    )
)  
EOD;

            //ejecuta y obtiene el resultado del sql
            $this->conn->execute($sql);



            $logger->info("ACTUALIZAR LA TABLA DE CONCEPTO_PERIODO");
            $custom_logger->info("[4] ACTUALIZAR LA TABLA DE CONCEPTO_PERIODO" . "\n");
            //ACTUALIZAR LA TABLA DE CONCEPTO_PERIODO
            //A. AQUELLOS FUNCIONARIOS QUE NO HAYAN TENIDO NINGUNA NOVEDAD DE PERSONAL
            /**
             * Solo funcionarios activos o que se retiraron despues de la fecha de filtro - 20150601
             */
            $sql = <<<EOD
select tab0.num_doc

from(

select tab1.num_doc,tab1.periodo, count(tab1.id_concepto_periodo) AS CANTIDAD

from no_concepto_periodo tab1


where tab1.id_concep_nomina = 1

group by tab1.num_doc,tab1.periodo
)
tab0
where tab0.cantidad =1 and tab0.periodo = $periodo
                       
$whereFuncionarioNumDoc 
                    
and tab0.NUM_DOC in (
    select nom.num_doc from no_nombramiento_v nom 
    where 
    ( nom.estado = 1 )
    or (
    nom.fecha_retiro is not null
    and  trunc( nom.fecha_retiro ) >= to_date('$fecha_desde_a','YYYY-MM-DD') 
    )
)  
EOD;

            $resultado = CN_TABLE::executeSQL($sql);

            foreach ($resultado as $resul) {

                $documento = $resul['num_doc'];

                $sql = <<<EOD
update no_concepto_periodo tab0 set tab0.valor = 

(
select tab2.asignacion_basica

from no_estado_func_v tab1
left join no_dp_v tab2 ON tab2.id_dp = tab1.id_dp
where tab1.rn=1 and tab1.num_doc = tab0.num_doc and tab1.actual = 1 and tab1.periodo=$periodo

)

where tab0.periodo = $periodo and tab0.id_concep_nomina = 1
and tab0.num_doc = $documento
EOD;

                //ejecuta y obtiene el resultado del sql
                $this->conn->execute($sql);

                $sql = <<<EOD
update no_concepto_periodo tab0 set tab0.valor = 

(
select tab2.asignacion_basica

from no_estado_func_v tab1
left join no_dp_v tab2 ON tab2.id_dp = tab1.id_dp
where tab1.rn=1 and tab1.num_doc = tab0.num_doc and tab1.actual = 1 and tab1.periodo=$periodo

) * tab0.porcentaje / 100

where tab0.periodo = $periodo and tab0.num_doc = $documento
and exists (select tab1.id_concep_nomina from no_agrup_deta tab1 
    where tab1.id_concep_nomina = tab0.id_concep_nomina and tab1.id_agrup_concepto=103)


EOD;

                //ejecuta y obtiene el resultado del sql
                $this->conn->execute($sql);
            }


            //B. AQUELLOS FUNCIONARIOS QUE TUVIERON ALGUNA NOVEDAD DE PERSONAL
            /**
             * Solo funcionarios activos o que se retiraron despues de la fecha de filtro - 20150601
             */
            $sql = <<<EOD
select tab0.num_doc

from(

select tab1.num_doc,tab1.periodo, count(tab1.id_concepto_periodo) AS CANTIDAD

from no_concepto_periodo tab1


where tab1.id_concep_nomina = 1

group by tab1.num_doc,tab1.periodo
)
tab0
where tab0.cantidad >1 and tab0.periodo = $periodo
                       
$whereFuncionarioNumDoc
                    
and tab0.NUM_DOC in (
    select nom.num_doc from no_nombramiento_v nom 
    where 
    ( nom.estado = 1 )
    or (
    nom.fecha_retiro is not null
    and  trunc( nom.fecha_retiro ) >= to_date('$fecha_desde_a','YYYY-MM-DD') 
    )
)  
EOD;

            $resultado = CN_TABLE::executeSQL($sql);

            foreach ($resultado as $resul) {

                $documento = $resul['num_doc'];

                $sql = <<<EOD
update no_concepto_periodo tab0 set tab0.valor = 

(
select tab2.asignacion_basica

from no_estado_func_v tab1
left join no_dp_v tab2 ON tab2.id_dp = tab1.id_dp
where tab1.rn=1 and tab1.num_doc = tab0.num_doc and tab1.actual = 1 and tab1.periodo=$periodo

)

where tab0.periodo = $periodo and tab0.id_concep_nomina = 1
and tab0.num_doc = $documento 
   
and tab0.id_concepto_periodo IN(

select max(conc.id_concepto_periodo) ID_CONCEPTO_PERIODO

from no_concepto_periodo conc

where conc.num_doc=$documento and conc.id_concep_nomina = 1 and conc.periodo = $periodo

)
              
              
EOD;

                $this->conn->execute($sql);

                $sql = <<<EOD
update no_concepto_periodo tab0 set tab0.valor = 

(
select tab2.asignacion_basica

from no_novedad_personal tab1
left join no_dp_v tab2 ON tab2.id_dp = tab1.id_dp_ini
where tab1.num_doc = tab0.num_doc and tab1.id_periodo=$periodo
and rownum <= 1

)

where tab0.periodo = $periodo and tab0.id_concep_nomina = 1
and tab0.num_doc = $documento 
   
and tab0.id_concepto_periodo IN(

select min(conc.id_concepto_periodo) ID_CONCEPTO_PERIODO

from no_concepto_periodo conc

where conc.num_doc=$documento and conc.id_concep_nomina = 1 and conc.periodo = $periodo

)
              
              
EOD;

                //ejecuta y obtiene el resultado del sql
                $this->conn->execute($sql);


                $sql = <<<EOD
update no_concepto_periodo tab0 set tab0.valor = 

(
select tab2.asignacion_basica

from no_estado_func_v tab1
left join no_dp_v tab2 ON tab2.id_dp = tab1.id_dp
where tab1.rn=1 and tab1.num_doc =  $documento and tab1.actual = 1 and tab1.periodo=$periodo

) * tab0.porcentaje / 100

where tab0.periodo = $periodo  and exists (select tab1.id_concep_nomina 
    from no_agrup_deta tab1 where tab1.id_concep_nomina = tab0.id_concep_nomina 
        and tab1.id_agrup_concepto=103)
and tab0.num_doc = $documento 
   
and tab0.id_concepto_periodo IN(

select max(conc.id_concepto_periodo) ID_CONCEPTO_PERIODO

from no_concepto_periodo conc

where conc.num_doc=$documento and exists (select tab1.id_concep_nomina 
    from no_agrup_deta tab1 where tab1.id_concep_nomina = conc.id_concep_nomina 
        and tab1.id_agrup_concepto=103) and conc.periodo = $periodo

)

EOD;

                //ejecuta y obtiene el resultado del sql
                $this->conn->execute($sql);

                $sql = <<<EOD
update no_concepto_periodo tab0 set tab0.valor = 

(
select tab2.asignacion_basica

from no_novedad_personal tab1
left join no_dp_v tab2 ON tab2.id_dp = tab1.id_dp_ini
where tab1.num_doc = tab0.num_doc and tab1.id_periodo=$periodo
and rownum <= 1
                        
) * tab0.porcentaje / 100

where tab0.periodo = $periodo 
    and exists (select tab1.id_concep_nomina from no_agrup_deta tab1 where tab1.id_concep_nomina = tab0.id_concep_nomina and tab1.id_agrup_concepto=103)
and tab0.num_doc = $documento 
   
and tab0.id_concepto_periodo IN(

select min(conc.id_concepto_periodo) ID_CONCEPTO_PERIODO

from no_concepto_periodo conc

where conc.num_doc=$documento and exists (select tab1.id_concep_nomina from no_agrup_deta tab1 
    where tab1.id_concep_nomina = conc.id_concep_nomina and tab1.id_agrup_concepto=103) 
        and conc.periodo = $periodo

)

EOD;

                //ejecuta y obtiene el resultado del sql
                $this->conn->execute($sql);
            }

            /**
             * Registros con valor null de 1001 - 20160212
             */
            $sql = <<<EOD
delete
--select * 
from no_concepto_func 
where 
valor is null
and porcentaje is null
and estado = 0
and id_concep_nomina = (select no_param_concep.id_concep_basica from no_param_concep) 
EOD;
            $this->conn->execute($sql);

            /*
             * commit todas las transacciones
             */
            $this->conn->commit();

            $records = array();

            $this->totalRows = 0;
            $this->startRow = 0;
            $this->endRow = 0;
            $this->list_data = $records;
            $this->logMessage("[actualiza_salario] Consulta exitosa.");



            /**
             * Toma registros de concep_func para actualizar terceros de comisiones - 20150601
             */
            $sql = <<<EOD
select 
tab0.*

from no_concepto_func tab0

where 
tab0.id_concep_nomina = 1               
and tab0.estado = 1 and tab0.actual = 1
$whereFuncionarioNumDoc $whereFuncionarioTipoDoc 

order by
tab0.num_doc,
tab0.fecha_desde 
EOD;

            $records = CN_TABLE::executeSQL($sql);


            /**
             * TERCEROS
             * ACTUALIZAR SUELDOS DE COMISIONES - 20150601
             */
            $this->conn->beginTransaction();

            foreach ($records as $resul) {

                $asignacion_basica = $resul['valor'];
                $num_doc = $resul['num_doc'];
                $logger->info("num_doc :: " . $num_doc . " - sueldo::" . $asignacion_basica);

                //validar salario vacio
                if ($asignacion_basica == null) {
                    $asignacion_basica = 0;
                }

                $sql = <<<EOD
UPDATE TERCEROS SET SUELDO = $asignacion_basica WHERE NITOCC = $num_doc
EOD;

                $this->conn->execute($sql);
                $custom_logger->info("Num_doc::" . $num_doc . " - Asignacion_basica::" . $asignacion_basica . "\n");
            }
            $this->conn->commit();
            $logger->info("[UPDATE] COMMIT DE TODAS LAS TRANSACCIONES.");


            /*
             * (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++;
            }


            /**
             * TERCEROS OTROS - SGR y CONTROL COMISIONES
             * ACTUALIZAR SUELDOS DE COMISIONES - 20150601
             */
            foreach ($records as $resul) {

                $asignacion_basica = $resul['valor'];
                $num_doc = $resul['num_doc'];
                $logger->info("num_doc :: " . $num_doc . " - sueldo::" . $asignacion_basica);

                //validar salario vacio
                if ($asignacion_basica == null) {
                    $asignacion_basica = 0;
                }

                /**
                 * Actualiza sueldos del ERP_SGR - 20150601
                 */
                $this->actualizarSueldos($entidadCliente, $asignacion_basica, $num_doc);
                $custom_logger->info("Num_doc::" . $num_doc . " - Asignacion_basica::" . $asignacion_basica . "\n");
            }
            $logger->info("[UPDATE] TERCEROS OTROS - SGR y CONTROL COMISIONES.");
        } catch (Exception $e) {

            //ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
            $this->conn->rollback();

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

    /**
     * Actualiza sueldos del ERP_SGR
     * @param type $entidadCliente
     * @param type $asignacion_basica
     * @param type $num_doc
     */
    public function actualizarSueldos($entidadCliente, $asignacion_basica, $num_doc) {

        $logger = sfContext::getInstance()->getLogger();
        $logger->info("[actualizarSueldos] Actualiza sueldos del ERP_SGR.");

        $this->conn->beginTransaction();

        try {

            if ($entidadCliente == 1 || $entidadCliente == 2) {//SGR
                //ACTUALIZAR SUELDOS DE COMISIONES
                $sql = <<<EOD
UPDATE ERP_SGR.TERCEROS SET SUELDO = $asignacion_basica WHERE NITOCC = $num_doc
EOD;
                $this->conn->execute($sql);
            } elseif ($entidadCliente == 5) {//CONTROL COMISIONES

                /**
                 * COLCIENCIAS Obtener valor se sueldo agrupacion 89 - 20151022
                 */
                $sql = <<<EOD
select 
confunc.id_tipo_doc,
confunc.num_doc,
round(sum(confunc.valor)) as valor
from no_concepto_func confunc
where confunc.estado = 1
and num_doc = $num_doc
and confunc.id_concep_nomina in (select id_concep_nomina from no_agrup_deta where no_agrup_deta.id_agrup_concepto = 89)
group by
confunc.id_tipo_doc,
confunc.num_doc 
EOD;

                $records = CN_TABLE::executeSQL($sql);

                if (count($records) > 0) {
                    $asignacion_basica = $records[0]['valor'];
                }

                //ACTUALIZAR SUELDOS DE CONTROL DE COMISIONES
                $sql = <<<EOD
UPDATE COM_TERCERO SET SUELDO = $asignacion_basica WHERE NUM_DOC = '$num_doc' 
EOD;
                $this->conn->execute($sql);
            }

            $this->conn->commit();
            $logger->info("[actualizarSueldos] COMMIT DE TODAS LAS TRANSACCIONES.");
        } catch (Exception $e) {
            //ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
            $this->conn->rollback();
            $logger->info("[actualizarSueldos Exception] ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR.");
            $logger->info("[actualizarSueldos Exception] " . $e->getMessage());
        } catch (PDOException $e) {
            $this->conn->rollback();
            $logger->info("[actualizarSueldos PDOException] ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR.");
            $logger->info("[actualizarSueldos PDOException] " . $e->getMessage());
        }
    }

}
