<?php

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

    protected $table_names = array(
        'NO_NOV_PERSONAL_V',
        'NO_NOVEDADES',
        'NO_DATOS_FUNCIONARIO_V',
        'NO_PERIODO_V'
    ); //tablas para construir el sql, por medio de joins
    protected $table_join_ids = array(
        'NO_NOVEDADES' =>
        array(
            'id_novedad' => 'NO_NOV_PERSONAL_V'
        ),
        'NO_DATOS_FUNCIONARIO_V' =>
        array(
            'id_tipo_doc' => 'NO_NOV_PERSONAL_V',
            'num_doc' => 'NO_NOV_PERSONAL_V'
        ),
        'NO_PERIODO_V' =>
        array(
            'id_periodo' => 'NO_NOV_PERSONAL_V'
        )
    ); //si posee tablas para joins, identificar la relacion de los campos con las tablas
    protected $fields = array(
        'NO_NOV_PERSONAL_V' =>
        array(
            'id_novedad_personal' => 'id_novedad_personal',
            'id_tipo_doc' => 'id_tipo_doc',
            'num_doc' => 'num_doc',
            'id_novedad' => 'id_novedad',
            'fecha_inicial' => 'fecha_inicial',
            'fecha_terminacion' => 'fecha_terminacion',
            'doc_soporte' => 'doc_soporte',
            'fecha_soporte' => 'fecha_soporte',
            'id_dp_ini' => 'id_dp_ini',
            'id_dp_fin' => 'id_dp_fin',
            'cargo1' => 'cargo1',
            'cargo2' => 'cargo2',
            'id_periodo' => 'id_periodo',
            'estado' => 'estado',
            'id_novedad_ajuste' => 'id_novedad_ajuste',
            'observaciones' => 'observaciones'
        ),
        'NO_NOVEDADES' =>
        array(
            'codigo' => 'codigo_novedad',
            'descripcion' => 'descripcion_novedad',
            'codigo,||, - ,||,descripcion' => 'completo_novedad'
        ),
        'NO_DATOS_FUNCIONARIO_V' =>
        array(
            'nombre_completo' => 'nombre_completo'
        ),
        'NO_PERIODO_V' =>
        array(
            'periodo' => 'periodo'
        )
    ); //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_NOV_PERSONAL_V' => array(
            'id_novedad_personal,a' => array('!=' => array(-1)),
            'id_novedad_personal,b' => array('=' => array('id_novedad_personal')),
            'id_novedad' => array('=' => array('id_novedad')),
            'num_doc' => array('=' => array('num_doc')),
            'id_tipo_doc' => array('=' => array('id_tipo_doc')),
            'id_periodo' => array('=' => array('id_periodo_filtro')),
            'estado' => array('=' => array('estado')),
            '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(
        'num_doc', 'fecha_inicial desc', 'id_novedad_personal desc'
    ); //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_novedad_personal'; //identificador de la tabla
    protected $id_names = array('id_novedad_personal'); //llave primaria
    protected $field_names = array('id_tipo_doc', 'num_doc', 'id_novedad', 'fecha_inicial', 'fecha_terminacion', 'doc_soporte', 'fecha_soporte',
        'id_dp_ini', 'id_dp_fin', 'id_periodo', 'num_doc', 'estado', 'id_novedad_ajuste', 'observaciones'); //campos de la tabla, sin la llave primaria
    protected $table_name = 'NO_NOVEDAD_PERSONAL'; //tabla en la cual se aplican los cambios
    protected $has_activo = true; //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_novedad_personal'; //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
         */

        $num_doc = $request['num_doc'];
        $id_novedad = $request['id_novedad'];
        $fecha_inicial = $request['fecha_inicial'];
        $fecha_terminacion = $request['fecha_terminacion'];
        $id_periodo = $request['id_periodo'];
        $id_dp_fin = $request['id_dp_fin'];

        //PRORROGA DE ENCARGO - COMISION
        if ($id_novedad == 5) {

            /**
             * Valida que la fecha sea posterior al periodo activo - 20200219
             */
            $sql = <<<EOD
SELECT
    *
FROM no_novedad_personal
where
num_doc = $num_doc
and id_novedad in (3,7) and estado = 1
and fecha_terminacion < (SELECT
            fecha_fin
        FROM no_periodo
        where
        id_periodo = $id_periodo) 
EOD;

            $results = CN_TABLE::executeSQL($sql);
            if (count($results) > 0) {
                $errors['mensaje'] = "El encargo activo del funcionario($num_doc) no corresponde a un rango correcto, la fecha de terminacion del encargo debe ser posterior al mes de la novedad; favor verificar.";
                $errors['servicio'] = "novedad_personal";
            }

            /**
             * Valida que la fecha sea posterior al periodo activo - 20191122
             */
            $sql = <<<EOD
SELECT
    *
FROM no_periodo
where
id_periodo = $id_periodo
and fecha_fin >= to_date('$fecha_terminacion','YYYY-MM-DD')
EOD;

            $results = CN_TABLE::executeSQL($sql);
            if (count($results) > 0) {
                $errors['mensaje'] = "La fecha nueva de terminación($fecha_terminacion) debe ser posterior al periodo; favor verificar.";
                $errors['servicio'] = "novedad_personal";
            }
        }

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

            $sql = <<<EOD
select 
* 
from no_novedad_personal
where 
num_doc = $num_doc
and id_novedad in (3,7)
and estado = 1
and (
    to_date('$fecha_terminacion','yyyy-mm-dd') between fecha_inicial and fecha_terminacion
) 
EOD;

            $results = CN_TABLE::executeSQL($sql);
            //valida que tenga para el rango de terminacion una novedad DE ENCARGO - COMISION - 20161012
            if (count($results) == 0) {
                $errors['mensaje'] = "La novedad de personal no puede ser en la fecha $fecha_terminacion, ya que no hay registro de encargo/comisión sobre el rango de fecha. Favor Verificar antes de Registrar.";
                $errors['servicio'] = "novedad_personal";
            }
        }

        /*
         * ENCARGO - COMISION
         */
        if ($id_novedad == 3 || $id_novedad == 7) {

            $sql = <<<EOD
select 
* 
from no_novedad_personal
where 
num_doc = $num_doc
and id_novedad in (3,7,4)
and estado = 1
and (
    fecha_inicial between to_date('$fecha_inicial','yyyy-mm-dd') and to_date('$fecha_terminacion','yyyy-mm-dd')
    or 
    fecha_terminacion between to_date('$fecha_inicial','yyyy-mm-dd') and to_date('$fecha_terminacion','yyyy-mm-dd')
) 
EOD;

            $results = CN_TABLE::executeSQL($sql);
            //valida que tenga otra novedad para el mismo rango de fechas - 20151119
            if (count($results) > 0) {
                $errors['mensaje'] = "La novedad de personal no puede estar en el rango de fechas de una terminacion, ascenso u otro encargo. Favor Verificar antes de Registrar.";
                $errors['servicio'] = "novedad_personal";
            }

            /**
             * Valida que la fecha sea posterior al periodo activo - 20200219
             */
            $sql = <<<EOD
SELECT
    *
FROM no_periodo
where
id_periodo = $id_periodo
and fecha_fin >= to_date('$fecha_terminacion','YYYY-MM-DD')
EOD;

            $results = CN_TABLE::executeSQL($sql);
            if (count($results) > 0) {
                $errors['mensaje'] = "La fecha de terminación($fecha_terminacion) del encargo nuevo debe ser posterior al periodo; favor verificar.";
                $errors['servicio'] = "novedad_personal";
            }
        }
        /*
         * ASCENSO
         */
        if ($id_novedad == 2) {

            $sql = <<<EOD
select 
* 
from rh_dp
where 
id_dp = $id_dp_fin
and titular is not null 
EOD;

            $results = CN_TABLE::executeSQL($sql);
            //valida que tenga este libre el titular del cargo - 20210224::LAVILA
            if (count($results) > 0) {
                $errors['mensaje'] = "La novedad de personal ascenso no se puede registrar ya que esta ocupado el cargo. Favor Verificar antes de Registrar.";
                $errors['servicio'] = "novedad_personal";
            }

            $sql = <<<EOD
select 
* 
from no_novedad_personal
where 
num_doc = $num_doc
and id_novedad in (4)
and estado = 1
and (
    fecha_terminacion >= to_date('$fecha_inicial','yyyy-mm-dd') 
) 
EOD;

            $results = CN_TABLE::executeSQL($sql);
            //valida que tenga otra novedad para el mismo rango de fechas - 20151119
            if (count($results) > 0) {
                $errors['mensaje'] = "La novedad de personal no puede estar en el rango de fechas de una terminacion. Favor Verificar antes de Registrar.";
                $errors['servicio'] = "novedad_personal";
            }
        }
        //Retiro, validacion al retirar, para que en el mes no tenga mas retiros activos - 20160505
        if ($id_novedad == 1) {


            $sql = <<<EOD
select 
* 
from no_novedad_personal
where 
num_doc = $num_doc
and id_novedad in (1)
and estado = 1
and id_periodo in (
        select no_periodo.id_periodo from no_periodo 
        where no_periodo.id_anhos = (select perr.id_anhos from no_periodo perr where perr.id_periodo = $id_periodo) 
        and no_periodo.id_meses = (select perr.id_meses from no_periodo perr where perr.id_periodo = $id_periodo)
)  
EOD;

            $results = CN_TABLE::executeSQL($sql);
            //valida que tenga otra novedad para el mismo rango de fechas - 20151119
            if (count($results) > 0) {
                $errors['mensaje'] = "El funcionario posee una novedad activa de retiro para el mismo mes, no se puede registrar una nueva. Favor Verificar antes de Registrar.";
                $errors['servicio'] = "novedad_personal";
            }


            $sql = <<<EOD
select 
* 
from no_nombramiento_v
where 
num_doc = $num_doc
and estado = 0
and fecha_retiro is not null  
EOD;

            $results = CN_TABLE::executeSQL($sql);
            //valida que no este retirado - 20220120;;LAVILA
            if (count($results) > 0) {
                $errors['mensaje'] = "El funcionario ya esta retirado. Favor Verificar antes de Registrar.";
                $errors['servicio'] = "novedad_personal";
            }

            /**
             * Validar que el retiro sea en el mes o posteior al periodo de registro - 20240820::LAVILA
             */
            $sql = <<<EOD
SELECT
    *
FROM no_periodo
where
id_periodo = $id_periodo
and to_date('$fecha_terminacion','YYYY-MM-DD') <= fecha_ini
EOD;

            $results = CN_TABLE::executeSQL($sql);
            //valida que no este retirado - 20220120;;LAVILA
            if (count($results) > 0) {
                $errors['mensaje'] = "La fecha de retiro debe ser en el mes o posterior al periodo de registro. Favor Verificar antes de Registrar.";
                $errors['servicio'] = "novedad_personal";
            }
        }


        /*
         * COMISION OTRA ENTIDAD - 20200922
         */
        if ($id_novedad == 8) {

            $sql = <<<EOD
select 
* 
from no_novedad_personal
where 
num_doc = $num_doc
and id_novedad in (3,7,8,14)
and estado = 1
and (
    fecha_inicial between to_date('$fecha_inicial','yyyy-mm-dd') and to_date('$fecha_terminacion','yyyy-mm-dd')
    or 
    fecha_terminacion between to_date('$fecha_inicial','yyyy-mm-dd') and to_date('$fecha_terminacion','yyyy-mm-dd')
) 
EOD;

            $results = CN_TABLE::executeSQL($sql);
            //valida que tenga otra novedad para el mismo rango de fechas - 20151119
            if (count($results) > 0) {
                $errors['mensaje'] = "La novedad de personal no puede estar en el rango de fechas de una terminacion u otra comisión otra entidad. Favor Verificar antes de Registrar.";
                $errors['servicio'] = "novedad_personal";
            }

            /**
             * Valida que la fecha sea posterior al periodo activo - 20200219
             */
            $sql = <<<EOD
SELECT
    *
FROM no_periodo
where
id_periodo = $id_periodo
and fecha_fin >= to_date('$fecha_terminacion','YYYY-MM-DD')
EOD;

            $results = CN_TABLE::executeSQL($sql);
            if (count($results) > 0) {
                $errors['mensaje'] = "La fecha de terminación($fecha_terminacion) de la comisión otra entidad nueva debe ser posterior al periodo; favor verificar.";
                $errors['servicio'] = "novedad_personal";
            }
        }

        //PRORROGA DE OE - 20200922
        if ($id_novedad == 15) {

            /**
             * Valida que la fecha sea posterior al periodo activo - 20200219
             */
            $sql = <<<EOD
SELECT
    *
FROM no_novedad_personal
where
num_doc = $num_doc
and id_novedad in (8) and estado = 1
and fecha_terminacion < (SELECT
            fecha_fin
        FROM no_periodo
        where
        id_periodo = $id_periodo) 
EOD;

            $results = CN_TABLE::executeSQL($sql);
            if (count($results) > 0) {
                $errors['mensaje'] = "La comisión otra entidad activo del funcionario($num_doc) no corresponde a un rango correcto, la fecha de terminacion del encargo debe ser posterior al mes de la novedad; favor verificar.";
                $errors['servicio'] = "novedad_personal";
            }

            /**
             * Valida que la fecha sea posterior al periodo activo - 20191122
             */
            $sql = <<<EOD
SELECT
    *
FROM no_periodo
where
id_periodo = $id_periodo
and fecha_fin >= to_date('$fecha_terminacion','YYYY-MM-DD')
EOD;

            $results = CN_TABLE::executeSQL($sql);
            if (count($results) > 0) {
                $errors['mensaje'] = "La fecha nueva de terminación($fecha_terminacion) debe ser posterior al periodo; favor verificar.";
                $errors['servicio'] = "novedad_personal";
            }
        }

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

            $sql = <<<EOD
select 
* 
from no_novedad_personal
where 
num_doc = $num_doc
and id_novedad in (8)
and estado = 1
and (
    to_date('$fecha_terminacion','yyyy-mm-dd') between fecha_inicial and fecha_terminacion
) 
EOD;

            $results = CN_TABLE::executeSQL($sql);
            //valida que tenga para el rango de terminacion una novedad DE ENCARGO - COMISION - 20161012
            if (count($results) == 0) {
                $errors['mensaje'] = "La novedad de personal no puede ser en la fecha $fecha_terminacion, ya que no hay registro de comisión otra entidad sobre el rango de fecha. Favor Verificar antes de Registrar.";
                $errors['servicio'] = "novedad_personal";
            }
        }


        //PRORROGA DE TC - 20210129
        if ($id_novedad == 16) {

            /**
             * Valida que la fecha sea posterior al periodo activo - 20191122
             * Incidente #31203, Se quita validacion para permitir modificar la fecha de terminacion - 20220805 - LAVILA
             */
            $sql = <<<EOD
SELECT
    *
FROM no_periodo
where
id_periodo = $id_periodo
and fecha_fin >= to_date('$fecha_terminacion','YYYY-MM-DD')
EOD;

            $results = CN_TABLE::executeSQL($sql);
            if (count($results) > 0) {
                //$errors['mensaje'] = "La fecha nueva de terminación($fecha_terminacion) debe ser posterior al periodo; favor verificar.";
                //$errors['servicio'] = "novedad_personal";
            }

            /**
             * Se valida si hay fecha max_contrato - 20210715::LAIVLA
             */
            $sql = <<<EOD
SELECT
    *
FROM no_periodo
where
id_periodo = $id_periodo
and (select max(fecha_max_contrato) from no_param_gen) < to_date('$fecha_terminacion','YYYY-MM-DD')
EOD;

            $results = CN_TABLE::executeSQL($sql);
            if (count($results) > 0) {
                $errors['mensaje'] = "La fecha nueva de terminación($fecha_terminacion) debe ser anterior a la máxima de contrato; favor verificar.";
                $errors['servicio'] = "novedad_personal";
            }
        }

        /*
         *  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) {

        //valor por defecto
        $errors = null;

        /*
         *  Validar la operación, ya sea por SQL - 20150317
         */
        $num_doc = $request['num_doc'];
        $id_novedad_personal = $request['id_novedad_personal'];

        $sql = <<<EOD
SELECT * FROM no_periodo where ACTIVO = 1 
EOD;

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

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

        /*
         * Validar que sea en el mismo periodo de registro
         */
        $sql = <<<EOD
SELECT * FROM NO_NOVEDAD_PERSONAL WHERE id_novedad_personal = $id_novedad_personal
EOD;

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

        $id_periodo_nov = $results[0]['id_periodo'];

        /*
         *  Generar errores en $errors
         */
        if ($id_periodo != $id_periodo_nov) {
            $errors['mensaje'] = "La novedad de personal no corresponde al periodo en el cual esta ejecutando la nómina actual. Favor Verificar antes de Eliminar.";
            $errors['servicio'] = "novedad_personal";
        }

        /*
         * Validar que este activo la novedad para anular - 20250123::LAVILA
         */
        $sql = <<<EOD
SELECT * FROM NO_NOVEDAD_PERSONAL 
    WHERE id_novedad_personal = $id_novedad_personal and estado = 1 
EOD;

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

        /*
         *  Generar errores en $errors
         */
        if (count($results) == 0) {
            $errors['mensaje'] = "La novedad de personal no esta activa, volver a ingresar y verificar.";
            $errors['servicio'] = "novedad_personal";
        }

        /*
         * Validar la novedad de personal no se puede anular, tiene un registro posterior activo, refrescar y verificar. - 20250123::LAVILA
         */
        $sql = <<<EOD
SELECT * FROM NO_NOVEDAD_PERSONAL 
    WHERE id_novedad_personal > $id_novedad_personal 
    and estado = 1 and num_doc = '$num_doc' 
EOD;

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

        /*
         *  Generar errores en $errors
         */
        if (count($results) > 0) {
            $errors['mensaje'] = "La novedad de personal no se puede anular, tiene un registro posterior activo, refrescar y verificar.";
            $errors['servicio'] = "novedad_personal";
        }

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

        //Validación para el tipo de novedad, no aplica para retiro esta no actualiza salario, solo estado - 20130828
        $asignacion_basica = 0;

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

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

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

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

            try {

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

                $id_novedad_personal = $list_data_post[0]['id_novedad_personal'];
                $usuario = $request['username'];

                //Se consulta periodo mensual - 20170315
                $sql = <<<EOD
select
nvl((
    select noper.id_periodo from no_periodo noper 
    where
    noper.id_anhos = perd.id_anhos
    and noper.id_meses = perd.id_meses
    and noper.id_tipo_periodo = 1
),0) as id_periodo_mensual,
perd.* 
from no_periodo perd
where perd.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_periodo_mensual = $results[0]['id_periodo_mensual'];
                $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'];

                /*
                 * ENCARGO - COMISION
                 */
                if ($id_novedad == 3 || $id_novedad == 7) {

                    $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'];

// AB del cargo anterior - 20141106
                    $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_ant = $results[0]['asignacion_basica'];

                    $sql = <<<EOD
            SELECT ASIGNACION_BASICA, ID_CEN_OP, ID_EA FROM NO_DP_V WHERE ID_DP = $id_dp
EOD;
                    $results = CN_TABLE::executeSQL($sql);
//ASIGNACION BASICA DEL NUEVO CARGO
                    $asignacion_basica = $results[0]['asignacion_basica'];
                    $id_cen_op = $results[0]['id_cen_op'];
                    $id_ea = $results[0]['id_ea'];

//BUSCO EN LA TABLA NO_CONCEPTO_FUNC EL CONCEPTO DE ASIGNACION ACTUAL Y PONGO ESTADO = 0 Y ACTUAL = 0
                    /**
                     * Solo al concepto actual -20140930 
                     */
                    $sql = <<<EOD
UPDATE NO_CONCEPTO_FUNC SET ESTADO = 0, ACTUAL = 0,
       fecha_hasta = to_date('$fecha_ingre','YYYY-MM-DD') - 1
    WHERE ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc AND ID_CONCEP_NOMINA = $id_concep_basica
    and actual = 1                        
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'),to_date('$fecha_hasta','YYYY-MM-DD'))
EOD;

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

                    //BUSCO EN LA TABLA NO_ESTADO_FUNC EL ESTADO ACTUAL Y LE PONGO ACTUAL = 0
                    /**
                     * Se cambia por el registro del periodo 
                     */
                    $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_CONCEPTO_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,$id_anhos,$id_meses,$id_periodo,1,$id_cen_op, $id_ea)
EOD;

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

                    /**
                     * Se actualiza estado_func del periodo mensual - 20170315
                     */
                    if ($id_periodo != $id_periodo_mensual && $id_periodo_mensual != 0) {

                        //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_mensual
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,$id_anhos,$id_meses,$id_periodo_mensual,1,$id_cen_op,$id_ea)
EOD;

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



                    /**
                     * Validar fecha de inicio de la novedad entre las fechas del periodo - 20140930
                     */
                    $date1 = new DateTime($fecha_ingre);
                    $date2 = new DateTime($fecha_hasta);
                    $date3 = new DateTime($fecha_hasta_periodo);
                    $date4 = new DateTime($fecha_desde_periodo);

                    if ($date1 >= $date4 && $date1 <= $date3) {

                        $logger->info("Fecha inicial de la novedad en el periodo a liquidar");

//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
                        /**
                         * Tomar los dias entre las fechas DIAS_RANGO_MES_SIN_TREINTAYUNO - 20140930
                         */
                        $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO SET fecha_hasta = to_date('$fecha_ingre','YYYY-MM-DD')-1, 
   -- num_dias = $num_dias - ( ($num_dias - TO_NUMBER(to_char(to_date('$fecha_ingre','YYYY-MM-DD'),'DD'))) + 1 )
      num_dias = DIAS_RANGO_MES_SIN_TREINTAYUNO(fecha_desde, to_date('$fecha_ingre','YYYY-MM-DD')-1, $id_meses) 
                                
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);

                        /**
                         * Borrar registro si la fecha desde es menor a la fecha hasta, para controlar registros de doble encargo - 20140930
                         */
//                        $sql = <<<EOD
//delete from NO_CONCEPTO_PERIODO 
//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
//
//)
//and no_concepto_periodo.fecha_hasta < no_concepto_periodo.fecha_desde
//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'),
        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')))+1)
EOD;

                        $this->conn->execute($sql);
                    } elseif ($date1 < $date4) {//Es menor a la fecha de inicio del periodo
                        $logger->info("Fecha inicial antes del periodo a liquidar");

//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
                         * Se deja que cuente los dias haste la inicial del periodo actual y se resta luego 1 dia, 
                         * para que en febrero tome los dias 30 o 29 si aplica - 20160315
                         */
                        //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_ant,
        (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 ENCARGADO = '$num_doc' WHERE ID_DP = $id_dp
EOD;

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

                    $sql = <<<EOD
 UPDATE RH_DP SET 
   TITULAR   =  case when '$num_doc' = TITULAR then TITULAR else TITULAR end, 
   ENCARGADO =  case when '$num_doc' = ENCARGADO then NULL else ENCARGADO end 
 WHERE ID_DP = $id_dp_ini  
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
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'))
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'),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')) +1)
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) {
                                    //Incidente #39612, se valida estado si es del mes anterior, inactivar - 20250317::LAVILA
                                    $sql = <<<EOD
UPDATE NO_CONCEPTO_FUNC SET fecha_hasta = to_date('$fecha_ingre','YYYY-MM-DD')-1,
    ESTADO = case when (to_date('$fecha_ingre','YYYY-MM-DD')-1) < to_date('$fecha_desde_periodo','YYYY-MM-DD') then 0 else ESTADO end
WHERE ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc AND ID_CONCEP_NOMINA = $id_concep_ab
EOD;

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

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


                                        $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO 
    SET fecha_hasta = to_date('$fecha_ingre','YYYY-MM-DD')-1,
      num_dias =  0                      
        
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);

                                        /**
                                         * Creo registro de reintegro de conceptos ab - 20151119
                                         */
                                        $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_ab ),
            to_date('$fecha_ingre','YYYY-MM-DD'),last_day(to_date('$fecha_desde_periodo','YYYY-MM-DD')), $valor_fijo,
        (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);
                                    } else {

                                        $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO 
    SET fecha_hasta = to_date('$fecha_ingre','YYYY-MM-DD')-1,
      num_dias =  case when ((to_date('$fecha_ingre','YYYY-MM-DD')-1)-fecha_desde + 1) > 30 
          then 30 else (to_date('$fecha_ingre','YYYY-MM-DD')-1-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);
                                    }
                                }
                            }
                        }
                    }
                }//FIN ENCARGO
                /*
                 * RETIRO
                 */ else if ($id_novedad == 1) {

                    // Agrupacion de concepto para retiro Trello Nomina Card #92 - 20130617
                    $id_agrup_concep = 104;

                    $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'];

                    /*
                     * BUSCO EN LA TABLA NO_CONCEPTO_FUNC EL CONCEPTO DE ASIGNACION ACTUAL 
                     * Y PONGO ESTADO = 0 Y ACTUAL = 0
                     * Se actualiza fecha_hasta solo cuando es nula, se coloca la de retiro 
                     * y que los conceptos de la agrupacion 104 no se cambien el estado o actual a 0 - 20130508
                     * Se quita inactivacion estado de conceptos al retirar, estos sse inactivan al cerrar el periodo, ya que para liq def son necesarios - 20190827
                     */
                    $sql = <<<EOD
update no_concepto_func set 
    /*estado = case when id_concep_nomina in (select det.ID_CONCEP_NOMINA from NO_AGRUP_DETA det where DET.ID_AGRUP_CONCEPTO = $id_agrup_concep) 
        then estado else 0 end, 
    actual = 1,*/ 
    fecha_hasta = case when fecha_hasta is null then to_date('$fecha_ingre','YYYY-MM-DD')-1 else fecha_hasta end
    WHERE ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc
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
                     * Al retirar el funcionario modifico dias de incapacidad y rentigros, no debe modificar estos registros - 20141126
                     * Los conceptos de horas extras no se modifica la fecha o num_dias, ya que se liquida en los lotes - 20150318
                     * Incidente #29824, Se valida que los conceptos se deban actualizar segun fechas, casos conceptos adicionales terminados - 20220518::LAVILA
                     */
                    $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO SET fecha_hasta=to_date('$fecha_ingre','YYYY-MM-DD')-1

WHERE id_concepto_periodo IN(
    select 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.periodo = $id_periodo
        and conc.fecha_hasta >= conc.fecha_desde 
        and conc.id_concep_nomina not in (select distinct id_concep_nomina from no_concep_ka)
        and conc.id_concep_nomina not in (select distinct id_concep_nomina from no_concep_vac)
        and conc.id_concep_nomina not in (select distinct nvl(id_concep_ajuste,0) from no_concep_nomina)
        and conc.id_concep_nomina not in (select distinct nvl(id_concep_rein,0) from no_concep_nomina)
        and conc.id_concep_nomina not in (
            select distinct id_concep_nomina from no_tipo_hr_extra                
        )    
)
EOD;

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

                    /*
                     * Dias de resta de kardex - 20130508
                     * Se coloca estado 1 en el filtro de no_novedad_kardex, para tomar solo las activas - 20130917
                     * Se coloca relacion de fechas para las novedades de kardex - 20180516
                     */
                    $sql = <<<EOD
select 
nvl(sum(dias_rango_mes_sin_treintayuno(novkar.fecha_ini,novkar.fecha_fin,(select id_meses from no_periodo where id_periodo =  $id_periodo ))),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.id_tipo_doc = $id_tipo_doc and novkar.num_doc = $num_doc 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) ,'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) ,'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) ,'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) ,'dd/mm/yyyy') )) 
    
    or  
    to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'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) ,'dd/mm/yyyy') )) between novkar.fecha_ini and novkar.fecha_fin
)
EOD;

                    $results = CN_TABLE::executeSQL($sql);
                    $dias_kardex = $results[0]['dias'];

                    /**
                     * Dias de vacaciones en el periodo - 20150306
                     * Se coloca filtro de rango de periodo para que tome novedades dentro del periodo generado y no de años anteriores - 20151014
                     * Se adiciona para que no tome vacaciones posteriores al retiro - 20160817
                     */
                    $sql = <<<EOD
select nvl(sum(dias),0) as dias from
(
    select 
    case when tipnov.operador = 1 
    then dias_rango_mes_sin_treintayuno(novvac.fecha_ini,novvac.fecha_fin,(select id_meses from no_periodo where id_periodo =  $id_periodo )) * (1)
    else dias_rango_mes_sin_treintayuno(novvac.fecha_ini,novvac.fecha_fin,(select id_meses from no_periodo where id_periodo =  $id_periodo )) * (-1) end as dias 
    from no_novedad_vac novvac
    left join no_tipo_nov_vac tipnov
    on tipnov.id_tipo_nov_vac = novvac.id_tipo_nov_vac
    where 
    to_date('$fecha_ingre','YYYY-MM-DD')-1 >= novvac.fecha_ini and
    tipnov.tiempo_liqui = 1 and novvac.id_tipo_doc = $id_tipo_doc and novvac.num_doc = $num_doc
    and (
          novvac.fecha_ini between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'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) ,'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) ,'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) ,'dd/mm/yyyy') )) 
          
          or        
          
          to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'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) ,'dd/mm/yyyy') )) between novvac.fecha_ini and novvac.fecha_fin
        ) 
) 
EOD;

                    $results = CN_TABLE::executeSQL($sql);
                    $dias_vac = $results[0]['dias'];

                    /*
                     * Se actualiza numero de dias por rango de fechas - 20130407
                     * Se restan dias de kardex que afectan antiguedad - 20130508
                     * Al retirar el funcionario modifico dias de incapacidad y rentigros, no debe modificar estos registros - 20141126
                     * Se divide la actualizacion de dias para conceptos que aplican o no vacaciones, para restar los dias que correspondan al mes - 20150306
                     * Los conceptos de horas extras no se modifica la fecha o num_dias, ya que se liquida en los lotes - 20150318
                     */
                    //conceptos que aplican vacaciones - 20150306
                    $sql = <<<EOD
update no_concepto_periodo set num_dias = case when 

( case when (fecha_hasta-fecha_desde + 1) > 30 
    then 30 else (fecha_hasta-fecha_desde + 1) end - ($dias_kardex) - ($dias_vac) ) < 0 then 0 else
( case when (fecha_hasta-fecha_desde + 1) > 30 
    then 30 else (fecha_hasta-fecha_desde + 1) end - ($dias_kardex) - ($dias_vac) )    end
        
WHERE id_concepto_periodo IN(
    select 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.periodo = $id_periodo
        and conc.id_concep_nomina not in (select distinct id_concep_nomina from no_concep_ka)
        and conc.id_concep_nomina not in (select distinct id_concep_nomina from no_concep_vac)
        and conc.id_concep_nomina not in (select distinct nvl(id_concep_ajuste,0) from no_concep_nomina)
        and conc.id_concep_nomina not in (select distinct nvl(id_concep_rein,0) from no_concep_nomina)
        and conc.id_concep_nomina in (
            select id_concep_nomina from no_concep_nomina where aplica_vacac = 1                
        ) 
        and conc.id_concep_nomina not in (
            select distinct id_concep_nomina from no_tipo_hr_extra                
        )    
)
EOD;

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

                    /*
                     * Conceptos que no aplican vacaciones - 20150306
                     * Se agrega validacion para que no tome los que son id_tipo_concepto = 3(deducidos de no ley) - 20160519
                     */
                    $sql = <<<EOD
update no_concepto_periodo set num_dias = case when 

( case when (fecha_hasta-fecha_desde + 1) > 30 
    then 30 else (fecha_hasta-fecha_desde + 1) end - ($dias_kardex) ) < 0 then 0 else
( case when (fecha_hasta-fecha_desde + 1) > 30 
    then 30 else (fecha_hasta-fecha_desde + 1) end - ($dias_kardex) )    end
        
WHERE id_concepto_periodo IN(
    select 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.periodo = $id_periodo
        and conc.id_concep_nomina not in (select distinct id_concep_nomina from no_concep_ka)
        and conc.id_concep_nomina not in (select distinct id_concep_nomina from no_concep_vac)
        and conc.id_concep_nomina not in (select distinct nvl(id_concep_ajuste,0) from no_concep_nomina)
        and conc.id_concep_nomina not in (select distinct nvl(id_concep_rein,0) from no_concep_nomina)
        and conc.id_concep_nomina not in (
            select id_concep_nomina from no_concep_nomina where aplica_vacac = 1                
        )    
        and conc.id_concep_nomina not in (
            select distinct id_concep_nomina from no_tipo_hr_extra                
        )
        and conc.id_concep_nomina in (
            select id_concep_nomina from no_concep_nomina where no_concep_nomina.id_tipo_concepto != 3                
        )    
)
EOD;

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

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

                    /*
                     * Se trae el periodo de liqdef si ya esta creado - 20130828                    
                     * Se filtra solo periodos activos - 20210702::LAVILA
                     */
                    $sql = <<<EOD
select 
period.id_periodo 
from no_periodo period 
where 
(period.id_anhos || lpad(period.id_meses,2,'0')) = (select id_anhos || lpad(id_meses,2,'0') from no_periodo where id_periodo = $id_periodo) 
and id_tipo_periodo = 5 and estado = 1 
EOD;
                    $results = CN_TABLE::executeSQL($sql);

                    /*
                     * Si el periodo de liquidacion definitiva esta creado, genera el registro en NO_ESTADO_FUNC - 20130828
                     */
                    if (count($results) > 0) {

                        $id_periodo_def = $results[0]['id_periodo'];

                        $sql = <<<EOD
Insert into NO_ESTADO_FUNC (ID_TIPO_DOC,NUM_DOC,ID_DP,ID_ANHOS,ID_MESES,PERIODO,ACTUAL,ID_EA,ID_CEN_OP) 

select 
ID_TIPO_DOC,
NUM_DOC,
ID_DP,
ID_ANHOS,
ID_MESES,
$id_periodo_def as PERIODO,
ACTUAL,
ID_EA,
ID_CEN_OP
from NO_ESTADO_FUNC_V
WHERE ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc 
        and PERIODO = $id_periodo
EOD;
                        $this->conn->execute($sql);
                    }


                    $sql = <<<EOD
 UPDATE RH_DP SET 
   TITULAR   =  case when '$num_doc' = TITULAR then NULL else TITULAR end, 
   ENCARGADO =  case when '$num_doc' = ENCARGADO then NULL else ENCARGADO end 
 WHERE ID_DP = $id_dp 
EOD;
                    $this->conn->execute($sql);

                    //ACTUALIZO NO_NOMBRAMIENTO ESTADO = 0 Y FECHA DE RETIRO                     
                    $sql = <<<EOD
UPDATE NO_NOMBRAMIENTO SET ESTADO=0,FECHA_TERMINA=to_date('$fecha_ingre','YYYY-MM-DD')-1,FECHA_RETIRO=to_date('$fecha_ingre','YYYY-MM-DD') 
    WHERE ID_TIPO_DOC=$id_tipo_doc AND NUM_DOC=$num_doc and ESTADO=1 
EOD;

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

                    //ACTUALIZO no_bonifica_servicios ESTADO = 0 - 20130506
                    $sql = <<<EOD
update no_bonifica_servicios set estado = 0 where id_tipo_doc = $id_tipo_doc and num_doc = $num_doc
EOD;

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

                    //Incidente #4127, si la fecha de retiro es antes de la bonificacion se retira de la liq mensual y se deja para la definitiva - 20160803
                    $sql = <<<EOD
delete 
FROM no_concepto_periodo
where
periodo = $id_periodo
and id_tipo_doc = $id_tipo_doc
and num_doc = $num_doc
and id_concep_nomina in (SELECT no_param_concep.id_concep_bonif FROM no_param_concep where no_param_concep.id_param_concep = 1)
and (select max(fecha_ingresa) from no_bonifica_servicios
where 
num_doc =  '$num_doc'  and  id_tipo_doc = $id_tipo_doc
and id_periodo = $id_periodo) > to_date('$fecha_ingre','YYYY-MM-DD') 
EOD;

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

                    /**
                     * Al retirar cambia novedad procedimineto rete - 20141111
                     */
                    $sql = <<<EOD
SELECT * FROM NO_NOVEDAD_PROCED_RETE
where
id_tipo_doc = $id_tipo_doc
and num_doc = $num_doc
and estado = 1
order by
num_doc, fecha_inicial desc  
EOD;
                    $results = CN_TABLE::executeSQL($sql);

//actualiza registro de la ultima novedad por el estado y fecha
                    if (count($results) > 0) {


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

                        /*
                         * Se cambia $fecha_ingre por $fecha_ingre_orig, para guardar fechas de la novedad en concepto_periodo - 20130918
                         */
                        $sql = <<<EOD
update NO_NOVEDAD_PROCED_RETE set fecha_terminacion = to_date('$fecha_ingre','YYYY-MM-DD')-1, 
  estado =  0
where
id_tipo_doc = $id_tipo_doc
and num_doc = $num_doc  
and id_novedad_proced_rete = $id_novedad_proced_rete 
EOD;
                        $this->conn->execute($sql);
                    }


                    /**
                     * Incidente #33764, se libera cargo si tenia encargo/comision - 20230113
                     */
                    $sql = <<<EOD
select
*
from NO_NOVEDAD_PERSONAL 
where
id_tipo_doc = $id_tipo_doc
and num_doc = $num_doc  
and ID_NOVEDAD in (3,7)
and ESTADO = 1  
EOD;
                    $results = CN_TABLE::executeSQL($sql);

                    if (count($results) > 0) {

                        $id_dp_enc = $results[0]['id_dp_ini'];

                        /**
                         * Incidente #4891,al retirar una persona se inactiva el encargo que tenia, para que no se deba registrar terminacion - 20161028
                         */
                        $sql = <<<EOD
update NO_NOVEDAD_PERSONAL set ESTADO = 0
where
id_tipo_doc = $id_tipo_doc
and num_doc = $num_doc  
and ID_NOVEDAD in (3,7)
and ESTADO = 1  
EOD;
                        $this->conn->execute($sql);

                        //se libera cargo anterior
                        $sql = <<<EOD
 UPDATE RH_DP SET 
   TITULAR   =  case when '$num_doc' = TITULAR then NULL else TITULAR end, 
   ENCARGADO =  case when '$num_doc' = ENCARGADO then NULL else ENCARGADO end 
 WHERE ID_DP = $id_dp_enc 
EOD;
                        $this->conn->execute($sql);
                    }
                }//FIN RETIRO

                /*
                 * ASCENSO - Cambio de Cargo con Terminación y Nombramiento - 20150422
                 * Nuevo tipo Nombramiento Provisional - Reubicación de MIN - 20250605::LAVILA
                 */ else if ($id_novedad == 2 || $id_novedad == 13 || $id_novedad == 17) {


                    $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'];

// AB del cargo anterior - 20141106
                    $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_ant = $results[0]['asignacion_basica'];

                    $sql = <<<EOD
            SELECT ASIGNACION_BASICA, ID_CEN_OP, ID_EA FROM NO_DP_V WHERE ID_DP = $id_dp
EOD;
                    $results = CN_TABLE::executeSQL($sql);
//ASIGNACION BASICA DEL NUEVO CARGO
                    $asignacion_basica = $results[0]['asignacion_basica'];
                    $id_cen_op = $results[0]['id_cen_op'];
                    $id_ea = $results[0]['id_ea'];

//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, 
 fecha_hasta = to_date('$fecha_ingre','YYYY-MM-DD')-1  
     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'),null)
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,$id_anhos,$id_meses,$id_periodo,1,$id_cen_op,$id_ea)
EOD;

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

                    /**
                     * Se actualiza estado_func del periodo mensual - 20170315
                     */
                    if ($id_periodo != $id_periodo_mensual && $id_periodo_mensual != 0) {

                        //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_mensual
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,$id_anhos,$id_meses,$id_periodo_mensual,1,$id_cen_op,$id_ea)
EOD;

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



                    /**
                     * Validar fecha de inicio de la novedad - 20140930
                     */
                    $date1 = new DateTime($fecha_ingre);
                    $date2 = new DateTime($fecha_hasta);
                    $date3 = new DateTime($fecha_hasta_periodo);
                    $date4 = new DateTime($fecha_desde_periodo);

                    if ($date1 >= $date4 && $date1 <= $date3) {
//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
            
UPDATE NO_CONCEPTO_PERIODO 
    SET fecha_hasta = to_date('$fecha_ingre','YYYY-MM-DD')-1,
      num_dias =  case when ((to_date('$fecha_ingre','YYYY-MM-DD')-1)-fecha_desde + 1) > 30 
          then 30 else (to_date('$fecha_ingre','YYYY-MM-DD')-1-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
                        /**
                         * Se cambia el calculo de dias para tomar en base a 30 dias mes - 20141007
                         */
                        $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'),
            last_day(to_date('$fecha_ingre','YYYY-MM-DD')),
                $asignacion_basica,
            --case when (last_day(to_date('$fecha_ingre','YYYY-MM-DD'))-to_date('$fecha_ingre','YYYY-MM-DD')+1) > 30 
            --then 30 else (last_day(to_date('$fecha_ingre','YYYY-MM-DD'))-to_date('$fecha_ingre','YYYY-MM-DD')+1) end   
            case when $num_dias - TO_NUMBER(to_char(to_date('$fecha_ingre','YYYY-MM-DD'),'DD')) +1 > 30 
            then 30 else $num_dias - TO_NUMBER(to_char(to_date('$fecha_ingre','YYYY-MM-DD'),'DD')) +1 end                  
) 
EOD;

                        $this->conn->execute($sql);
                    } elseif ($date1 < $date4) {

                        $logger->info("Fecha inicial antes del periodo a liquidar");

//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
                         * Se deja que cuente los dias haste la inicial del periodo actual y se resta luego 1 dia, 
                         * para que en febrero tome los dias 30 o 29 si aplica - 20160315
                         */
//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_ant,
        (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
EOD;

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

                    $sql = <<<EOD
 UPDATE RH_DP SET 
   TITULAR   =  case when '$num_doc' = TITULAR then NULL else TITULAR end, 
   ENCARGADO =  case when '$num_doc' = ENCARGADO then NULL else ENCARGADO end 
 WHERE ID_DP = $id_dp_ini  
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
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'))
EOD;

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

                                    $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'),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')) +1 )
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')-1 WHERE ID_TIPO_DOC=$id_tipo_doc AND NUM_DOC=$num_doc AND ID_CONCEP_NOMINA=$id_concep_ab
EOD;

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

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


                                        $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO 
    SET fecha_hasta = to_date('$fecha_ingre','YYYY-MM-DD')-1,
      num_dias =  0                      
        
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);
                                    } else {
                                        $sql = <<<EOD
            
UPDATE NO_CONCEPTO_PERIODO 
    SET fecha_hasta = to_date('$fecha_ingre','YYYY-MM-DD')-1,
      num_dias =  case when ((to_date('$fecha_ingre','YYYY-MM-DD')-1)-fecha_desde + 1) > 30 
          then 30 else (to_date('$fecha_ingre','YYYY-MM-DD')-1-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);
                                    }
                                }
                            }
                        }
                    }


                    /**
                     * Incidente #39921, registro de convocatoria - 20250515::LAVILA
                     */
                    $sql = <<<EOD
update no_cargo_convocatoria set estado = 0, fecha_anu = trunc(sysdate), usuario_anu = '$usuario', id_novedad_personal = $id_novedad_personal 
    where id_cargo_convocatoria in (select id_cargo_convocatoria from rh_dp where id_dp = $id_dp) and estado = 1 
EOD;
                    $this->conn->execute($sql);

                    $sql = <<<EOD
update rh_dp set id_cargo_convocatoria = '' where id_dp = $id_dp
EOD;
                    $this->conn->execute($sql);
                }//FIN ASCENSO

                /*
                 * INCORPORACION
                 */ else if ($id_novedad == 6) {


                    $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 ASIGNACION_BASICA, ID_CEN_OP, ID_EA FROM NO_DP_V WHERE ID_DP = $id_dp
EOD;
                    $results = CN_TABLE::executeSQL($sql);
//ASIGNACION BASICA DEL NUEVO CARGO
                    $asignacion_basica = $results[0]['asignacion_basica'];
                    $id_cen_op = $results[0]['id_cen_op'];
                    $id_ea = $results[0]['id_ea'];

//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, 
 fecha_hasta = to_date('$fecha_ingre','YYYY-MM-DD')-1             
   WHERE ID_TIPO_DOC=$id_tipo_doc AND NUM_DOC=$num_doc AND ID_CONCEP_NOMINA=$id_concep_basica and estado = 1 and actual = 1 
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'), null)
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,$id_anhos,$id_meses,$id_periodo,1,$id_cen_op,$id_ea)
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
            
UPDATE NO_CONCEPTO_PERIODO 
    SET fecha_hasta = to_date('$fecha_ingre','YYYY-MM-DD')-1,
      num_dias =  case when ((to_date('$fecha_ingre','YYYY-MM-DD')-1)-fecha_desde + 1) > 30 
          then 30 else (to_date('$fecha_ingre','YYYY-MM-DD')-1-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
                    /*
                     * Antes:
                     * case when (last_day(to_date('$fecha_ingre','YYYY-MM-DD'))-to_date('$fecha_ingre','YYYY-MM-DD')+1) > 30 
                      then 30 else (last_day(to_date('$fecha_ingre','YYYY-MM-DD'))-to_date('$fecha_ingre','YYYY-MM-DD')) end
                     * dias de 30 completos - 20200212
                     */
                    $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'),
            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')) +1
                  )
EOD;

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

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

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

                    $sql = <<<EOD
 UPDATE RH_DP SET 
   TITULAR   =  case when '$num_doc' = TITULAR then NULL else TITULAR end, 
   ENCARGADO =  case when '$num_doc' = ENCARGADO then NULL else ENCARGADO end 
 WHERE ID_DP = $id_dp_ini 
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
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'))
EOD;

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

                                    $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'),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')) +1)
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')-1 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')-1,
      num_dias =  case when ((to_date('$fecha_ingre','YYYY-MM-DD')-1)-fecha_desde + 1) > 30 
          then 30 else (to_date('$fecha_ingre','YYYY-MM-DD')-1-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);
                                }
                            }
                        }
                    }
                }//FIN INCORPORACION

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


//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
        and ACTUAL = 1
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,
                    (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);
                    } 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
                             * Incidente #39773, se ajusta dia inicial de la novedad - 20250429::LAVILA
                             */
//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')+1,
        to_date('$fecha_desde_periodo','YYYY-MM-DD')-1,$asignacion_basica,
        (FECHA_RANGO_SIN_TREINTAYUNO(to_date('$fecha_ingre','yyyy-mm-dd')+1,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')+1,
        to_date('$fecha_desde_periodo','YYYY-MM-DD')-1,$asignacion_basica_fin,
        (FECHA_RANGO_SIN_TREINTAYUNO(to_date('$fecha_ingre','yyyy-mm-dd')+1,to_date('$fecha_desde_periodo','yyyy-mm-dd')-1 ))
    ) 
EOD;

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

                    //Validacion para cuando no esta como titular o encargado y termina el encargo - 20160525
                    $sql = <<<EOD
 UPDATE RH_DP SET 
   TITULAR   =  case when '$num_doc' = TITULAR 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);

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

//si la fecha de terminación es menor que la fecha inicial del periodo debe colocar en número de días (0) - 20130813
                                    $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);
                                }
                            }
                        }
                    }
                }//FIN TERMINACION DE ENCARGO

                /*
                 * ID-5 09-PRORROGA ENCARGO - 20130906
                 */ else if ($id_novedad == 5) {

                    $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'];

//En la novedad "Prorroga de encargo"  modificar la fecha final del encargo original
                    $sql = <<<EOD
UPDATE NO_NOVEDAD_PERSONAL SET FECHA_TERMINACION = to_date('$fecha_hasta','YYYY-MM-DD') 
    WHERE ID_NOVEDAD in (3,7) AND ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc AND ID_NOVEDAD_PERSONAL = $id_novedad_ajuste
EOD;

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

                    /*
                     * BUSCO EN LA TABLA NO_CONCEPTO_FUNC EL CONCEPTO DE ASIGNACION ACTUAL ACTUALIZA LA FECHA_HASTA
                     */
                    $sql = <<<EOD
UPDATE NO_CONCEPTO_FUNC SET FECHA_HASTA = to_date('$fecha_hasta','YYYY-MM-DD') 
    WHERE ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc 
        AND ID_CONCEP_NOMINA = $id_concep_basica
        and ACTUAL = 1
EOD;

                    $this->conn->execute($sql);
                }//FIN PRORROGA ENCARGO

                /**
                 * ID-8 12-Comisión de Servicio Otra Entidad - 20150316
                 * En la liq del nuevo periodo desactiva valores y días de no_concepto_periodo - 20150317
                 */ elseif ($id_novedad == 8) {

                    /**
                     * Controlar fecha de la novedad
                     */
                    /**
                     * Validar fecha de inicio de la novedad - 20140930
                     */
                    $date1 = new DateTime($fecha_ingre);
                    $date2 = new DateTime($fecha_hasta);
                    $date3 = new DateTime($fecha_desde_periodo);
                    $date4 = new DateTime($fecha_hasta_periodo);

                    //si la fecha es anterior a la del inicio del periodo
                    if ($date1 <= $date3) {

                        /*
                         * Actualiza concepto periodo
                         */
                        // actualiza días de no_concepto_periodo
                        $sql = <<<EOD
update no_concepto_periodo set num_dias = 0
where 
periodo = $id_periodo 
and id_tipo_doc = $id_tipo_doc
and num_doc = $num_doc  
EOD;
                        $this->conn->execute($sql);
                    } elseif ($date3 <= $date1 && $date1 <= $date4) {//fecha dentro del periodo

                        /*
                         * Actualiza concepto periodo
                         */
                        // actualiza días de no_concepto_periodo
                        $sql = <<<EOD
update no_concepto_periodo set fecha_hasta = to_date ('$fecha_ingre','yyyy-mm-dd')-1,
  num_dias = FECHA_RANGO_SIN_TREINTAYUNO (fecha_desde, to_date ('$fecha_ingre','yyyy-mm-dd')-1)
where 
periodo = $id_periodo 
and id_tipo_doc = $id_tipo_doc
and num_doc = $num_doc  
EOD;
                        $this->conn->execute($sql);
                    }

                    /*
                     * Coloca el cargo en null, para ser usado por otro - 20170517
                     * Incidente #39601, se retira la modificacion con el campo de titular - 20250317::LAVILA
                      TITULAR   =  case when '$num_doc' = TITULAR then NULL else TITULAR end,
                     */
                    $sql = <<<EOD
UPDATE RH_DP SET 
    ENCARGADO =  case when '$num_doc' = ENCARGADO then NULL else ENCARGADO end 
WHERE ID_DP = $id_dp_ini  
EOD;

                    $this->conn->execute($sql);
                }//FIN Comisión de Servicio Otra Entidad


                /*
                 * TERMINACION Comisión de Servicio Otra Entidad - 20200922
                 */ else if ($id_novedad == 14) {

                    //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 OE
                    $sql = <<<EOD
UPDATE NO_NOVEDAD_PERSONAL SET ESTADO = 0, FECHA_TERMINACION = to_date('$fecha_hasta','YYYY-MM-DD')  
    WHERE ID_NOVEDAD in (8) AND ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc and estado = 1 AND ID_NOVEDAD_PERSONAL = $id_novedad_ajuste 
EOD;

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

                    //Actualiza kardex si tiene registro que afecta antiguedad y es de suspencion
                    $sql = <<<EOD
UPDATE NO_NOVEDAD_KARDEX SET FECHA_FIN = to_date('$fecha_hasta','YYYY-MM-DD'), 
NUM_DIAS = to_date('$fecha_hasta','YYYY-MM-DD') - FECHA_INI   
    WHERE FECHA_INI = (select FECHA_INICIAL from NO_NOVEDAD_PERSONAL 
        where ID_NOVEDAD in (8) AND ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc AND ID_NOVEDAD_PERSONAL = $id_novedad_ajuste)
    and ID_TIP_NOV_KA in (select ID_TIP_NOV_KA from no_tip_nov_ka where AFECTA_ANTIGU = 1 and SUSPENSION = 1)
    AND ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc AND estado = 1
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,
        (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);
                    } 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_desde = to_date('$fecha_ingre','YYYY-MM-DD')+1, 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);

                            //Incidente #32405, Actualiza conceptos de aportes y rete, para fecha desde - 20221028::LAVILA
                            $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO SET fecha_desde = to_date('$fecha_ingre','YYYY-MM-DD')+1
    
WHERE id_concepto_periodo IN(

    select 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 in (select DISTINCT id_concep_nomina from no_fondo_concepto) or conc.id_concep_nomina in (SELECT id_concep_rete FROM no_param_concep) )
    and nvl(porcentaje,0) > 0 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
                             * Incidente #32405, calculo de dias de aportes y rete - 20221028::LAVILA
                             */
                            $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

)
or id_concepto_periodo in (

    select 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 in (select DISTINCT id_concep_nomina from no_fondo_concepto) or conc.id_concep_nomina in (SELECT id_concep_rete FROM no_param_concep) )
    and nvl(porcentaje,0) > 0 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");
                        }
                    }

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

                    //VERIFICAR SI SE ADICIONA CONCEPTOS ASOCIADOS A LA ASIGNACION BASICA
                    $sql = <<<EOD
            SELECT * FROM NO_CONCEP_AB WHERE ESTADO = 1
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);

//si la fecha de terminación es menor que la fecha inicial del periodo debe colocar en número de días (0) - 20130813
                                    $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);
                                }
                            }
                        }
                    }
                }//FIN TERMINACION Comisión de Servicio Otra Entidad

                /*
                 * ID-15 PRORROGA Comisión de Servicio Otra Entidad - 20200922
                 */ else if ($id_novedad == 15) {

                    //En la novedad "Prorroga de OE"  modificar la fecha final del encargo original
                    $sql = <<<EOD
UPDATE NO_NOVEDAD_PERSONAL SET FECHA_TERMINACION = to_date('$fecha_hasta','YYYY-MM-DD') 
    WHERE ID_NOVEDAD in (8) AND ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc AND ID_NOVEDAD_PERSONAL = $id_novedad_ajuste
EOD;

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

                    //Actualiza kardex si tiene registro que afecta antiguedad y es de suspencion
                    $sql = <<<EOD
UPDATE NO_NOVEDAD_KARDEX SET FECHA_FIN = to_date('$fecha_hasta','YYYY-MM-DD'), 
NUM_DIAS = to_date('$fecha_hasta','YYYY-MM-DD') - FECHA_INI   
    WHERE FECHA_INI = (select FECHA_INICIAL from NO_NOVEDAD_PERSONAL 
        where ID_NOVEDAD in (8) AND ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc AND ID_NOVEDAD_PERSONAL = $id_novedad_ajuste)
    and ID_TIP_NOV_KA in (select ID_TIP_NOV_KA from no_tip_nov_ka where AFECTA_ANTIGU = 1 and SUSPENSION = 1)
    AND ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc AND estado = 1
EOD;

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

                    //Incidente #40550,en las prorrogas tambien se suman dias - 20250815::LAVILA
                    $sql = <<<EOD
select tab0.*
from no_causa_vacac tab0
where tab0.num_doc = $num_doc and tab0.fecha_ini<=to_date('$fecha_ingre','YYYY-MM-DD') 
and tab0.fecha_fin>=to_date('$fecha_ingre','YYYY-MM-DD')
EOD;
                    $records = CN_TABLE::executeSQL($sql);
                    //Validar registros
                    if (count($records) > 0) {
                        $id_causa_vacac = $records[0]['id_causa_vacac'];
                        $sql = <<<EOD
UPDATE NO_CAUSA_VACAC set fecha_fin = fecha_fin + (to_date ('$fecha_hasta','yyyy-mm-dd') - to_date ('$fecha_ingre','yyyy-mm-dd') + 1)
    where id_causa_vacac = $id_causa_vacac
EOD;
                        $this->conn->execute($sql);
                    }
                    //corre los dias del activo
                    $sql = <<<EOD
UPDATE NO_BONIFICA_SERVICIOS set fecha_bonifica = fecha_bonifica + (to_date ('$fecha_hasta','yyyy-mm-dd') - to_date ('$fecha_ingre','yyyy-mm-dd') + 1)
    where num_doc = $num_doc and estado = 1 
EOD;
                    $this->conn->execute($sql);
                }//FIN PRORROGA Comisión de Servicio Otra Entidad


                /**
                 * PRORROGA DE TC - 20210129
                 */ else if ($id_novedad == 16) {

                    //En la novedad "Prorroga de OE"  modificar la fecha final del encargo original
                    $sql = <<<EOD
UPDATE no_nombramiento SET FECHA_TERMINA = to_date('$fecha_hasta','YYYY-MM-DD') 
    WHERE estado = 1 AND ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc 
EOD;

                    $this->conn->execute($sql);
                }//FIN PRORROGA Terminacion Contrato


                /**
                 * NOM-99 :: COL - Se revisa la funcionalidad de novedad de personal, ya que no esta teniendo en cuenta los días de vacaciones - 20150415
                 * Nuevo tipo Nombramiento Provisional - Reubicación de MIN - 20250605::LAVILA
                 */
                if ($id_novedad == 3 || $id_novedad == 7 || $id_novedad == 2 || $id_novedad == 6 || $id_novedad == 4 || $id_novedad == 13 || $id_novedad == 17) {
                    $sql = <<<EOD
select 
tab0.id_concepto_periodo,
nvl(sum(dias),0) as dias 
from
(
    select 
    case when tab0.operador = 1 
        then dias_rango_mes_sin_treintayuno(tab0.fecha_ini,tab0.fecha_fin,(select id_meses from no_periodo where id_periodo =  $id_periodo )) * (1)
        else dias_rango_mes_sin_treintayuno(tab0.fecha_ini,tab0.fecha_fin,(select id_meses from no_periodo where id_periodo =  $id_periodo )) * (-1) end as dias ,
        
    tab0.*
    
    from( 
        
        select 
        
        novvac.id_novedad_vac,
        tipnov.operador,
        case when conper.fecha_desde <= novvac.fecha_ini then novvac.fecha_ini else conper.fecha_desde end as fecha_ini,
        case when conper.fecha_hasta <= novvac.fecha_fin then conper.fecha_hasta else novvac.fecha_fin end as fecha_fin,
        
        conper.* 
        
        from no_concepto_periodo conper
        left join no_concep_nomina  connom on conper.id_concep_nomina = connom.id_concep_nomina
        left join no_novedad_vac novvac on novvac.id_tipo_doc = conper.id_tipo_doc and novvac.num_doc = conper.num_doc
            left join no_tipo_nov_vac tipnov on tipnov.id_tipo_nov_vac = novvac.id_tipo_nov_vac
        
        where
        conper.num_doc = $num_doc
        and conper.periodo = $id_periodo
        and connom.id_concep_nomina = (select no_param_concep.id_concep_basica from no_param_concep where no_param_concep.id_param_concep = 1)
        and conper.fecha_desde <= conper.fecha_hasta
        
        and (
          novvac.fecha_ini between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'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) ,'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) ,'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) ,'dd/mm/yyyy') ))
          or
          to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'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) ,'dd/mm/yyyy') )) between novvac.fecha_ini and novvac.fecha_fin
        )
    
    )tab0
    
    where
    tab0.fecha_ini <= tab0.fecha_fin
    
)tab0

group by
tab0.id_concepto_periodo 
EOD;
                    $results = CN_TABLE::executeSQL($sql);

                    foreach ($results as $results_val) {
                        $id_concepto_periodo = $results_val['id_concepto_periodo'];
                        $dias = $results_val['dias'];

                        $sql = <<<EOD
update no_concepto_periodo  set num_dias = case when (num_dias - $dias) > 30 then 30 when (num_dias - $dias) >= 0 then (num_dias - $dias) else 0 end 
where id_concepto_periodo = $id_concepto_periodo 
EOD;

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

                    /**
                     * Incidente #39773, se ajusta dias para novedades de vac, si es de un periodo anterior concep ajuste y reintegro AB - 20250429::LAVILA
                     */
                    $sql = <<<EOD
select 
max(id_periodo) as id_periodo_ant
from no_periodo
where id_periodo < $id_periodo
and id_tipo_periodo = 1
EOD;

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

                    if (count($results) > 0) {
                        $id_periodo_ant = $results[0]['id_periodo_ant'];

                        $sql = <<<EOD
select 
tab0.id_concepto_periodo,
nvl(sum(dias),0) as dias 
from
(
    select 
    case when tab0.operador = 1 
        then dias_rango_mes_sin_treintayuno(tab0.fecha_ini,tab0.fecha_fin,(select id_meses from no_periodo where id_periodo =  $id_periodo_ant )) * (1)
        else dias_rango_mes_sin_treintayuno(tab0.fecha_ini,tab0.fecha_fin,(select id_meses from no_periodo where id_periodo =  $id_periodo_ant )) * (-1) end as dias ,
        
    tab0.*
    
    from( 
        
        select 
        
        novvac.id_novedad_vac,
        tipnov.operador,
        case when conper.fecha_desde <= novvac.fecha_ini then novvac.fecha_ini else conper.fecha_desde end as fecha_ini,
        case when conper.fecha_hasta <= novvac.fecha_fin then conper.fecha_hasta else novvac.fecha_fin end as fecha_fin,
        
        conper.* 
        
        from no_concepto_periodo conper
        left join no_concep_nomina  connom on conper.id_concep_nomina = connom.id_concep_nomina
        left join no_novedad_vac novvac on novvac.id_tipo_doc = conper.id_tipo_doc and novvac.num_doc = conper.num_doc
        left join no_tipo_nov_vac tipnov on tipnov.id_tipo_nov_vac = novvac.id_tipo_nov_vac
        
        where
        conper.num_doc = $num_doc
        and conper.periodo = $id_periodo
        and connom.id_concep_nomina in ( (select no_concep_nomina.id_concep_ajuste from no_concep_nomina where no_concep_nomina.id_concep_nomina = 1) , (select no_concep_nomina.id_concep_rein from no_concep_nomina where no_concep_nomina.id_concep_nomina = 1) )
        and conper.fecha_desde <= conper.fecha_hasta
        
        and (
          novvac.fecha_ini between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo_ant) ,'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_ant) ,'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_ant) ,'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_ant) ,'dd/mm/yyyy') ))
          or
          to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo_ant) ,'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_ant) ,'dd/mm/yyyy') )) between novvac.fecha_ini and novvac.fecha_fin
        )
    
    )tab0
    
    where
    tab0.fecha_ini <= tab0.fecha_fin
    
)tab0

group by
tab0.id_concepto_periodo 
EOD;

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

                        foreach ($results as $results_val) {
                            $id_concepto_periodo = $results_val['id_concepto_periodo'];
                            $dias = $results_val['dias'];

                            $sql = <<<EOD
update no_concepto_periodo  set num_dias = case when (num_dias - $dias) > 30 then 30 when (num_dias - $dias) >= 0 then (num_dias - $dias) else 0 end 
where id_concepto_periodo = $id_concepto_periodo 
EOD;

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


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

                $this->conn->beginTransaction();

                /*
                 * ACTUALIZAR SUELDOS DE COMISIONES - 20130618
                 * Nuevo tipo Nombramiento Provisional - Reubicación de MIN - 20250605::LAVILA
                 */
                if ($id_novedad == 4 || $id_novedad == 3 || $id_novedad == 2 || $id_novedad == 6 || $id_novedad == 7 || $id_novedad == 13 || $id_novedad == 17) {

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

                    $this->conn->execute($sql);
                } elseif ($id_novedad == 1) {

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

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


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

                //Actualiza sueldos del ERP_SGR - 20130618
                $this->actualizarSueldos($id_novedad, $asignacion_basica, $num_doc, $entidadCliente);
                $logger->info("[UPDATE] TERCEROS OTROS - SGR y CONTROL COMISIONES.");

                //Actualizar conceptos que apliquen asigbasica, para actualizar el valor - 20150422
                $this->actualizarAplicaAsigBasica($id_tipo_doc, $num_doc, $id_periodo, $id_novedad);
            } catch (Exception $e) {

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

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

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

            try {


                $id_tipo_doc = $list_data_post[0]['id_tipo_doc'];
                $num_doc = $list_data_post[0]['num_doc'];
                $fecha_ingre = $list_data_post[0]['fecha_inicial'];
                $fecha_ingre = explode(' ', $fecha_ingre);
                $fecha_ingre = $fecha_ingre[0];
                $fecha_hasta = $list_data_post[0]['fecha_terminacion'];
                $fecha_hasta = explode(' ', $fecha_hasta);
                $fecha_hasta = $fecha_hasta[0];
                $id_dp = $list_data_post[0]['id_dp_fin'];
                $id_dp_ini = $list_data_post[0]['id_dp_ini'];
                $id_periodo = $list_data_post[0]['id_periodo'];
                $id_novedad = $list_data_post[0]['id_novedad'];

                $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'];

                /*
                 * ENCARGO - COMISION
                 */
                if ($id_novedad == 3 || $id_novedad == 7) {

                    $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 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'];
                    $id_cen_op = $results[0]['id_cen_op'];
                    $id_ea = $results[0]['id_ea'];

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

//BUSCO EN LA TABLA NO_CONCEPTO_FUNC EL CONCEPTO DE ASIGNACION ACTUAL DELETE el registro - 20140930

                    $sql = <<<EOD
DELETE FROM NO_CONCEPTO_FUNC WHERE ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc AND ID_CONCEP_NOMINA = $id_concep_basica
    and actual = 1
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'),null)
EOD;

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

//BUSCO EN LA TABLA NO_ESTADO_FUNC EL ESTADO ACTUAL Y LE PONGO ACTUAL = 0
                    /*
                     * Se cambia por el periodo de registro
                     */

                    $sql = <<<EOD
            DELETE FROM NO_ESTADO_FUNC 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);

                    /**
                     * Validar fecha de inicio de la novedad - 20140930
                     */
                    $date1 = new DateTime($fecha_ingre);
                    $date2 = new DateTime($fecha_hasta);
                    $date3 = new DateTime($fecha_hasta_periodo);
                    $date4 = new DateTime($fecha_desde_periodo);

                    if ($date1 >= $date4 && $date1 <= $date3) {

                        $logger->info("Fecha inicial de la novedad en el periodo a liquidar");

//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
DELETE FROM NO_CONCEPTO_PERIODO WHERE ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc AND ID_CONCEP_NOMINA = $id_concep_basica
    AND PERIODO = $id_periodo AND VALOR = $asignacion_basica_fin                        
EOD;

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

//CREO EL NUEVO REGISTRO DE NO_CONCEPTO_PERIODO

                        $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO SET                            
    --NUM_DIAS = $num_dias, 
    NUM_DIAS = $num_dias - TO_NUMBER(to_char(fecha_desde,'DD')) + 1, 
    --fecha_desde = to_date('$fecha_desde_periodo','YYYY-MM-DD'), 
    fecha_hasta = to_date('$fecha_hasta_periodo','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);
                    } elseif ($date1 < $date4) {

                        $logger->info("Fecha inicial antes del periodo a liquidar");

//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
DELETE FROM NO_CONCEPTO_PERIODO 
WHERE ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc 
    AND ID_CONCEP_NOMINA = (select nvl(ID_CONCEP_AJUSTE ,ID_CONCEP_NOMINA ) as ID_CONCEP_AJUSTE from no_concep_nomina where ID_CONCEP_NOMINA = $id_concep_basica )
    AND PERIODO = $id_periodo AND FECHA_DESDE = to_date('$fecha_ingre','YYYY-MM-DD')                               
EOD;

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

//Reintegro AB
                        $sql = <<<EOD
DELETE FROM NO_CONCEPTO_PERIODO 
WHERE ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc 
    AND ID_CONCEP_NOMINA = (select nvl(ID_CONCEP_REIN ,ID_CONCEP_NOMINA ) as ID_CONCEP_REIN from no_concep_nomina where ID_CONCEP_NOMINA = $id_concep_basica )
    AND PERIODO = $id_periodo AND FECHA_DESDE = to_date('$fecha_ingre','YYYY-MM-DD')         
EOD;

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




                    $sql = <<<EOD
UPDATE RH_DP SET ENCARGADO = null WHERE ID_DP = $id_dp
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
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'))
EOD;

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

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

                                        /**
                                         * Creo registro de reintegro de conceptos ab - 20151119
                                         */
                                        $sql = <<<EOD
DELETE FROM NO_CONCEPTO_PERIODO 
WHERE ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc 
    AND ID_CONCEP_NOMINA = (select nvl(ID_CONCEP_REIN ,ID_CONCEP_NOMINA ) as ID_CONCEP_REIN from no_concep_nomina where ID_CONCEP_NOMINA = $id_concep_ab )
    AND PERIODO = $id_periodo AND FECHA_DESDE = to_date('$fecha_ingre','YYYY-MM-DD')         
EOD;

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

                                        $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'),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')) +1)
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) {

                                    //Incidente #39612, se valida estado si es del mes anterior, inactivar - 20250317::LAVILA
                                    $sql = <<<EOD
UPDATE NO_CONCEPTO_FUNC SET fecha_hasta = to_date('$fecha_ingre','YYYY-MM-DD')-1,
    ESTADO = case when (to_date('$fecha_ingre','YYYY-MM-DD')-1) < to_date('$fecha_desde_periodo','YYYY-MM-DD') then 0 else ESTADO end
WHERE ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc AND ID_CONCEP_NOMINA = $id_concep_ab
EOD;

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

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


                                        $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO 
    SET fecha_hasta = to_date('$fecha_ingre','YYYY-MM-DD')-1,
      num_dias =  0                      
        
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);

                                        /**
                                         * Creo registro de reintegro de conceptos ab - 20151119
                                         */
                                        $sql = <<<EOD
DELETE FROM NO_CONCEPTO_PERIODO 
WHERE ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc 
    AND ID_CONCEP_NOMINA = (select nvl(ID_CONCEP_REIN ,ID_CONCEP_NOMINA ) as ID_CONCEP_REIN from no_concep_nomina where ID_CONCEP_NOMINA = $id_concep_ab )
    AND PERIODO = $id_periodo AND FECHA_DESDE = to_date('$fecha_ingre','YYYY-MM-DD')         
EOD;

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

                                        $sql = <<<EOD
            
UPDATE NO_CONCEPTO_PERIODO 
    SET fecha_hasta = to_date('$fecha_ingre','YYYY-MM-DD')-1,
      num_dias =  case when ((to_date('$fecha_ingre','YYYY-MM-DD')-1)-fecha_desde + 1) > 30 
          then 30 else (to_date('$fecha_ingre','YYYY-MM-DD')-1-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);
                                    }
                                }
                            }
                        }
                    }
                }//ENCARGO - COMISION

                /*
                 * RETIRO
                 */ else if ($id_novedad == 1) {

// Agrupacion de concepto para retiro Trello Nomina Card #92 - 20130617
                    $id_agrup_concep = 104;

                    $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'];

                    /*
                     * BUSCO EN LA TABLA NO_CONCEPTO_FUNC EL CONCEPTO DE ASIGNACION ACTUAL 
                     * Y PONGO ESTADO = 0 Y ACTUAL = 0
                     * Se actualiza fecha_hasta solo cuando es nula, se coloca la de retiro - 20130508
                     */
                    $sql = <<<EOD
update no_concepto_func set
    estado = case when fecha_hasta = to_date('$fecha_ingre','YYYY-MM-DD')-1 
        then 1 else estado end, 
    actual = 1, 
    fecha_hasta = case when fecha_hasta = to_date('$fecha_ingre','YYYY-MM-DD')-1 
        then null else fecha_hasta end
    WHERE ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc
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
                     * Al retirar el funcionario modifico dias de incapacidad y rentigros, no debe modificar estos registros - 20141126
                     * Los conceptos de horas extras no se modifica la fecha o num_dias, ya que se liquida en los lotes - 20150318
                     * Incidente #29824, Se valida que los conceptos se deban actualizar segun fechas, casos conceptos adicionales terminados - 20220518::LAVILA
                     */
                    $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO SET fecha_hasta=(select fecha_fin from no_periodo where id_periodo =  $id_periodo )

WHERE id_concepto_periodo IN(
    select 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.periodo = $id_periodo
        and conc.fecha_hasta >= conc.fecha_desde 
        and conc.id_concep_nomina not in (select distinct id_concep_nomina from no_concep_ka)
        and conc.id_concep_nomina not in (select distinct id_concep_nomina from no_concep_vac)
        and conc.id_concep_nomina not in (select distinct nvl(id_concep_ajuste,0) from no_concep_nomina)
        and conc.id_concep_nomina not in (select distinct nvl(id_concep_rein,0) from no_concep_nomina)
        and conc.id_concep_nomina not in (
            select distinct id_concep_nomina from no_tipo_hr_extra                
        )    
)
EOD;

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

                    /*
                     * Dias de resta de kardex - 20130508
                     * Se coloca estado 1 en el filtro de no_novedad_kardex - 20130917
                     * Se coloca relacion de fechas para las novedades de kardex - 20180516
                     */
                    $sql = <<<EOD
select 
nvl(sum(dias_rango_mes_sin_treintayuno(novkar.fecha_ini,novkar.fecha_fin,(select id_meses from no_periodo where id_periodo =  $id_periodo ))),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.id_tipo_doc = $id_tipo_doc and novkar.num_doc = $num_doc 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) ,'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) ,'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) ,'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) ,'dd/mm/yyyy') )) 
    
    or  
    to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'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) ,'dd/mm/yyyy') )) between novkar.fecha_ini and novkar.fecha_fin
)
EOD;

                    $results = CN_TABLE::executeSQL($sql);
                    $dias_kardex = $results[0]['dias'];

                    /**
                     * Dias de vacaciones en el periodo - 20150306
                     * Se coloca filtro de rango de periodo para que tome novedades dentro del periodo generado y no de años anteriores - 20151014
                     */
                    $sql = <<<EOD
select nvl(sum(dias),0) as dias from
(
    select 
    case when tipnov.operador = 1 
    then dias_rango_mes_sin_treintayuno(novvac.fecha_ini,novvac.fecha_fin,(select id_meses from no_periodo where id_periodo =  $id_periodo )) * (1)
    else dias_rango_mes_sin_treintayuno(novvac.fecha_ini,novvac.fecha_fin,(select id_meses from no_periodo where id_periodo =  $id_periodo )) * (-1) end as dias 
    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.id_tipo_doc = $id_tipo_doc and novvac.num_doc = $num_doc 
    and (
          novvac.fecha_ini between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'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) ,'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) ,'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) ,'dd/mm/yyyy') )) 
          
          or        
          
          to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'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) ,'dd/mm/yyyy') )) between novvac.fecha_ini and novvac.fecha_fin
        ) 
) 
EOD;

                    $results = CN_TABLE::executeSQL($sql);
                    $dias_vac = $results[0]['dias'];

                    /*
                     * Se actualiza numero de dias por rango de fechas - 20130407
                     * Se restan dias de kardex que afectan antiguedad - 20130508
                     * Al retirar el funcionario modifico dias de incapacidad y rentigros, no debe modificar estos registros - 20141126
                     * Se divide la actualizacion de dias para conceptos que aplican o no vacaciones, para restar los dias que correspondan al mes - 20150306
                     * Los conceptos de horas extras no se modifica la fecha o num_dias, ya que se liquida en los lotes - 20150318
                     */
                    //conceptos que aplican vacaciones - 20150306
                    $sql = <<<EOD
update no_concepto_periodo set num_dias = case when 

( case when (fecha_hasta-fecha_desde + 1) > 30 
    then 30 else (fecha_hasta-fecha_desde + 1) end - ($dias_kardex) - ($dias_vac) ) < 0 then 0 else
( case when (fecha_hasta-fecha_desde + 1) > 30 
    then 30 else (fecha_hasta-fecha_desde + 1) end - ($dias_kardex) - ($dias_vac) )    end
        
WHERE id_concepto_periodo IN(
    select 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.periodo = $id_periodo
        and conc.id_concep_nomina not in (select distinct id_concep_nomina from no_concep_ka)
        and conc.id_concep_nomina not in (select distinct id_concep_nomina from no_concep_vac)
        and conc.id_concep_nomina not in (select distinct nvl(id_concep_ajuste,0) from no_concep_nomina)
        and conc.id_concep_nomina not in (select distinct nvl(id_concep_rein,0) from no_concep_nomina)
        and conc.id_concep_nomina in (
            select id_concep_nomina from no_concep_nomina where aplica_vacac = 1                
        ) 
        and conc.id_concep_nomina not in (
            select distinct id_concep_nomina from no_tipo_hr_extra                
        )       
)
EOD;

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

                    //conceptos que no aplican vacaciones - 20150306
                    $sql = <<<EOD
update no_concepto_periodo set num_dias = case when 

( case when (fecha_hasta-fecha_desde + 1) > 30 
    then 30 else (fecha_hasta-fecha_desde + 1) end - ($dias_kardex) ) < 0 then 0 else
( case when (fecha_hasta-fecha_desde + 1) > 30 
    then 30 else (fecha_hasta-fecha_desde + 1) end - ($dias_kardex) )    end
        
WHERE id_concepto_periodo IN(
    select 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.periodo = $id_periodo
        and conc.id_concep_nomina not in (select distinct id_concep_nomina from no_concep_ka)
        and conc.id_concep_nomina not in (select distinct id_concep_nomina from no_concep_vac)
        and conc.id_concep_nomina not in (select distinct nvl(id_concep_ajuste,0) from no_concep_nomina)
        and conc.id_concep_nomina not in (select distinct nvl(id_concep_rein,0) from no_concep_nomina)
        and conc.id_concep_nomina not in (
            select id_concep_nomina from no_concep_nomina where aplica_vacac = 1                
        )    
        and conc.id_concep_nomina not in (
            select distinct id_concep_nomina from no_tipo_hr_extra                
        )    
)
EOD;

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

                    $sql = <<<EOD
UPDATE NO_ESTADO_FUNC SET ACTUAL = 1 
    WHERE ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc 
        and PERIODO = $id_periodo
EOD;
                    $this->conn->execute($sql);

//Se trae el periodo de liqdef si ya esta creado - 20130828
                    $sql = <<<EOD
select 
period.id_periodo 
from no_periodo period 
where 
(period.id_anhos || lpad(period.id_meses,2,'0')) = (select id_anhos || lpad(id_meses,2,'0') from no_periodo where id_periodo = $id_periodo) 
and id_tipo_periodo = 5 
EOD;
                    $results = CN_TABLE::executeSQL($sql);

                    /*
                     * Si el periodo de liquidacion definitiva esta creado, genera el registro en NO_ESTADO_FUNC - 20130828
                     */
                    if (count($results) > 0) {

                        $id_periodo_def = $results[0]['id_periodo'];

                        //borrar
                        $sql = <<<EOD
delete from NO_ESTADO_FUNC
WHERE ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc 
        and PERIODO = $id_periodo_def
EOD;
                        $this->conn->execute($sql);
                    }


                    //actualiza el cargo
                    $sql = <<<EOD
 UPDATE RH_DP SET 
   TITULAR   =  case when TITULAR is null then '$num_doc' else TITULAR end, 
   ENCARGADO =  case when ENCARGADO is null then NULL else ENCARGADO end 
 WHERE ID_DP = $id_dp 
EOD;
                    $this->conn->execute($sql);

//ACTUALIZO NO_NOMBRAMIENTO ESTADO = 1, ultima activa Y FECHA DE RETIRO                     
                    $sql = <<<EOD
            UPDATE NO_NOMBRAMIENTO SET ESTADO=1,FECHA_TERMINA=null,FECHA_RETIRO=null
                WHERE ID_TIPO_DOC=$id_tipo_doc AND NUM_DOC=$num_doc
    and to_date('$fecha_ingre','YYYY-MM-DD') between fecha_ingreso and fecha_retiro       
EOD;

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

//ACTUALIZO no_bonifica_servicios ESTADO = 1, ultima activa - 20130506
                    $sql = <<<EOD
update no_bonifica_servicios set estado = 1 where id_tipo_doc = $id_tipo_doc and num_doc = $num_doc
    and to_date('$fecha_ingre','YYYY-MM-DD') between fecha_ingresa and fecha_bonifica                        
EOD;

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

                    /**
                     * Al retirar cambia novedad procedimineto rete - 20141111
                     */
                    $sql = <<<EOD
SELECT * FROM NO_NOVEDAD_PROCED_RETE
where
id_tipo_doc = $id_tipo_doc
and num_doc = $num_doc
order by
num_doc, fecha_terminacion desc  
EOD;
                    $results = CN_TABLE::executeSQL($sql);

//actualiza registro de la ultima novedad por el estado y fecha
                    if (count($results) > 0) {


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

                        /*
                         * Se cambia $fecha_ingre por $fecha_ingre_orig, para guardar fechas de la novedad en concepto_periodo - 20130918
                         */
                        $sql = <<<EOD
update NO_NOVEDAD_PROCED_RETE set fecha_terminacion = null, 
  estado =  1
where
id_tipo_doc = $id_tipo_doc
and num_doc = $num_doc  
and id_novedad_proced_rete = $id_novedad_proced_rete 
EOD;
                        $this->conn->execute($sql);
                    }


                    /**
                     * Incidente #33764, se libera cargo si tenia encargo/comision - 20230113
                     */
                    $sql = <<<EOD
select
*
from NO_NOVEDAD_PERSONAL
where
id_tipo_doc = $id_tipo_doc
and num_doc = $num_doc  
and ID_NOVEDAD in (3,7)
and ESTADO = 0 
and id_novedad_personal in (
    select 
    id_novedad_personal 
    from no_novedad_personal
    where
    id_tipo_doc = $id_tipo_doc
    and num_doc = $num_doc  
    and fecha_terminacion >= sysdate
)
EOD;
                    $results = CN_TABLE::executeSQL($sql);

                    if (count($results) > 0) {

                        $id_dp_enc = $results[0]['id_dp_ini'];

                        //actualiza el cargo
                        $sql = <<<EOD
 UPDATE RH_DP SET 
   TITULAR   =  case when TITULAR is null then '$num_doc' else TITULAR end, 
   ENCARGADO =  case when ENCARGADO is null then NULL else ENCARGADO end 
 WHERE ID_DP = $id_dp_enc 
EOD;
                        $this->conn->execute($sql);

                        /**
                         * Incidente #4891,al retirar una persona se inactiva el encargo que tenia, para que no se deba registrar terminacion - 20161028
                         * Se coloca la reversa del encargo en el retiro - 20180713
                         */
                        $sql = <<<EOD
update NO_NOVEDAD_PERSONAL set ESTADO = 1
where
id_tipo_doc = $id_tipo_doc
and num_doc = $num_doc  
and ID_NOVEDAD in (3,7)
and ESTADO = 0 
and id_novedad_personal in (
    select 
    id_novedad_personal 
    from no_novedad_personal
    where
    id_tipo_doc = $id_tipo_doc
    and num_doc = $num_doc  
    and fecha_terminacion >= sysdate
) 
EOD;
                        $this->conn->execute($sql);
                    }
                }//RETIRO

                /*
                 * ASCENSO - Cambio de Cargo con Terminación y Nombramiento - 20150422
                 * Nuevo tipo Nombramiento Provisional - Reubicación de MIN - 20250605::LAVILA
                 */ else if ($id_novedad == 2 || $id_novedad == 13 || $id_novedad == 17) {

                    $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 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'];
                    $id_cen_op = $results[0]['id_cen_op'];
                    $id_ea = $results[0]['id_ea'];

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

//BUSCO EN LA TABLA NO_CONCEPTO_FUNC EL CONCEPTO DE ASIGNACION ACTUAL DELETE el registro - 20140930

                    $sql = <<<EOD
DELETE FROM NO_CONCEPTO_FUNC WHERE ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc AND ID_CONCEP_NOMINA = $id_concep_basica
    and actual = 1
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'),null)
EOD;

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

//BUSCO EN LA TABLA NO_ESTADO_FUNC EL ESTADO ACTUAL Y LE PONGO ACTUAL = 0
                    /*
                     * Se cambia por el periodo de registro
                     */

                    $sql = <<<EOD
            DELETE FROM NO_ESTADO_FUNC 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);

                    /**
                     * Validar fecha de inicio de la novedad - 20140930
                     */
                    $date1 = new DateTime($fecha_ingre);
                    $date2 = new DateTime($fecha_hasta);
                    $date3 = new DateTime($fecha_hasta_periodo);
                    $date4 = new DateTime($fecha_desde_periodo);

                    if ($date1 >= $date4 && $date1 <= $date3) {


//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
DELETE FROM NO_CONCEPTO_PERIODO WHERE ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc AND ID_CONCEP_NOMINA = $id_concep_basica
    AND PERIODO = $id_periodo AND VALOR = $asignacion_basica_fin                        
EOD;

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

//CREO EL NUEVO REGISTRO DE NO_CONCEPTO_PERIODO

                        $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO SET   
    NUM_DIAS = $num_dias - TO_NUMBER(to_char(fecha_desde,'DD')) + 1, 
    fecha_hasta = to_date('$fecha_hasta_periodo','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);
                    } elseif ($date1 < $date4) {

                        $logger->info("Fecha inicial antes del periodo a liquidar");

//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
DELETE FROM NO_CONCEPTO_PERIODO 
WHERE ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc 
    AND ID_CONCEP_NOMINA = (select nvl(ID_CONCEP_AJUSTE ,ID_CONCEP_NOMINA ) as ID_CONCEP_AJUSTE from no_concep_nomina where ID_CONCEP_NOMINA = $id_concep_basica )
    AND PERIODO = $id_periodo AND FECHA_DESDE = to_date('$fecha_ingre','YYYY-MM-DD')                               
EOD;

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

//Reintegro AB
                        $sql = <<<EOD
DELETE FROM NO_CONCEPTO_PERIODO 
WHERE ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc 
    AND ID_CONCEP_NOMINA = (select nvl(ID_CONCEP_REIN ,ID_CONCEP_NOMINA ) as ID_CONCEP_REIN from no_concep_nomina where ID_CONCEP_NOMINA = $id_concep_basica )
    AND PERIODO = $id_periodo AND FECHA_DESDE = to_date('$fecha_ingre','YYYY-MM-DD')         
EOD;

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



                    $sql = <<<EOD
UPDATE RH_DP SET TITULAR = null WHERE ID_DP = $id_dp
EOD;

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

                    $sql = <<<EOD
 UPDATE RH_DP SET 
   TITULAR   =  NULL, 
   ENCARGADO =  case when ENCARGADO is null then '$num_doc' else ENCARGADO end 
 WHERE ID_DP = $id_dp_ini                              
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
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'))
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'),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')) +1)
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')-1 
                WHERE ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc AND ID_CONCEP_NOMINA = $id_concep_ab
EOD;

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

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


                                        $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO 
    SET fecha_hasta = to_date('$fecha_ingre','YYYY-MM-DD')-1,
      num_dias =  0                      
        
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);
                                    } else {

                                        $sql = <<<EOD
            
UPDATE NO_CONCEPTO_PERIODO 
    SET fecha_hasta = to_date('$fecha_ingre','YYYY-MM-DD')-1,
      num_dias =  case when ((to_date('$fecha_ingre','YYYY-MM-DD')-1)-fecha_desde + 1) > 30 
          then 30 else (to_date('$fecha_ingre','YYYY-MM-DD')-1-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);
                                    }
                                }
                            }
                        }
                    }
                }//FIN ASCENSO

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


//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 * FROM NO_NOVEDAD_PERSONAL WHERE ID_NOVEDAD in (3,7) 
        AND ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc AND ESTADO = 0
        order by
        fecha_inicial desc 
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'];
                    $fecha_fin_enc = $results[0]['fecha_terminacion'];
                    $fecha_fin_enc = explode(' ', $fecha_fin_enc);
                    $fecha_fin_enc = $fecha_fin_enc[0];
                    $id_novedad_personal_enc = $results[0]['id_novedad_personal'];

                    $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'];

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

                    /*
                     * 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 la ultima CON ESTADO = 1 LA NOVEDAD DE ENCARGO

                    $sql = <<<EOD
UPDATE NO_NOVEDAD_PERSONAL SET ESTADO = 1 
    WHERE ID_NOVEDAD in (3,7) AND ID_TIPO_DOC = $id_tipo_doc 
        AND NUM_DOC = $num_doc
        and id_novedad_personal = $id_novedad_personal_enc 
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_fin,$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, 
    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_basica
        and ACTUAL = 1
EOD;

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

//actualiza REGISTRO EN LA TABLA NO_CONCEPTO_FUNC del encargo 

                    $sql = <<<EOD
UPDATE NO_CONCEPTO_FUNC SET ESTADO = 1, ACTUAL = 1 
    WHERE ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc 
        AND ID_CONCEP_NOMINA = $id_concep_basica
        and ACTUAL = 0 and fecha_hasta = to_date('$fecha_fin_enc','YYYY-MM-DD')
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) {


                        //BUSCO EN LA TABLA NO_CONCEPTO_FUNC EL CONCEPTO DE ASIGNACION ACTUAL DELETE el registro - 20140930

                        $sql = <<<EOD
DELETE FROM NO_CONCEPTO_PERIODO 
    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 fecha_hasta = to_date('$fecha_hasta_periodo','YYYY-MM-DD'), num_dias = 30 
    
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 {

                        /*
                         * 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
DELETE FROM NO_CONCEPTO_PERIODO 
    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 fecha_hasta = to_date('$fecha_hasta_periodo','YYYY-MM-DD'), num_dias = 30 
    
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);

                            /*
                             * 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_fin         
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
                             * Incidente #39773, se ajusta dia inicial de la novedad - 20250429::LAVILA
                             */
//Ajuste AB
                            $sql = <<<EOD
DELETE FROM NO_CONCEPTO_PERIODO 
WHERE ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc 
    AND ID_CONCEP_NOMINA = (select nvl(ID_CONCEP_AJUSTE ,ID_CONCEP_NOMINA ) as ID_CONCEP_AJUSTE from no_concep_nomina where ID_CONCEP_NOMINA = $id_concep_basica )
    AND PERIODO = $id_periodo AND FECHA_DESDE = to_date('$fecha_ingre','YYYY-MM-DD')+1                               
EOD;

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

//Reintegro AB
                            $sql = <<<EOD
DELETE FROM NO_CONCEPTO_PERIODO 
WHERE ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc 
    AND ID_CONCEP_NOMINA = (select nvl(ID_CONCEP_REIN ,ID_CONCEP_NOMINA ) as ID_CONCEP_REIN from no_concep_nomina where ID_CONCEP_NOMINA = $id_concep_basica )
    AND PERIODO = $id_periodo AND FECHA_DESDE = to_date('$fecha_ingre','YYYY-MM-DD')+1         
EOD;

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



                    $sql = <<<EOD
 UPDATE RH_DP SET 
   TITULAR   =  case when '$num_doc' = TITULAR then TITULAR else TITULAR end, 
   ENCARGADO =  case when '$num_doc' = ENCARGADO then NULL else ENCARGADO end 
 WHERE ID_DP = $id_dp_ini  
EOD;

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

                    $sql = <<<EOD
UPDATE RH_DP SET ENCARGADO = '$num_doc' 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
EOD;
                    $results = CN_TABLE::executeSQL($sql);

                    $asignacion_basica = $asignacion_basica_fin;
                    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'))
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'),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')) +1)
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')-1 
                WHERE ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc AND ID_CONCEP_NOMINA = $id_concep_ab
EOD;

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

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


                                        $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO 
    SET fecha_hasta = to_date('$fecha_ingre','YYYY-MM-DD')-1,
      num_dias =  0                      
        
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);
                                    } else {

                                        $sql = <<<EOD
            
UPDATE NO_CONCEPTO_PERIODO 
    SET fecha_hasta = to_date('$fecha_ingre','YYYY-MM-DD')-1,
      num_dias =  case when ((to_date('$fecha_ingre','YYYY-MM-DD')-1)-fecha_desde + 1) > 30 
          then 30 else (to_date('$fecha_ingre','YYYY-MM-DD')-1-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);
                                    }
                                }
                            }
                        }
                    }
                }//FIN TERMINACION DE ENCARGO


                /*
                 * ID-5 09-PRORROGA ENCARGO anulacion - 20170815
                 */ else if ($id_novedad == 5) {

                    $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'];

//En la novedad "Prorroga de encargo"  modificar la fecha final del encargo original
                    $sql = <<<EOD
UPDATE NO_NOVEDAD_PERSONAL SET FECHA_TERMINACION = to_date('$fecha_ingre','YYYY-MM-DD') 
    WHERE ID_NOVEDAD in (3,7) AND ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc AND estado = 1 
EOD;

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

                    /*
                     * BUSCO EN LA TABLA NO_CONCEPTO_FUNC EL CONCEPTO DE ASIGNACION ACTUAL ACTUALIZA LA FECHA_HASTA
                     */
                    $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_basica
        and ACTUAL = 1
EOD;

                    $this->conn->execute($sql);
                }//FIN PRORROGA ENCARGO


                /**
                 * ID-8 12-Comisión de Servicio Otra Entidad - 20150316
                 * En la liq del nuevo periodo desactiva valores y días de no_concepto_periodo - 20150317
                 */ elseif ($id_novedad == 8) {

                    /**
                     * Controlar fecha de la novedad
                     */
                    /**
                     * Validar fecha de inicio de la novedad - 20140930
                     */
                    $date1 = new DateTime($fecha_ingre);
                    $date2 = new DateTime($fecha_hasta);
                    $date3 = new DateTime($fecha_desde_periodo);
                    $date4 = new DateTime($fecha_hasta_periodo);

                    //si la fecha es anterior a la del inicio del periodo
                    if ($date1 <= $date3) {

                        /*
                         * Actualiza concepto periodo
                         */
                        // actualiza días de no_concepto_periodo
                        $sql = <<<EOD
update no_concepto_periodo set num_dias = 30
where 
periodo = $id_periodo 
and id_tipo_doc = $id_tipo_doc
and num_doc = $num_doc  
EOD;
                        $this->conn->execute($sql);
                    } elseif ($date3 <= $date1 && $date1 <= $date4) {//fecha dentro del periodo

                        /*
                         * Actualiza concepto periodo
                         */
                        // actualiza días de no_concepto_periodo
                        $sql = <<<EOD
update no_concepto_periodo set fecha_hasta = trunc(LAST_DAY(fecha_desde)),
  num_dias = 30
where 
periodo = $id_periodo 
and id_tipo_doc = $id_tipo_doc
and num_doc = $num_doc  
EOD;
                        $this->conn->execute($sql);
                    }

                    /*
                     * Incidente #39601, se completa cuando es encargado, para titular ya no se limpia - 20250317::LAVILA
                     */
                    $sql = <<<EOD
UPDATE RH_DP SET 
    ENCARGADO =  case when ENCARGADO is null and TITULAR != '$num_doc' then '$num_doc' else ENCARGADO end 
WHERE ID_DP = $id_dp_ini  
EOD;

                    $this->conn->execute($sql);
                }//FIN Comisión de Servicio Otra Entidad


                /*
                 * TERMINACION DE OE - 20200922
                 */ else if ($id_novedad == 14) {


//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 * FROM NO_NOVEDAD_PERSONAL WHERE ID_NOVEDAD in (8) 
        AND ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc AND ESTADO = 0
        order by
        fecha_inicial desc 
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'];
                    $fecha_fin_enc = $results[0]['fecha_terminacion'];
                    $fecha_fin_enc = explode(' ', $fecha_fin_enc);
                    $fecha_fin_enc = $fecha_fin_enc[0];
                    $id_novedad_personal_enc = $results[0]['id_novedad_personal'];

                    $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'];

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

                    /*
                     * 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 la ultima CON ESTADO = 1 LA NOVEDAD DE ENCARGO

                    $sql = <<<EOD
UPDATE NO_NOVEDAD_PERSONAL SET ESTADO = 1 
    WHERE ID_NOVEDAD in (8) AND ID_TIPO_DOC = $id_tipo_doc 
        AND NUM_DOC = $num_doc
        and id_novedad_personal = $id_novedad_personal_enc 
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) {


                        //BUSCO EN LA TABLA NO_CONCEPTO_FUNC EL CONCEPTO DE ASIGNACION ACTUAL DELETE el registro - 20140930

                        $sql = <<<EOD
DELETE FROM NO_CONCEPTO_PERIODO 
    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 fecha_hasta = to_date('$fecha_hasta_periodo','YYYY-MM-DD'), num_dias = 30 
    
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 {

                        /*
                         * 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
DELETE FROM NO_CONCEPTO_PERIODO 
    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 fecha_desde = to_date('$fecha_hasta_periodo','YYYY-MM-DD')+1, fecha_hasta = to_date('$fecha_hasta_periodo','YYYY-MM-DD'), num_dias = 0 
    
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);

                            //Incidente #32405, Actualiza conceptos de aportes y rete, para fecha desde - 20221028::LAVILA
                            $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO SET fecha_desde = to_date('$fecha_hasta_periodo','YYYY-MM-DD')+1
    
WHERE id_concepto_periodo IN(

    select 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 in (select DISTINCT id_concep_nomina from no_fondo_concepto) or conc.id_concep_nomina in (SELECT id_concep_rete FROM no_param_concep) )
    and nvl(porcentaje,0) > 0 and conc.periodo = $id_periodo
    
)
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
                             * Incidente #32405, conceptos de aporte y rete - 20221028::LAVILA
                             */
                            $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

)
or id_concepto_periodo in (

    select 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 in (select DISTINCT id_concep_nomina from no_fondo_concepto) or conc.id_concep_nomina in (SELECT id_concep_rete FROM no_param_concep) )
    and nvl(porcentaje,0) > 0 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");
                        }
                    }



                    $sql = <<<EOD
 UPDATE RH_DP SET 
   TITULAR   =  case when '$num_doc' = TITULAR then NULL else TITULAR end, 
   ENCARGADO =  case when '$num_doc' = ENCARGADO then NULL else ENCARGADO end 
 WHERE ID_DP = $id_dp_ini  
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
EOD;
                    $results = CN_TABLE::executeSQL($sql);

                    $asignacion_basica = $asignacion_basica_fin;
                    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'))
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'),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')) +1)
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')-1 
                WHERE ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc AND ID_CONCEP_NOMINA = $id_concep_ab
EOD;

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

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


                                        $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO 
    SET fecha_hasta = to_date('$fecha_ingre','YYYY-MM-DD')-1,
      num_dias =  0                      
        
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);
                                    } else {

                                        $sql = <<<EOD
            
UPDATE NO_CONCEPTO_PERIODO 
    SET fecha_hasta = to_date('$fecha_ingre','YYYY-MM-DD')-1,
      num_dias =  case when ((to_date('$fecha_ingre','YYYY-MM-DD')-1)-fecha_desde + 1) > 30 
          then 30 else (to_date('$fecha_ingre','YYYY-MM-DD')-1-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);
                                    }
                                }
                            }
                        }
                    }
                }//FIN TERMINACION DE OE


                /*
                 * ID-15 PRORROGA Comisión de Servicio Otra Entidad - 20200922
                 */ else if ($id_novedad == 15) {


                    //En la novedad "Prorroga de encargo"  modificar la fecha final del encargo original
                    $sql = <<<EOD
UPDATE NO_NOVEDAD_PERSONAL SET FECHA_TERMINACION = to_date('$fecha_ingre','YYYY-MM-DD') 
    WHERE ID_NOVEDAD in (8) AND ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc AND estado = 1 
EOD;

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

                    //Actualiza kardex si tiene registro que afecta antiguedad y es de suspencion
                    $sql = <<<EOD
UPDATE NO_NOVEDAD_KARDEX SET FECHA_FIN = to_date('$fecha_ingre','YYYY-MM-DD'), 
NUM_DIAS = to_date('$fecha_ingre','YYYY-MM-DD') - FECHA_INI   
    WHERE FECHA_INI = (select max(FECHA_INICIAL) from NO_NOVEDAD_PERSONAL 
        where ID_NOVEDAD in (8) AND ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc AND estado = 1)
    and ID_TIP_NOV_KA in (select ID_TIP_NOV_KA from no_tip_nov_ka where AFECTA_ANTIGU = 1 and SUSPENSION = 1)
    AND ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc AND estado = 1
EOD;

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

                    //Incidente #40550,en las prorrogas tambien se suman dias - 20250815::LAVILA
                    $sql = <<<EOD
select tab0.*
from no_causa_vacac tab0
where tab0.num_doc = $num_doc and tab0.fecha_ini<=to_date('$fecha_ingre','YYYY-MM-DD') 
and tab0.fecha_fin>=to_date('$fecha_ingre','YYYY-MM-DD')
EOD;
                    $records = CN_TABLE::executeSQL($sql);
                    //Validar registros
                    if (count($records) > 0) {
                        $id_causa_vacac = $records[0]['id_causa_vacac'];
                        $sql = <<<EOD
UPDATE NO_CAUSA_VACAC set fecha_fin = fecha_fin - (to_date ('$fecha_hasta','yyyy-mm-dd') - to_date ('$fecha_ingre','yyyy-mm-dd') + 1)
    where id_causa_vacac = $id_causa_vacac
EOD;
                        $this->conn->execute($sql);
                    }
                    //corre los dias del activo
                    $sql = <<<EOD
UPDATE NO_BONIFICA_SERVICIOS set fecha_bonifica = fecha_bonifica - (to_date ('$fecha_hasta','yyyy-mm-dd') - to_date ('$fecha_ingre','yyyy-mm-dd') + 1)
    where num_doc = $num_doc and estado = 1 
EOD;
                    $this->conn->execute($sql);
                }//FIN PRORROGA OE


                /**
                 * PRORROGA DE TC - 20210129
                 */ else if ($id_novedad == 16) {

                    //En la novedad "Prorroga de OE"  modificar la fecha final del encargo original
                    $sql = <<<EOD
UPDATE no_nombramiento SET FECHA_TERMINA = to_date('$fecha_ingre','YYYY-MM-DD') 
    WHERE estado = 1 AND ID_TIPO_DOC = $id_tipo_doc AND NUM_DOC = $num_doc 
EOD;

                    $this->conn->execute($sql);
                }//FIN PRORROGA Terminacion Contrato

                /**
                 * NOM-99 :: COL - Se revisa la funcionalidad de novedad de personal, ya que no esta teniendo en cuenta los días de vacaciones - 20150415
                 * Nuevo tipo Nombramiento Provisional - Reubicación de MIN - 20250605::LAVILA
                 */
                if ($id_novedad == 3 || $id_novedad == 7 || $id_novedad == 2 || $id_novedad == 6 || $id_novedad == 4 || $id_novedad == 13 || $id_novedad == 17) {
                    $sql = <<<EOD
select 
tab0.id_concepto_periodo,
nvl(sum(dias),0) as dias 
from
(
    select 
    case when tab0.operador = 1 
        then dias_rango_mes_sin_treintayuno(tab0.fecha_ini,tab0.fecha_fin,(select id_meses from no_periodo where id_periodo =  $id_periodo )) * (1)
        else dias_rango_mes_sin_treintayuno(tab0.fecha_ini,tab0.fecha_fin,(select id_meses from no_periodo where id_periodo =  $id_periodo )) * (-1) end as dias ,
        
    tab0.*
    
    from( 
        
        select 
        
        novvac.id_novedad_vac,
        tipnov.operador,
        case when conper.fecha_desde <= novvac.fecha_ini then novvac.fecha_ini else conper.fecha_desde end as fecha_ini,
        case when conper.fecha_hasta <= novvac.fecha_fin then conper.fecha_hasta else novvac.fecha_fin end as fecha_fin,
        
        conper.* 
        
        from no_concepto_periodo conper
        left join no_concep_nomina  connom on conper.id_concep_nomina = connom.id_concep_nomina
        left join no_novedad_vac novvac on novvac.id_tipo_doc = conper.id_tipo_doc and novvac.num_doc = conper.num_doc
            left join no_tipo_nov_vac tipnov on tipnov.id_tipo_nov_vac = novvac.id_tipo_nov_vac
        
        where
        conper.num_doc = $num_doc
        and conper.periodo = $id_periodo
        and connom.id_concep_nomina = (select no_param_concep.id_concep_basica from no_param_concep where no_param_concep.id_param_concep = 1)
        and conper.fecha_desde <= conper.fecha_hasta
        
        and (
          novvac.fecha_ini between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'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) ,'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) ,'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) ,'dd/mm/yyyy') ))
          or
          to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo) ,'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) ,'dd/mm/yyyy') )) between novvac.fecha_ini and novvac.fecha_fin
        )
    
    )tab0
    
    where
    tab0.fecha_ini <= tab0.fecha_fin
    
)tab0

group by
tab0.id_concepto_periodo 
EOD;
                    $results = CN_TABLE::executeSQL($sql);

                    foreach ($results as $results_val) {
                        $id_concepto_periodo = $results_val['id_concepto_periodo'];
                        $dias = $results_val['dias'];

                        $sql = <<<EOD
update no_concepto_periodo  set num_dias = case when (num_dias - $dias) > 30 then 30 when (num_dias - $dias) >= 0 then (num_dias - $dias) else 0 end 
where id_concepto_periodo = $id_concepto_periodo
EOD;

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

                    /**
                     * Incidente #39773, se ajusta dias para novedades de vac, si es de un periodo anterior concep ajuste y reintegro AB - 20250429::LAVILA
                     */
                    $sql = <<<EOD
select 
max(id_periodo) as id_periodo_ant
from no_periodo
where id_periodo < $id_periodo
and id_tipo_periodo = 1
EOD;

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

                    if (count($results) > 0) {
                        $id_periodo_ant = $results[0]['id_periodo_ant'];

                        $sql = <<<EOD
select 
tab0.id_concepto_periodo,
nvl(sum(dias),0) as dias 
from
(
    select 
    case when tab0.operador = 1 
        then dias_rango_mes_sin_treintayuno(tab0.fecha_ini,tab0.fecha_fin,(select id_meses from no_periodo where id_periodo =  $id_periodo_ant )) * (1)
        else dias_rango_mes_sin_treintayuno(tab0.fecha_ini,tab0.fecha_fin,(select id_meses from no_periodo where id_periodo =  $id_periodo_ant )) * (-1) end as dias ,
        
    tab0.*
    
    from( 
        
        select 
        
        novvac.id_novedad_vac,
        tipnov.operador,
        case when conper.fecha_desde <= novvac.fecha_ini then novvac.fecha_ini else conper.fecha_desde end as fecha_ini,
        case when conper.fecha_hasta <= novvac.fecha_fin then conper.fecha_hasta else novvac.fecha_fin end as fecha_fin,
        
        conper.* 
        
        from no_concepto_periodo conper
        left join no_concep_nomina  connom on conper.id_concep_nomina = connom.id_concep_nomina
        left join no_novedad_vac novvac on novvac.id_tipo_doc = conper.id_tipo_doc and novvac.num_doc = conper.num_doc
        left join no_tipo_nov_vac tipnov on tipnov.id_tipo_nov_vac = novvac.id_tipo_nov_vac
        
        where
        conper.num_doc = $num_doc
        and conper.periodo = $id_periodo
        and connom.id_concep_nomina in ( (select no_concep_nomina.id_concep_ajuste from no_concep_nomina where no_concep_nomina.id_concep_nomina = 1) , (select no_concep_nomina.id_concep_rein from no_concep_nomina where no_concep_nomina.id_concep_nomina = 1) )
        and conper.fecha_desde <= conper.fecha_hasta
        
        and (
          novvac.fecha_ini between to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo_ant) ,'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_ant) ,'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_ant) ,'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_ant) ,'dd/mm/yyyy') ))
          or
          to_date('01/'|| (select lpad(id_meses,2,'0') ||'/'||id_anhos from no_periodo where id_periodo = $id_periodo_ant) ,'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_ant) ,'dd/mm/yyyy') )) between novvac.fecha_ini and novvac.fecha_fin
        )
    
    )tab0
    
    where
    tab0.fecha_ini <= tab0.fecha_fin
    
)tab0

group by
tab0.id_concepto_periodo 
EOD;

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

                        foreach ($results as $results_val) {
                            $id_concepto_periodo = $results_val['id_concepto_periodo'];
                            $dias = $results_val['dias'];

                            $sql = <<<EOD
update no_concepto_periodo  set num_dias = case when (num_dias - $dias) > 30 then 30 when (num_dias - $dias) >= 0 then (num_dias - $dias) else 0 end 
where id_concepto_periodo = $id_concepto_periodo 
EOD;

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



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

                //ACTUALIZAR SUELDOS DE COMISIONES - 20130618
                $this->conn->beginTransaction();

                /**
                 * ...
                 * Nuevo tipo Nombramiento Provisional - Reubicación de MIN - 20250605::LAVILA
                 */
                if ($id_novedad == 4 || $id_novedad == 3 || $id_novedad == 2 || $id_novedad == 6 || $id_novedad == 7 || $id_novedad == 13 || $id_novedad == 17) {

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

                    $this->conn->execute($sql);
                } elseif ($id_novedad == 1) {

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

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


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

                //Actualiza sueldos del ERP_SGR - 20130618
                $this->actualizarSueldos($id_novedad, $asignacion_basica, $num_doc, $entidadCliente);
                $logger->info("[UPDATE] TERCEROS OTROS - SGR y CONTROL COMISIONES.");

                //Actualizar conceptos que apliquen asigbasica, para actualizar el valor - 20150422
                $this->actualizarAplicaAsigBasica($id_tipo_doc, $num_doc, $id_periodo, $id_novedad);
            } 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());
            }
        }

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

        return $request;
    }

    /**
     * Metodo para actualizar conceptos que apliquen asigbasica, para actualizar el valor - 20150422
     * 
     * @param type $id_tipo_doc
     * @param type $num_doc
     * @param type $periodo
     * @param type $id_novedad
     */
    public function actualizarAplicaAsigBasica($id_tipo_doc, $num_doc, $periodo, $id_novedad) {

        $logger = sfContext::getInstance()->getLogger();
        $logger->info("[actualizarAplicaAsigBasica] Actualiza AplicaAsigBasica.");

        $this->conn->beginTransaction();

        try {

            /*
             * Para algunas de las novedades
             * Nuevo tipo Nombramiento Provisional - Reubicación de MIN - 20250605::LAVILA
             */
            if ($id_novedad == 2 || $id_novedad == 3 || $id_novedad == 4 || $id_novedad == 7 || $id_novedad == 13 || $id_novedad == 17) {

                //traer conceptos por persona que se deben actualizar
                $sql = <<<EOD
select 
no_consulta_sql_f(0, 0, 0, 0, confun.id_tipo_doc, confun.num_doc, 
(select no_param_concep.id_concep_basica from no_param_concep where no_param_concep.id_param_concep = 1), 'C', $periodo) as salario,
confun.*
from no_concepto_func confun
left join no_concep_nomina connom
on connom.id_concep_nomina = confun.id_concep_nomina

where
confun.estado = 1
and actual = 1
and connom.aplica_asig_basica = 1
and confun.porcentaje is not null
and confun.num_doc = $num_doc
and confun.id_tipo_doc = $id_tipo_doc

order by
confun.num_doc,
confun.id_concep_nomina
EOD;
                $results = CN_TABLE::executeSQL($sql);

                foreach ($results as $results_val) {

                    $id_concep_func = $results_val['id_concep_func'];
                    $salario = $results_val['salario'];
                    $porcentaje = $results_val['porcentaje'];
                    $id_concep_nomina = $results_val['id_concep_nomina'];

                    //nuevo valor concepto
                    $valor = round(($salario * $porcentaje) / 100);

                    /**
                     * actualizar concepto_func
                     */
                    $sql = <<<EOD
update no_concepto_func set valor = $valor 
where id_tipo_doc = $id_tipo_doc and num_doc = $num_doc
and id_concep_nomina = $id_concep_nomina
and id_concep_func = $id_concep_func 
EOD;

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

                    /**
                     * actualizar concepto periodo
                     */
                    $sql = <<<EOD
update no_concepto_periodo set valor = $valor 
where id_tipo_doc = $id_tipo_doc and num_doc = $num_doc
and id_concep_nomina = $id_concep_nomina
and periodo = $periodo 
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());
        }
    }

    /**
     * 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, $entidadCliente = 0) {

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

        $this->conn->beginTransaction();

        try {

            /*
             * Verifica la entidad - 20151022
             */
            if ($entidadCliente == 1 || $entidadCliente == 2) {//SGR
                /*
                 * ACTUALIZAR SUELDOS DE COMISIONES
                 * Nuevo tipo Nombramiento Provisional - Reubicación de MIN - 20250605::LAVILA
                 */
                if ($id_novedad == 4 || $id_novedad == 3 || $id_novedad == 2 || $id_novedad == 6 || $id_novedad == 7 || $id_novedad == 13 || $id_novedad == 17) {

                    $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);
                }
            } elseif ($entidadCliente == 5) {//CONTROL COMISIONES
                /*
                 * ACTUALIZAR SUELDOS DE CONTROL DE COMISIONES
                 * Nuevo tipo Nombramiento Provisional - Reubicación de MIN - 20250605::LAVILA
                 */
                if ($id_novedad == 4 || $id_novedad == 3 || $id_novedad == 2 || $id_novedad == 6 || $id_novedad == 7 || $id_novedad == 13 || $id_novedad == 17) {

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

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

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

                    $sql = <<<EOD
UPDATE COM_TERCERO SET SUELDO = $asignacion_basica WHERE NUM_DOC = '$num_doc' 
EOD;
                    $this->conn->execute($sql);
                } elseif ($id_novedad == 1) {

                    $sql = <<<EOD
UPDATE COM_TERCERO SET ESTADO = 0 WHERE NUM_DOC = '$num_doc'
EOD;
                    $this->conn->execute($sql);
                }
            }

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