<?php

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

    protected $table_names = array(
        'NO_NOVEDAD_KARDEX',
        'NO_DATOS_FUNCIONARIO_V',
        'NO_TIP_NOV_KA',
        'NO_PERIODO',
        'NO_TIPO_PERIODO',
        'NO_PERIODO_V'
    ); //tablas para construir el sql, por medio de joins
    protected $table_join_ids = array(
        'NO_DATOS_FUNCIONARIO_V' =>
        array(
            'id_tipo_doc' => 'NO_NOVEDAD_KARDEX',
            'num_doc' => 'NO_NOVEDAD_KARDEX'
        ),
        'NO_TIP_NOV_KA' =>
        array(
            'id_tip_nov_ka' => 'NO_NOVEDAD_KARDEX'
        ),
        'NO_PERIODO' =>
        array(
            'id_periodo' => 'NO_NOVEDAD_KARDEX'
        ),
        'NO_TIPO_PERIODO' =>
        array(
            'id_tipo_periodo' => 'NO_PERIODO'
        ),
        'NO_PERIODO_V,LEFT' =>
        array(
            'id_periodo_base-id_periodo' => 'NO_NOVEDAD_KARDEX'
        )
    ); //si posee tablas para joins, identificar la relacion de los campos con las tablas
    protected $fields = array(
        'NO_NOVEDAD_KARDEX' =>
        array(
            'id_novedad_kardex' => 'id_novedad_kardex',
            'id_tipo_doc' => 'id_tipo_doc',
            'num_doc' => 'num_doc',
            'id_tip_nov_ka' => 'id_tip_nov_ka',
            'fecha_ini' => 'fecha_ini',
            'fecha_fin' => 'fecha_fin',
            'num_dias' => 'num_dias',
            'numero_doc' => 'numero_doc',
            'fecha_doc' => 'fecha_doc',
            'observaciones' => 'observaciones',
            'prorroga' => 'prorroga',
            'num_dias_ant' => 'num_dias_ant',
            'num_incapacidad' => 'num_incapacidad',
            'fecha_inc' => 'fecha_inc',
            'id_periodo' => 'id_periodo',
            'estado' => 'estado',
            'id_periodo_base' => 'id_periodo_base'
        ),
        'NO_DATOS_FUNCIONARIO_V' =>
        array(
            'nombre_completo' => 'nombre_completo',
            'nombre_apellido' => 'nombre_apellido'
        ),
        'NO_TIP_NOV_KA' =>
        array(
            'codigo' => 'codigo',
            'descripcion' => 'descripcion',
            'codigo,||, - ,||,descripcion' => 'completo_tipka'
        ),
        'NO_PERIODO' =>
        array(
            'id_meses' => 'id_meses',
            'id_anhos' => 'id_anhos'
        ),
        'NO_TIPO_PERIODO' =>
        array(
            'descripcion' => 'descripcion_periodo'
        ),
        'NO_PERIODO_V' =>
        array(
            'id_meses' => 'id_meses_base',
            'id_anhos' => 'id_anhos_base'
        )
    ); //por cada tabla especificar los campos del select
    protected $fields_orderBy = array(
        'num_doc', 'codigo'
    ); //campos para el ordenamiento de la consulta


    /*
     * 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
     *
     * _filtroNull / para filtro de not null o null - type debe ser is - para todas las variables
     * TYPE NULL / para filtro de not null o null con el valor de campo desde gwt
     * rownum,start - rownum,end / estos campos para uso del Grid live GWT, numero fijo de filas de consulta
     */
    protected $table_field_conditions = array(
        'NO_NOVEDAD_KARDEX' =>
        array(
            'id_novedad_kardex,a' => array('!=' => array(-1)),
            'id_novedad_kardex,b' => array('=' => array('id_novedad_kardex')),
            'id_tipo_doc' => array('=' => array('id_tipo_doc')),
            'num_doc' => array('=' => array('num_doc')),
            'id_tip_nov_ka' => array('=' => array('id_tip_nov_ka')),
            'numero_doc' => array('=' => array('numero_doc')),
            'fecha_doc' => array('BETWEENFECHA' => array('fecha_ini', 'fecha_fin')),
            'prorroga' => array('=' => array('prorroga')),
            'id_periodo' => array('=' => array('id_periodo')),
            '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 $query_qualifier = 'DISTINCT'; //Para eliminar filas repetidas

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



    /*
     * ------------VARIABLES PARA SERVICIOS CRUD
     */
    protected $id_name = 'id_novedad_kardex'; //identificador de la tabla
    protected $id_names = array('id_novedad_kardex'); //llave primaria
    protected $field_names = array('id_tipo_doc', 'num_doc', 'id_tip_nov_ka', 'fecha_ini',
        'fecha_fin', 'num_dias', 'numero_doc', 'fecha_doc', 'observaciones', 'prorroga', 'num_dias_ant',
        'num_incapacidad', 'fecha_inc', 'id_periodo', 'estado', 'id_periodo_base'); //campos de la tabla, sin la llave primaria
    protected $table_name = 'NO_NOVEDAD_KARDEX'; //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_kardex'; //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;

    protected function validateAdd(sfWebRequest $request) {

        //valor por defecto
        $errors = null;

        /*
         * Variables request
         */
        $id_tipo_doc = $request['id_tipo_doc'];
        $num_doc = $request['num_doc'];
        $fecha_ini = $request['fecha_ini'];
        $fecha_fin = $request['fecha_fin'];
        $id_tip_nov_ka = $request['id_tip_nov_ka'];
        $num_dias = $request['num_dias'];

        /*
         * Validacion tope dias ANUAL - 20200309
         * Validar la operación, ya sea por SQL
         */

        $sql = <<<EOD
SELECT tab.* FROM (                        
    SELECT $num_dias as num_dias,
                  dias_habiles_cant('$fecha_ini','$fecha_fin') as dias_habiles,
                  tope_dias_anual as tope_dias_anual   
                  FROM NO_TIP_NOV_KA
                  WHERE id_tip_nov_ka=$id_tip_nov_ka
)tab              
EOD;
        $res = CN_TABLE::executeSQL($sql);

        $tope_max_anual = $res[0]['tope_dias_anual'];
        $dias_habiles = $res[0]['dias_habiles'];

        if ($tope_max_anual > 0) {
            if ($dias_habiles > $tope_max_anual) {
                $errors['mensaje'] = "Excede el tope maximo de días anual para la novedad de kardex en el rango ingresado, favor verificar.";
                $errors['servicio'] = "novedad_kardex";
            }
        }

        //Se coloca dias habiles campo nuevo - 20210818::LAVILA
        $sql = <<<EOD
SELECT tab.* FROM (                        
    SELECT
        sum(tab0.num_dias_habil)+dias_habiles_cant('$fecha_ini','$fecha_fin') as total,
        max(tab2.tope_dias_anual) as tope_dias_anual                    
    FROM no_novedad_kardex tab0
    LEFT JOIN NO_PERIODO_V tab1 ON tab0.id_periodo=tab1.id_periodo  
    LEFT JOIN NO_TIP_NOV_KA tab2 ON tab0.id_tip_nov_ka=tab2.id_tip_nov_ka    
    where
    tab0.id_tipo_doc = $id_tipo_doc
    and tab0.num_doc = $num_doc
    and tab0.id_tip_nov_ka = $id_tip_nov_ka   
    and tab1.id_anhos = EXTRACT(YEAR FROM sysdate) 
    and tab0.estado = 1
GROUP BY tab1.id_anhos                       
)tab              
EOD;
        $totalidad = CN_TABLE::executeSQL($sql);

        if (count($totalidad) > 0 && $tope_max_anual > 0) {
            $tope_max_anual = $totalidad[0]['tope_dias_anual'];
            $total = $totalidad[0]['total'];
            if ($total > $tope_max_anual) {
                $errors['mensaje'] = "Excede el tope maximo de días anual para la novedad de kardex en el rango ingresado, favor verificar.";
                $errors['servicio'] = "novedad_kardex";
            }
        }


        /*
         * Validacion tope dias - 20191105
         * Validar la operación, ya sea por SQL
         */
        $sql = <<<EOD
select
*
from(

    SELECT
    dias_habiles_cant('$fecha_ini','$fecha_fin') as dias_habiles,
    tope_dias
    FROM no_tip_nov_ka
    where
    id_tip_nov_ka = $id_tip_nov_ka 
    and tope_dias > 0

)

where
dias_habiles > tope_dias
EOD;
        $results = CN_TABLE::executeSQL($sql);

        if (count($results) > 0) {
            $errors['mensaje'] = "Excede el tope maximo de días para la novedad de kardex en el rango ingresado, favor verificar.";
            $errors['servicio'] = "novedad_kardex";
        }

        /*
         *  Validar la operación, ya sea por SQL
         */
        $sql = <<<EOD
SELECT
    *
FROM no_novedad_kardex

where
id_tipo_doc = $id_tipo_doc
and num_doc = $num_doc
and estado = 1
and (
    fecha_ini BETWEEN to_date('$fecha_ini','yyyy-mm-dd') and to_date('$fecha_fin','yyyy-mm-dd')
    or
    fecha_fin BETWEEN to_date('$fecha_ini','yyyy-mm-dd') and to_date('$fecha_fin','yyyy-mm-dd')
    or
    to_date('$fecha_ini','yyyy-mm-dd') BETWEEN fecha_ini and fecha_fin
    or
    to_date('$fecha_fin','yyyy-mm-dd') BETWEEN fecha_ini and fecha_fin
) 
EOD;
        $results = CN_TABLE::executeSQL($sql);


        /*
         *  Generar errores en $errors
         */
        if (count($results) > 0) {
            $errors['mensaje'] = "Ya existe una novedad de kardex en el rango ingresado, favor verificar.";
            $errors['servicio'] = "novedad_kardex";
        }

        /*
         *  Validar la operación, ya sea por SQL
         * Validar si tuvo nov con reintegro - 20210118
         */
        //vacaciones generales
        $sql = <<<EOD
SELECT
    nov.*
FROM no_novedad_vac nov

join no_tipo_nov_vac tip
on tip.id_tipo_nov_vac = nov.id_tipo_nov_vac

left join no_novedad_vac novrei
on novrei.num_doc = nov.num_doc
and novrei.id_tipo_doc = nov.id_tipo_doc
and novrei.fecha_ini = nov.fecha_ini
and novrei.fecha_fin = nov.fecha_fin
and novrei.id_tipo_nov_vac in (select id_tipo_nov_vac from no_tipo_nov_vac where operador = 0)


where
nov.id_tipo_doc = $id_tipo_doc
and nov.num_doc = $num_doc
and tip.operador = 1
and (
    nov.fecha_ini BETWEEN to_date('$fecha_ini','yyyy-mm-dd') and to_date('$fecha_fin','yyyy-mm-dd')
    or
    nov.fecha_fin BETWEEN to_date('$fecha_ini','yyyy-mm-dd') and to_date('$fecha_fin','yyyy-mm-dd')
    or
    to_date('$fecha_ini','yyyy-mm-dd') BETWEEN nov.fecha_ini and nov.fecha_fin
    or
    to_date('$fecha_fin','yyyy-mm-dd') BETWEEN nov.fecha_ini and nov.fecha_fin
)
and novrei.id_novedad_vac is null
EOD;
        $results = CN_TABLE::executeSQL($sql);

        /*
         *  Generar errores en $errors
         */
        if (count($results) > 0) {
            //si son de reintegro
            $sql = <<<EOD
SELECT
    nov.*
FROM no_novedad_vac nov

join no_tipo_nov_vac tip
on tip.id_tipo_nov_vac = nov.id_tipo_nov_vac

where
nov.id_tipo_doc = $id_tipo_doc
and nov.num_doc = $num_doc
and tip.operador = 0
and (
    to_date('$fecha_ini','yyyy-mm-dd') BETWEEN nov.fecha_ini and nov.fecha_fin
    or
    to_date('$fecha_fin','yyyy-mm-dd') BETWEEN nov.fecha_ini and nov.fecha_fin
)
EOD;
            $results = CN_TABLE::executeSQL($sql);

            if (count($results) == 0) {
                $errors['mensaje'] = "Ya existe una novedad de vacaciones en el rango ingresado, favor verificar.";
                $errors['servicio'] = "novedad_kardex";
            }
        }

        return $errors;
    }

    /**
     * Anulacion
     * 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;

        /*
         * Variables request
         */
        $id_novedad_kardex = $request['id_novedad_kardex'];

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


        $sql = <<<EOD
select * from no_novedad_kardex where id_novedad_kardex = $id_novedad_kardex
EOD;

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

        $id_periodo_novedad = $records[0]['id_periodo'];

        $sql = <<<EOD
            SELECT * FROM NO_PERIODO WHERE id_periodo = $id_periodo_novedad and estado = 1
EOD;
        $results = CN_TABLE::executeSQL($sql);
        /*
         *  Generar errores en $errors
         */

        if (count($results) == 0) {

            $errors['mensaje'] = "No es posible anular una novedad de un periodo anterior. favor verificar";
            $errors['servicio'] = "novedad_kardex";
        }

        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") {
            /*
             * Forzar formato de fecha para manejo en el postprocess - 20130918
             */
            $sql = <<<EOD
ALTER SESSION SET NLS_DATE_FORMAT = "YYYY-MM-DD"
EOD;
            CN_TABLE::executeSQL($sql);
        }

        //accion update
        if ($Action == "UPDATE") {
            /*
             * Forzar formato de fecha para manejo en el postprocess - 20130918
             */
            $sql = <<<EOD
ALTER SESSION SET NLS_DATE_FORMAT = "YYYY-MM-DD"
EOD;
            CN_TABLE::executeSQL($sql);
        }

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

        return $request;
    }

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

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

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

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

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

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

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

                $id_novedad_kardex = $list_data_post[0]['id_novedad_kardex'];
                $id_tipo_doc = $list_data_post[0]['id_tipo_doc'];
                $num_doc = $list_data_post[0]['num_doc'];
                $fecha_ingre_orig = $fecha_ingre = $list_data_post[0]['fecha_ini'];
                $fecha_hasta = $list_data_post[0]['fecha_fin'];
                $id_tip_nov_ka = $list_data_post[0]['id_tip_nov_ka'];
                $id_periodo = $list_data_post[0]['id_periodo'];
                $num_dias = $list_data_post[0]['num_dias'];
                $prorroga = $list_data_post[0]['prorroga'];
                $id_periodo_base = $list_data_post[0]['id_periodo_base'];

                $dias_liqui = 0;

                $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'];
                $fecha_ini_periodo = $results[0]['fecha_ini'];
                $fecha_fin_periodo = $results[0]['fecha_fin'];

                //Actualiza num_dias_habil - 20210818::LAVILA
                $sql = <<<EOD
update no_novedad_kardex set num_dias_habil = dias_habiles_cant(to_char(FECHA_INI,'yyyy-mm-dd'),to_char(FECHA_FIN,'yyyy-mm-dd')) 
    where id_novedad_kardex = $id_novedad_kardex 
EOD;
                $this->conn->execute($sql);

                //tipo de nov ka
                $sql = <<<EOD
SELECT tab.*, nvl((select distinct id_nov_ka_licmat from no_param_concep),0) as id_nov_ka_licmat 
    FROM NO_TIP_NOV_KA tab WHERE tab.ID_TIP_NOV_KA = $id_tip_nov_ka 
EOD;

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

                $dias_patrono = $results[0]['dias_patrono'];
                $causa_liqui = $results[0]['causa_liquidacion'];
                $afecta_antigu = $results[0]['afecta_antigu'];
                $afecta_alimen = $results[0]['afecta_alimen'];

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

                //Si causa liquidacion
                if ($causa_liqui) {
                    /*
                     * Si tiene prorroga no descuenta dias de patrono
                     */
                    if ($prorroga) {
                        $num_dias_reales = $num_dias;
                        $dias_patrono = 0;
                    } else {

                        $num_dias_reales = $num_dias - $dias_patrono;
                        if ($num_dias_reales < 0) {
                            $num_dias_reales = 0;
                        }

                        /*
                         * Validar dias patrono para descontar - 20141016
                         * Los dias del patrono no pueden ser mayores a los de la inc - 20151123
                         */

                        $logger->info("Validar dias patrono para descontar. num_dias = " . $num_dias . " - dias_patrono = " . $dias_patrono);
                        if ($num_dias >= $dias_patrono) {
                            $dias_patrono = $dias_patrono;
                        } else {
                            $dias_patrono = $num_dias;
                        }
                    }

                    /**
                     * 
                     */
                    if (true) {

                        $logger->info("INICIO :: Incapacidades Kardex - Causan Liquidación");

                        /*
                         * Dias entre el inicio de la novedad y el ultimo dia del mes en el periodo liquidado
                         * Dias per correr fecha de dias patrono - 20141016
                         * Dias de 31 de meses anteriores - 20190411
                         * En dias_treintauno_ant valida que la fecha sea segun la fecha ini o el ultimo dia ultimo del mes anterior del periodo de registro - 20190912
                         */
                        $sql = <<<EOD
select 

case when (select fecha_fin from no_periodo where id_periodo =  $id_periodo) <= to_date('$fecha_hasta','yyyy-mm-dd') 
  then (select fecha_fin from no_periodo where id_periodo =  $id_periodo) - to_date('$fecha_ingre','yyyy-mm-dd') + 1 
  else to_date('$fecha_hasta','yyyy-mm-dd') - to_date('$fecha_ingre','yyyy-mm-dd') + 1 end as dia_inc,
dias_rango_mes_sin_treintayuno(to_date('$fecha_ingre','yyyy-mm-dd')+$dias_patrono,to_date('$fecha_hasta','yyyy-mm-dd'),
    (select id_meses from no_periodo where id_periodo =  $id_periodo)) as dia_per,--dias en el periodo   
                                
dias_rango_mes_sin_treintayuno(to_date('$fecha_ingre','yyyy-mm-dd'),to_date('$fecha_hasta','yyyy-mm-dd'),
    (select id_meses from no_periodo where id_periodo =  $id_periodo)) as dia_per_patrono,--dias en el periodo con patrono 
                                
(to_date('$fecha_hasta','yyyy-mm-dd') - to_date('$fecha_ingre','yyyy-mm-dd') + 1) - fecha_rango_sin_treintayuno(to_date('$fecha_ingre','yyyy-mm-dd'), to_date('$fecha_hasta','yyyy-mm-dd')) as dias_treintauno,

case when to_date('$fecha_ingre','yyyy-mm-dd') < (select fecha_ini-1 from no_periodo where id_periodo =  $id_periodo) 
    then 
    ( case when (select fecha_ini-1 from no_periodo where id_periodo =  $id_periodo) < (to_date('$fecha_hasta','yyyy-mm-dd')) 
        then (select fecha_ini-1 from no_periodo where id_periodo =  $id_periodo) 
        else to_date('$fecha_hasta','yyyy-mm-dd') end 
        - to_date('$fecha_ingre','yyyy-mm-dd') + 1) 
    - 
    fecha_rango_sin_treintayuno(to_date('$fecha_ingre','yyyy-mm-dd'), case when (select fecha_ini-1 from no_periodo where id_periodo =  $id_periodo) < (to_date('$fecha_hasta','yyyy-mm-dd')) 
                                                                    then (select fecha_ini-1 from no_periodo where id_periodo =  $id_periodo) 
                                                                    else to_date('$fecha_hasta','yyyy-mm-dd') end) 
    else 0 end as dias_treintauno_ant,                                 
                                
fecha_rango_sin_treintayuno(to_date('$fecha_ingre','yyyy-mm-dd'), to_date('$fecha_hasta','yyyy-mm-dd')) as dias_sin,
to_date('$fecha_hasta','yyyy-mm-dd') - to_date('$fecha_ingre','yyyy-mm-dd') + 1 as dias_completos
                                
from dual   
EOD;

                        $results = CN_TABLE::executeSQL($sql);
                        //dias
                        $dia_inc = $results[0]['dia_inc'];
                        $dia_per = $results[0]['dia_per'];
                        $dia_per_patrono = $results[0]['dia_per_patrono'];
                        $dias_treintauno = $results[0]['dias_treintauno'];

                        //Dias de 31 de meses anteriores, verificacion de dias del periodo - 20190411 $dia_ant_mes = $dia_inc - $dia_per;                        
                        /*
                         * Incidente #38885, validacion pra descontar dias anteriores del mes si aplica segun fechas de novedad, 
                         * no para todos los casos se debe restar, conceptos 1005 y 1006, se hace en el SQL con dia_per_patrono  - 20241018::LAVILA
                         */
                        $dia_ant_mes = $dia_inc - $dia_per_patrono;
                        $dia_patrono_per = $dias_patrono - $dia_ant_mes;
                        $dias_treintauno_ant = 0; //Se retira ya que se hace en el SQL quitar el dia 31 segun rango de fecha - 20220613::LAVILA $results[0]['dias_treintauno_ant'];
                        if ($dia_patrono_per < 0) {
                            $dia_patrono_per = 0;
                        }

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

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

                        $asignacion_basica = $valor_base;

                        /**
                         * Incidente #4274, validacion para base minima segun 1 dia de salario - 20161027
                         */
                        $sql = <<<EOD
select * from no_smdlv where vigencia = $id_anhos 
EOD;

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


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

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

                        foreach ($results as $conceptos) {

                            $id_concep_nomina = $conceptos['id_concep_nomina'];
                            $dia_inc = $dia_inc - $dias_patrono;

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



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


                            /**
                             * Actualiza la fecha y dias de concepto_periodo de acuerdo a la novedad
                             * Se cambia por conceptos que aplica_novka - 20150309
                             * Valida que solo se resta a un registro por concepto, que se puedan quitar los dias de la novedad - 20150310
                             * Valida cuando es febrero onga los dias de meses de 30 - 20200213
                             */
                            $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO tab set tab.fecha_desde = tab.fecha_desde + $dia_per, tab.num_dias = ( tab.num_dias - $dia_per ) 
    where tab.id_tipo_doc = $id_tipo_doc and tab.num_doc = $num_doc 
        and tab.periodo = $id_periodo and tab.id_concep_nomina in (select no_concep_nomina.id_concep_nomina from no_concep_nomina where no_concep_nomina.aplica_novka = 1)
        
        and tab.id_concepto_periodo in ( 
            select distinct /*aux.rn,*/ aux.id_concepto_periodo from (
                select                
                dias_rango_mes_sin_treintayuno( tabper.fecha_desde, tabper.fecha_hasta , (select id_meses from no_periodo where id_periodo = $id_periodo) ) as dd,
                tabper.*, row_number() over ( partition by tabper.id_concep_nomina order by tabper.id_concep_nomina asc, tabper.fecha_desde asc) rn  
                from NO_CONCEPTO_PERIODO tabper
                where tabper.id_tipo_doc = $id_tipo_doc and tabper.num_doc = $num_doc 
                and tabper.periodo = $id_periodo and tabper.id_concep_nomina in (select no_concep_nomina.id_concep_nomina from no_concep_nomina where no_concep_nomina.aplica_novka = 1)
                and ( case when dias_rango_mes_sin_treintayuno( tabper.fecha_desde, tabper.fecha_hasta , (select id_meses from no_periodo where id_periodo = $id_periodo) ) + 
                (case when extract(month from tabper.fecha_hasta) = 2 and to_char(tabper.fecha_hasta,'dd') = 29 then 1 
                      when extract(month from tabper.fecha_hasta) = 2 and to_char(tabper.fecha_hasta,'dd') = 28 then 2 else 0 end) - $dia_per >= 0 then 1 else 0 end ) = 1
            )aux
            where aux.rn = 1
        ) 
EOD;
                            $this->conn->execute($sql);

//                            $sql = <<<EOD
//UPDATE NO_CONCEPTO_PERIODO tab set tab.num_dias = ( tab.num_dias - $dia_per )
//    where tab.id_tipo_doc = $id_tipo_doc and tab.num_doc = $num_doc 
//        and tab.periodo = $id_periodo and tab.id_concep_nomina in (select no_concep_nomina.id_concep_nomina from no_concep_nomina where no_concep_nomina.aplica_novka = 1)
//                                            
//        and tab.id_concepto_periodo in ( 
//            select distinct /*aux.rn,*/ aux.id_concepto_periodo from (
//                select                
//                dias_rango_mes_sin_treintayuno( tabper.fecha_desde, tabper.fecha_hasta , (select id_meses from no_periodo where id_periodo = $id_periodo) ) as dd,
//                tabper.*, row_number() over ( partition by tabper.id_concep_nomina order by tabper.id_concep_nomina asc, tabper.fecha_desde asc) rn  
//                from NO_CONCEPTO_PERIODO tabper
//                where tabper.id_tipo_doc = $id_tipo_doc and tabper.num_doc = $num_doc 
//                and tabper.periodo = $id_periodo and tabper.id_concep_nomina in (select no_concep_nomina.id_concep_nomina from no_concep_nomina where no_concep_nomina.aplica_novka = 1)
//                and ( case when dias_rango_mes_sin_treintayuno( tabper.fecha_desde, tabper.fecha_hasta , (select id_meses from no_periodo where id_periodo = $id_periodo) ) - $dia_per >= 0 then 1 else 0 end ) = 1
//            )aux
//            where aux.rn = 1
//        ) 
//EOD;
//                            $this->conn->execute($sql);


                            /**
                             * Si aplica concepto de Auxilio de Trasporte y Subsidio de Alimentación 
                             * se realiza tambien el reintegro. - 20131115
                             * Incidente #39358, se retira de los ajustes de dias al concepto 1011 - 20250210::LAVILA
                             */
                            //VERIFICAR SI SE ADICIONA CONCEPTOS ASOCIADOS A LA ASIGNACION BASICA
                            $sql = <<<EOD
SELECT * FROM NO_CONCEP_AB WHERE ESTADO = 1 and rango_maximo > 1 
EOD;
                            $results = CN_TABLE::executeSQL($sql);

                            if (count($results) > 0) {

                                /**
                                 * Para los dias de patrono si se deben descontar en Auxilio de Trasporte y Subsidio de Alimentación - 20141112
                                 * Se cambia para que solo sume los dias de patrono al iniciar el recorrido de concepto AB, y no por cada uno - 20150123
                                 */
                                //$dia_per = $dia_per + $dias_patrono;//20190411
                                $dia_per = $dia_per + $dia_patrono_per;

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

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

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

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


                        /**
                         * Reintegros
                         * Se deben generar conceptos de reintegro de los 
                         * conceptos de devengados para los días de la novedad que correspondan a meses anteriores.
                         */
                        $logger->info("Incapacidades Kardex - Causan Liquidación - Reintregos");

                        //1) Traigo los periodos que afecta la novedad
                        $sql = <<<EOD
select 

tab0.*

 from no_periodo tab0 
 where 
 tab0.id_tipo_periodo = 1 
 and (
   tab0.id_anhos || lpad(tab0.id_meses,2,'0') >=  to_char(to_date('$fecha_ingre_orig','yyyy-mm-dd'),'yyyy') || to_char(to_date('$fecha_ingre_orig','yyyy-mm-dd'),'mm')
   and 
   tab0.id_anhos || lpad(tab0.id_meses,2,'0') <=  to_char(to_date('$fecha_hasta','yyyy-mm-dd'),'yyyy') || to_char(to_date('$fecha_hasta','yyyy-mm-dd'),'mm')
 )
 and tab0.id_anhos || lpad(tab0.id_meses,2,'0') < (select id_anhos || lpad(id_meses,2,'0') from no_periodo where id_periodo = $id_periodo)
 order by tab0.fecha_fin 
EOD;

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

                        $dias_patrono_orig = $dias_patrono;
                        $dias_patrono_orig_ab = $dias_patrono;
                        //recorre cada periodo
                        foreach ($results as $periodos) {

                            $periodo_reint = $periodos['id_periodo'];

                            /**
                             * Obtine los datos de no_concepto_periodo para el concepto de asignacion basica, del periodo base
                             */
                            $sql = <<<EOD
select 
rownum as rn,
case when to_date('$fecha_ingre_orig','yyyy-mm-dd') >= tab0.fecha_desde then to_date('$fecha_ingre_orig','yyyy-mm-dd') else tab0.fecha_desde end as fecha_liqui_ini,
case when to_date('$fecha_hasta','yyyy-mm-dd') <= tab0.fecha_hasta then to_date('$fecha_hasta','yyyy-mm-dd') else tab0.fecha_hasta end as fecha_liqui_fin,
dias_rango_mes_sin_treintayuno(to_date('$fecha_ingre_orig','yyyy-mm-dd'),to_date('$fecha_hasta','yyyy-mm-dd'), tab0.id_meses ) as dias_liqui,
tab0.*
    from no_concepto_periodo tab0
where 
    tab0.id_tipo_doc = $id_tipo_doc and tab0.num_doc = $num_doc 
    and tab0.periodo = $periodo_reint and tab0.id_concep_nomina = $id_concep_nomina_asig    
    and rownum = 1
EOD;

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

                            foreach ($records as $asigna) {

                                $fecha_liqui_ini = $asigna['fecha_liqui_ini'];
                                $fecha_liqui_fin = $asigna['fecha_liqui_fin'];
                                $num_dias = $asigna['num_dias'];
                                $dias_liqui = $asigna['dias_liqui'];
                                $valor_liqui = $asigna['valor'];
                                $asignacion_basica = $valor_liqui;

                                $logger->info("Incapacidades Kardex. dias_liqui = " . $dias_liqui . " - dias_patrono_orig = " . $dias_patrono_orig);
                                //valida que se puedan restar los dias - valida valor negativo de dias
                                if (($dias_liqui - $dias_patrono_orig) >= 0) {
                                    $dias_liqui = $dias_liqui - $dias_patrono_orig; //resta dias patrono en el primer reintegro que pueda
                                    $dias_patrono_orig = 0;
                                } else {
                                    //Primero se descuenta dias patrono ya aplicados - 20151123
                                    $dias_patrono_orig = $dias_patrono_orig - $dias_liqui;
                                    $dias_liqui = 0;
                                }
                                if (($dias_liqui ) >= 0) {
                                    /**
                                     * Para los dias de patrono si se deben descontar en Auxilio de Trasporte y Subsidio de Alimentación - 20141112 
                                     * NOM-129 <-> Se agregan dias de patrono para los conceptos de AB - 20150520
                                     * Restar dias 31 anteriores - 20190411
                                     */
                                    $dias_liqui_ab = $dias_liqui + $dias_patrono_orig_ab - $dias_treintauno_ant;
                                    $dias_patrono_orig_ab = 0;
                                } else {
                                    $dias_liqui_ab = 0;
                                    $dias_patrono_orig_ab = $dias_patrono_orig_ab - $dias_liqui;
                                }

                                /*
                                 * CREO EL REGISTRO DE REINTEGRO DE ASIGNACION BASICA
                                 * Se cambia id-401 quemado por codigo de concepto 4001 - 20130909
                                 */
                                $sql = <<<EOD
INSERT INTO NO_CONCEPTO_PERIODO (ID_ANHOS,ID_MESES,PERIODO,ID_TIPO_DOC,NUM_DOC,ID_CONCEP_NOMINA,FECHA_DESDE,FECHA_HASTA,NUM_DIAS,VALOR)
    VALUES($id_anhos,$id_meses,$id_periodo,$id_tipo_doc,$num_doc,(select id_concep_nomina from no_concep_nomina where codigo = '4001'),
        to_date('$fecha_ingre_orig','YYYY-MM-DD'),to_date('$fecha_hasta','YYYY-MM-DD'),$dias_liqui,$valor_liqui)
EOD;
                                $this->conn->execute($sql);



                                /*
                                 * Se actualiza conceptos aplica_novka diferentes a la asig_basica, 
                                 * valida que poseea activo este concepto segun concep_periodo - 20150309
                                 * Se colocal and ( nvl(tab0.num_dias,-1) != 0) para pasar conceptos con dias diferentes a 0 - 20150324
                                 * Se valida que el valor sea null - 20160218
                                 */
                                $sql = <<<EOD
select 
rownum as rn,
case when to_date('$fecha_ingre_orig','yyyy-mm-dd') >= tab0.fecha_desde then to_date('$fecha_ingre_orig','yyyy-mm-dd') else tab0.fecha_desde end as fecha_liqui_ini,
case when to_date('$fecha_hasta','yyyy-mm-dd') <= tab0.fecha_hasta then to_date('$fecha_hasta','yyyy-mm-dd') else tab0.fecha_hasta end as fecha_liqui_fin,
dias_rango_mes_sin_treintayuno(to_date('$fecha_ingre_orig','yyyy-mm-dd'),to_date('$fecha_hasta','yyyy-mm-dd'), tab0.id_meses ) as dias_liqui,
tab0.ID_CONCEPTO_PERIODO,
tab0.ID_ANHOS,
tab0.ID_MESES,
tab0.PERIODO,
tab0.ID_TIPO_DOC,
tab0.NUM_DOC,
tab0.ID_CONCEP_NOMINA,
tab0.FECHA_DESDE,
tab0.FECHA_HASTA,
nvl(tab0.VALOR,0) as valor,
nvl(tab0.PORCENTAJE,0) as PORCENTAJE,
tab0.NUM_DIAS,
tab0.ID_PERIODO_AJUSTE,
(select distinct no_concep_nomina.id_concep_rein from no_concep_nomina where no_concep_nomina.id_concep_nomina = tab0.id_concep_nomina ) as concep_reint
    from no_concepto_periodo tab0
where 
    tab0.id_tipo_doc = $id_tipo_doc and tab0.num_doc = $num_doc 
    and tab0.periodo = $periodo_reint and tab0.id_concep_nomina != $id_concep_nomina_asig  
    and tab0.id_concep_nomina in (select distinct no_concep_nomina.id_concep_nomina from no_concep_nomina where no_concep_nomina.aplica_novka = 1)
    and (select distinct no_concep_nomina.id_concep_rein from no_concep_nomina where no_concep_nomina.id_concep_nomina = tab0.id_concep_nomina ) is not null
    and ( nvl(tab0.num_dias,-1) != 0)
    and rownum = 1 
EOD;

                                $records = CN_TABLE::executeSQL($sql);
                                //crea registro por cada concepto 
                                foreach ($records as $concepto_novka) {
                                    //$num_dias = $concepto_novka['num_dias'];
                                    //$dias_liqui = $concepto_novka['dias_liqui'];
                                    $valor_liqui = $concepto_novka['valor'];
                                    $porcentaje = $concepto_novka['porcentaje'];
                                    $concep_reint = $concepto_novka['concep_reint'];

                                    /*
                                     * registro nuevo de reintegro segun campo aplica_novka - 20150309
                                     */
                                    $sql = <<<EOD
INSERT INTO NO_CONCEPTO_PERIODO (ID_ANHOS,ID_MESES,PERIODO,ID_TIPO_DOC,NUM_DOC,ID_CONCEP_NOMINA,FECHA_DESDE,FECHA_HASTA,NUM_DIAS,VALOR,PORCENTAJE)
    VALUES($id_anhos,$id_meses,$id_periodo,$id_tipo_doc,$num_doc,$concep_reint,
        to_date('$fecha_ingre_orig','YYYY-MM-DD'),to_date('$fecha_hasta','YYYY-MM-DD'),$dias_liqui,$valor_liqui,$porcentaje)
EOD;
                                    $this->conn->execute($sql);
                                }



                                /**
                                 * Si aplica concepto de Auxilio de Trasporte y Subsidio de Alimentación 
                                 * se realiza tambien el reintegro. - 20131115
                                 * Incidente #39358, se retira de los ajustes de dias al concepto 1011 - 20250210::LAVILA
                                 */
                                //VERIFICAR SI SE ADICIONA CONCEPTOS ASOCIADOS A LA ASIGNACION BASICA
                                $sql = <<<EOD
SELECT 
nvl( (select id_concep_rein from no_concep_nomina where no_concep_nomina.id_concep_nomina = conab.id_concep_nomina  ), 
    conab.id_concep_nomina) as id_concep_rein,
conab.*
FROM NO_CONCEP_AB conab
WHERE conab.ESTADO = 1 and conab.rango_maximo > 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_rein'];
                                        $valor_fijo = $conceptos['valor_fijo'];

                                        /**
                                         * Valida rango de valores para aplicar el concepto
                                         */
                                        if ($asignacion_basica >= $rango_minimo && $asignacion_basica <= $rango_maximo) {

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

                                            $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_orig','YYYY-MM-DD'),
        to_date('$fecha_hasta','YYYY-MM-DD'), $valor_fijo, $dias_liqui_ab )
EOD;
                                            $this->conn->execute($sql);
                                        }
                                    }
                                }
                            }
                        }


                        $logger->info("FIN :: Incapacidades Kardex - Causan Liquidación");
                    }
                } else {
                    //Si afecta antiguedad
                    if ($afecta_antigu) {

                        $date1 = new DateTime($fecha_fin_periodo);
                        $date2 = new DateTime($fecha_hasta);
                        $fecha_fin_periodo = explode(' ', $fecha_fin_periodo);
                        $fecha_fin_periodo = $fecha_fin_periodo[0];
                        $fecha_ini_periodo = explode(' ', $fecha_ini_periodo);
                        $fecha_ini_periodo = $fecha_ini_periodo[0];

                        /**
                         * Validacion de la fecha final de la novedad KA menor a la fecha final del periodo
                         */
                        $logger->info($fecha_hasta . " < " . $fecha_fin_periodo);
                        if ($date2 <= $date1) {

                            /**
                             * Validar que no se resten mas de 30 dias de un mes - 20130820
                             * Se valida que no quite dias a deducidos de no ley id-3 - 20150707
                             * Incidente #38406, validacion para solo registros del periodo, no ajustes o reintegros - 20240708::LAVILA
                             */
                            if ($num_dias >= 30) {
                                $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO tab set tab.num_dias = 0
    where tab.id_tipo_doc = $id_tipo_doc and tab.num_doc = $num_doc and tab.periodo = $id_periodo 
    and ( select con.id_tipo_concepto from no_concep_nomina con where con.id_concep_nomina = tab.id_concep_nomina ) != 3
    and tab.fecha_desde >= to_date('$fecha_ini_periodo','YYYY-MM-DD')
EOD;
                            } else {
                                /*
                                 * Se verifica que reste segun fechas sin dia 31 - 20220518::LAVILA
                                 * UPDATE NO_CONCEPTO_PERIODO tab set tab.num_dias = tab.num_dias - $num_dias
                                 * Se cambia $fecha_fin_periodo por $fecha_hasta, por erorr se coloco la que no era  - 20220616::LAVILA
                                 * Incidente #38406, validacion para solo registros del periodo, no ajustes o reintegros - 20240708::LAVILA
                                 */
                                $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO tab set tab.num_dias = tab.num_dias - (FECHA_RANGO_SIN_TREINTAYUNO( to_date('$fecha_ingre','yyyy-mm-dd'), to_date('$fecha_hasta','yyyy-mm-dd')))
    where tab.id_tipo_doc = $id_tipo_doc and tab.num_doc = $num_doc and tab.periodo = $id_periodo 
    and ( select con.id_tipo_concepto from no_concep_nomina con where con.id_concep_nomina = tab.id_concep_nomina ) != 3
    and tab.fecha_desde >= to_date('$fecha_ini_periodo','YYYY-MM-DD') 
EOD;
                            }
                        } else {

                            /**
                             * ID-8 12-Comisión de Servicio Otra Entidad, se verifica que si tiene una novedad personal con la misma fecha, no genere de nuevo cambios en dias - 20240718::LAVILA
                             */
                            $sql = <<<EOD
select
*
from no_novedad_personal 
where id_novedad = 8
and id_tipo_doc = $id_tipo_doc and num_doc = $num_doc
and estado = 1
and fecha_inicial = to_date('$fecha_ingre','yyyy-mm-dd') 
EOD;
                            $results = CN_TABLE::executeSQL($sql);
                            if (count($results) == 0) {
                                /**
                                 * Se cambia para que reste los dias completos, y meses de 30
                                 * (num_dias - ( to_date('$fecha_fin_periodo','yyyy-mm-dd') - to_date('$fecha_ingre','yyyy-mm-dd'))) - 20150605
                                 * Se valida que no quite dias a deducidos de no ley id-3 - 20150707
                                 * Incidente #38406, validacion para solo registros del periodo, no ajustes o reintegros - 20240708::LAVILA
                                 */
                                $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO tab set tab.num_dias = tab.num_dias - (FECHA_RANGO_SIN_TREINTAYUNO( to_date('$fecha_ingre','yyyy-mm-dd'), to_date('$fecha_fin_periodo','yyyy-mm-dd')))
    where tab.id_tipo_doc = $id_tipo_doc and tab.num_doc = $num_doc and tab.periodo = $id_periodo
    and ( select con.id_tipo_concepto from no_concep_nomina con where con.id_concep_nomina = tab.id_concep_nomina ) != 3
    and tab.fecha_desde >= to_date('$fecha_ini_periodo','YYYY-MM-DD') 
EOD;
                            } else {
                                $sql = <<<EOD
update no_log set id_tabla = '' where id_log = 1 
EOD;
                            }
                        }

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


                        /*
                         * CUANDO LA NOVEDAD AFECTE ANTIGUEDAD, EL PERIODO DE CAUSACION DE VACACIONES SE AMPLIA
                         * CEV::Se deja que tambien aumente la fecha ini segun dias como la fecha_fin, a solicitud Gloria Amparo por manejo para personas retiradas - 20220623::LAVILA, Se quita cambio - 20220628::LAVILA
                         */
                        $sql = <<<EOD
select tab0.*
from no_causa_vacac tab0
where tab0.num_doc = $num_doc and tab0.fecha_ini<=to_date('$fecha_ini_periodo','YYYY-MM-DD') 
and tab0.fecha_fin>=to_date('$fecha_fin_periodo','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 + $num_dias  
    where id_causa_vacac = $id_causa_vacac
EOD;

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


                        /*
                         * CUANDO LA NOVEDAD AFECTE ANTIGUEDAD, LA FECHA DE BONIFICACION DE SERVICIOS SE MODIFICA
                         * Se actualiza, para que si bonifica el mismo mes de la novedad nueva correctamente las fechas y desactive en el periodo de liq - 20150714
                         */
                        $id_bonifica_servicios_inac = 0;
                        //Traer la bonificacion inactiva
                        $sql = <<<EOD
SELECT 
EXTRACT(month FROM tab.FECHA_BONIFICA) as mes_ant,
EXTRACT(month FROM tab.FECHA_BONIFICA + $num_dias) as mes_des,
tab.FECHA_BONIFICA + $num_dias as fecha_des,
tab.* 
FROM NO_BONIFICA_SERVICIOS tab
where tab.num_doc = $num_doc and tab.estado = 0 
order by
tab.FECHA_BONIFICA desc 
EOD;

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

                            $id_bonifica_servicios_inac = $records_inac[0]['id_bonifica_servicios'];
                        }


                        //Traer la bonificacion activa
                        $sql = <<<EOD
SELECT 
EXTRACT(month FROM tab.FECHA_BONIFICA) as mes_ant,
EXTRACT(month FROM tab.FECHA_BONIFICA + $num_dias) as mes_des,
tab.FECHA_BONIFICA + $num_dias as fecha_des,
tab.* 
FROM NO_BONIFICA_SERVICIOS tab
where tab.num_doc = $num_doc and tab.estado = 1 
order by
tab.FECHA_BONIFICA desc 
EOD;

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

                        //Validar registros
                        if (count($records) > 0) {

                            $id_bonifica_servicios = $records[0]['id_bonifica_servicios'];
                            $mes_ant = $records[0]['mes_ant'];
                            $mes_des = $records[0]['mes_des'];
                            $id_periodo_bonif = $records[0]['id_periodo'];

                            $date1 = new DateTime($fecha_ingre_orig);
                            $date2 = new DateTime($records[0]['fecha_ingresa']);

                            //validar fechas
                            if ($date1 >= $date2) {
                                //Si la fecha_ini de la bonif activa es mayor a la fecha_ingresa de la novedad de kardex
                                $sql = <<<EOD
UPDATE NO_BONIFICA_SERVICIOS set fecha_bonifica = fecha_bonifica + $num_dias 
    where num_doc = $num_doc and estado = 1 
EOD;

                                $this->conn->execute($sql);
                            } else if ($date1 < $date2) {

                                //si es el mismo mes
                                if ($mes_ant == $mes_des) {
                                    //corre dias del ultimo registro inactivo
                                    $sql = <<<EOD
UPDATE NO_BONIFICA_SERVICIOS set fecha_bonifica = fecha_bonifica + $num_dias 
    where num_doc = $num_doc and estado = 0 and id_bonifica_servicios = $id_bonifica_servicios_inac   
EOD;

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


                                    //corre los dias del activo
                                    $sql = <<<EOD
UPDATE NO_BONIFICA_SERVICIOS set fecha_bonifica = fecha_bonifica + $num_dias, fecha_ingresa = fecha_ingresa + $num_dias  
    where num_doc = $num_doc and estado = 1 
EOD;

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

                                    //del mismo periodo mensual
                                    if ($id_periodo == $id_periodo_bonif) {
                                        //borra concepto periodo del mes mensual actual
                                        $sql = <<<EOD
delete from NO_CONCEPTO_PERIODO tab
    where tab.id_tipo_doc = $id_tipo_doc and tab.num_doc = $num_doc and tab.periodo = $id_periodo 
    and tab.id_concep_nomina = ( SELECT ID_CONCEP_BONIF FROM NO_PARAM_CONCEP  where ID_PARAM_CONCEP = 1 ) 
EOD;
                                        $this->conn->execute($sql);


                                        //borrar registro si es del periodo nuevo, de la novedad 
                                        $sql = <<<EOD
delete from NO_BONIFICA_SERVICIOS 
    where num_doc = $num_doc and estado = 1 and id_periodo = $id_periodo 
EOD;

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

                                        //activa el ultimo registro inactivo
                                        $sql = <<<EOD
UPDATE NO_BONIFICA_SERVICIOS set fecha_bonifica = fecha_bonifica + $num_dias, estado = 1  
    where num_doc = $num_doc and estado = 0 and id_bonifica_servicios = $id_bonifica_servicios_inac   
EOD;

                                        $this->conn->execute($sql);
                                    } else {
                                        //corre dias del ultimo registro inactivo
                                        $sql = <<<EOD
UPDATE NO_BONIFICA_SERVICIOS set fecha_bonifica = fecha_bonifica + $num_dias 
    where num_doc = $num_doc and estado = 0 and id_bonifica_servicios = $id_bonifica_servicios_inac   
EOD;

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

                                        //corre los dias del activo
                                        $sql = <<<EOD
UPDATE NO_BONIFICA_SERVICIOS set fecha_bonifica = fecha_bonifica + $num_dias, fecha_ingresa = fecha_ingresa + $num_dias  
    where num_doc = $num_doc and estado = 1 
EOD;

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


                /**
                 * Crear
                 * Revisando las incapacidades registradas y verificando a cada uno de los funcionarios, 
                 * me doy cuenta que no se le está descontando el numero de días de la incapacidad a las 
                 * personas que tiene subsidio de alimentación y transporte. -- 20140910
                 */
                //Si afecta alimentacion y No causa liquidacion o antiguedad
                if (!$causa_liqui && !$afecta_antigu && $afecta_alimen) {

                    /**
                     * salario
                     */
                    $sql = <<<EOD
select nvl(valor,0) as valor from no_concepto_func 
where num_doc = $num_doc 
and actual = 1 and estado = 1
and id_concep_nomina = (select no_param_concep.id_concep_basica from no_param_concep)
EOD;
                    $results = CN_TABLE::executeSQL($sql);

                    $asignacion_basica = $results[0]['valor'];

                    //VERIFICAR SI SE ADICIONA CONCEPTOS ASOCIADOS A LA ASIGNACION BASICA
                    //Se omite concepto de CONECTIVIDAD - 20200710
                    $sql = <<<EOD
SELECT 
concep.* 
FROM NO_CONCEP_AB  concep
left join no_concep_nomina nom on concep.id_concep_nomina = nom.id_concep_nomina
WHERE concep.ESTADO = 1
and upper(nom.descripcion) not like '%CONECTIVIDAD%' 
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'];

                            if ($asignacion_basica >= $rango_minimo && $asignacion_basica <= $rango_maximo) {

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

                                //valida si es dentro del periodo la novedad de kardex
                                $date1 = new DateTime($fecha_ini_periodo);
                                $date2 = new DateTime($fecha_hasta);
                                if ($date2 < $date1) {
                                    //inserta reintegro
                                    //Modificacion para que tome el valor de concepto periodo de la novedad segun su fecha - 20160217
                                    $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_nomina  from no_concep_nomina where id_concep_nomina = $id_concep_ab),
        to_date('$fecha_ingre_orig','YYYY-MM-DD'),to_date('$fecha_hasta','YYYY-MM-DD'),
            nvl( (select min(valor) as valor from no_concepto_periodo
where
id_concep_nomina = $id_concep_ab
and num_doc = $num_doc
and id_tipo_doc = $id_tipo_doc
and id_anhos = to_char(to_date('$fecha_ingre_orig','YYYY-MM-DD'), 'YYYY')
and id_meses = to_char(to_date('$fecha_ingre_orig','YYYY-MM-DD'), 'mm')) , $valor_fijo),
        
        $num_dias )
EOD;
                                    $this->conn->execute($sql);
                                } else {

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

                /**
                 * Incidente #33581,dejar en vacante temporal - 20221230::LAVILA
                 * Incidente #38287, Se retira que modifique el titular, solo el encargado se deja 
                 *  titular = (case when titular = '$num_doc' then '' else titular end), - 20240620::LAVILA
                 */
                $sql = <<<EOD
SELECT 
tab.*, 
nvl((select distinct id_nov_ka_licnorem from no_param_concep),0) as id_nov_ka_licnorem,
est.id_dp

FROM NO_TIP_NOV_KA tab 

left join no_estado_func_v est
on est.num_doc = '$num_doc'
and est.actual = 1
and est.periodo = $id_periodo

WHERE tab.ID_TIP_NOV_KA = $id_tip_nov_ka
EOD;
                $results = CN_TABLE::executeSQL($sql);

                if (count($results) > 0) {

                    $id_nov_ka_licnorem = $results[0]['id_nov_ka_licnorem'];
                    $id_dp = $results[0]['id_dp'];

                    if ($id_tip_nov_ka == $id_nov_ka_licnorem) {
                        $sql = <<<EOD
update rh_dp set encargado = (case when encargado = '$num_doc' then '' else encargado end)   
where id_dp = $id_dp
EOD;
                        $this->conn->execute($sql);
                    }
                }

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

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

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

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

                //Solo para cuando es anulado - 20190509
                if ($list_data_post[0]['estado'] == 0) {

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

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

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


                    $id_novedad_kardex = $list_data_post[0]['id_novedad_kardex'];
                    $id_tipo_doc = $list_data_post[0]['id_tipo_doc'];
                    $num_doc = $list_data_post[0]['num_doc'];
                    $fecha_ingre_orig = $fecha_ingre = $list_data_post[0]['fecha_ini'];
                    $fecha_hasta = $list_data_post[0]['fecha_fin'];
                    $id_tip_nov_ka = $list_data_post[0]['id_tip_nov_ka'];
                    $id_periodo = $list_data_post[0]['id_periodo'];
                    $num_dias = $list_data_post[0]['num_dias'];
                    $prorroga = $list_data_post[0]['prorroga'];
                    $id_periodo_base = $list_data_post[0]['id_periodo_base'];

                    /*
                     * Datos del periodo de la novedad - 20130911
                     */
                    $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'];
                    $fecha_ini_periodo = $results[0]['fecha_ini'];
                    $fecha_fin_periodo = $results[0]['fecha_fin'];

                    //Actualiza num_dias_habil - 20210818::LAVILA
                    $sql = <<<EOD
update no_novedad_kardex set num_dias_habil = dias_habiles_cant(to_char(FECHA_INI,'yyyy-mm-dd'),to_char(FECHA_FIN,'yyyy-mm-dd')) 
    where id_novedad_kardex = $id_novedad_kardex 
EOD;
                    $this->conn->execute($sql);


                    //tipo de nov ka
                    $sql = <<<EOD
SELECT tab.*, nvl((select distinct id_nov_ka_licmat from no_param_concep),0) as id_nov_ka_licmat FROM NO_TIP_NOV_KA tab WHERE tab.ID_TIP_NOV_KA = $id_tip_nov_ka
EOD;

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

                    $dias_patrono = $results[0]['dias_patrono'];
                    $causa_liqui = $results[0]['causa_liquidacion'];
                    $afecta_antigu = $results[0]['afecta_antigu'];
                    $afecta_alimen = $results[0]['afecta_alimen'];

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


                    //Si causa liquidacion
                    if ($causa_liqui) {
                        /*
                         * Si tiene prorroga no descuenta dias de patrono
                         */
                        if ($prorroga) {
                            $num_dias_reales = $num_dias;
                            $dias_patrono = 0;
                        } else {

                            $num_dias_reales = $num_dias - $dias_patrono;
                            if ($num_dias_reales < 0) {
                                $num_dias_reales = 0;
                            }

                            //Validar dias patrono para descontar - 20141016
                            if ($num_dias >= $dias_patrono) {
                                $dias_patrono = $dias_patrono;
                            } else {
                                $dias_patrono = $num_dias;
                            }
                        }

                        $dias_calculados = $num_dias_reales;



                        $logger->info("INICIO :: Incapacidades Kardex");

                        /*
                         * Dias entre el inicio de la novedad y el ultimo dia del mes en el periodo liquidado
                         */
                        $sql = <<<EOD
select 

case when (select fecha_fin from no_periodo where id_periodo =  $id_periodo) <= to_date('$fecha_hasta','yyyy-mm-dd') 
  then (select fecha_fin from no_periodo where id_periodo =  $id_periodo) - to_date('$fecha_ingre','yyyy-mm-dd') + 1 
  else to_date('$fecha_hasta','yyyy-mm-dd') - to_date('$fecha_ingre','yyyy-mm-dd') + 1 end as dia_inc,
dias_rango_mes_sin_treintayuno(to_date('$fecha_ingre','yyyy-mm-dd')+$dias_patrono,to_date('$fecha_hasta','yyyy-mm-dd'),
    (select id_meses from no_periodo where id_periodo =  $id_periodo)) as dia_per,--dias en el periodo  
                                
dias_rango_mes_sin_treintayuno(to_date('$fecha_ingre','yyyy-mm-dd'),to_date('$fecha_hasta','yyyy-mm-dd'),
    (select id_meses from no_periodo where id_periodo =  $id_periodo)) as dia_per_patrono,--dias en el periodo con patrono 
                                
(to_date('$fecha_hasta','yyyy-mm-dd') - to_date('$fecha_ingre','yyyy-mm-dd') + 1) - fecha_rango_sin_treintayuno(to_date('$fecha_ingre','yyyy-mm-dd'), to_date('$fecha_hasta','yyyy-mm-dd')) as dias_treintauno,
fecha_rango_sin_treintayuno(to_date('$fecha_ingre','yyyy-mm-dd'), to_date('$fecha_hasta','yyyy-mm-dd')) as dias_sin,
to_date('$fecha_hasta','yyyy-mm-dd') - to_date('$fecha_ingre','yyyy-mm-dd') + 1 as dias_completos
from dual   
EOD;

                        $results = CN_TABLE::executeSQL($sql);
                        //dias
                        $dia_inc = $results[0]['dia_inc'];
                        $dia_per = $results[0]['dia_per'];
                        $dia_per_patrono = $results[0]['dia_per_patrono'];
                        $dias_treintauno = $results[0]['dias_treintauno'];

                        //Dias de 31 de meses anteriores, verificacion de dias del periodo - 20190411 $dia_ant_mes = $dia_inc - $dia_per;                        
                        /*
                         * Incidente #38885, validacion pra descontar dias anteriores del mes si aplica segun fechas de novedad, 
                         * no para todos los casos se debe restar, conceptos 1005 y 1006, se hace en el SQL con dia_per_patrono  - 20241018::LAVILA
                         */
                        $dia_ant_mes = $dia_inc - $dia_per_patrono;
                        $dia_patrono_per = $dias_patrono - $dia_ant_mes;
                        $dias_treintauno_ant = 0; //Se retira ya que se hace en el SQL quitar el dia 31 segun rango de fecha - 20220613::LAVILA $results[0]['dias_treintauno_ant'];
                        if ($dia_patrono_per < 0) {
                            $dia_patrono_per = 0;
                        }

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

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

                        $asignacion_basica = $valor_base;


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

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

                        foreach ($results as $conceptos) {

                            $id_concep_nomina = $conceptos['id_concep_nomina'];
                            $dia_inc = $dia_inc - $dias_patrono;

                            /*
                             * Elimina conceptos creados en la novedad de kardex - 20130911
                             * Solo un registro por novedad - 20130911
                             */
                            $sql = <<<EOD
DELETE FROM NO_CONCEPTO_PERIODO WHERE id_concep_nomina = $id_concep_nomina 
    and id_tipo_doc = $id_tipo_doc and num_doc = $num_doc and periodo = $id_periodo
    and fecha_desde = to_date('$fecha_ingre','yyyy-mm-dd')
    and fecha_hasta = to_date('$fecha_hasta','yyyy-mm-dd')
EOD;
                            $this->conn->execute($sql);
                        }



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


                            /**
                             * Actualiza la fecha y dias de concepto_periodo de acuerdo a la novedad
                             * Se cambia por conceptos que aplica_novka - 20150309
                             * Valida que solo se resta a un registro por concepto, que se puedan quitar los dias de la novedad - 20150310
                             */
                            $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO tab set tab.fecha_desde = tab.fecha_desde - $dia_per, tab.num_dias = ( tab.num_dias + $dia_per )
    where tab.id_tipo_doc = $id_tipo_doc and tab.num_doc = $num_doc 
        and tab.periodo = $id_periodo and tab.id_concep_nomina in (select no_concep_nomina.id_concep_nomina from no_concep_nomina where no_concep_nomina.aplica_novka = 1)
        
        and tab.id_concepto_periodo in ( 
            select distinct /*aux.rn,*/ aux.id_concepto_periodo from (
                select
                dias_rango_mes_sin_treintayuno( tabper.fecha_desde, tabper.fecha_hasta , (select id_meses from no_periodo where id_periodo = $id_periodo) ) as dd,
                tabper.*, row_number() over ( partition by tabper.id_concep_nomina order by tabper.id_concep_nomina asc, tabper.fecha_desde asc) rn  
                from NO_CONCEPTO_PERIODO tabper
                where tabper.id_tipo_doc = $id_tipo_doc and tabper.num_doc = $num_doc 
                and tabper.periodo = $id_periodo and tabper.id_concep_nomina in (select no_concep_nomina.id_concep_nomina from no_concep_nomina where no_concep_nomina.aplica_novka = 1)
                and ( case when tabper.fecha_desde - $dia_per >= (select no_periodo.fecha_ini from no_periodo where id_periodo = $id_periodo) then 1 else 0 end ) = 1  
                
            )aux
            where aux.rn = 1
        ) 
EOD;
                            $this->conn->execute($sql);

//                        $sql = <<<EOD
//UPDATE NO_CONCEPTO_PERIODO tab set tab.num_dias = ( tab.num_dias + $dia_per )
//    where tab.id_tipo_doc = $id_tipo_doc and tab.num_doc = $num_doc 
//        and tab.periodo = $id_periodo and tab.id_concep_nomina in (select no_concep_nomina.id_concep_nomina from no_concep_nomina where no_concep_nomina.aplica_novka = 1)
//        
//        and tab.id_concepto_periodo in ( 
//            select distinct /*aux.rn,*/ aux.id_concepto_periodo from (
//                select
//                dias_rango_mes_sin_treintayuno( tabper.fecha_desde, tabper.fecha_hasta , (select id_meses from no_periodo where id_periodo = $id_periodo) ) as dd,
//                tabper.*, row_number() over ( partition by tabper.id_concep_nomina order by tabper.id_concep_nomina asc, tabper.fecha_desde asc) rn  
//                from NO_CONCEPTO_PERIODO tabper
//                where tabper.id_tipo_doc = $id_tipo_doc and tabper.num_doc = $num_doc 
//                and tabper.periodo = $id_periodo and tabper.id_concep_nomina in (select no_concep_nomina.id_concep_nomina from no_concep_nomina where no_concep_nomina.aplica_novka = 1)
//                and ( case when tabper.fecha_desde - $dia_per >= (select no_periodo.fecha_ini from no_periodo where id_periodo = $id_periodo) then 1 else 0 end ) = 1  
//                
//            )aux
//            where aux.rn = 1
//        ) 
//EOD;
//                        $this->conn->execute($sql);


                            /**
                             * Si aplica concepto de Auxilio de Trasporte y Subsidio de Alimentación 
                             * se realiza tambien el reintegro. - 20131115
                             * Incidente #39358, se retira de los ajustes de dias al concepto 1011 - 20250210::LAVILA
                             */
                            //VERIFICAR SI SE ADICIONA CONCEPTOS ASOCIADOS A LA ASIGNACION BASICA
                            $sql = <<<EOD
SELECT * FROM NO_CONCEP_AB WHERE ESTADO = 1 and rango_maximo > 1
EOD;
                            $results = CN_TABLE::executeSQL($sql);

                            if (count($results) > 0) {

                                /**
                                 * Para los dias de patrono si se deben descontar en Auxilio de Trasporte y Subsidio de Alimentación - 20141112
                                 * Se cambia para que solo sume los dias de patrono al iniciar el recorrido de concepto AB, y no por cada uno - 20150123
                                 */
                                //$dia_per = $dia_per + $dias_patrono;//20190411
                                $dia_per = $dia_per + $dia_patrono_per;

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

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

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

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


                        /**
                         * Reintegros
                         */
                        $logger->info("Incapacidades Kardex - Reintregos");

                        /*
                         * Elimina conceptos de 4001 creados en la novedad de kardex - 20130911
                         * Solo un registro por novedad - 20130911
                         * Se cambia por conceptos de reintegro de conceptos que aplica_novka - 20150309
                         */
                        $sql = <<<EOD
DELETE FROM NO_CONCEPTO_PERIODO WHERE id_concep_nomina in (select distinct id_concep_rein from no_concep_nomina where aplica_novka = 1) 
    and id_tipo_doc = $id_tipo_doc and num_doc = $num_doc and periodo = $id_periodo 
    and fecha_desde = to_date('$fecha_ingre','yyyy-mm-dd')
    and fecha_hasta = to_date('$fecha_hasta','yyyy-mm-dd')
EOD;
                        $this->conn->execute($sql);



                        /**
                         * Si aplica concepto de Auxilio de Trasporte y Subsidio de Alimentación 
                         * se realiza tambien el reintegro. - 20131115
                         * Incidente #39358, se retira de los ajustes de dias al concepto 1011 - 20250210::LAVILA
                         */
                        //VERIFICAR SI SE ADICIONA CONCEPTOS ASOCIADOS A LA ASIGNACION BASICA
                        $sql = <<<EOD
SELECT 
nvl( (select id_concep_rein from no_concep_nomina where no_concep_nomina.id_concep_nomina = conab.id_concep_nomina  ), 
    conab.id_concep_nomina) as id_concep_rein,
conab.*
FROM NO_CONCEP_AB conab
WHERE conab.ESTADO = 1 and conab.rango_maximo > 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_rein'];
                                $valor_fijo = $conceptos['valor_fijo'];

                                /**
                                 * Valida rango de valores para aplicar el concepto
                                 * Se quita la validacion, ya que al anular la novedad el debe eliminar los registros que poseea, segun la novedad registrada
                                 * esto se hace por medio del filtro de las fechas, por si se registro o no el momento de crear la novedad - 20150507
                                 */
//                            if ($asignacion_basica >= $rango_minimo && $asignacion_basica <= $rango_maximo) {

                                $sql = <<<EOD
DELETE FROM NO_CONCEPTO_PERIODO WHERE id_concep_nomina = $id_concep_ab 
    and id_tipo_doc = $id_tipo_doc and num_doc = $num_doc and periodo = $id_periodo 
    and fecha_desde = to_date('$fecha_ingre','yyyy-mm-dd')
    and fecha_hasta = to_date('$fecha_hasta','yyyy-mm-dd')
EOD;
                                $this->conn->execute($sql);
//                            }
                            }
                        }


                        $logger->info("FIN - Incapacidades Kardex");
                    } else {
                        //Si afecta antiguedad
                        if ($afecta_antigu) {

                            $date1 = new DateTime($fecha_fin_periodo);
                            $date2 = new DateTime($fecha_hasta);
                            $fecha_fin_periodo = explode(' ', $fecha_fin_periodo);
                            $fecha_fin_periodo = $fecha_fin_periodo[0];
                            $fecha_ini_periodo = explode(' ', $fecha_ini_periodo);
                            $fecha_ini_periodo = $fecha_ini_periodo[0];

                            //Validar fechas
                            if ($date2 <= $date1) {

                                //Validar que no se resten mas de 30 dias de un mes - 20130820
                                if ($num_dias >= 30) {
                                    $sql = <<<EOD
            UPDATE NO_CONCEPTO_PERIODO set num_dias = 30
                where id_tipo_doc = $id_tipo_doc and num_doc = $num_doc and periodo = $id_periodo
EOD;
                                } else {
                                    $sql = <<<EOD
            UPDATE NO_CONCEPTO_PERIODO set num_dias = num_dias + $num_dias
                where id_tipo_doc = $id_tipo_doc and num_doc = $num_doc and periodo = $id_periodo
EOD;
                                }
                            } else {

                                /**
                                 * Se cambia para que reste los dias completos, y meses de 30
                                 * (num_dias - ( to_date('$fecha_fin_periodo','yyyy-mm-dd') - to_date('$fecha_ingre','yyyy-mm-dd'))) - 20150605
                                 */
                                $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO set num_dias = num_dias + (FECHA_RANGO_SIN_TREINTAYUNO( to_date('$fecha_ingre','yyyy-mm-dd'), to_date('$fecha_fin_periodo','yyyy-mm-dd')))
    where id_tipo_doc = $id_tipo_doc and num_doc = $num_doc and periodo = $id_periodo
EOD;
                            }

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


                            /**
                             * CUANDO LA NOVEDAD AFECTE ANTIGUEDAD, EL PERIODO DE CAUSACION DE VACACIONES SE AMPLIA
                             * CEV::Se deja que tambien disminuya la fecha ini segun dias como la fecha_fin, a solicitud Gloria Amparo por manejo para personas retiradas - 20220623::LAVILA, Se quita cambio - 20220628::LAVILA
                             */
                            $sql = <<<EOD
select tab0.*
from no_causa_vacac tab0
where tab0.num_doc = $num_doc and tab0.fecha_ini<=to_date('$fecha_ini_periodo','YYYY-MM-DD') 
and tab0.fecha_fin>=to_date('$fecha_fin_periodo','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 - $num_dias  
    where id_causa_vacac = $id_causa_vacac
EOD;

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


                            /*
                             * CUANDO LA NOVEDAD AFECTE ANTIGUEDAD, LA FECHA DE BONIFICACION DE SERVICIOS SE MODIFICA
                             * Se actualiza, para que si bonifica el mismo mes de la novedad nueva correctamente las fechas y desactive en el periodo de liq - 20150714
                             */
                            $id_bonifica_servicios_inac = 0;
                            //Traer la bonificacion inactiva
                            $sql = <<<EOD
SELECT 
EXTRACT(month FROM tab.FECHA_BONIFICA) as mes_ant,
EXTRACT(month FROM tab.FECHA_BONIFICA - $num_dias) as mes_des,
tab.FECHA_BONIFICA - $num_dias as fecha_des,
tab.* 
FROM NO_BONIFICA_SERVICIOS tab
where tab.num_doc = $num_doc and tab.estado = 0 
order by
tab.FECHA_BONIFICA desc 
EOD;

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

                                $id_bonifica_servicios_inac = $records_inac[0]['id_bonifica_servicios'];
                            }


                            //Traer la bonificacion activa
                            $sql = <<<EOD
SELECT 
to_date('$fecha_ingre_orig','yyyy-mm-dd') + $num_dias as fecha_ini_des,
EXTRACT(month FROM tab.FECHA_BONIFICA - $num_dias) as mes_ant,
EXTRACT(month FROM tab.FECHA_BONIFICA) as mes_des,
tab.FECHA_BONIFICA - $num_dias as fecha_des,
tab.* 
FROM NO_BONIFICA_SERVICIOS tab
where tab.num_doc = $num_doc and tab.estado = 1 
order by
tab.FECHA_BONIFICA desc  
EOD;

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

                            //Validar registros
                            if (count($records) > 0) {
                                $id_bonifica_servicios = $records[0]['id_bonifica_servicios'];
                                $mes_ant = $records[0]['mes_ant'];
                                $mes_des = $records[0]['mes_des'];
                                $id_periodo_bonif = $records[0]['id_periodo'];
                                $fecha_ini_des = $records[0]['fecha_ini_des'];
                                $fecha_des = $records[0]['fecha_des'];

                                $date1 = new DateTime($fecha_ini_des);
                                $date2 = new DateTime($records[0]['fecha_ingresa']);
                                $date3 = new DateTime($records[0]['fecha_des']);

                                //validar fechas
                                if ($date2 <= $date1 && $date1 <= $date3) {
                                    //Si la fecha_ini de la bonif activa es mayor a la fecha_ingresa de la novedad de kardex
                                    $sql = <<<EOD
UPDATE NO_BONIFICA_SERVICIOS set fecha_bonifica = fecha_bonifica - $num_dias 
    where num_doc = $num_doc and id_tipo_doc = $id_tipo_doc and estado = 1 
EOD;

                                    $this->conn->execute($sql);
                                } else {
                                    //si es el mismo mes
                                    if ($mes_ant == $mes_des) {
                                        //devuelve dias del ultimo registro inactivo
                                        $sql = <<<EOD
UPDATE NO_BONIFICA_SERVICIOS set fecha_bonifica = fecha_bonifica - $num_dias 
    where num_doc = $num_doc and estado = 0 and id_bonifica_servicios = $id_bonifica_servicios_inac   
EOD;

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


                                        //devuelve los dias del activo
                                        $sql = <<<EOD
UPDATE NO_BONIFICA_SERVICIOS set fecha_bonifica = fecha_bonifica - $num_dias, fecha_ingresa = fecha_ingresa - $num_dias  
    where num_doc = $num_doc and estado = 1 
EOD;

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

                                        //del mismo periodo mensual, solo se anula si es del mismo periodo de registro
                                        if ($id_periodo == $id_periodo) {
                                            //inserta concepto periodo del mes mensual actual
                                            $sql = <<<EOD
Insert into NO_CONCEPTO_PERIODO (ID_CONCEPTO_PERIODO,ID_ANHOS,ID_MESES,PERIODO,ID_TIPO_DOC,NUM_DOC,
    ID_CONCEP_NOMINA,FECHA_DESDE,FECHA_HASTA,VALOR,PORCENTAJE,NUM_DIAS,ID_PERIODO_AJUSTE) 
    values (null,$id_anhos,$id_meses,$id_periodo,$id_tipo_doc,'$num_doc', (SELECT ID_CONCEP_BONIF FROM NO_PARAM_CONCEP where ID_PARAM_CONCEP = 1),
        to_date('$fecha_ini_periodo','yyyy-mm-dd'), to_date('$fecha_fin_periodo','yyyy-mm-dd'), 0, null, 30, null)  
EOD;
                                            $this->conn->execute($sql);

                                            //inactiva el ultimo registro activo
                                            $sql = <<<EOD
UPDATE NO_BONIFICA_SERVICIOS set fecha_bonifica = fecha_bonifica - $num_dias, estado = 0  
    where num_doc = $num_doc and estado = 1 
EOD;

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


                                            //inserta registro si es del periodo nuevo, de la novedad 
                                            $sql = <<<EOD
Insert into NO_BONIFICA_SERVICIOS (ID_BONIFICA_SERVICIOS,ID_TIPO_DOC,NUM_DOC,FECHA_INGRESA,FECHA_BONIFICA,ESTADO,ID_PERIODO) 
    values (null,$id_tipo_doc,'$num_doc',to_date('$fecha_des','yyyy-mm-dd'),
        to_date('$fecha_des','yyyy-mm-dd') + interval '1' year , 1, $id_periodo) 
EOD;

                                            $this->conn->execute($sql);
                                        } else {
                                            //esta no se cumple ya que la anulacion es en el periodo en el cual se registro
                                            //devuelve dias del ultimo registro inactivo
                                            $sql = <<<EOD
UPDATE NO_BONIFICA_SERVICIOS set fecha_bonifica = fecha_bonifica - $num_dias 
    where num_doc = $num_doc and estado = 0 and id_bonifica_servicios = $id_bonifica_servicios_inac   
EOD;

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

                                            //devuelve los dias del activo
                                            $sql = <<<EOD
UPDATE NO_BONIFICA_SERVICIOS set fecha_bonifica = fecha_bonifica - $num_dias, fecha_ingresa = fecha_ingresa - $num_dias  
    where num_doc = $num_doc and estado = 1 
EOD;

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


                    /**
                     * Anular
                     * Revisando las incapacidades registradas y verificando a cada uno de los funcionarios, 
                     * me doy cuenta que no se le está descontando el numero de días de la incapacidad a las 
                     * personas que tiene subsidio de alimentación y transporte. -- 20140910
                     */
                    //Si afecta alimentacion y No causa liquidacion o antiguedad
                    if (!$causa_liqui && !$afecta_antigu && $afecta_alimen) {

                        /**
                         * salario
                         */
                        $sql = <<<EOD
select nvl(valor,0) as valor from no_concepto_func 
where num_doc = $num_doc 
and actual = 1 and estado = 1
and id_concep_nomina = (select no_param_concep.id_concep_basica from no_param_concep)
EOD;
                        $results = CN_TABLE::executeSQL($sql);

                        $asignacion_basica = $results[0]['valor'];

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

                                if ($asignacion_basica >= $rango_minimo && $asignacion_basica <= $rango_maximo) {

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

                                    //valida si es dentro del periodo la novedad de kardex
                                    $date1 = new DateTime($fecha_ini_periodo);
                                    $date2 = new DateTime($fecha_hasta);
                                    if ($date2 < $date1) {
                                        //inserta reintegro
                                        $sql = <<<EOD
delete from NO_CONCEPTO_PERIODO 
    where id_tipo_doc = $id_tipo_doc and num_doc = $num_doc 
        and periodo = $id_periodo and id_concep_nomina = (select nvl(id_concep_rein, id_concep_nomina) as id_concep_nomina  from no_concep_nomina where id_concep_nomina = $id_concep_ab)
        and fecha_desde = to_date('$fecha_ingre','YYYY-MM-DD')
        and fecha_hasta = to_date('$fecha_hasta','YYYY-MM-DD') 
EOD;

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

                                        //actualiza dias
                                        $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO set num_dias = num_dias + $num_dias
    where id_tipo_doc = $id_tipo_doc and num_doc = $num_doc and 
        periodo = $id_periodo and id_concep_nomina = $id_concep_ab
EOD;
                                        $this->conn->execute($sql);
                                    }
                                }
                            }
                        }
                    }


                    /**
                     * Incidente #33581,dejar en vacante temporal - 20221230::LAVILA
                     */
                    $sql = <<<EOD
SELECT 
tab.*, 
nvl((select distinct id_nov_ka_licnorem from no_param_concep),0) as id_nov_ka_licnorem,
est.id_dp

FROM NO_TIP_NOV_KA tab 

left join no_estado_func_v est
on est.num_doc = '$num_doc'
and est.actual = 1
and est.periodo = $id_periodo

WHERE tab.ID_TIP_NOV_KA = $id_tip_nov_ka
EOD;
                    $results = CN_TABLE::executeSQL($sql);

                    if (count($results) > 0) {

                        $id_nov_ka_licnorem = $results[0]['id_nov_ka_licnorem'];
                        $id_dp = $results[0]['id_dp'];

                        if ($id_tip_nov_ka == $id_nov_ka_licnorem) {
                            $sql = <<<EOD
update rh_dp set encargado = (case when encargado is null then '$num_doc' else encargado end)   
where id_dp = $id_dp
EOD;
                            $this->conn->execute($sql);
                        }
                    }
                }//Si estado es anular
                $this->conn->commit();
            } catch (Exception $e) {

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

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

        return $request;
    }

}
