<?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;
                        $dias_patrono = $dias_patrono;
                    }

                    /**
                     * En las licencias de maternidad que registren dias futuros o de fechA 
                     * DE TERMINACIÓN MAYOR A LA FECHA DE TERMINACIÓN DEL PERIODO LIQUIDADO, 
                     * ESTOS DÍAS no se deben liquidar en el período sino que se guardan para el periodo correspondiente. -- 20140916
                     */
                    if ($id_tip_nov_ka == $id_nov_ka_licmat) {

                        $logger->info("Licencia de maternidad");

                        /*
                         * 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'),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
                         */
                        $logger->info("Licencia de maternidad - 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'];

                                    /**
                                     * 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("Licencia de maternidad - 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.fecha_fin >= to_date('$fecha_ingre_orig','yyyy-mm-dd')
     and 
     tab0.fecha_fin < (select fecha_ini  from no_periodo where id_periodo =  $id_periodo)
 )
 order by tab0.fecha_fin 
EOD;

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

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

                                /*
                                 * 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_liqui_ini','YYYY-MM-DD'),to_date('$fecha_liqui_fin','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_liqui_ini','YYYY-MM-DD'),
        to_date('$fecha_liqui_fin','YYYY-MM-DD'), $valor_fijo, $dias_liqui )
EOD;
                                            $this->conn->execute($sql);
                                        }
                                    }
                                }
                            }
                        }


                        $logger->info("FIN - Licencia de maternidad");
                    } else {


                        $logger->info("Otras incapacidades - causa_liquidacion");
                        
                        /*
                         * Calculo de los dias 31 entre dos fechas - 20131119
                         */
                        $sql = <<<EOD
select 
(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_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;

                        //CALCULOS NECESARIOS PARA EL REGISTRO DE UNA NOVEDAD DE KARDEX.
                        //1) Traigo los periodos que afecta la novedad

                        $sql = <<<EOD
select tab0.*, to_char(to_date('$fecha_ingre','YYYY-MM-DD')+$dias_patrono,'yyyy-mm-dd') as fecha_ingre
 from no_periodo tab0 
 where tab0.id_tipo_periodo = 1 and (tab0.fecha_ini >=to_date('$fecha_ingre','YYYY-MM-DD')+0
 or tab0.fecha_fin between to_date('$fecha_ingre','YYYY-MM-DD') AND last_day(to_date('$fecha_hasta','YYYY-MM-DD')) )
 order by tab0.fecha_fin 
EOD;

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

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

                        $dias_calculados = $num_dias_reales;
                        foreach ($results as $periodos) {



                            //SI ES EL PERIODO ACTUAL REGISTRO LOS CONCEPTOS ASOCIADOS 
                            //AL TIPO DE NOVEDAD DE KARDEX CON EL NUMERO DE DIAS

                            if ($periodos['activo'] == 1 && $periodos['estado'] == 1) {


                                $sql = <<<EOD
            SELECT * FROM NO_CONCEP_KA WHERE ID_TIP_NOV_KA = $id_tip_nov_ka
EOD;

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

                                foreach ($results as $conceptos) {

                                    $id_concep_nomina = $conceptos['id_concep_nomina'];


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

                                /**
                                 * Quitar dias 31 para no tener encuenta - 20131119
                                 */
                                $dias_calculados = $dias_calculados - $dias_treintauno;
                                if ($dias_calculados != 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 + $dias_calculados 
                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 - $dias_calculados 
                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'];

                                            /**
                                             * Actualiza la fecha y dias de concepto_periodo de acuerdo a la novedad
                                             */
                                            $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO set fecha_desde = fecha_desde + $dias_calculados
    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 - $dias_calculados
    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);
                                        }
                                    }
                                }
                            } else {

                                $periodo_reint = $periodos['id_periodo'];

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

                                $fecha_ini = $periodos['fecha_ini'];
                                $fecha_ini = explode(' ', $fecha_ini);
                                $fecha_ini = $fecha_ini[0];

                                /*
                                 * Fecha siguiente del periodo
                                 * dias del periodo causado
                                 */
                                $sql = <<<EOD
select 
to_char(to_date('$fecha_fin','yyyy-mm-dd')+1,'yyyy-mm-dd') as fecha_sig,    
case when EXTRACT(MONTH from to_date('$fecha_ingre','yyyy-mm-dd')) != EXTRACT(MONTH from to_date('$fecha_hasta','yyyy-mm-dd')) then
                        30 - (to_date('$fecha_ingre','yyyy-mm-dd') - to_date('$fecha_ini','yyyy-mm-dd'))
                  else 
                  to_date('$fecha_hasta','yyyy-mm-dd') - to_date('$fecha_ingre','yyyy-mm-dd')+1
                      
end
                            as num_dias
    from dual
EOD;
                                //execute sql
                                $records = CN_TABLE::executeSQL($sql);

                                $num_dias_desc = $records[0]['num_dias'];
                                $fecha_sig = $records[0]['fecha_sig'];

                                /**
                                 * Obtine los datos de no_concepto_periodo para el concepto de asignacion basica, del periodo base
                                 */
                                $sql = <<<EOD
select 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 (tab0.fecha_desde between to_date('$fecha_ingre','YYYY-MM-DD') AND to_date('$fecha_fin','YYYY-MM-DD')
            or tab0.fecha_hasta between to_date('$fecha_ingre','YYYY-MM-DD') AND to_date('$fecha_fin','YYYY-MM-DD') )
EOD;

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

                                foreach ($records as $asigna) {

                                    $dias_liqui = $asigna['num_dias'];
                                    if ($dias_liqui > $num_dias_desc) {
                                        $dias_liqui = $num_dias_desc;
                                    }
                                    $fecha_liqui_ini = $asigna['fecha_desde'];
                                    $fecha_liqui_ini = explode(' ', $fecha_liqui_ini);
                                    $fecha_liqui_ini = $fecha_liqui_ini[0];
                                    $fecha_liqui_fin = $asigna['fecha_hasta'];
                                    $fecha_liqui_fin = explode(' ', $fecha_liqui_fin);
                                    $fecha_liqui_fin = $fecha_liqui_fin[0];
                                    $valor_liqui = $asigna['valor'];
                                    $asignacion_basica = $valor_liqui;
                                    $dias_concep_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_liqui_ini','YYYY-MM-DD'),to_date('$fecha_liqui_fin','YYYY-MM-DD'),$dias_liqui,$valor_liqui)
EOD;
                                    $this->conn->execute($sql);
                                }
                                $fecha_ingre = $fecha_sig;
                                $dias_calculados = $dias_calculados - $dias_liqui;
                            }
                        }

                        /**
                         * 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_concep_ab )
EOD;
                                    $this->conn->execute($sql);
                                }
                            }
                        }
                    }
                } 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;
                        $dias_patrono = $dias_patrono;
                    }

                    $dias_calculados = $num_dias_reales;



                    /**
                     * En las licencias de maternidad que registren dias futuros o de fechA 
                     * DE TERMINACIÓN MAYOR A LA FECHA DE TERMINACIÓN DEL PERIODO LIQUIDADO, 
                     * ESTOS DÍAS no se deben liquidar en el período sino que se guardan para el periodo correspondiente. -- 20140916
                     */
                    if ($id_tip_nov_ka == $id_nov_ka_licmat) {

                        $logger->info("Licencia de maternidad");

                        /*
                         * 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'),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 rownum <= 1
EOD;
                            $this->conn->execute($sql);
                        }



                        /**
                         * Descontar Asignacion Basica y conceptos asociados
                         * Quitar dias 31 para no tener encuenta - 20131119
                         */
                        $logger->info("Licencia de maternidad - 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'];

                                    /**
                                     * 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("Licencia de maternidad - 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 
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 
EOD;
                                    $this->conn->execute($sql);
                                }
                            }
                        }


                        $logger->info("FIN - Licencia de maternidad");
                    } else {
                        /**
                         * Dias para regresar de la incapacidad para el periodo de la novedad - 20130911
                         */
                        $sql = <<<EOD
select 
fecha_ini,
fecha_fin,
num_dias,
dias_rango_mes_sin_treintayuno(fecha_ini + $dias_patrono, fecha_fin, (select no_periodo.id_meses from no_periodo where no_periodo.id_periodo = $id_periodo )) dias
from no_novedad_kardex where id_novedad_kardex = $id_novedad_kardex
EOD;

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

                        $dias_calculados = $results[0]['dias'];


                        //1) Traigo los periodos que afecta la novedad

                        $sql = <<<EOD
           select tab0.*, to_char(to_date('$fecha_ingre','YYYY-MM-DD')+$dias_patrono,'yyyy-mm-dd') as fecha_ingre
            from no_periodo tab0 
            where tab0.id_tipo_periodo = 1 and (tab0.fecha_ini >=to_date('$fecha_ingre','YYYY-MM-DD')+0
            or tab0.fecha_fin between to_date('$fecha_ingre','YYYY-MM-DD') AND last_day(to_date('$fecha_hasta','YYYY-MM-DD')) )
            order by tab0.fecha_fin 
EOD;

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

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

                        foreach ($results as $periodos) {



                            //SI ES EL PERIODO ACTUAL REGISTRO LOS CONCEPTOS ASOCIADOS 
                            //AL TIPO DE NOVEDAD DE KARDEX CON EL NUMERO DE DIAS

                            if ($periodos['activo'] == 1 && $periodos['estado'] == 1) {


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

                                    /*
                                     * 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 rownum <= 1
EOD;
                                    $this->conn->execute($sql);
                                }

                                /*
                                 * Si hay dias en el periodo
                                 */
                                if ($dias_calculados != 0) {

                                    $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO set fecha_desde = fecha_desde - $dias_calculados
    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 + $dias_calculados
    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'];

                                            /**
                                             * Actualiza la fecha y dias de concepto_periodo de acuerdo a la novedad
                                             */
                                            $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO set fecha_desde = fecha_desde - $dias_calculados
    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 + $dias_calculados
    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);
                                        }
                                    }
                                }
                            } else {

                                /*
                                 * 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 rownum <= 1
EOD;
                                $this->conn->execute($sql);
                            }
                        }

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

                                $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 rownum <= 1
EOD;
                                $this->conn->execute($sql);
                            }
                        }
                    }
                } 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;
    }

}