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

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

        /*
         *  Generar errores en $errors
         */

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


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

                    /**
                     * 
                     */
                    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
                         */
                        $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   
                                
(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'];
                        $dias_treintauno = $results[0]['dias_treintauno'];

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

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

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

                            /*
                             * 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.
                         */
                        $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
                             */
                            $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO set fecha_desde = fecha_desde + $dia_per 
    where id_tipo_doc = $id_tipo_doc and num_doc = $num_doc and periodo = $id_periodo and id_concep_nomina = $id_concep_nomina_asig
EOD;
                            $this->conn->execute($sql);

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


                            /**
                             * Si aplica concepto de Auxilio de Trasporte y Subsidio de Alimentación 
                             * se realiza tambien el reintegro. - 20131115
                             */
                            //VERIFICAR SI SE ADICIONA CONCEPTOS ASOCIADOS A LA ASIGNACION BASICA
                            $sql = <<<EOD
SELECT * FROM NO_CONCEP_AB WHERE ESTADO = 1
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;

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

                                //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 {
                                    $dias_liqui = 0;
                                    $dias_patrono_orig = $dias_patrono_orig - $dias_liqui;
                                }
                                if (($dias_liqui ) >= 0) {
                                    /**
                                     * Para los dias de patrono si se deben descontar en Auxilio de Trasporte y Subsidio de Alimentación - 20141112
                                     */
                                    $dias_liqui_ab = $dias_liqui;
                                } else {
                                    $dias_liqui_ab = 0;
                                }

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




                                /**
                                 * Si aplica concepto de Auxilio de Trasporte y Subsidio de Alimentación 
                                 * se realiza tambien el reintegro. - 20131115
                                 */
                                //VERIFICAR SI SE ADICIONA CONCEPTOS ASOCIADOS A LA ASIGNACION BASICA
                                //Se toma el concepto de reintegro - 20131115
                                $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
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];


                        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 = 0
                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 {

                            $sql = <<<EOD
            UPDATE NO_CONCEPTO_PERIODO set num_dias = num_dias - ( to_date('$fecha_fin_periodo','yyyy-mm-dd') - to_date('$fecha_ingre','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

                        $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

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


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

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


                $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 {

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


                //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  
                                
(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'];
                    $dias_treintauno = $results[0]['dias_treintauno'];

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

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

                    $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
                     */
                    $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
                         */
                        $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO set fecha_desde = fecha_desde - $dia_per 
    where id_tipo_doc = $id_tipo_doc and num_doc = $num_doc and periodo = $id_periodo and id_concep_nomina = $id_concep_nomina_asig
EOD;
                        $this->conn->execute($sql);

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


                        /**
                         * Si aplica concepto de Auxilio de Trasporte y Subsidio de Alimentación 
                         * se realiza tambien el reintegro. - 20131115
                         */
                        //VERIFICAR SI SE ADICIONA CONCEPTOS ASOCIADOS A LA ASIGNACION BASICA
                        $sql = <<<EOD
SELECT * FROM NO_CONCEP_AB WHERE ESTADO = 1
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'];

                                /**
                                 * Para los dias de patrono si se deben descontar en Auxilio de Trasporte y Subsidio de Alimentación - 20141112
                                 */
                                $dia_per = $dia_per + $dias_patrono;

                                /**
                                 * 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
                     */
                    $sql = <<<EOD
DELETE FROM NO_CONCEPTO_PERIODO WHERE id_concep_nomina = (select id_concep_nomina from no_concep_nomina where codigo = '4001') 
    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
                     */
                    //VERIFICAR SI SE ADICIONA CONCEPTOS ASOCIADOS A LA ASIGNACION BASICA
                    //Se toma el concepto de reintegro - 20131115
                    $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
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) {

                                $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 {

                            $sql = <<<EOD
            UPDATE NO_CONCEPTO_PERIODO set num_dias = num_dias + ( to_date('$fecha_fin_periodo','yyyy-mm-dd') - to_date('$fecha_ingre','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

                        $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

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


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

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

}
