<?php

/**
 * periodo_actual actions.
 *
 * @package    nomina
 * @subpackage periodo_actual
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class periodo_actualActions extends sfQuery {
    /*
     * ------------VARIABLES PARA SERVICIOS DE CONSULTA - LIST
     */

    protected $table_names = array(
        'NO_PERIODO',
        'NO_TIPO_PERIODO',
        'MESES'
    ); //tablas para construir el sql, por medio de joins
    protected $table_join_ids = array(
        'NO_TIPO_PERIODO' =>
        array(
            'id_tipo_periodo' => 'NO_PERIODO'
        ),
        'MESES' =>
        array(
            'id_meses' => 'NO_PERIODO'
        )
    ); //si posee tablas para joins, identificar la relacion de los campos con las tablas
    protected $fields = array(
        'NO_PERIODO' =>
        array(
            'id_periodo' => 'id_periodo',
            'id_anhos' => 'id_anhos',
            'id_meses' => 'id_meses',
            'fecha_ini' => 'fecha_ini',
            'fecha_fin' => 'fecha_fin',
            'id_tipo_periodo' => 'id_tipo_periodo',
            'estado' => 'estado',
            'activo' => 'activo',
            'fecha_cierre' => 'fecha_cierre',
            'fecha_cierre_nov' => 'fecha_cierre_nov',
            'id_meses,||, - ,||,id_anhos' => 'periodo'
        ),
        'NO_TIPO_PERIODO' =>
        array(
            'codigo' => 'codigo_tipo',
            'descripcion' => 'descripcion_tipo',
            'periodica' => 'periodica',
            'codigo,||, - ,||,descripcion' => 'completo_tipo'
        )
    ); //por cada tabla especificar los campos del select

    /*
     * OPCIONES DE FILTRO:
     *
     * LIKEALLPLUS- busqueda comparativa de la cadena dividida por los espacios en blanco en cualquier posición
     * LIKEALL - busqueda comparativa de la cadena en cualquier posición
     * LIKE - busqueda en la cadena que inicie por la variable de filtro
     *
     * rownum,start - rownum,end / estos campos para uso del Grid live GWT, numero fijo de filas de consulta
     */
    protected $table_field_conditions = array(
        'NO_PERIODO' => array(
            'id_periodo,a' => array('!=' => array(-1)),
            'id_periodo,b' => array('=' => array('id_periodo_actual')),
            'id_tipo_periodo' => array('=' => array('id_tipo_periodo')),
            'activo' => array('=' => array(1)),
            'rownum,start' => array('>' => array('_startRow')),
            'rownum,end' => array('<=' => array('_endRow'))
        )
    ); //por cada tabla se dan los campos, opcion de filtro y variable que entra para los posibles filtros
    protected $table_field_or_conditions = array(); // filtros de condicion or
    protected $fields_orderBy = array(
        'id_tipo_periodo,id_anhos,id_meses'
    ); //campos para el ordenamiento de la consulta
//    protected $table_field_obligatory = array('id_debito'); //campos obligatorios de filtro - estan en el request

    /*
     * Variables manejo de log
     */
    //true - consulta de administracion
    protected $is_admin = true;
    //si es servicio para filtro agregar campo
//    protected $filtro = 'Area';
    //true - la tabla principal de busqueda no es una vista
    protected $is_filtro = true;



    /*
     * ------------VARIABLES PARA SERVICIOS CRUD
     */
    protected $id_name = 'id_periodo'; //identificador de la tabla
    protected $id_names = array('id_periodo'); //llave primaria
    protected $field_names = array('id_anhos', 'id_meses', 'fecha_ini', 'fecha_fin', 'id_tipo_periodo', 'estado', 'fecha_cierre', 'fecha_cierre_nov', 'activo'); //campos de la tabla, sin la llave primaria
    protected $table_name = 'NO_PERIODO'; //tabla en la cual se aplican los cambios
    protected $has_activo = false; //si posee campo en la tabla de nombre activo ---- ESTADO PARA REGALIAS - CARTERA
    protected $has_vigencia = false; //si posee vigencia
    protected $has_cen_op = false; //si posee centro de operacion
    protected $has_id_cia = false; //si posee compañia
    protected $has_secuencia = false; //si posee secuencia la tabla - true si es por tabla, false - trigger
//    protected $en_mayuscula = true; // si se pone, se puede poner en mayucula con true y en minuscula con false, de lo contrario la pone tal cual la BD

    /*
     * Manejo de registro log
     */
    protected $id_unico = 'id_periodo'; //identificador unico de la tabla
    //false - Registrar log para list - consultar
    protected $log_list = false;
    //false - Registrar log para add - update - remove
    protected $log_crud = false;

    /**
     * Construccion de observacion perzonalizada
     * 
     * Toda variable para tomarla del request con el formato:
     * &request-variable&
     * 
     * false - observacion por defecto
     *
     * @var string 
     */
    protected $observacion_list = false;
    protected $observacion_add = false;
    protected $observacion_update = false;
    protected $observacion_remove = false;

    // Validate
    /**
     * Ejecuta una validación previa a la ejecución de una operación tipo Add
     *
     * @param sfWebRequest $request
     * @return array 
     */
    protected function validateAdd(sfWebRequest $request) {

        //valor por defecto
        $errors = null;

        /*
         *  Validar la operación, ya sea por SQL
         */

        /*
         *  Generar errores en $errors
         */

        return $errors;
    }

    /**
     * Ejecuta una validación previa a la ejecución de una operación tipo Update
     *
     * @param sfWebRequest $request
     * @return array 
     */
    protected function validateUpdate(sfWebRequest $request) {



        $errors = null;

        /*
         *  Validar la operación, ya sea por SQL
         */
        //Cierre de Nómina Periódica:  Solo debe permitir el cierre de periódos tipo (01   NOMINA PERIODICA). - 20140811

        $id_periodo = $request['id_periodo'];

        $sql = <<<EOD
select 
per.*,
tipper.codigo,
tipper.descripcion,
tipper.periodica

from no_periodo per
join no_tipo_periodo tipper
on tipper.id_tipo_periodo = per.id_tipo_periodo

where 
per.id_periodo = $id_periodo
and tipper.periodica = 0  
EOD;

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


        /*
         *  Generar errores en $errors
         */
        if (count($records) > 0) {
            $errors['mensaje'] = "Solo se permite el cierre de periódos tipo (NOMINA PERIODICA).";
            $errors['servicio'] = "periodo_actual";
        }


        /**
         *  Validar que no exista otro periodo mensual, con el mismo mes-anho - 20151014
         */
        //TRAIGO LOS DATOS DEL PERIODO QUE CERRE

        $sql = <<<EOD
SELECT * FROM NO_PERIODO WHERE ID_PERIODO = $id_periodo 
EOD;

        $records = CN_TABLE::executeSQL($sql);
        $id_anhos_ant = $records[0]['id_anhos'];
        $id_meses_ant = $records[0]['id_meses'];

        //Retorna el anho - mes siguiente
        $fechaSiguinte = array();
        $fechaSiguinte = CN_TABLE::fechaSiguiente($id_anhos_ant, $id_meses_ant);

        $id_anhos = $fechaSiguinte['id_anhos'];
        $id_meses = $fechaSiguinte['id_meses'];

        $sql = <<<EOD
select 
per.* 
from no_periodo per
join no_tipo_periodo tipper
on tipper.id_tipo_periodo = per.id_tipo_periodo
where
per.id_anhos = $id_anhos 
and per.id_meses = $id_meses 
and tipper.periodica = 1 
EOD;

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

        /*
         *  Generar errores en $errors
         */
        if (count($records) > 0) {
            $errors['mensaje'] = "Se valida que no exista otro periodo mensual, con el mismo mes-año. Favor volver a ingresar y verificar.";
            $errors['servicio'] = "periodo_actual";
        }

        /**
         * No permitir el cierre de un periodo MENSUAL hasta que los periodos de primas 
         * si hay en el mes estén cerrados - 20180615
         */
        $sql = <<<EOD
select 
* 
from NO_PERIODO

where
ID_ANHOS = $id_anhos_ant
and ID_MESES = $id_meses_ant
and ID_TIPO_PERIODO in (3,4)
and ESTADO = 1
EOD;

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

        /*
         *  Generar errores en $errors
         */
        if (count($records) > 0) {
            $errors['mensaje'] = "Debe cerrar los periodos de primas abiertos antes del periodo mensual. Favor volver a ingresar y verificar.";
            $errors['servicio'] = "periodo_actual";
        }

        return $errors;
    }

    /**
     * Ejecuta una validación previa a la ejecución de una operación tipo Remove
     *
     * @param sfWebRequest $request
     * @return array 
     */
    protected function validateRemove(sfWebRequest $request) {

        //valor por defecto
        $errors = null;

        /*
         *  Validar la operación, ya sea por SQL
         */

        /*
         *  Generar errores en $errors
         */

        return $errors;
    }

    /**
     * Acciones anteriores a la original
     * 
     * return sfWebRequest Changed Request with additional parameters.
     * 
     * @param type $Action ( ADD, UPDATE, REMOVE )
     * @param sfWebRequest $request
     * @return \sfWebRequest 
     */
    protected function preprocessRequest($Action, sfWebRequest $request) {

        /*
         * Se instancia la clase del manejo del log
         */
        $logger = sfContext::getInstance()->getLogger();
        $logger->info("Entro a preprocessRequest");

        /*
         * Procesar Request
         */
        //accion add
        if ($Action == "ADD") {
            
        }

        //accion update 
        if ($Action == "UPDATE") {
            
        }

        //accion remove
        if ($Action == "REMOVE") {
            
        }

        return $request;
    }

    /**
     * Acciones posteriores a la original
     * 
     * return sfWebRequest Changed Request with additional parameters.
     * 
     * @param type $Action ( ADD, UPDATE, REMOVE )
     * @param sfWebRequest $request
     * @return \sfWebRequest 
     */
    protected function postprocessRequest($Action, sfWebRequest $request, $list_data_post) {

        /*
         * Se instancia la clase del manejo del log
         */
        $logger = sfContext::getInstance()->getLogger();
        $logger->info("Entro a postprocessRequest - " . $list_data_post);

        /*
         * Procesar Request
         */
        //accion add
        if ($Action == "ADD") {
            
        }

        //accion update - realiza el cierre de la nomina mensual y crea un siguiente periodo
        if ($Action == "UPDATE") {


            $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
            $this->conn->beginTransaction();
            /*
             * Manejo de errores
             */
            try {

                $logger->info("Entro a Manejo de errores");

                //Toma periodo actualizado(Cerrado)    
                $id_periodo_ant = $id_periodo = $list_data_post[0]['id_periodo'];
                $fecha_anu = CN_TABLE::fechaSistema();
                $concepto_periodo = 0;

                /**
                 * Se inactivan conceptos viejos por fecha y estado - 20150306
                 */
                $sql = <<<EOD
update no_concepto_func set no_concepto_func.actual = 0, no_concepto_func.fecha_hasta = nvl((select nom.fecha_termina from no_nombramiento_v nom where nom.num_doc = no_concepto_func.num_doc ),fecha_desde)
where no_concepto_func.estado = 0 and no_concepto_func.fecha_hasta is null   
EOD;

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

                $sql = <<<EOD
update no_concepto_func set no_concepto_func.estado = 0, no_concepto_func.actual = 0 
where no_concepto_func.actual = 1 and no_concepto_func.fecha_hasta is not null 
and (
    extract(year from no_concepto_func.fecha_hasta) < (select id_anhos from no_periodo where id_periodo = $id_periodo) 
    or
    ( (no_concepto_func.id_concep_nomina in (5,6)) and ((no_concepto_func.fecha_hasta) < (select no_periodo.fecha_ini from no_periodo where id_periodo = $id_periodo)) )
)  
EOD;

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

                /*
                 * Inactivar conceptos viejos de personas sin nombramiento alguno - 20150609
                 */
                $sql = <<<EOD
update no_concepto_func set no_concepto_func.estado = 0, no_concepto_func.actual = 0, 
no_concepto_func.fecha_hasta = nvl(no_concepto_func.fecha_hasta,fecha_desde)
where 
no_concepto_func.num_doc not in (select distinct num_doc from no_nombramiento)   
EOD;

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


                /**
                 * Inactivar certificados mensuales que la fecha de validez este cumplida - 20200722::LAVILA
                 */
                $sql = <<<EOD
update no_concepto_func set estado = 0 , actual = 0, 
    fecha_hasta = (select no_periodo.fecha_fin from no_periodo where no_periodo.id_periodo = $id_periodo_ant)  
    where actual = 1
    and (id_tipo_doc,num_doc,id_concep_nomina) in (
        select id_tipo_doc,num_doc,id_concep_nomina 
        from no_certi_retefuente cert
        where
        cert.estado = 1
        and cert.fecha_validez_fin <= (select no_periodo.fecha_fin from no_periodo where no_periodo.id_periodo = $id_periodo_ant)
    )  
EOD;

                $this->conn->execute($sql);
                //Anular certificados
                $sql = <<<EOD
update no_certi_retefuente cert set cert.estado = 0, 
    cert.fecha_anu = trunc(sysdate), cert.motivo_anu = 'Se anula por que se cumple la fecha de validez.'
where
cert.estado = 1
and cert.fecha_validez_fin <= (select no_periodo.fecha_fin from no_periodo where no_periodo.id_periodo = $id_periodo_ant)   
EOD;

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


                /**
                 * Inactivar los deducidos de no ley para retirados - 20150505
                 */
                $sql = <<<EOD
update no_ded_noley dedley set dedley.estado = 0, dedley.fecha_anu = (select nom.fecha_retiro from no_nombramiento_v nom where nom.num_doc = dedley.num_doc ),
    dedley.motivo_anu = 'Se inactiva registro por retiro'                     
where dedley.estado = 1
and (dedley.id_tipo_doc,dedley.num_doc) in (select no_nombramiento_v.id_tipo_doc, no_nombramiento_v.num_doc from no_nombramiento_v where no_nombramiento_v.fecha_retiro is not null) 
EOD;

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


                /**
                 * Activar los deducidos de no ley por Inactivos el mes Anterior - 20190403
                 */
                $sql = <<<EOD
update no_ded_noley set estado = 1, fecha_activa = sysdate 
where
estado = 0
and fecha_anu is null
and fecha_mod BETWEEN (select no_periodo.fecha_ini from no_periodo where id_periodo = $id_periodo) and sysdate  
EOD;

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



                /**
                 * Se inactiva conceptos de asignacion basica (1005,1006), que ya no apliquen para el salario - 20150306 NO se coloca ya que se usa el estado,actual 1 para el retroactivo
                 */
                //VERIFICAR CONCEPTOS ASOCIADOS A LA ASIGNACION BASICA
//                $sql = <<<EOD
//select 
//nvl((select sum(no_concepto_func.valor) as valor from no_concepto_func where no_concepto_func.num_doc = con.num_doc and no_concepto_func.id_concep_nomina = (select id_concep_basica from no_param_concep where id_param_concep = 1)) ,0) as asignacion_basica,
//con.*,
//conab.id_concep_ab,
//conab.rango_minimo,
//conab.rango_maximo,
//conab.valor_fijo,
//conab.porcentaje as porcentaje_conab,
//conab.horas
//from no_concepto_func con
//
//join no_concep_ab conab
//on conab.id_concep_nomina = con.id_concep_nomina
//
//where conab.estado = 1
//and con.estado = 1 and con.actual = 1
//and con.fecha_hasta is not null  
//EOD;
//                $results = CN_TABLE::executeSQL($sql);
//
//                if (count($results) > 0) {
//
//                    /*
//                     * RECORRO CADA UNO DE LOS CONCEPTOS QUE ESTEN ASOCIADOS
//                     */
//                    foreach ($results as $conceptos) {
//
//                        $rango_minimo = $conceptos['rango_minimo'];
//                        $rango_maximo = $conceptos['rango_maximo'];
//                        $id_concep_ab = $conceptos['id_concep_nomina'];
//                        $valor_fijo = $conceptos['valor_fijo'];
//                        $asignacion_basica = $conceptos['asignacion_basica'];
//
//                        /**
//                         * Actualiza estado
//                         */
//                        if ($asignacion_basica >= $rango_minimo && $asignacion_basica <= $rango_maximo) {
//                            $sql = <<<EOD
//UPDATE NO_CONCEPTO_PERIODO set fecha_desde = fecha_desde + $dia_per
//    where id_tipo_doc = $id_tipo_doc and num_doc = $num_doc and periodo = $id_periodo and id_concep_nomina = $id_concep_ab
//EOD;
//                            $this->conn->execute($sql);
//                        }
//                    }
//                }
                //A. CREO EL SIGUIENTE PERIODO DE NOMINA EN LA TABLA NO_PERIODO


                $sql = <<<EOD
SELECT ID_TIPO_PERIODO, NO_DIAS_MES FROM NO_TIPO_PERIODO WHERE PERIODICA = 1
EOD;
                $records = CN_TABLE::executeSQL($sql);

                //1. TRAIGO EL ID DEL TIPO DE PERIODO QUE SEA PERIODICA = 1

                $id_tipo_periodo = $records[0]['id_tipo_periodo'];

                //2. TRAIGO EL NUMERO DE DIAS PARAMETRIZADO PARA EL TIPO DE PERIODO
                $num_dias = $records[0]['no_dias_mes'];


                //3. TRAIGO LOS DATOS DEL PERIODO QUE CERRE

                $sql = <<<EOD
SELECT * FROM NO_PERIODO WHERE ID_PERIODO = $id_periodo 
EOD;

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

                //Se actualiza periodo de cierre con datos para interfaz contable - 20130809
                //Se colocan datos de definitivo  - 20171101
                $sql = <<<EOD
update NO_PERIODO  
    set FECHA_PAGO = trunc(sysdate),
        NUM_DOC_PAGO =  ( select '01' || to_char(sysdate,'yyyymmdd') from dual),
            DEFINITIVO = 1,
            FECHA_DEFINITIVO = trunc(sysdate)                       
        WHERE ID_PERIODO = $id_periodo 
EOD;

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

                $id_anhos_ant = $records[0]['id_anhos'];
                $id_meses_ant = $records[0]['id_meses'];

                $fechaSiguinte = array();
                $fechaSiguinte = CN_TABLE::fechaSiguiente($id_anhos_ant, $id_meses_ant);

                $id_anhos = $fechaSiguinte['id_anhos'];
                $id_meses = $fechaSiguinte['id_meses'];


                /**
                 * Al crear el periodo mensual 12, crea automaticamente el año siguiente - 20140902
                 */
                if ($id_meses == 12) {

                    $sql = <<<EOD
select * from anhos where id_anhos = ($id_anhos + 1)
EOD;

                    $records = CN_TABLE::executeSQL($sql);
                    //valida que no exista el año
                    if (count($records) <= 0) {

                        //crea el nuevo año
                        $sql = <<<EOD
insert into anhos ( id_anhos ) values ( ($id_anhos+1) ) 
EOD;

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


                /**
                 * Prorrogas de fehca terminacion - 20210310::LAVILA
                 * Se valida si no hay fecha max_contrato, coloca los meses de mas - 20210527::LAIVLA
                 */
                if (isset($request['tag_prorroga_fecha']) && $request['tag_prorroga_fecha'] == 1) {

                    //crea la novedad
                    $sql = <<<EOD
insert into no_novedad_personal
(
ID_NOVEDAD_PERSONAL,
ID_TIPO_DOC,
NUM_DOC,
ID_NOVEDAD,
FECHA_INICIAL,
FECHA_TERMINACION,
DOC_SOPORTE,
FECHA_SOPORTE,
ID_DP_INI,
ID_DP_FIN,
ID_PERIODO,
ESTADO,
ID_NOVEDAD_AJUSTE,
OBSERVACIONES
)
                            
select
null as id_novedad_personal,
nov.id_tipo_doc,
nov.num_doc,
16 as id_novedad,

nov.fecha_termina as fecha_inicial,
case when gen.fecha_max_contrato is not null and (ADD_MONTHS( nov.fecha_termina , nov.num_meses ) -1) < gen.fecha_max_contrato 
then (ADD_MONTHS( nov.fecha_termina , nov.num_meses ) -1)
else nvl(gen.fecha_max_contrato, (ADD_MONTHS( nov.fecha_termina , nov.num_meses ) -1) ) end as fecha_terminacion,
                            
nov.doc_nombra as doc_soporte,
trunc(sysdate) as fecha_soporte,
est.id_dp as id_dp_ini,
est.id_dp as id_dp_fin,
$id_periodo_ant as id_periodo,
1 as estado,
null as id_novedad_ajuste,
'Genración automatica de prorroga de fecha terminación' as observaciones

from no_nombramiento nov

left join no_estado_func_v est
on est.id_tipo_doc = nov.id_tipo_doc
and est.num_doc = nov.num_doc
and est.periodo = $id_periodo_ant

left join no_param_gen gen
on gen.id_param_gen = 1

where 
nov.estado = 1 and nov.num_meses != 0
and trunc(nov.fecha_termina) between to_date( (select   id_anhos||'-'||lpad(id_meses,2,'0')  from no_periodo where id_periodo = $id_periodo_ant) || '-01' ,'YYYY-MM-DD')  + interval '1' month
    and trunc(last_day( to_date( (select   id_anhos||'-'||lpad(id_meses,2,'0')  from no_periodo where id_periodo = $id_periodo_ant) || '-01' ,'YYYY-MM-DD') + interval '1' month ))  
EOD;

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

                    //actualiza nombramiento
                    $sql = <<<EOD
update no_nombramiento nov 
set nov.fecha_termina = case when (select max(fecha_max_contrato) from no_param_gen) is not null 
    and (ADD_MONTHS( nov.fecha_termina , nov.num_meses ) -1) < (select max(fecha_max_contrato) from no_param_gen)
then (ADD_MONTHS( nov.fecha_termina , nov.num_meses ) -1) 
else nvl( (select max(fecha_max_contrato) from no_param_gen), (ADD_MONTHS( nov.fecha_termina , nov.num_meses ) -1) ) end

where 
nov.estado = 1 and nov.num_meses != 0
and trunc(nov.fecha_termina) between to_date( (select   id_anhos||'-'||lpad(id_meses,2,'0')  from no_periodo where id_periodo = $id_periodo_ant) || '-01' ,'YYYY-MM-DD')  + interval '1' month
    and trunc(last_day( to_date( (select   id_anhos||'-'||lpad(id_meses,2,'0')  from no_periodo where id_periodo = $id_periodo_ant) || '-01' ,'YYYY-MM-DD') + interval '1' month )) 
EOD;

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


                //3. CREO EL PERIODO
                /*
                 * Se agrega porcentaje del maximo dednoley de los parametros generales - 20140526
                 */
                $sql = <<<EOD
INSERT INTO NO_PERIODO (ID_MESES,ESTADO,ID_TIPO_PERIODO,ID_ANHOS,FECHA_CIERRE_NOV,ACTIVO,FECHA_INI,FECHA_FIN, MAX_DED_NOLEY)
    VALUES($id_meses,1,$id_tipo_periodo,$id_anhos,last_day(to_date('$id_anhos-$id_meses-01','YYYY-MM-DD')),1,
        to_date('$id_anhos-$id_meses-01','YYYY-MM-DD'),last_day(to_date('$id_anhos-$id_meses-01','YYYY-MM-DD')),
            (select nvl(max_ded_noley,0) as max_ded_noley from no_param_gen where id_param_gen = 1) )
EOD;

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

                //Obtiene datos del periodo creado
                $sql = <<<EOD
select id_periodo from no_periodo periodo 
                left join no_tipo_periodo tipo ON tipo.id_tipo_periodo = periodo.id_tipo_periodo
                where periodo.estado = 1 and periodo.activo = 1 and tipo.periodica = 1
EOD;

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

                //id del periodo nuevo
                $id_periodo_nuevo = $records[0]['id_periodo'];

                /*
                 * Filtro de actual para evitar los funcionarios retirados (and est.actual= 1) - 20130816
                 * Validacion para no traer las personas retiradas en fechas anteriores al nuevo periodo - 20141202
                 */
                $sql = <<<EOD
declare
   
id_periodo_ant1 int;
id_periodo_nuevo1 int;


begin

id_periodo_ant1:= $id_periodo;
id_periodo_nuevo1 := $id_periodo_nuevo;

INSERT INTO NO_ESTADO_FUNC (ID_TIPO_DOC,NUM_DOC,ID_DP,ID_ANHOS,ID_MESES,PERIODO,ACTUAL,ID_CEN_OP,ID_EA)

select tab1.ID_TIPO_DOC,tab1.NUM_DOC,tab1.ID_DP,(select id_anhos from no_periodo 
    where id_periodo = id_periodo_nuevo1) AS ID_ANHOS,(select id_meses from no_periodo 
        where id_periodo = id_periodo_nuevo1) AS ID_MESES
,id_periodo_nuevo1 AS PERIODO,tab1.ACTUAL,tab1.ID_CEN_OP,tab1.ID_EA
from no_estado_func_v tab1

where tab1.periodo = id_periodo_ant1 and not exists (select est.num_doc from no_estado_retirado_v est 
    where est.num_doc = tab1.num_doc 
        --and est.actual= 1 
            and est.periodo = id_periodo_ant1)
            
            
and tab1.NUM_DOC not in (
 select nom.NUM_DOC from no_nombramiento_v nom 
  where nom.fecha_retiro is not null
  and (select no_periodo.fecha_ini from no_periodo 
        where id_periodo = id_periodo_nuevo1) > trunc(last_day( nom.fecha_termina ))
);


end;
   
EOD;

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

                /*  $sql = <<<EOD

                  UPDATE NO_ESTADO_FUNC SET ACTUAL = 0 WHERE periodo = $id_periodo


                  EOD;

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

                //CREO LOS REGISTRO DE DEVENGADOS Y DEDUCIDOS DE LEY EN NO_CONCEPTO_PERIODO    
                /*
                 * Se valida que la fecha hasta(calculo dias) no supere al ultimo dia del periodo - 20130806
                 * Se coloca estado 1 en el filtro de no_novedad_kardex, para tomar solo las activas - 20130917
                 * Se coloca en el where filtrar por fecha para los concep_ab(1005,1006) qque no deben pasar al siguiente mes por la fecha hasta - 20150309
                 * Ya no se toman dias de kardex, ya que mas adelante se descuentan para la AB y deducidos de ley - 20150707
                 * Se coloca validacion para operador de las vacaciones, por devolucion de tiempo - 20170110
                 * fecha_hasta en la fecha hasta valida igual año no solo mes - 20191122
                 */
                $sql = <<<EOD
INSERT INTO NO_CONCEPTO_PERIODO (
ID_ANHOS,
ID_MESES,
PERIODO,
ID_TIPO_DOC,
NUM_DOC,
ID_CONCEP_NOMINA,
VALOR,
PORCENTAJE,
FECHA_DESDE,
FECHA_HASTA,
NUM_DIAS
)

SELECT 

id_anhos,id_meses,periodo,id_tipo_doc,num_doc,
ID_CONCEP_NOMINA,VALOR,PORCENTAJE,FECHA_DESDE,

case 
when fecha_hasta is null then last_day(to_date('01/$id_meses/$id_anhos','DD/MM/YYYY'))
when fecha_hasta > last_day(to_date('01/$id_meses/$id_anhos','DD/MM/YYYY')) then last_day(to_date('01/$id_meses/$id_anhos','DD/MM/YYYY'))
else FECHA_HASTA end as FECHA_HASTA,
--FECHA_HASTA,

(case 
when fecha_hasta is not null and fecha_hasta <= last_day(to_date('01/$id_meses/$id_anhos','DD/MM/YYYY')) then (fecha_hasta-fecha_desde)
when fecha_hasta is not null and fecha_hasta > last_day(to_date('01/$id_meses/$id_anhos','DD/MM/YYYY')) then ( trunc(last_day(to_date('01/$id_meses/$id_anhos','DD/MM/YYYY'))) - fecha_desde)
else (select perv.no_dias_mes from no_periodo_v perv where perv.id_periodo = $id_periodo_nuevo)
end) - 
(case 
  when dias > 30 and aplica_vacac = 1 then 30 else case when dias > 0 and aplica_vacac = 1 then dias else 0 end 
end) 
as NUM_DIAS 

FROM(

    select  
    (select id_anhos from no_periodo where id_periodo = $id_periodo_nuevo) as id_anhos,
    (select id_meses from no_periodo where id_periodo = $id_periodo_nuevo) as id_meses,
    $id_periodo_nuevo as periodo, tab0.id_tipo_doc, tab0.num_doc, 
    tab0.id_concep_nomina, tab0.valor, tab0.porcentaje, tab1.aplica_vacac,
    
    to_date('01/$id_meses/$id_anhos','DD/MM/YYYY') AS FECHA_DESDE,
    
    
    /*
    case when tab0.fecha_hasta IS NULL then last_day(to_date('01/$id_meses/$id_anhos','DD/MM/YYYY'))
    when extract(month from tab0.fecha_hasta) = $id_meses then tab0.fecha_hasta
    
    else last_day(to_date('01/$id_meses/$id_anhos','DD/MM/YYYY'))
    
    end AS FECHA_HASTA
    */
    case when extract(month from tab0.fecha_hasta) = $id_meses and extract(year from tab0.fecha_hasta) = $id_anhos then tab0.fecha_hasta
    else null
    end as fecha_hasta,   
    
    (    
      select nvl(sum(dias),0) AS DIAS      
      from
      (
        /*select 
        num_doc,
        nvl(sum(dias_rango_mes_sin_treintayuno(novkar.fecha_ini,novkar.fecha_fin,(select id_meses from no_periodo where id_periodo =  $id_periodo_nuevo ))),0) as dias 
        from no_novedad_kardex novkar
        left join no_tip_nov_ka tipnov
        on tipnov.id_tip_nov_ka = novkar.id_tip_nov_ka
        where tipnov.afecta_antigu = 1
        and novkar.estado = 1
        
        and (
          novkar.fecha_ini between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo_nuevo) ,'dd/mm/yyyy')
          and trunc(last_day( to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo_nuevo) ,'dd/mm/yyyy') )) 
          or
          novkar.fecha_fin between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo_nuevo) ,'dd/mm/yyyy')
          and TRUNC(LAST_DAY( TO_DATE('01/'|| (select LPAD(ID_MESES,2,'0') ||'/'||ID_ANHOS from NO_PERIODO where ID_PERIODO = $id_periodo_nuevo) ,'dd/mm/yyyy') )) 
          
          or        
          
          to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo_nuevo) ,'dd/mm/yyyy') between novkar.fecha_ini and novkar.fecha_fin
          or
          trunc(last_day( to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo_nuevo) ,'dd/mm/yyyy') )) between novkar.fecha_ini and novkar.fecha_fin
        )
      
        group by num_doc 
        
        union */
        
        select 
        num_doc,
        case when tipnov.operador = 1
        then nvl(sum(DIAS_RANGO_MES_SIN_TREINTAYUNO(novvac.fecha_ini,novvac.fecha_fin,(select id_meses from no_periodo where id_periodo =  $id_periodo_nuevo))),0)
        else nvl(sum(DIAS_RANGO_MES_SIN_TREINTAYUNO(novvac.fecha_ini,novvac.fecha_fin,(select id_meses from no_periodo where id_periodo =  $id_periodo_nuevo))),0) * (-1) end as dias,
        nvl(sum(DIAS_RANGO_MES_SIN_TREINTAYUNO(novvac.fecha_ini,novvac.fecha_fin,(select id_meses from no_periodo where id_periodo =  $id_periodo_nuevo))),0) as dias1        
        from no_novedad_vac novvac
        left join no_tipo_nov_vac tipnov on tipnov.id_tipo_nov_vac = novvac.id_tipo_nov_vac
        where tipnov.tiempo_liqui = 1
        
        and (
          novvac.fecha_ini between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo_nuevo) ,'dd/mm/yyyy')
          and trunc(last_day( to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo_nuevo) ,'dd/mm/yyyy') )) 
          or
          novvac.fecha_fin between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo_nuevo) ,'dd/mm/yyyy')
          and TRUNC(LAST_DAY( TO_DATE('01/'|| (select LPAD(ID_MESES,2,'0') ||'/'||ID_ANHOS from NO_PERIODO where ID_PERIODO = $id_periodo_nuevo) ,'dd/mm/yyyy') )) 
          
          or        
          
          to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo_nuevo) ,'dd/mm/yyyy') between novvac.fecha_ini and novvac.fecha_fin
          or
          trunc(last_day( to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo_nuevo) ,'dd/mm/yyyy') )) between novvac.fecha_ini and novvac.fecha_fin
        )
        
        group by num_doc, operador   
      )tab3 where tab0.num_doc = tab3.num_doc
    ) as dias
                    
    from no_concepto_func tab0
    LEFT JOIN no_concep_nomina tab1 ON tab1.id_concep_nomina = tab0.id_concep_nomina 
    where tab0.estado = 1 and tab0.actual = 1 and tab1.id_tipo_concepto != 4
    and exists (select est.num_doc from no_estado_func_v est where est.num_doc = tab0.num_doc and est.periodo = $id_periodo_nuevo)
    and (
      case when tab0.id_concep_nomina in (select distinct id_concep_nomina from no_concep_ab where estado = 1) 
          and nvl(tab0.fecha_hasta,(select fecha_ini from no_periodo where id_periodo = $id_periodo_nuevo)) < (select fecha_ini from no_periodo where id_periodo = $id_periodo_nuevo)
      then 0
      else 1 end
    ) = 1

)
   
EOD;

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



                /**
                 * ACTUALIZO LA TABLA DE DEDUCIDOS 
                 * NOM-116 <-> Se actualiza segun liquidacion de nomina del mes anterior - 20150505
                 * Incidente #4000 <-> Se coloca para que tome todos los periodos del mes, y no solo el mensual  - 20160719
                 */
                //Obtiene datos del periodo creado
                $sql = <<<EOD

select 
nvl((tab.cuotas),0) as cuotas_liq,
dedley.*,
connom.aplica_desc_adic_vac
from no_ded_noley dedley
left join no_concep_nomina connom
on dedley.id_concep_nomina = connom.id_concep_nomina
left join(
    select 
    liq.id_tipo_doc,
    liq.num_doc,
    liq.id_periodo,
    liq.id_concep_nomina,
    count(liq.id_liquida_nomina) as cuotas
    from no_liquida_nomina liq
    where 
    liq.id_periodo in (select id_periodo from no_periodo
                      where
                      id_anhos = (select id_anhos from no_periodo where id_periodo = $id_periodo)
                      and id_meses = (select id_meses from no_periodo where id_periodo = $id_periodo))
    group by
    liq.id_tipo_doc,
    liq.num_doc,
    liq.id_periodo,
    liq.id_concep_nomina
)tab
on tab.id_tipo_doc = dedley.id_tipo_doc and tab.num_doc = dedley.num_doc 
and dedley.id_concep_nomina = tab.id_concep_nomina
where 
dedley.estado = 1 
EOD;

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

                //recorre cada deducido
                foreach ($records_dednoley as $value_dednoley) {

                    $id_ded_noley = $value_dednoley['id_ded_noley'];
                    $id_tipo_doc = $value_dednoley['id_tipo_doc'];
                    $num_doc = $value_dednoley['num_doc'];
                    $cuotas_liq = $value_dednoley['cuotas_liq'];

                    $sql = <<<EOD
update no_ded_noley set cuotas_desc = (cuotas_desc+$cuotas_liq) 
    where estado = 1 and id_ded_noley = $id_ded_noley 
EOD;

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

                $sql = <<<EOD
update no_ded_noley set saldo = (num_cuotas*NVL(valor_cuota,0))-(cuotas_desc*NVL(valor_cuota,0)) where estado = 1
EOD;

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



                /**
                 * CREO LOS REGISTRO DE DEDUCIDOS DE NO LEY EN NO_CONCEPTO_PERIODO 
                 * NOM-116 <-> Para los que tienen vacaciones el mes anterior no genera deducido - 20150505
                 * Se coloca validacion para que en el cieere mensual, no tenga encuenta deducidos de prima de servicios o navidad - 20160719
                 */
                $sql = <<<EOD
INSERT INTO NO_CONCEPTO_PERIODO (
ID_ANHOS,
ID_MESES,
PERIODO,
ID_TIPO_DOC,
NUM_DOC,
ID_CONCEP_NOMINA,
VALOR,
PORCENTAJE,
FECHA_DESDE,
FECHA_HASTA,
NUM_DIAS
)

SELECT 
id_anhos,id_meses,periodo,id_tipo_doc,num_doc,
id_concep_nomina,valor,porcentaje,fecha_desde,

 /*   
case when fecha_hasta is null 
then last_day(to_date('01/$id_meses/$id_anhos','DD/MM/YYYY'))
else FECHA_HASTA end as FECHA_HASTA,
 */
fecha_hasta,

/*
case when fecha_hasta is not null 
then (fecha_hasta-fecha_desde)
else (select perv.no_dias_mes from no_periodo_v perv where perv.id_periodo = $id_periodo_nuevo)
end as NUM_DIAS
*/
$num_dias AS NUM_DIAS

FROM(

    select  
    (select id_anhos from no_periodo where id_periodo = $id_periodo_nuevo) as id_anhos,
    (select id_meses from no_periodo where id_periodo = $id_periodo_nuevo) as id_meses,
    $id_periodo_nuevo as periodo,tab0.id_tipo_doc,tab0.num_doc,
    tab0.id_concep_nomina,
    connom.aplica_desc_adic_vac,
    tab0.valor_cuota AS VALOR,tab0.porcentaje_cuota AS PORCENTAJE,
        
    to_date('01/$id_meses/$id_anhos','DD/MM/YYYY') AS FECHA_DESDE,
    last_day(to_date('01/$id_meses/$id_anhos','DD/MM/YYYY')) AS FECHA_HASTA                      
    /*
    case when tab0.fecha_hasta IS NULL then last_day(to_date('01/$id_meses/$id_anhos','DD/MM/YYYY'))
    when extract(month from tab0.fecha_hasta) = $id_meses then tab0.fecha_hasta
    
    else last_day(to_date('01/$id_meses/$id_anhos','DD/MM/YYYY'))
    
    end AS FECHA_HASTA
    
    case when extract(month from tab0.fecha_hasta) = $id_meses then tab0.fecha_hasta
    else null
    end AS FECHA_HASTA  
    */
    
    FROM no_ded_noley tab0
    
    left join no_concep_nomina connom
    on tab0.id_concep_nomina = connom.id_concep_nomina
    
    left join no_periodo per
    on per.id_periodo = tab0.id_periodo
    
    where     
    tab0.estado = 1 
    and per.id_tipo_periodo not in (3,4)
    and( tab0.num_cuotas = 0 or tab0.cuotas_desc < tab0.num_cuotas )
    and exists (select est.num_doc from no_estado_func_v est where est.num_doc = tab0.num_doc and est.periodo = $id_periodo_nuevo)
    
    and ( 
      connom.aplica_desc_adic_vac = 0
        or (connom.aplica_desc_adic_vac = 1 and 
      
          (tab0.id_tipo_doc,tab0.num_doc) not in (
          
            select 
            novac.id_tipo_doc,
            novac.num_doc
            from no_novedad_vac novac
            left join no_tipo_nov_vac tipvac
            on novac.id_tipo_nov_vac = tipvac.id_tipo_nov_vac
            where 
            novac.id_periodo = $id_periodo and tipvac.tiempo_liqui = 1 and tipvac.operador = 1    
          
          )
      
        )
    )
  
)   
EOD;
                $this->conn->execute($sql);

                //Actualizar fecha y motivo anulacion - 20130522
                $sql = <<<EOD
update no_ded_noley set estado = 0, 
    fecha_anu = '$fecha_anu',
    motivo_anu = 'Se terminaron las cuotas por cobrar.'    
    where cuotas_desc >= num_cuotas 
    and num_cuotas != 0 and estado = 1
EOD;

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

                //VERIFICO SI PARA ALGUN FUNCIONARIO SE DEBE REGISTRAR BONIFICACION POR SERVICIOS
                $sql = <<<EOD
SELECT nvl(ID_CONCEP_BONIF,0) as ID_CONCEP_BONIF FROM NO_PARAM_CONCEP
EOD;

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

                $id_concep_bonif = $results[0]['id_concep_bonif'];

                $logger->info("CONCEPTO DE NOMINA " . $id_concep_bonif);

                /*
                 * Bonificacion de servicios en el periodo - Registros activos
                 * Se controla que no genere nada para las personas reiradas con fecha de terminación 
                 * anterior a la fecha de inicio del nuevo periodo, para evitar los retirados - 20130930
                 */
                $sql = <<<EOD
SELECT 
nom.fecha_termina,
bonser.* 
FROM NO_BONIFICA_SERVICIOS bonser
left join no_nombramiento_v nom
on nom.id_tipo_doc = bonser.id_tipo_doc
and nom.num_doc = bonser.num_doc
WHERE 
bonser.ESTADO = 1 
AND bonser.FECHA_BONIFICA >= to_date('01/$id_meses/$id_anhos','DD/MM/YYYY') AND bonser.FECHA_BONIFICA <= last_day(to_date('01/$id_meses/$id_anhos','DD/MM/YYYY')) 
and nvl(nom.fecha_termina,to_date('01/$id_meses/$id_anhos','DD/MM/YYYY')) >= to_date('01/$id_meses/$id_anhos','DD/MM/YYYY')
EOD;


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

                /*
                 * VERIFICAR QUE EXISTAN REGISTROS
                 * verificar  que tenga bonificacion parametrizado - 20210511
                 */
                if (count($records) and $id_concep_bonif != 0) {

                    $sql = <<<EOD
SELECT * FROM NO_PERIODO WHERE ID_PERIODO = $id_periodo_nuevo 
EOD;
                    $results = CN_TABLE::executeSQL($sql);

                    $id_anhos_nuevo = $results[0]['id_anhos'];
                    $id_meses_nuevo = $results[0]['id_meses'];

                    foreach ($records as $bonificaciones) {

                        $id_bonifica_servicios = $bonificaciones['id_bonifica_servicios'];
                        $fecha_bonifica = $bonificaciones['fecha_bonifica'];
                        $id_tipo_doc = $bonificaciones['id_tipo_doc'];
                        $num_doc = $bonificaciones['num_doc'];

                        $sql = <<<EOD
INSERT INTO NO_CONCEPTO_PERIODO (ID_ANHOS,ID_MESES,PERIODO,ID_TIPO_DOC,NUM_DOC,ID_CONCEP_NOMINA,FECHA_DESDE,FECHA_HASTA,PORCENTAJE,NUM_DIAS)
    VALUES($id_anhos_nuevo,$id_meses_nuevo,$id_periodo_nuevo,$id_tipo_doc,$num_doc,$id_concep_bonif,
        to_date('01/$id_meses/$id_anhos','DD/MM/YYYY'),last_day(to_date('01/$id_meses/$id_anhos','DD/MM/YYYY')),
            0, $num_dias )
EOD;
                        $this->conn->execute($sql);


                        $sql = <<<EOD
update NO_BONIFICA_SERVICIOS set estado = 0 
    where id_bonifica_servicios = $id_bonifica_servicios
EOD;

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

                        $sql = <<<EOD
INSERT INTO NO_BONIFICA_SERVICIOS (ID_TIPO_DOC,NUM_DOC,FECHA_INGRESA,FECHA_BONIFICA,ESTADO,ID_PERIODO)
    VALUES($id_tipo_doc,$num_doc,to_date('$fecha_bonifica','YYYY-MM-DD HH24:MI:SS'),
        to_date('$fecha_bonifica','YYYY-MM-DD HH24:MI:SS') + interval '1' year,1,$id_periodo_nuevo)
EOD;

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



                /**
                 * ACTUALIZAR LA TABLA DE ULTIMO VALOR
                 */
                //A. INSERTA LOS VALORES NUEVOS POR FUNCIONARIO Y CONCEPTO

                $sql = <<<EOD
insert into no_ultimo_valor (ID_TIPO_DOC,NUM_DOC,ID_CONCEP_NOMINA,VALOR,ID_LIQUIDA_NOMINA)

select id_tipo_doc,num_doc,id_concep_nomina, sum(nvl(VALOR,0)) as VALOR, max(id_liquida_nomina) as id_liquida_nomina from(
                        
select tab0.id_tipo_doc,tab0.num_doc, tab0.id_concep_nomina, tab0.valor_liquidado AS VALOR, tab0.id_liquida_nomina
from no_liquida_nomina tab0
where tab0.id_periodo = $id_periodo 
    and not exists (select ultimo.num_doc, ultimo.id_tipo_doc, ultimo.id_concep_nomina 
        from no_ultimo_valor ultimo where ultimo.num_doc = tab0.num_doc 
            and ultimo.id_concep_nomina = tab0.id_concep_nomina and ultimo.id_tipo_doc = tab0.id_tipo_doc) 
                        
)
group by
id_tipo_doc,num_doc,id_concep_nomina
EOD;

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


                //B. ACTUALIZA LOS VALORES QUE YA EXISTAN          

                $sql = <<<EOD
select id_tipo_doc,num_doc,id_concep_nomina, sum(nvl(VALOR,0)) as VALOR, max(id_liquida_nomina) as id_liquida_nomina from(
                        
select tab0.id_tipo_doc,tab0.num_doc, tab0.id_concep_nomina, tab0.valor_liquidado AS VALOR, tab0.id_liquida_nomina
from no_liquida_nomina tab0
where tab0.id_periodo = $id_periodo 
    and exists (select ultimo.num_doc, ultimo.id_tipo_doc, ultimo.id_concep_nomina 
        from no_ultimo_valor ultimo where ultimo.num_doc = tab0.num_doc 
            and ultimo.id_concep_nomina = tab0.id_concep_nomina and ultimo.id_tipo_doc = tab0.id_tipo_doc) 
                        
)
group by
id_tipo_doc,num_doc,id_concep_nomina                        
EOD;

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

                foreach ($records as $liquida) {

                    $valor = $liquida['valor'];
                    $id_liquida_nomina = $liquida['id_liquida_nomina'];
                    $num_doc = $liquida['num_doc'];
                    $id_concep_nomina = $liquida['id_concep_nomina'];


                    $sql = <<<EOD
update no_ultimo_valor mt set mt.valor = $valor,  mt.id_liquida_nomina  = $id_liquida_nomina    
    where mt.num_doc = $num_doc and mt.id_concep_nomina = $id_concep_nomina
EOD;

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


                /*
                 * Colocarle en 0 el valor ultimo para las personas retiradas - 20131211
                 * Se quita del cierre del periodo y se mueve al nombramiento, por el calculo del retro - 20150625
                 */
                $sql = <<<EOD
update NO_ULTIMO_VALOR set VALOR = 0
where num_doc in (select DISTINCT est.num_doc 
from no_estado_retirado_v est 
where est.periodo = $id_periodo)
EOD;

                //$this->conn->execute($sql);
                //CREAR CAUSACION DE VACACIONES PARA AQUELLOS FUNCIONARIOS QUE TENIAN FECHA DE CAUSACION EN EL PERIODO QUE ESTA CERRANDO
                /*
                 * Se cambia el dia incial de la causacion por un dia despues de la fecha fin de la causacion del periodo creado - 20130902
                 * Se controla que no genere nada para las personas reiradas con fecha de terminación 
                 * anterior a la fecha de inicio del nuevo periodo, para evitar los retirados - 20130930
                 * Se realiza el cambio para la fecha fin, para qeu tome en cuenta los años bisiestos,
                 * ahora toma el año desde la feche ini y le resta un dia - 20160518
                 * Incidente #29507, se coloca filtro tab0.fecha_ini >= nom.fecha_ingreso , para validar que el periodo causado sea de el periodo activo del ultimo nombramiento - 20220425::LAVILA
                 */
                $sql = <<<EOD
INSERT INTO NO_CAUSA_VACAC (ID_TIPO_DOC,NUM_DOC,FECHA_INI,FECHA_FIN,NUM_DIAS,DIAS_DISFRUTADOS,SALDOS_DIAS)

select 
--nom.fecha_termina,
tab0.id_tipo_doc, tab0.num_doc, 
--tab0.fecha_ini + interval '1' year AS FECHA_INI,//la fecha final se corre por novedades de kardex por eso se toma la fin
tab0.fecha_fin + 1 AS FECHA_INI,
--tab0.fecha_fin + interval '1' year AS FECHA_FIN, 
((tab0.fecha_fin + 1) + interval '1' year) - 1 AS FECHA_FIN,
tab0.num_dias as dias, 0 as dias_disfrutados, tab0.num_dias as saldo_dias

from no_causa_vacac tab0
left join no_nombramiento_v nom
on nom.id_tipo_doc = tab0.id_tipo_doc
and nom.num_doc = tab0.num_doc

where tab0.fecha_fin >= to_date('01/$id_meses/$id_anhos','DD/MM/YYYY') 
and tab0.fecha_fin <= last_day(to_date('01/$id_meses/$id_anhos','DD/MM/YYYY'))
and nvl(nom.fecha_termina,to_date('01/$id_meses/$id_anhos','DD/MM/YYYY')) >= to_date('01/$id_meses/$id_anhos','DD/MM/YYYY')
--and tab0.saldos_dias != 0    
and tab0.fecha_ini >= nom.fecha_ingreso  
EOD;

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



                /**
                 * Proceso de cierre de mes. 
                 * Verificación de novedades de Kardex registradas en periódos anteriores cuya fecha de terminación 
                 * sea mayor o igual a la fecha de inicio del nuevo periodo.
                 * Si la fecha de terminación de la novedad de kardex es menor a la fecha de terminación del nuevo periódo: El número de días es igual a fecha de terminación de la novedad menos fecha de inicio del periódo +1
                 * Si la fecha de terminación de la novedad es mayor a la fecha de terminación del periodo nuevo: El número de días es igual a la fecha de terminación del periódo menos la fecha de inicio del periodo +1
                 * 20140917
                 */
                $logger->info("INICIO :: Incapacidades Kardex");

                /**
                 * Incapacidades que afectan dias en el nuevo periodo
                 */
                $sql = <<<EOD
select tab0.* from no_novedad_kardex tab0
where 
tab0.estado = 1
and( 
    tab0.fecha_ini  between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo_nuevo) ,'dd/mm/yyyy')
    and trunc(last_day( TO_DATE('01/'|| (SELECT LPAD(ID_MESES,2,'0') ||'/'||ID_ANHOS FROM NO_PERIODO WHERE ID_PERIODO = $id_periodo_nuevo) ,'dd/mm/yyyy') )) 
    or
    tab0.fecha_fin  between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo_nuevo) ,'dd/mm/yyyy')
    and trunc(last_day( TO_DATE('01/'|| (SELECT LPAD(ID_MESES,2,'0') ||'/'||ID_ANHOS FROM NO_PERIODO WHERE ID_PERIODO = $id_periodo_nuevo) ,'dd/mm/yyyy') )) 
or
    to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo_nuevo) ,'dd/mm/yyyy') between tab0.fecha_ini and tab0.fecha_fin
    or
    trunc(last_day( TO_DATE('01/'|| (SELECT LPAD(ID_MESES,2,'0') ||'/'||ID_ANHOS FROM NO_PERIODO WHERE ID_PERIODO = $id_periodo_nuevo) ,'dd/mm/yyyy') )) between tab0.fecha_ini and tab0.fecha_fin
)
order by
tab0.num_doc   
EOD;

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

                foreach ($results as $rec_nov_ka) {

                    $id_periodo = $id_periodo_nuevo;
                    $id_tip_nov_ka = $rec_nov_ka['id_tip_nov_ka'];
                    $id_periodo_base = $rec_nov_ka['id_periodo_base'];
                    $num_doc = $rec_nov_ka['num_doc'];
                    $id_tipo_doc = $rec_nov_ka['id_tipo_doc'];

                    $fecha_ingre = $rec_nov_ka['fecha_ini'];
                    $fecha_ingre = explode(' ', $fecha_ingre);
                    $fecha_ingre = $fecha_ingre[0];
                    $fecha_ingre_orig = $fecha_ingre;

                    $fecha_hasta = $rec_nov_ka['fecha_fin'];
                    $fecha_hasta = explode(' ', $fecha_hasta);
                    $fecha_hasta = $fecha_hasta[0];


                    /*
                     * Dias entre el inicio de la novedad y el ultimo dia del mes en el periodo liquidado
                     * Validacion para el mes de febrero descuente los dias 29 y 30 segun año - 20200219
                     * Se valida inicio de la nov para que no tome meses de otros años - 20210818::LAVILA
                     */
                    $sql = <<<EOD
select 

(case when (select id_meses from no_periodo where id_periodo =  $id_periodo) = 2 and (select to_char(LAST_DAY(fecha_fin),'dd') from no_periodo where id_periodo =  $id_periodo) = '29' then 1 
      when (select id_meses from no_periodo where id_periodo =  $id_periodo) = 2 and (select to_char(LAST_DAY(fecha_fin),'dd') from no_periodo where id_periodo =  $id_periodo) = '28' then 2 else 0 end) as dia_feb,                             
                            
case when (select fecha_fin from no_periodo where id_periodo =  $id_periodo) <= to_date('$fecha_hasta','YYYY-MM-DD') 
  then (select fecha_fin from no_periodo where id_periodo =  $id_periodo) - to_date('$fecha_ingre','YYYY-MM-DD') + 1 
  else to_date('$fecha_hasta','YYYY-MM-DD') - to_date('$fecha_ingre','YYYY-MM-DD') + 1 end as dia_inc,
                            
dias_rango_mes_sin_treintayuno(case when to_date('$fecha_ingre','YYYY-MM-DD') < (select fecha_ini from no_periodo where id_periodo =  $id_periodo) then (select fecha_ini from no_periodo where id_periodo =  $id_periodo) else to_date('$fecha_ingre','YYYY-MM-DD') end,to_date('$fecha_hasta','YYYY-MM-DD'),(select id_meses from no_periodo where id_periodo =  $id_periodo)) as dia_per,--dias en el periodo   
dias_rango_mes(case when to_date('$fecha_ingre','YYYY-MM-DD') < (select fecha_ini from no_periodo where id_periodo =  $id_periodo) then (select fecha_ini from no_periodo where id_periodo =  $id_periodo) else to_date('$fecha_ingre','YYYY-MM-DD') end,to_date('$fecha_hasta','yyyy-mm-dd'),(select id_meses from no_periodo where id_periodo =  $id_periodo)) as dia_per_inc,--dias en el periodo con el dia 31
                                
(to_date('$fecha_hasta','YYYY-MM-DD') - to_date('$fecha_ingre','YYYY-MM-DD') + 1) - fecha_rango_sin_treintayuno(to_date('$fecha_ingre','YYYY-MM-DD'), to_date('$fecha_hasta','YYYY-MM-DD')) as dias_treintauno,
fecha_rango_sin_treintayuno(to_date('$fecha_ingre','YYYY-MM-DD'), to_date('$fecha_hasta','YYYY-MM-DD')) as dias_sin,
to_date('$fecha_hasta','YYYY-MM-DD') - to_date('$fecha_ingre','YYYY-MM-DD') + 1 as dias_completos
from dual   
EOD;

                    $results = CN_TABLE::executeSQL($sql);
                    //dias
                    $dia_inc = $results[0]['dia_inc'];
                    $dia_per = $results[0]['dia_per'] + $results[0]['dia_feb'];
                    if ($dia_per > 30) {
                        $dia_per = 30;
                    }
                    $dia_per_inc = $results[0]['dia_per_inc'];
                    $dias_treintauno = $results[0]['dias_treintauno'];

                    /**
                     * Trae los dias y salario(base salud) para el periodo base de la novedad
                     */
                    $sql = <<<EOD
select nvl(tab0.valor_base,0) as valor_base, num_dias
    from no_liquida_aporte tab0
where tab0.id_tipo_doc = $id_tipo_doc and tab0.num_doc = $num_doc and tab0.id_periodo = $id_periodo_base and tab0.id_clase_fondo = 2    
EOD;

                    $results = CN_TABLE::executeSQL($sql);
                    if (count($results) > 0) {
                        $valor_base = $results[0]['valor_base'];
                        $num_dias_a = $results[0]['num_dias'];
                    } else {
                        $valor_base = 0;
                        $num_dias_a = 1;
                    }

                    $asignacion_basica = $valor_base;

                    /**
                     * SI AFECTA ANTIGUEDAD - 20150707
                     * Se validan que sean novedades solo que causen liquiacion o afecten antiguedad - 20200803
                     */
                    $sql = <<<EOD
SELECT * FROM NO_TIP_NOV_KA WHERE ID_TIP_NOV_KA = $id_tip_nov_ka
and ( afecta_antigu = 1 or suspension = 1 or causa_liquidacion = 1 ) 
EOD;

                    $results = CN_TABLE::executeSQL($sql);
                    if (count($results) > 0) {
                        $afecta_antigu = $results[0]['afecta_antigu'];

                        /**
                         * conceptos asociados al tipo nov ka
                         */
                        $sql = <<<EOD
SELECT * FROM NO_CONCEP_KA WHERE ID_TIP_NOV_KA = $id_tip_nov_ka
EOD;

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

                        foreach ($results as $conceptos) {

                            $id_concep_nomina = $conceptos['id_concep_nomina'];

                            /*
                             * Se cambia $fecha_ingre por $fecha_ingre_orig, para guardar fechas de la novedad en concepto_periodo - 20130918
                             */
                            $sql = <<<EOD
INSERT INTO NO_CONCEPTO_PERIODO (ID_ANHOS,ID_MESES,PERIODO,ID_TIPO_DOC,NUM_DOC,ID_CONCEP_NOMINA,FECHA_DESDE,FECHA_HASTA,NUM_DIAS,VALOR)
    VALUES($id_anhos,$id_meses,$id_periodo,$id_tipo_doc,$num_doc,$id_concep_nomina,to_date('$fecha_ingre_orig','YYYY-MM-DD'),
        to_date('$fecha_hasta','YYYY-MM-DD'), $dia_per_inc,$valor_base/$num_dias_a)
EOD;
                            $this->conn->execute($sql);
                        }


                        /**
                         * Descontar Asignacion Basica y conceptos asociados
                         * Quitar dias 31 para no tener encuenta - 20131119
                         * Para los 2 casos el número de días de Asignación básica del mes y sus 
                         * conceptos relacionados de devengados debe ser disminuido en los días del mes en el que exista la novedad.
                         */
                        $logger->info("Incapacidades Kardex - Descontar Asignacion Basica y conceptos asociados");
                        if ($dia_per != 0) {



                            $id_concep_nomina_asig = 0;
                            $asignacion_basica = 0;
                            $dias_concep_ab = 0;

                            //Sql para tomar id de asignacion basica
                            $sql = <<<EOD
select * from no_param_concep where id_param_concep = 1
EOD;
                            //Ejecutar SQL
                            $records = CN_TABLE::executeSQL($sql);

                            if (count($records) > 0) {
                                $id_concep_nomina_asig = $records[0]['id_concep_basica'];
                            }

                            //Si afecta antiguedad, Actualiza la fecha y dias para todos los conceptos - 20150707
                            if ($afecta_antigu) {
                                $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO tab set tab.fecha_desde = tab.fecha_desde + $dia_per 
    where tab.id_tipo_doc = $id_tipo_doc and tab.num_doc = $num_doc and tab.periodo = $id_periodo 
    and ( select con.id_tipo_concepto from no_concep_nomina con where con.id_concep_nomina = tab.id_concep_nomina ) != 3 
    and tab.id_concep_nomina not in (SELECT id_concep_nomina FROM NO_CONCEP_AB WHERE ESTADO = 1)
EOD;
                                $this->conn->execute($sql);

                                $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO tab set tab.num_dias = ( tab.num_dias - $dia_per )
    where tab.id_tipo_doc = $id_tipo_doc and tab.num_doc = $num_doc and tab.periodo = $id_periodo 
    and ( select con.id_tipo_concepto from no_concep_nomina con where con.id_concep_nomina = tab.id_concep_nomina ) != 3 
    and tab.id_concep_nomina not in (SELECT id_concep_nomina FROM NO_CONCEP_AB WHERE ESTADO = 1)
EOD;
                                $this->conn->execute($sql);
                            } else {
                                /**
                                 * Actualiza la fecha y dias de concepto_periodo de acuerdo a la novedad, solo AB
                                 */
                                $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO set fecha_desde = fecha_desde + $dia_per 
    where id_tipo_doc = $id_tipo_doc and num_doc = $num_doc and periodo = $id_periodo and id_concep_nomina = $id_concep_nomina_asig
EOD;
                                $this->conn->execute($sql);

                                $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO set num_dias = ( num_dias - $dia_per )
    where id_tipo_doc = $id_tipo_doc and num_doc = $num_doc and periodo = $id_periodo and id_concep_nomina = $id_concep_nomina_asig
EOD;
                                $this->conn->execute($sql);
                            }

                            /**
                             * Si aplica concepto de Auxilio de Trasporte y Subsidio de Alimentación 
                             * se realiza tambien el reintegro. - 20131115
                             */
                            //VERIFICAR SI SE ADICIONA CONCEPTOS ASOCIADOS A LA ASIGNACION BASICA
                            $sql = <<<EOD
SELECT * FROM NO_CONCEP_AB WHERE ESTADO = 1
and id_concep_nomina not in (select no_param_concep.id_concep_bonif from no_param_concep) 
EOD;
                            $results = CN_TABLE::executeSQL($sql);

                            if (count($results) > 0) {

                                /*
                                 * RECORRO CADA UNO DE LOS CONCEPTOS QUE ESTEN ASOCIADOS
                                 */
                                foreach ($results as $conceptos) {

                                    $rango_minimo = $conceptos['rango_minimo'];
                                    $rango_maximo = $conceptos['rango_maximo'];
                                    $id_concep_ab = $conceptos['id_concep_nomina'];
                                    $valor_fijo = $conceptos['valor_fijo'];

                                    /**
                                     * Actualiza la fecha y dias de concepto_periodo de acuerdo a la novedad
                                     */
                                    $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO set fecha_desde = fecha_desde + $dia_per
    where id_tipo_doc = $id_tipo_doc and num_doc = $num_doc and periodo = $id_periodo and id_concep_nomina = $id_concep_ab
EOD;
                                    $this->conn->execute($sql);

                                    $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO set num_dias = num_dias - $dia_per
    where id_tipo_doc = $id_tipo_doc and num_doc = $num_doc and periodo = $id_periodo and id_concep_nomina = $id_concep_ab
EOD;
                                    $this->conn->execute($sql);
                                }
                            }
                        }
                    }
                }
                $logger->info("FIN :: Incapacidades Kardex");



                /*
                 * En el cierre del mes para las personas que se retiran quede DESACTIVADA LA CUENTA para pago en bancos. - 20141203
                 */
                $sql = <<<EOD
update no_pago_func tab1

set tab1.estado = 0, tab1.fecha_terminacion = (
  select tab.fecha_termina from no_nombramiento_v tab
  where tab1.id_tipo_doc = tab.id_tipo_doc
  and tab1.num_doc = tab.num_doc
)

/*
select 
tab1.*,
tab.fecha_termina
from no_pago_func tab1

join no_nombramiento_v tab
on tab1.id_tipo_doc = tab.id_tipo_doc
and tab1.num_doc = tab.num_doc
*/
                        
where
tab1.estado = 1
and tab1.NUM_DOC in (
 select nom.NUM_DOC from no_nombramiento_v nom 
  where nom.fecha_retiro is not null
  and (select no_periodo.fecha_ini from no_periodo 
        where id_periodo = $id_periodo_nuevo) > trunc(last_day( nom.fecha_termina ))
) 
EOD;
                $this->conn->execute($sql);

                /*
                 * Se anula certificados de retefuente de retirados - 20190305
                 */
                $sql = <<<EOD
update no_certi_retefuente tab1
set tab1.estado = 0, 
tab1.motivo_anu = 'Se anula por retiro de funcionario',
tab1.fecha_anu = (
  select tab.fecha_termina from no_nombramiento_v tab
  where tab1.id_tipo_doc = tab.id_tipo_doc
  and tab1.num_doc = tab.num_doc
)
where
tab1.estado = 1
and tab1.NUM_DOC in (
 select nom.NUM_DOC from no_nombramiento_v nom 
  where nom.fecha_retiro is not null
  and (select no_periodo.fecha_ini from no_periodo 
        where id_periodo = $id_periodo_nuevo) > trunc(last_day( nom.fecha_termina ))
) 
EOD;
                $this->conn->execute($sql);


                /**
                 * Retirados el primer dia del mes, para liquidacion de cesantias - 20150312
                 */
                $sql = <<<EOD
select 

case when trunc(nombra.fecha_retiro) = (select fecha_ini from no_periodo where id_periodo = $id_periodo_nuevo) then 1 else 0 end as retiro_primerdiames,
    (case when (select count(est.id_estado_func) as cant from no_estado_func est where est.num_doc = nombra.num_doc and est.periodo = $id_periodo_nuevo ) > 0 then 1 else 0 end) as estado_func,

nombra.* 

from no_nombramiento_v nombra

where 
nombra.estado = 0
and trunc(nombra.fecha_retiro) = (select fecha_ini from no_periodo where id_periodo = $id_periodo_nuevo) 
EOD;
                $results_nov = CN_TABLE::executeSQL($sql);

                if (count($results_nov) > 0) {
                    //verificar usuarios
                    foreach ($results_nov as $value_nov) {

                        $id_tipo_doc = $value_nov['id_tipo_doc'];
                        $num_doc = $value_nov['num_doc'];
                        $estado_func = $value_nov['estado_func'];
                        $retiro_primerdiames = $value_nov['retiro_primerdiames'];

                        //verifica para cada registro que esta en estado_func, sino lo crea
                        if ($retiro_primerdiames == 1 && $estado_func == 0) {

                            $sql = <<<EOD
insert into no_estado_func
select 
null as id_estado_func,
id_tipo_doc,
num_doc,
id_dp,
(select id_anhos from no_periodo where id_periodo = $id_periodo_nuevo) as id_anhos,
(select id_meses from no_periodo where id_periodo = $id_periodo_nuevo) as id_meses,
$id_periodo_nuevo as periodo,
1 as actual,
id_ea,
id_cen_op
from no_estado_func
where 
periodo = $id_periodo_ant 
and id_tipo_doc = $id_tipo_doc
and num_doc = $num_doc 
EOD;
                            $this->conn->execute($sql);
                        }

                        // actualiza días de no_concepto_periodo
                        $sql = <<<EOD
update no_concepto_periodo set num_dias = 0
where 
periodo = $id_periodo_nuevo 
and id_tipo_doc = $id_tipo_doc
and num_doc = $num_doc  
EOD;
                        $this->conn->execute($sql);
                    }
                }



                /**
                 * Personas con novedad Suspensión por Incapacidad no_param_concep id 13-Suspensión por Incapacidad,
                 * Se crea en estado funcionario y el registro en concepto_periodo - 20150312
                 */
                $sql = <<<EOD
select 
(case when (select count(con.id_concepto_periodo) as cant from no_concepto_periodo con 
    where con.num_doc = nov.num_doc and con.periodo = $id_periodo_nuevo and con.id_concep_nomina = (select id_concep_basica from no_param_concep where id_param_concep = 1) ) > 0 then 1 else 0 end) as concepto_periodo,
(case when (select count(est.id_estado_func) as cant from no_estado_func est where est.num_doc = nov.num_doc and est.periodo = $id_periodo_nuevo ) > 0 then 1 else 0 end) as estado_func,
nov.* 

from no_novedad_kardex nov

where 
nov.estado = 1
and nov.id_tip_nov_ka = (select no_param_concep.id_nov_ka_susinc from no_param_concep where no_param_concep.id_param_concep = 1)
and (
    (select fecha_ini from no_periodo where id_periodo = $id_periodo_nuevo) between nov.fecha_ini and nov.fecha_fin
    or    
    (select fecha_fin from no_periodo where id_periodo = $id_periodo_nuevo) between nov.fecha_ini and nov.fecha_fin
)
EOD;
                $results_nov = CN_TABLE::executeSQL($sql);

                if (count($results_nov) > 0) {
                    //verificar usuarios
                    foreach ($results_nov as $value_nov) {

                        $id_tipo_doc = $value_nov['id_tipo_doc'];
                        $num_doc = $value_nov['num_doc'];
                        $estado_func = $value_nov['estado_func'];
                        $concepto_periodo = $value_nov['concepto_periodo'];

                        //verifica para cada registro que esta en estado_func, sino lo crea
                        if ($estado_func == 0) {

                            $sql = <<<EOD
insert into no_estado_func
select 
null as id_estado_func,
id_tipo_doc,
num_doc,
id_dp,
(select id_anhos from no_periodo where id_periodo = $id_periodo_nuevo) as id_anhos,
(select id_meses from no_periodo where id_periodo = $id_periodo_nuevo) as id_meses,
$id_periodo_nuevo as periodo,
1 as actual,
id_ea,
id_cen_op
from no_estado_func
where 
periodo = $id_periodo_ant 
and id_tipo_doc = $id_tipo_doc
and num_doc = $num_doc 
EOD;
                            $this->conn->execute($sql);
                        }

                        // actualiza días de no_concepto_periodo
                        $sql = <<<EOD
update no_concepto_periodo set num_dias = 0
where 
periodo = $id_periodo_nuevo 
and id_tipo_doc = $id_tipo_doc
and num_doc = $num_doc  
EOD;
                        $this->conn->execute($sql);

                        //registra asiganacion basica si no la tiene
                        if ($concepto_periodo == 0) {
                            $sql = <<<EOD
Insert into NO_CONCEPTO_PERIODO (ID_CONCEPTO_PERIODO,ID_ANHOS,ID_MESES,PERIODO,ID_TIPO_DOC,NUM_DOC,ID_CONCEP_NOMINA,
    FECHA_DESDE,FECHA_HASTA,VALOR,PORCENTAJE,NUM_DIAS,ID_PERIODO_AJUSTE) 
    values (null,(select id_anhos from no_periodo where id_periodo = $id_periodo_nuevo),(select id_meses from no_periodo where id_periodo = $id_periodo_nuevo),
    $id_periodo_nuevo,$id_tipo_doc,'$num_doc',(select id_concep_basica from no_param_concep where id_param_concep = 1),
        (select fecha_ini from no_periodo where id_periodo = $id_periodo_nuevo),(select fecha_fin from no_periodo where id_periodo = $id_periodo_nuevo),
          (    select /*aux.num_doc,*/ sum(aux.valor) as valor from (
                select 
                con.num_doc, nvl(con.valor,0) as valor, 
                row_number() over ( partition by con.num_doc order by con.periodo desc) rn
                from no_concepto_periodo con 
                where
                con.id_concep_nomina = (select id_concep_basica from no_param_concep where id_param_concep = 1)
                and con.periodo != $id_periodo_nuevo 
                and con.id_periodo_ajuste is null
            )aux  
            where aux.rn = 1
            and aux.num_doc = $num_doc
            group by
            aux.num_doc),0,0,null)   
EOD;
                            $this->conn->execute($sql);
                        }
                    }
                }



                /*
                 * Terminar comision otra entidad id -> 8 - 202000923
                 */
                //id 8 novedad de comision OE
                //id 14 novedad de terminacion de OE
                $sql = <<<EOD
select
to_char(FECHA_TERMINACION,'YYYY-MM-DD') as fecha,
(select  id_anhos ||'-'|| lpad(id_meses,2,'0') || '-01' from no_periodo where id_periodo = $id_periodo_nuevo)  as fecha_ini,
$id_periodo_nuevo as id_periodo,
id_novedad_personal,
ID_TIPO_DOC,
num_doc,
14 as ID_NOVEDAD,
fecha_inicial,
FECHA_TERMINACION,
doc_soporte,
FECHA_SOPORTE,
id_dp_ini,
ID_DP_FIN,
--ID_PERIODO,
ESTADO,
id_novedad_personal as id_novedad_ajuste
from no_novedad_personal
where 
id_novedad in (8)
and estado = 1
and fecha_terminacion between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo_nuevo) ,'dd/mm/yyyy')
    and trunc(last_day( to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo_nuevo) ,'dd/mm/yyyy') ))                       
EOD;

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

                foreach ($records as $list_data_post) {
                    $this->terminarOE($list_data_post);
                }



                /**
                 * Personas con novedad de comision otra entidad id -> 8,
                 * en la liq del nuevo periodo desactiva valores y días de no_concepto_periodo - 20150311
                 * Validacion para personas retiradas - 20230116::LAVILA
                 */
                $sql = <<<EOD
select 
(case when (select count(con.id_concepto_periodo) as cant from no_concepto_periodo con 
    where con.num_doc = nov.num_doc and con.periodo = $id_periodo_nuevo and con.id_concep_nomina = (select id_concep_basica from no_param_concep where id_param_concep = 1) ) > 0 then 1 else 0 end) as concepto_periodo,
(case when (select count(est.id_estado_func) as cant from no_estado_func est where est.num_doc = nov.num_doc and est.periodo = $id_periodo_nuevo ) > 0 then 1 else 0 end) as estado_func,
nov.* 

from no_novedad_personal nov

where 
nov.estado = 1
and nov.id_novedad = 8
and (
    (select fecha_ini from no_periodo where id_periodo = $id_periodo_nuevo) between nov.fecha_inicial and nov.fecha_terminacion
    or    
    (select fecha_fin from no_periodo where id_periodo = $id_periodo_nuevo) between nov.fecha_inicial and nov.fecha_terminacion
)
and nov.NUM_DOC not in (
 select nom.NUM_DOC from no_nombramiento_v nom 
  where nom.fecha_retiro is not null
  and (select no_periodo.fecha_ini from no_periodo 
        where id_periodo = $id_periodo_nuevo) > trunc(last_day( nom.fecha_termina ))
) 
EOD;
                $results_nov = CN_TABLE::executeSQL($sql);

                if (count($results_nov) > 0) {
                    //verificar usuarios
                    foreach ($results_nov as $value_nov) {

                        $id_tipo_doc = $value_nov['id_tipo_doc'];
                        $num_doc = $value_nov['num_doc'];
                        $estado_func = $value_nov['estado_func'];
                        $concepto_periodo = $value_nov['concepto_periodo'];

                        //verifica para cada registro que esta en estado_func, sino lo crea
                        if ($estado_func == 0) {

                            $sql = <<<EOD
insert into no_estado_func
select 
null as id_estado_func,
id_tipo_doc,
num_doc,
id_dp,
(select id_anhos from no_periodo where id_periodo = $id_periodo_nuevo) as id_anhos,
(select id_meses from no_periodo where id_periodo = $id_periodo_nuevo) as id_meses,
$id_periodo_nuevo as periodo,
1 as actual,
id_ea,
id_cen_op
from no_estado_func
where 
periodo = $id_periodo_ant 
and id_tipo_doc = $id_tipo_doc
and num_doc = $num_doc 
EOD;
                            $this->conn->execute($sql);
                        }

                        // actualiza días de no_concepto_periodo
                        $sql = <<<EOD
update no_concepto_periodo set num_dias = 0
where 
periodo = $id_periodo_nuevo 
and id_tipo_doc = $id_tipo_doc
and num_doc = $num_doc  
EOD;
                        $this->conn->execute($sql);

                        //registra asiganacion basica si no la tiene, Se agrega validacion si no esta creado en concepto periodo - 20150609
                        if ($concepto_periodo == 0) {
                            $sql = <<<EOD
Insert into NO_CONCEPTO_PERIODO (ID_CONCEPTO_PERIODO,ID_ANHOS,ID_MESES,PERIODO,ID_TIPO_DOC,NUM_DOC,ID_CONCEP_NOMINA,
    FECHA_DESDE,FECHA_HASTA,VALOR,PORCENTAJE,NUM_DIAS,ID_PERIODO_AJUSTE) 
    values (null,(select id_anhos from no_periodo where id_periodo = $id_periodo_nuevo),(select id_meses from no_periodo where id_periodo = $id_periodo_nuevo),
    $id_periodo_nuevo,$id_tipo_doc,'$num_doc',(select id_concep_basica from no_param_concep where id_param_concep = 1),
        (select fecha_ini from no_periodo where id_periodo = $id_periodo_nuevo),(select fecha_fin from no_periodo where id_periodo = $id_periodo_nuevo),
          (    select /*aux.num_doc,*/ sum(aux.valor) as valor from (
                select 
                con.num_doc, nvl(con.valor,0) as valor, 
                row_number() over ( partition by con.num_doc order by con.periodo desc) rn
                from no_concepto_periodo con 
                where
                con.id_concep_nomina = (select id_concep_basica from no_param_concep where id_param_concep = 1)
                and con.periodo != $id_periodo_nuevo 
            )aux  
            where aux.rn = 1
            and aux.num_doc = $num_doc
            group by
            aux.num_doc),0,0,null)   
EOD;
                            $this->conn->execute($sql);
                        }
                    }
                }


                /*
                 * Terminar encargos para el periodo creado - 20130809
                 */
                //id 3 novedad de encargo
                //id 7 novedad de comision
                //id 4 novedad de terminacion de encargo
                $sql = <<<EOD
select
to_char(FECHA_TERMINACION,'YYYY-MM-DD') as fecha,
(select  id_anhos ||'-'|| lpad(id_meses,2,'0') || '-01' from no_periodo where id_periodo = $id_periodo_nuevo)  as fecha_ini,
$id_periodo_nuevo as id_periodo,
id_novedad_personal,
ID_TIPO_DOC,
num_doc,
4 as ID_NOVEDAD,
fecha_inicial,
FECHA_TERMINACION,
doc_soporte,
FECHA_SOPORTE,
id_dp_ini,
ID_DP_FIN,
--ID_PERIODO,
ESTADO
from no_novedad_personal
where 
id_novedad in (3,7)
and estado = 1
and fecha_terminacion between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo_nuevo) ,'dd/mm/yyyy')
    and trunc(last_day( to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo_nuevo) ,'dd/mm/yyyy') ))                       
EOD;

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


                //COMMIT DE TODAS LAS TRANSACCIONES
                $this->conn->commit();

                foreach ($records as $list_data_post) {
                    $this->terminarEncargo($list_data_post);
                }
            } catch (Exception $e) {

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

                $logger->info("ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR");
                $logger->info("[UPDATE Exception] " . $e->getMessage());
            }
        }

        //accion remove
        if ($Action == "REMOVE") {
            
        }

        return $request;
    }

    /**
     * 
     * @param type $list_data_post
     */
    public function terminarEncargo($list_data_post) {

        /*
         * Se instancia la clase del manejo del log
         */
        $logger = sfContext::getInstance()->getLogger();

        $this->conn->beginTransaction();

        try {

            $id_tipo_doc = $list_data_post['id_tipo_doc'];
            $num_doc = $list_data_post['num_doc'];
            $fecha_ingre = $list_data_post['fecha'];
            $fecha_hasta = $list_data_post['fecha'];
            $id_dp = $list_data_post['id_dp_fin'];
            $id_dp_ini = $list_data_post['id_dp_fin'];
            $id_periodo = $list_data_post['id_periodo'];
            $id_novedad = $list_data_post['id_novedad'];
//            $id_novedad_ajuste = $list_data_post['id_novedad_ajuste'];

            $sql = <<<EOD
            SELECT * FROM NO_PERIODO WHERE ID_PERIODO = $id_periodo 
EOD;
            $results = CN_TABLE::executeSQL($sql);

            $id_anhos = $results[0]['id_anhos'];
            $id_meses = $results[0]['id_meses'];
            $id_periodo = $results[0]['id_periodo'];
            $id_tipo_periodo = $results[0]['id_tipo_periodo'];
            $fecha_desde_periodo = $results[0]['fecha_ini'];
            $fecha_desde_periodo = explode(' ', $fecha_desde_periodo);
            $fecha_desde_periodo = $fecha_desde_periodo[0];
            $fecha_hasta_periodo = $results[0]['fecha_fin'];
            $fecha_hasta_periodo = explode(' ', $fecha_hasta_periodo);
            $fecha_hasta_periodo = $fecha_hasta_periodo[0];

            $sql = <<<EOD
            SELECT * FROM NO_TIPO_PERIODO WHERE ID_TIPO_PERIODO = $id_tipo_periodo 
EOD;
            $results = CN_TABLE::executeSQL($sql);

            $num_dias = $results[0]['no_dias_mes'];

            //TERMINACION DE ENCARGO
            if ($id_novedad == 4) {


                $sql = <<<EOD
insert into no_novedad_personal (id_novedad_personal,id_tipo_doc,num_doc,id_novedad,fecha_inicial,
    fecha_terminacion,doc_soporte,fecha_soporte,id_dp_ini,id_dp_fin,id_periodo,estado) 
    values (null,1,'$num_doc',$id_novedad,
        to_date('$fecha_ingre','YYYY-MM-DD'), to_date('$fecha_ingre','YYYY-MM-DD'),
         (select lpad(id_meses,2,'0') ||id_anhos from no_periodo where id_periodo = $id_periodo),
             trunc(sysdate),$id_dp,$id_dp,$id_periodo,1)
EOD;
                $this->conn->execute($sql);


                //SELECCIONO EL CONCEPTO DE ASIGNACIÓN BÁSICA

                $sql = <<<EOD
            SELECT ID_CONCEP_BASICA FROM NO_PARAM_CONCEP
EOD;

                $results = CN_TABLE::executeSQL($sql);
                //CONCEPTO DE ASIGNACION BASICA
                $id_concep_basica = $results[0]['id_concep_basica'];

                $sql = <<<EOD
            SELECT ID_DP_INI, ID_DP_FIN FROM NO_NOVEDAD_PERSONAL WHERE ID_NOVEDAD in (3,7) AND ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc AND ESTADO=1
EOD;

                $results = CN_TABLE::executeSQL($sql);
                //TRAIGO EL CARGO ANTERIOR AL ENCARGO 
                $id_dp_ini = $results[0]['id_dp_ini'];
                //TRAIGO EL CARGO DEL ENCARGO 
                $id_dp_fin = $results[0]['id_dp_fin'];


                // AB del cargo anterior - 20141106
                $sql = <<<EOD
SELECT ASIGNACION_BASICA, ID_CEN_OP, ID_EA FROM NO_DP_V WHERE ID_DP = $id_dp_fin
EOD;
                $results = CN_TABLE::executeSQL($sql);
//ASIGNACION BASICA DEL NUEVO CARGO
                $asignacion_basica_fin = $results[0]['asignacion_basica'];


                $sql = <<<EOD
            SELECT ASIGNACION_BASICA,ID_CEN_OP,ID_EA FROM NO_DP_V WHERE ID_DP = $id_dp_ini
EOD;
                $results = CN_TABLE::executeSQL($sql);

                //ASIGNACION BASICA DEL NUEVO CARGO
                $asignacion_basica = $results[0]['asignacion_basica'];
                /*
                 * Validar que los registros no son null - 20130618
                 */
                $id_cen_op = 'null';
                if (!is_null($results[0]['id_cen_op'])) {
                    $id_cen_op = $results[0]['id_cen_op'];
                }
                $id_ea = 'null';
                if (!is_null($results[0]['id_ea'])) {
                    $id_ea = $results[0]['id_ea'];
                }



                //SETEO CON ESTADO = 0 LA NOVEDAD DE ENCARGO

                $sql = <<<EOD
            UPDATE NO_NOVEDAD_PERSONAL SET ESTADO = 0 WHERE ID_NOVEDAD in (3,7) AND ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc
EOD;

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

                //BUSCO EN LA TABLA NO_ESTADO_FUNC EL ESTADO ACTUAL Y LE PONGO ACTUAL = 0

                $sql = <<<EOD
            UPDATE NO_ESTADO_FUNC SET ACTUAL=0 WHERE ID_TIPO_DOC=$id_tipo_doc AND NUM_DOC=$num_doc and PERIODO = $id_periodo
EOD;

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


                //CREO EL NUEVO REGISTRO EN LA TABLA NO_ESTADO_FUNC

                $sql = <<<EOD
            INSERT INTO NO_ESTADO_FUNC (ID_TIPO_DOC,NUM_DOC,ID_DP,ID_ANHOS,ID_MESES,PERIODO,ACTUAL,ID_CEN_OP,ID_EA)
                VALUES($id_tipo_doc,$num_doc,$id_dp_ini,$id_anhos,$id_meses,$id_periodo,1,$id_cen_op,$id_ea)  
EOD;


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


                //BUSCO EN LA TABLA NO_CONCEPTO_FUNC EL CONCEPTO DE ASIGNACION ACTUAL Y PONGO ESTADO=0 Y ACTUAL = 0

                $sql = <<<EOD
            UPDATE NO_CONCEPTO_FUNC SET ESTADO=0, ACTUAL=0 WHERE ID_TIPO_DOC=$id_tipo_doc AND NUM_DOC=$num_doc AND ID_CONCEP_NOMINA=$id_concep_basica
EOD;

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

                //CREO EL NUEVO REGISTRO EN LA TABLA NO_CONCEPTO_FUNC

                $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_basica,$asignacion_basica,1,1,
        to_date('$fecha_ingre','YYYY-MM-DD')+1, null )
EOD;

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


                //ACTUALIZO LA TABLA NO_CONCEPTO_PERIODO LA FECHA FINAL DE LA ULTIMA NOVEDAD A LA 
                //FECHA INMEDIATAMENTE ANTERIOR A LA FECHA INICIAL DE LA NUEVA NOVEDAD

                $sql = <<<EOD
            
select max(conc.id_concepto_periodo) ID_CONCEPTO_PERIODO

from no_concepto_periodo conc

where conc.id_tipo_doc=$id_tipo_doc and conc.num_doc=$num_doc and conc.id_concep_nomina = $id_concep_basica and conc.periodo = $id_periodo



EOD;

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


                $id_concep_periodo = $results[0]['id_concepto_periodo'];

                $sql = <<<EOD
            
select conc.*

from no_concepto_periodo conc

where conc.id_concepto_periodo = $id_concep_periodo



EOD;

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


                $fecha_ini_per = $concepto[0]['fecha_desde'];
                $fecha_fin_per = $concepto[0]['fecha_hasta'];



                $date1 = new DateTime($fecha_ini_per);
                $date2 = new DateTime($fecha_ingre);

                /**
                 * Valida si la fecha de la novedad es la misma del primer dia del periodo
                 */
                if ($date1 == $date2) {

                    $sql = <<<EOD
            
UPDATE NO_CONCEPTO_PERIODO SET fecha_hasta = to_date('$fecha_ingre','YYYY-MM-DD'), num_dias = 1 
    
WHERE id_concepto_periodo IN(

select max(conc.id_concepto_periodo) ID_CONCEPTO_PERIODO

from no_concepto_periodo conc

where conc.id_tipo_doc=$id_tipo_doc and conc.num_doc=$num_doc 
    and conc.id_concep_nomina = $id_concep_basica and conc.periodo = $id_periodo

)

EOD;


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

                    //CREO EL NUEVO REGISTRO DE NO_CONCEPTO_PERIODO

                    $sql = <<<EOD
            INSERT INTO NO_CONCEPTO_PERIODO (ID_ANHOS,ID_MESES,PERIODO,ID_TIPO_DOC,NUM_DOC,ID_CONCEP_NOMINA,FECHA_DESDE,FECHA_HASTA,VALOR,NUM_DIAS)
                VALUES($id_anhos,$id_meses,$id_periodo,$id_tipo_doc,$num_doc,$id_concep_basica,to_date('$fecha_ingre','YYYY-MM-DD')+1,
                    last_day(to_date('$fecha_ingre','YYYY-MM-DD')),$asignacion_basica,
		($num_dias - TO_NUMBER(to_char(to_date('$fecha_ingre','YYYY-MM-DD'),'DD'))))
EOD;


                    $this->conn->execute($sql);
                } else {

                    /*
                     * Validar que la terminacion no sea en un siguiente periodo - 20140114
                     */
                    $sql = <<<EOD
select 
ID_PERIODO,
ID_ANHOS,
ID_MESES,
FECHA_INI,
to_char(FECHA_INI,'YYYY-MM-DD') as fecha_desde,
FECHA_FIN,
to_char(FECHA_FIN,'YYYY-MM-DD') as fecha_hasta,
ID_TIPO_PERIODO,
ESTADO,
FECHA_CIERRE,
FECHA_CIERRE_NOV,
ACTIVO,
MAX_DED_NOLEY,
FECHA_PAGO,
NUM_DOC_PAGO    
from no_periodo where id_periodo = $id_periodo
EOD;

                    $periodo = CN_TABLE::executeSQL($sql);
                    $fecha_ini_per = $periodo[0]['fecha_desde'];
                    $date4 = new DateTime($fecha_ini_per);
                    $fecha_fin_per = $periodo[0]['fecha_hasta'];
                    $date3 = new DateTime($fecha_fin_per);

                    /*
                     * Validar que la terminacion no sea en un siguiente periodo - 20140114
                     */
                    if ($date2 >= $date4 && $date2 <= $date3) {

                        $sql = <<<EOD
            
UPDATE NO_CONCEPTO_PERIODO SET fecha_hasta = to_date('$fecha_ingre','YYYY-MM-DD') 
    
WHERE id_concepto_periodo IN(

select max(conc.id_concepto_periodo) ID_CONCEPTO_PERIODO

from no_concepto_periodo conc

where conc.id_tipo_doc = $id_tipo_doc and conc.num_doc = $num_doc 
    and conc.id_concep_nomina = $id_concep_basica and conc.periodo = $id_periodo

)

EOD;


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

                        $sql = <<<EOD
            
UPDATE NO_CONCEPTO_PERIODO 
    SET num_dias = case 
                    when fecha_hasta < fecha_desde then 0
                    when (fecha_hasta - fecha_desde) + 1 >= 30 then 30 
                   else (fecha_hasta - fecha_desde) + 1 end  
    
WHERE id_concepto_periodo IN(

select max(conc.id_concepto_periodo) ID_CONCEPTO_PERIODO

from no_concepto_periodo conc

where conc.id_tipo_doc = $id_tipo_doc and conc.num_doc = $num_doc 
    and conc.id_concep_nomina = $id_concep_basica and conc.periodo = $id_periodo

)

EOD;


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

//CREO EL NUEVO REGISTRO DE NO_CONCEPTO_PERIODO

                        $sql = <<<EOD
            INSERT INTO NO_CONCEPTO_PERIODO (ID_ANHOS,ID_MESES,PERIODO,ID_TIPO_DOC,NUM_DOC,ID_CONCEP_NOMINA,FECHA_DESDE,FECHA_HASTA,VALOR,NUM_DIAS)
                VALUES($id_anhos,$id_meses,$id_periodo,$id_tipo_doc,$num_doc,$id_concep_basica,to_date('$fecha_ingre','YYYY-MM-DD')+1,
                    (select fecha_fin from no_periodo where id_periodo = $id_periodo),$asignacion_basica,
		($num_dias - TO_NUMBER(to_char(to_date('$fecha_ingre','YYYY-MM-DD'),'DD'))))
EOD;


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


                        /*
                         * Recalcular num_dias
                         */
                        /*
                         * si la fecha de terminación es menor que la fecha inicial del periodo debe colocar en número de días (0) - 20130813
                         * case when ((to_date('$fecha_ingre','YYYY-MM-DD')-1)-fecha_desde + 1) > 30 then 30 
                         * when ((to_date('$fecha_ingre','YYYY-MM-DD')-1)-fecha_desde + 1) < 0 then 0
                         * else (to_date('$fecha_ingre','YYYY-MM-DD')-1-fecha_desde + 1) end 
                         */
                        /*
                         * Se valida rango de fechas y numero de dias - 20140114
                         */
                        $sql = <<<EOD
            
UPDATE NO_CONCEPTO_PERIODO SET 
      num_dias =  
      case  
            when fecha_desde < (select FECHA_INI from no_periodo where id_periodo = $id_periodo) then $num_dias
            when fecha_desde > fecha_hasta then 0
            when ($num_dias - TO_NUMBER(to_char(fecha_desde,'DD'))+1)  <= 0 then 0 
            else ($num_dias - TO_NUMBER(to_char(fecha_desde,'DD'))+1) end                          
        
WHERE id_concepto_periodo IN(

select max(conc.id_concepto_periodo) ID_CONCEPTO_PERIODO

from no_concepto_periodo conc

where conc.id_tipo_doc = $id_tipo_doc and conc.num_doc = $num_doc 
    and conc.id_concep_nomina = $id_concep_basica and conc.periodo = $id_periodo

)

EOD;
                        $this->conn->execute($sql);
                    } else if ($date2 < $date4) {
                        /*
                         * Si la terminacion es antes del periodo - 20141126
                         */
                        $logger->info("Si la terminacion es antes del periodo");
                        //ACTUALIZO LA TABLA NO_CONCEPTO_PERIODO el valor - 20140930

                        $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO SET  
    valor = $asignacion_basica         
WHERE id_concepto_periodo IN(

    select max(conc.id_concepto_periodo) ID_CONCEPTO_PERIODO
    from no_concepto_periodo conc
    where conc.id_tipo_doc = $id_tipo_doc and conc.num_doc = $num_doc 
        and conc.id_concep_nomina = $id_concep_basica and conc.periodo = $id_periodo

)
EOD;

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


                        /**
                         * Ajustar el valor correspondiente con el ingreso de un ajuste del nuevo salario 
                         * y el reintegro del sueldo anterior. - 20141106
                         */
//Ajuste AB
                        $sql = <<<EOD
INSERT INTO NO_CONCEPTO_PERIODO (ID_ANHOS,ID_MESES,PERIODO,ID_TIPO_DOC,NUM_DOC,ID_CONCEP_NOMINA,FECHA_DESDE,FECHA_HASTA,VALOR,NUM_DIAS)
    VALUES($id_anhos,$id_meses,$id_periodo,$id_tipo_doc,$num_doc,
        (select nvl(ID_CONCEP_AJUSTE ,ID_CONCEP_NOMINA ) as ID_CONCEP_AJUSTE from no_concep_nomina where ID_CONCEP_NOMINA = $id_concep_basica ),
        to_date('$fecha_ingre','YYYY-MM-DD'),
        to_date('$fecha_desde_periodo','YYYY-MM-DD')-1,$asignacion_basica,
        (FECHA_RANGO_SIN_TREINTAYUNO(to_date('$fecha_ingre','yyyy-mm-dd'),to_date('$fecha_desde_periodo','yyyy-mm-dd')-1 ))
    )                             
EOD;


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

//Reintegro AB
                        $sql = <<<EOD
INSERT INTO NO_CONCEPTO_PERIODO (ID_ANHOS,ID_MESES,PERIODO,ID_TIPO_DOC,NUM_DOC,ID_CONCEP_NOMINA,FECHA_DESDE,FECHA_HASTA,VALOR,NUM_DIAS)
    VALUES($id_anhos,$id_meses,$id_periodo,$id_tipo_doc,$num_doc,
        (select nvl(ID_CONCEP_REIN ,ID_CONCEP_NOMINA ) as ID_CONCEP_REIN from no_concep_nomina where ID_CONCEP_NOMINA = $id_concep_basica ),
        to_date('$fecha_ingre','YYYY-MM-DD'),
        to_date('$fecha_desde_periodo','YYYY-MM-DD')-1,$asignacion_basica_fin,
        (FECHA_RANGO_SIN_TREINTAYUNO(to_date('$fecha_ingre','yyyy-mm-dd'),to_date('$fecha_desde_periodo','yyyy-mm-dd')-1 ))
    ) 
EOD;


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


                $sql = <<<EOD
            UPDATE RH_DP SET TITULAR = '$num_doc' WHERE ID_DP= $id_dp_ini
EOD;

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

                $sql = <<<EOD
            UPDATE RH_DP SET ENCARGADO= NULL WHERE ID_DP= $id_dp_fin
EOD;

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


                //VERIFICAR SI SE ADICIONA CONCEPTOS ASOCIADOS A LA ASIGNACION BASICA

                $sql = <<<EOD
SELECT * FROM NO_CONCEP_AB WHERE ESTADO = 1
and id_concep_nomina not in (select no_param_concep.id_concep_bonif from no_param_concep) 
EOD;
                $results = CN_TABLE::executeSQL($sql);

                if (count($results) > 0) {

                    //RECORRO CADA UNO DE LOS CONCEPTOS QUE ESTEN ASOCIADOS

                    foreach ($results as $conceptos) {

                        $rango_minimo = $conceptos['rango_minimo'];
                        $rango_maximo = $conceptos['rango_maximo'];
                        $id_concep_ab = $conceptos['id_concep_nomina'];
                        $valor_fijo = $conceptos['valor_fijo'];
                        //SI PARA LA ASIGNACION BASICA LE CORRESPONDEN LOS CONCEPTOS
                        if ($asignacion_basica >= $rango_minimo && $asignacion_basica <= $rango_maximo) {

                            $logger->info("-----ENTRE A GUARDAR CONCEPTOS DE ASIGNACION------------- ");

                            $sql = <<<EOD
            SELECT * FROM NO_CONCEPTO_FUNC WHERE ID_CONCEP_NOMINA = $id_concep_ab AND ID_TIPO_DOC = $id_tipo_doc
                                    AND NUM_DOC = $num_doc AND ACTUAL = 1 AND ESTADO = 1
EOD;

                            $results = CN_TABLE::executeSQL($sql);
                            //VERIFICO QUE NO LOS TENGA, SI NO, ENTONCES SE LOS CREO EN NO_CONCEPTO_FUNC Y EN NO_CONCEPTO_PERIODO
                            if (count($results) == 0) {

                                $sql = <<<EOD
            INSERT INTO NO_CONCEPTO_FUNC (ID_TIPO_DOC,NUM_DOC,ID_CONCEP_NOMINA,VALOR,ESTADO,ACTUAL,FECHA_DESDE)
                VALUES($id_tipo_doc,$num_doc,$id_concep_ab,$valor_fijo,1,1,to_date('$fecha_ingre','YYYY-MM-DD')+1)
EOD;

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

//validar que la fecha no supere el inicio del periodo - 20140930
                                if ($date1 < $date4) {
                                    $fecha_ingre = $fecha_desde_periodo;
                                }

                                $sql = <<<EOD
            INSERT INTO NO_CONCEPTO_PERIODO (ID_ANHOS,ID_MESES,PERIODO,ID_TIPO_DOC,NUM_DOC,ID_CONCEP_NOMINA,FECHA_DESDE,FECHA_HASTA,VALOR,NUM_DIAS)
                VALUES($id_anhos,$id_meses,$id_periodo,$id_tipo_doc,$num_doc,$id_concep_ab,to_date('$fecha_ingre','YYYY-MM-DD')+1,
                    last_day(to_date('$fecha_ingre','YYYY-MM-DD')),$valor_fijo,
                    $num_dias - TO_NUMBER(to_char(to_date('$fecha_ingre','YYYY-MM-DD'),'DD')))
EOD;
                                $this->conn->execute($sql);
                            }
                        } else {
                            //SI PARA LA ASIGNACION BASICA NO LE CORRESPONDEN LOS CONCEPTOS

                            $sql = <<<EOD
            SELECT * FROM NO_CONCEPTO_FUNC WHERE ID_CONCEP_NOMINA = $id_concep_ab AND ID_TIPO_DOC = $id_tipo_doc
                                    AND NUM_DOC = $num_doc AND ACTUAL = 1 AND ESTADO = 1
EOD;

                            $results = CN_TABLE::executeSQL($sql);
                            //VERIFICO SI TIENE CREADOS LOS CONCEPTOS, SI LOS TIENE LOS INHABILITO
                            if (count($results) > 0) {

                                $sql = <<<EOD
            UPDATE NO_CONCEPTO_FUNC SET fecha_hasta = to_date('$fecha_ingre','YYYY-MM-DD') 
                WHERE ID_TIPO_DOC=$id_tipo_doc AND NUM_DOC=$num_doc AND ID_CONCEP_NOMINA=$id_concep_ab
EOD;

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

                                $sql = <<<EOD
            
UPDATE NO_CONCEPTO_PERIODO 
    SET fecha_hasta = to_date('$fecha_ingre','YYYY-MM-DD'),
      num_dias =  
          case when ((to_date('$fecha_ingre','YYYY-MM-DD'))-fecha_desde + 1) > 30 then 30 
               when ((to_date('$fecha_ingre','YYYY-MM-DD'))-fecha_desde + 1) < 0 then 0
          else (to_date('$fecha_ingre','YYYY-MM-DD')-fecha_desde + 1) end                           
        
WHERE id_concepto_periodo IN(

select max(conc.id_concepto_periodo) ID_CONCEPTO_PERIODO

from no_concepto_periodo conc

where conc.id_tipo_doc = $id_tipo_doc and conc.num_doc = $num_doc 
    and conc.id_concep_nomina = $id_concep_ab and conc.periodo = $id_periodo

)

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


            $this->conn->commit();

            $this->conn->beginTransaction();

            //ACTUALIZAR SUELDOS DE COMISIONES - 20130618
            if ($id_novedad == 4 || $id_novedad == 3 || $id_novedad == 2 || $id_novedad == 7) {

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

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

//                    try {
//                        // ACTUALIZA EL SUELDO EN EL SGR - 20130618
//                        $sql = <<<EOD
//            UPDATE ERP_SGR.TERCEROS SET SUELDO= $asignacion_basica WHERE NITOCC = $num_doc
//EOD;
//                        $this->conn->execute($sql);
//                    } catch (Exception $exc) {
////                        echo $exc->getTraceAsString();
//                        $logger->info("If ROLLBACK ...");
//                    }
            } elseif ($id_novedad == 1) {

                $sql = <<<EOD
            UPDATE TERCEROS SET ESTADO= 0 WHERE NITOCC = $num_doc
EOD;

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

//                    try {
//                        // ACTUALIZA EL SUELDO EN EL SGR - 20130618
//
//                        $sql = <<<EOD
//            UPDATE ERP_SGR.TERCEROS SET ESTADO= 0 WHERE NITOCC = $num_doc
//EOD;
//                        $this->conn->execute($sql);
//                    } catch (Exception $exc) {
////                        echo $exc->getTraceAsString();
//                        $logger->info("Else ROLLBACK ...");
//                    }
            }


            $this->conn->commit();
            $logger->info("COMMIT DE TODAS LAS TRANSACCIONES.");

            //Actualiza sueldos del ERP_SGR - 20130618
            $this->actualizarSueldos($id_novedad, $asignacion_basica, $num_doc);
        } catch (Exception $e) {

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

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

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

        $this->conn->beginTransaction();

        try {

            //ACTUALIZAR SUELDOS DE COMISIONES

            if ($id_novedad == 4 || $id_novedad == 3 || $id_novedad == 2 || $id_novedad == 7) {

                $sql = <<<EOD
UPDATE ERP_SGR.TERCEROS SET SUELDO= $asignacion_basica WHERE NITOCC = $num_doc
EOD;
                $this->conn->execute($sql);
            } elseif ($id_novedad == 1) {

                $sql = <<<EOD
UPDATE ERP_SGR.TERCEROS SET ESTADO= 0 WHERE NITOCC = $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());
        }
    }

    /**
     * 
     * Comision otra entidad - 20200923
     * 
     * @param type $list_data_post
     */
    public function terminarOE($list_data_post) {

        /*
         * Se instancia la clase del manejo del log
         */
        $logger = sfContext::getInstance()->getLogger();

        $this->connoe = Doctrine_Manager::getInstance()->getCurrentConnection();
        $this->connoe->beginTransaction();

        try {

            $id_tipo_doc = $list_data_post['id_tipo_doc'];
            $num_doc = $list_data_post['num_doc'];
            $fecha_ingre = $list_data_post['fecha'];
            $fecha_hasta = $list_data_post['fecha'];
            $id_dp = $list_data_post['id_dp_fin'];
            $id_dp_ini = $list_data_post['id_dp_fin'];
            $id_periodo = $list_data_post['id_periodo'];
            $id_novedad = $list_data_post['id_novedad'];
            $id_novedad_ajuste = $list_data_post['id_novedad_ajuste'];

            $sql = <<<EOD
            SELECT * FROM NO_PERIODO WHERE ID_PERIODO = $id_periodo 
EOD;
            $results = CN_TABLE::executeSQL($sql);

            $id_anhos = $results[0]['id_anhos'];
            $id_meses = $results[0]['id_meses'];
            $id_periodo = $results[0]['id_periodo'];
            $id_tipo_periodo = $results[0]['id_tipo_periodo'];
            $fecha_desde_periodo = $results[0]['fecha_ini'];
            $fecha_desde_periodo = explode(' ', $fecha_desde_periodo);
            $fecha_desde_periodo = $fecha_desde_periodo[0];
            $fecha_hasta_periodo = $results[0]['fecha_fin'];
            $fecha_hasta_periodo = explode(' ', $fecha_hasta_periodo);
            $fecha_hasta_periodo = $fecha_hasta_periodo[0];

            $sql = <<<EOD
            SELECT * FROM NO_TIPO_PERIODO WHERE ID_TIPO_PERIODO = $id_tipo_periodo 
EOD;
            $results = CN_TABLE::executeSQL($sql);

            $num_dias = $results[0]['no_dias_mes'];

            //TERMINACION DE OE
            if ($id_novedad == 14) {


                $sql = <<<EOD
insert into no_novedad_personal (id_novedad_personal,id_tipo_doc,num_doc,id_novedad,fecha_inicial,
    fecha_terminacion,doc_soporte,fecha_soporte,id_dp_ini,id_dp_fin,id_periodo,estado,id_novedad_ajuste) 
    values (null,1,'$num_doc',$id_novedad,
        to_date('$fecha_ingre','YYYY-MM-DD'), to_date('$fecha_ingre','YYYY-MM-DD'),
         (select lpad(id_meses,2,'0') ||id_anhos from no_periodo where id_periodo = $id_periodo),
             trunc(sysdate),$id_dp,$id_dp,$id_periodo,1,'$id_novedad_ajuste')
EOD;
                $this->connoe->execute($sql);


                //SELECCIONO EL CONCEPTO DE ASIGNACIÓN BÁSICA

                $sql = <<<EOD
            SELECT ID_CONCEP_BASICA FROM NO_PARAM_CONCEP
EOD;

                $results = CN_TABLE::executeSQL($sql);
                //CONCEPTO DE ASIGNACION BASICA
                $id_concep_basica = $results[0]['id_concep_basica'];

                $sql = <<<EOD
            SELECT ID_DP_INI, ID_DP_FIN FROM NO_NOVEDAD_PERSONAL WHERE ID_NOVEDAD in (8) AND ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc AND ESTADO=1
EOD;

                $results = CN_TABLE::executeSQL($sql);
                //TRAIGO EL CARGO ANTERIOR AL ENCARGO 
                $id_dp_ini = $results[0]['id_dp_ini'];
                //TRAIGO EL CARGO DEL ENCARGO 
                $id_dp_fin = $results[0]['id_dp_fin'];


                // AB del cargo anterior - 20141106
                $sql = <<<EOD
SELECT ASIGNACION_BASICA, ID_CEN_OP, ID_EA FROM NO_DP_V WHERE ID_DP = $id_dp_fin
EOD;
                $results = CN_TABLE::executeSQL($sql);
//ASIGNACION BASICA DEL NUEVO CARGO
                $asignacion_basica_fin = $results[0]['asignacion_basica'];


                $sql = <<<EOD
            SELECT ASIGNACION_BASICA,ID_CEN_OP,ID_EA FROM NO_DP_V WHERE ID_DP = $id_dp_ini
EOD;
                $results = CN_TABLE::executeSQL($sql);

                //ASIGNACION BASICA DEL NUEVO CARGO
                $asignacion_basica = $results[0]['asignacion_basica'];
                /*
                 * Validar que los registros no son null - 20130618
                 */
                $id_cen_op = 'null';
                if (!is_null($results[0]['id_cen_op'])) {
                    $id_cen_op = $results[0]['id_cen_op'];
                }
                $id_ea = 'null';
                if (!is_null($results[0]['id_ea'])) {
                    $id_ea = $results[0]['id_ea'];
                }



                //SETEO CON ESTADO = 0 LA NOVEDAD DE ENCARGO

                $sql = <<<EOD
UPDATE NO_NOVEDAD_PERSONAL SET ESTADO = 0 
    WHERE ID_NOVEDAD in (8) AND ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc 
EOD;

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

                //Validacion para cuando no esta como titular o encargado y termina el oe - 20160525
                $sql = <<<EOD
 UPDATE RH_DP SET 
   TITULAR   =  case when TITULAR is NULL then '$num_doc' else TITULAR end, 
   ENCARGADO =  case when '$num_doc' = ENCARGADO then '$num_doc' 
                when TITULAR is null and ENCARGADO is null then '$num_doc' 
                else ENCARGADO end  
 WHERE ID_DP = $id_dp_ini 
EOD;

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


            $this->connoe->commit();
        } catch (Exception $e) {

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

}
