<?php

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

    protected $table_names = array(
        'NO_NOVEDAD_VAC',
        'NO_DATOS_FUNCIONARIO_V',
        'NO_TIPO_NOV_VAC',
        'NO_PERIODO_V',
        'NO_TIPO_PERIODO',
        'NO_CAUSA_VACAC',
        'NO_CERTIFICACION_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_VAC',
            'num_doc' => 'NO_NOVEDAD_VAC'
        ),
        'NO_TIPO_NOV_VAC' =>
        array(
            'id_tipo_nov_vac' => 'NO_NOVEDAD_VAC'
        ),
        'NO_PERIODO_V' =>
        array(
            'id_periodo' => 'NO_NOVEDAD_VAC'
        ),
        'NO_TIPO_PERIODO' =>
        array(
            'id_tipo_periodo' => 'NO_PERIODO_V'
        ),
        'NO_CAUSA_VACAC' =>
        array(
            'id_causa_vacac' => 'NO_NOVEDAD_VAC'
        ),
        'NO_CERTIFICACION_V,LEFT' =>
        array(
            'id_certificacion' => 'NO_TIPO_NOV_VAC'
        )
    ); //si posee tablas para joins, identificar la relacion de los campos con las tablas
    protected $fields = array(
        'NO_NOVEDAD_VAC' =>
        array(
            'id_novedad_vac' => 'id_novedad_vac',
            'id_tipo_doc' => 'id_tipo_doc',
            'num_doc' => 'num_doc',
            'id_tipo_nov_vac' => 'id_tipo_nov_vac',
            'fecha_per_cau' => 'fecha_per_cau',
            'fecha_ini' => 'fecha_ini',
            'fecha_fin' => 'fecha_fin',
            'num_dias_vac' => 'num_dias_vac',
            'numero_doc' => 'numero_doc',
            'fecha_doc' => 'fecha_doc',
            'observaciones' => 'observaciones',
            'id_periodo' => 'id_periodo',
            'id_causa_vacac' => 'id_causa_vacac'
        ),
        'NO_DATOS_FUNCIONARIO_V' =>
        array(
            'nombre_completo' => 'nombre_completo',
            'nombre_apellido' => 'nombre_apellido'
        ),
        'NO_TIPO_NOV_VAC' =>
        array(
            'codigo' => 'codigo',
            'descripcion' => 'descripcion',
            'codigo,||, - ,||,descripcion' => 'completo_tipvac',
            'id_certificacion' => 'id_certificacion'
        ),
        'NO_PERIODO_V' =>
        array(
            'id_meses' => 'id_meses',
            'id_anhos' => 'id_anhos',
            'periodo' => 'periodo'
        ),
        'NO_TIPO_PERIODO' =>
        array(
            'descripcion' => 'descripcion_periodo'
        ),
        'NO_CAUSA_VACAC' =>
        array(
            'fecha_ini' => 'fecha_ini_causa',
            'fecha_fin' => 'fecha_fin_causa',
            'dias_disfrutados' => 'dias_disfrutados_causa',
            'saldos_dias' => 'saldo_dias_causa'
        ),
        'NO_CERTIFICACION_V' =>
        array(
            'tipo_certificacion' => 'tipo_certificacion',
            'op_tipo_certificacion' => 'op_tipo_certificacion',
            'comando' => 'comando',
            'descripcion' => 'descripcion_certif',
            'aplica_usuario' => 'aplica_usuario',
            'estado' => 'estado',
            'empresa' => 'empresa',
            'prefijo' => 'prefijo'
        )
    ); //por cada tabla especificar los campos del select
    protected $fields_orderBy = array(
        'num_doc', 'codigo', 'fecha_ini desc'
    ); //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_VAC' =>
        array(
            'id_novedad_vac,a' => array('!=' => array(-1)),
            'id_novedad_vac,b' => array('=' => array('id_novedad_vac')),
            'id_tipo_doc' => array('=' => array('id_tipo_doc')),
            'num_doc' => array('=' => array('num_doc')),
            'id_tipo_nov_vac' => array('=' => array('id_tipo_nov_vac')),
            'numero_doc' => array('=' => array('numero_doc')),
            'fecha_doc' => array('BETWEENFECHA' => array('fecha_ini', 'fecha_fin')),
            'id_periodo' => array('=' => array('id_periodo_filtro')),
            'id_causa_vacac' => array('=' => array('id_causa_vacac')),
            '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 Vacaciones';
    //true - la tabla principal de busqueda no es una vista
    protected $is_filtro = true;



    /*
     * ------------VARIABLES PARA SERVICIOS CRUD
     */
    protected $id_name = 'id_novedad_vac'; //identificador de la tabla
    protected $id_names = array('id_novedad_vac'); //llave primaria
    protected $field_names = array('id_tipo_doc', 'num_doc', 'id_tipo_nov_vac', 'fecha_per_cau',
        'fecha_ini', 'fecha_fin', 'num_dias_vac', 'numero_doc', 'fecha_doc', 'observaciones', 'id_periodo',
        'id_causa_vacac'); //campos de la tabla, sin la llave primaria
    protected $table_name = 'NO_NOVEDAD_VAC'; //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_vac'; //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) {

        $errors = null;

        /*
         * Variables request
         */
        $id_tipo_doc = $request['id_tipo_doc'];
        $num_doc = $request['num_doc'];
        $fecha_ini = $request['fecha_ini'];
        $fecha_fin = $request['fecha_fin'];
        $id_causa_vacac = $request['id_causa_vacac'];
        $num_dias = $request['num_dias_disfrute'];
        $id_tipo_nov_vac = $request['id_tipo_nov_vac'];


        //validar causacion
        $sql = <<<EOD
SELECT * FROM NO_CAUSA_VACAC WHERE ID_CAUSA_VACAC = $id_causa_vacac
EOD;

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

        $logger = sfContext::getInstance()->getLogger();

        $fecha_causa = $results[0]['fecha_fin'];
        $dias_saldo = $results[0]['saldos_dias'];
        $date1 = new DateTime($fecha_ini);
        $date2 = new DateTime($fecha_causa);

        $logger->info("Fecha novedad" . $fecha_ini);
        $logger->info("Fecha causa" . $fecha_causa);

        /**
         * Si la novedad permite vac anticipada no valida fechas - 20190917
         * Se agrega 19 y 14 reintegro - 20200117
         * Se agrega id - 22 - 20220216
         */
        if ($id_tipo_nov_vac != 2 && $id_tipo_nov_vac != 19 && $id_tipo_nov_vac != 14 && $id_tipo_nov_vac != 22) {
            if ($date1 < $date2) {

                $errors['mensaje'] = "La fecha de Inicio de la Novedad debe ser mayor o igual a la fecha Final de Causación asociada al Funcionario.";
                $errors['servicio'] = "causacion_vacaciones";
            }
        }

        //Traer operador por tipo de novedvac - 20130815
        //Operador (+) disminuye saldo el operador (-) suma al saldo en los dias - 20130815

        $sql = <<<EOD
SELECT * FROM NO_TIPO_NOV_VAC WHERE ID_TIPO_NOV_VAC = $id_tipo_nov_vac
EOD;

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

        $operador = $results[0]['operador'];
        $operador_id = 0;
        if ($operador) {
            $operador_id = 1;
            if ($num_dias > $dias_saldo) {
                $errors['mensaje'] = "El numero de dias registrados no puede superar el saldo";
                $errors['servicio'] = "causacion_vacaciones";
            }
        }



        /*
         *  Validar la operación, ya sea por SQL
         */
        //Incidente #30578, Validar festivo dia inicial - 20220714::LAVILA
        $sql = <<<EOD
SELECT
* 
FROM infestivo
where trunc(fecha) = to_date('$fecha_ini','yyyy-mm-dd')
EOD;

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

        if (count($results) > 0) {
            if ($operador) {//Incidente #36399, solo para vac no reintegros - 20230823::LAVILA
                $errors['mensaje'] = "</br>No se permite registrar novedad apartir de la fecha inicial siendo este un día no hábil marcado en el calendario de festivos, favor verificar.";
                $errors['servicio'] = "causacion_vacaciones";
            }
        }


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

join no_tipo_nov_vac tip
on tip.id_tipo_nov_vac = nov.id_tipo_nov_vac

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

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

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


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

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


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

        return $errors;
    }

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

        //valor por defecto
        $errors = null;

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

        /*
         *  Generar errores en $errors
         */

        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 remove de novedad vacac - 20140611
        $id_novedad_vac = $request['id_novedad_vac'];
        $id_periodo = $request['id_periodo'];

        /*
         *  Validar la operación, ya sea por SQL
         */
        $sql = <<<EOD
SELECT * FROM NO_NOVEDAD_VAC WHERE id_novedad_vac = $id_novedad_vac
EOD;

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

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

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


        return $errors;
    }

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

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

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

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

        //accion remove
        //validar remove de novedad vacac - 20140611
        if ($Action == "REMOVE") {

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

                /*
                 * Formato de fecha
                 */
                //Sql
                $sql = <<<EOD
ALTER SESSION SET NLS_DATE_FORMAT = "YYYY-MM-DD" 
EOD;
                //Ejecutar SQL
                CN_TABLE::executeSQL($sql);

                /*
                 * guardar anul de novedad vacac - 20140611
                 */
                $id_novedad_vac = $request['id_novedad_vac'];
                $id_periodo = $request['id_periodo'];


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

                /**
                 * Nuevas validaciones solit - 20211201::LAVILA
                 */
                $sql = <<<EOD
UPDATE NO_NOVEDAD_VAC_SOLIT
   SET 
       ID_NOVEDAD_VAC = ''       
WHERE ID_NOVEDAD_VAC = $id_novedad_vac 
EOD;

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


                $sql = <<<EOD
UPDATE NO_NOVEDAD_VAC_SOLIT
   SET 
       ID_NOVEDAD_VAC_REINT = ''       
WHERE ID_NOVEDAD_VAC_REINT = $id_novedad_vac  
EOD;

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


                $sql = <<<EOD
INSERT INTO NO_ANUL_NOVEDAD_VAC ( ID_TIPO_DOC, NUM_DOC, ID_TIPO_NOV_VAC, FECHA_PER_CAU,
FECHA_INI, FECHA_FIN, NUM_DIAS_VAC, NUMERO_DOC, FECHA_DOC, OBSERVACIONES, ID_PERIODO, 
    ID_CAUSA_VACAC, FECHA_PROCESO)

SELECT ID_TIPO_DOC, NUM_DOC, ID_TIPO_NOV_VAC, FECHA_PER_CAU,
FECHA_INI, FECHA_FIN, NUM_DIAS_VAC, NUMERO_DOC, FECHA_DOC, OBSERVACIONES, ID_PERIODO, 
    ID_CAUSA_VACAC, trunc(sysdate)
            FROM NO_NOVEDAD_VAC WHERE id_novedad_vac = $id_novedad_vac 
EOD;

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

                /**
                 * revertir novedad vacac - 20140611
                 */
                $sql = <<<EOD
SELECT
dias_habiles_cant(to_char(tab.fecha_ini,'yyyy-mm-dd'), to_char(tab.fecha_fin,'yyyy-mm-dd')) as num_dias_disfru,
tab.* 
FROM NO_NOVEDAD_VAC tab WHERE tab.id_novedad_vac = $id_novedad_vac 
EOD;
                $results = CN_TABLE::executeSQL($sql);

                $id_tipo_nov_vac = $results[0]['id_tipo_nov_vac'];
                $id_tipo_doc = $results[0]['id_tipo_doc'];
                $num_doc = $results[0]['num_doc'];
                $id_causa_vacac = $results[0]['id_causa_vacac'];
                $num_dias_disfru = $results[0]['num_dias_disfru'];
                $fecha_ingre = $results[0]['fecha_ini'];
                $fecha_hasta = $results[0]['fecha_fin'];

                $sql = <<<EOD
SELECT * FROM NO_CONCEP_VAC WHERE ID_TIPO_NOV_VAC = $id_tipo_nov_vac
EOD;

                $results = CN_TABLE::executeSQL($sql);
                //RECORRE CADA CONCEPTO
                foreach ($results as $conceptos) {

                    $id_concep_nomina = $conceptos['id_concep_nomina'];

                    /**
                     * si se registran dos vacaciones, al anular validar que sean del mismo rango de fechas - 20140903
                     */
                    $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);
                }



                //SI EL TIPO DE NOVEDAD AFECTA ANTIGUEDAD SE REALIZA LA DISMINUCION DE DIAS
                //Traer operador por tipo de novedvac - 20130815
                //Operador (+) disminuye saldo y el operador (-) suma al saldo en los dias - 20130815

                $sql = <<<EOD
SELECT * FROM NO_TIPO_NOV_VAC WHERE ID_TIPO_NOV_VAC = $id_tipo_nov_vac
EOD;

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

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

                //MODIFICO EL NUMERO DE DIAS DISFRUTADOS EN LA TABLA DE NO_CAUSA_VACAC
                if ($operador) {
                    $sql = <<<EOD
UPDATE NO_CAUSA_VACAC SET DIAS_DISFRUTADOS = DIAS_DISFRUTADOS - $num_dias_disfru WHERE ID_CAUSA_VACAC = $id_causa_vacac
EOD;
                    $this->conn->execute($sql);
                } else {
                    $sql = <<<EOD
UPDATE NO_CAUSA_VACAC SET DIAS_DISFRUTADOS = DIAS_DISFRUTADOS + $num_dias_disfru WHERE ID_CAUSA_VACAC = $id_causa_vacac
EOD;
                    $this->conn->execute($sql);
                }


                $sql = <<<EOD
UPDATE NO_CAUSA_VACAC SET SALDOS_DIAS = NUM_DIAS - DIAS_DISFRUTADOS WHERE ID_CAUSA_VACAC = $id_causa_vacac
EOD;
                $this->conn->execute($sql);



                //variable que afecta tiempo_liquidacion
                $tiempo_liqui = $results[0]['tiempo_liqui'];

                if ($tiempo_liqui) {

                    /*
                     * Trae el periodo mensual - 20141105
                     */
                    $sql = <<<EOD
SELECT ID_PERIODO FROM no_periodo
where ID_TIPO_PERIODO = 1
and id_meses = (select id_meses from no_periodo where id_periodo = $id_periodo)   
and id_anhos = (select id_anhos from no_periodo where id_periodo = $id_periodo)            
EOD;

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

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

                    $logger->info("Tiempo liqui- " . $tiempo_liqui);

                    $date1 = new DateTime($fecha_ingre);
                    $date2 = new DateTime($fecha_hasta);
                    $date3 = new DateTime($fecha_hasta_periodo);
                    $date4 = new DateTime($fecha_desde_periodo);

                    $fecha_hasta_periodo = explode(" ", $fecha_hasta_periodo);
                    $fecha_hasta_periodo = $fecha_hasta_periodo[0];

                    $logger->info("Fecha Hasta- " . $fecha_hasta_periodo);

                    //VERIFICO SI LA NOVEDAD ESTA ENTRE LOS DIAS DEL PERIODO ACTUAL

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

                        //SELECCIONO LOS CONCEPTOS QUE ESTAN AFECTADOS CON VACACIONES

                        $sql = <<<EOD
select tab0.id_concepto_periodo, DIAS_RANGO_MES_SIN_TREINTAYUNO(to_date('$fecha_ingre','YYYY-MM-DD'),
    to_date('$fecha_hasta','YYYY-MM-DD'),$id_meses) num_dias 
from no_concepto_periodo tab0
left join no_concep_nomina tab1 ON tab1.id_concep_nomina = tab0.id_concep_nomina
where tab1.aplica_vacac = 1 and tab0.periodo = $id_periodo and tab0.num_doc = $num_doc
and tab0.fecha_hasta>=to_date('$fecha_hasta_periodo','YYYY-MM-DD')
EOD;

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

                        foreach ($results as $conceptos) {

                            $id_concep_periodo = $conceptos['id_concepto_periodo'];
                            $dias_quitar = $conceptos['num_dias'];


                            $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO SET NUM_DIAS = NUM_DIAS + $dias_quitar WHERE ID_CONCEPTO_PERIODO = $id_concep_periodo
EOD;
                            $this->conn->execute($sql);
                        }
                    } else if ($date1 < $date4) {

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

                        /**
                         * Reintegrar días de AB y disminur los días AB - 20140930
                         */
                        //SELECCIONO LOS CONCEPTOS QUE ESTAN AFECTADOS CON VACACIONES

                        $sql = <<<EOD
select 

tab0.*, DIAS_RANGO_MES_SIN_TREINTAYUNO(to_date('$fecha_ingre','YYYY-MM-DD'),to_date('$fecha_hasta','YYYY-MM-DD'),$id_meses) num_dias_vac 
    
from no_concepto_periodo tab0

left join no_concep_nomina tab1 ON tab1.id_concep_nomina = tab0.id_concep_nomina

where tab1.aplica_vacac = 1 
and tab0.periodo = $id_periodo and tab0.num_doc = $num_doc
and tab0.fecha_hasta >= to_date('$fecha_hasta_periodo','YYYY-MM-DD')          
EOD;

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

                        foreach ($results as $conceptos) {

                            $id_concep_periodo = $conceptos['id_concepto_periodo'];
                            $dias_quitar = $conceptos['num_dias_vac'];
                            $id_concep_nomina = $conceptos['id_concep_nomina'];
                            $valor = $conceptos['valor'];
                            $porcentaje = $conceptos['porcentaje'];

                            if (!($valor != null)) {
                                $valor = 'null';
                            }

                            if (!($porcentaje != null)) {
                                $porcentaje = 'null';
                            }

                            $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO SET NUM_DIAS = NUM_DIAS + $dias_quitar 
    WHERE ID_CONCEPTO_PERIODO = $id_concep_periodo
EOD;
                            $this->conn->execute($sql);


                            /*
                             * Elimina conceptos de 4001 creados por reintegro
                             * Solo un registro por novedad 
                             */
                            $sql = <<<EOD
DELETE FROM NO_CONCEPTO_PERIODO WHERE id_concep_nomina = (select id_concep_rein from no_concep_nomina 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);
                        }
                    }

                    /**
                     * NOM-116 <-> En el registro de Vacaciones, cuando el tipo de novedad de vacaciones tenga la marca (Corre tiempo de Liquidación OK):  
                     * Revisar si en los descuentos de no ley existen conceptos con la marca (punto 1), y que tenga cuotas por descontar.
                     * Para los casos encontrados adicionar en concepto periodo el descuento. - 20150504
                     */
                    if ($operador) {

                        //deducidos de no ley activos
                        $sql = <<<EOD
select 
(select no_dias_mes from no_tipo_periodo where id_tipo_periodo = 1) as num_dias,
dedley.*,
connom.aplica_desc_adic_vac
from no_ded_noley dedley
left join no_concep_nomina connom
on dedley.id_concep_nomina = connom.id_concep_nomina
where 
dedley.estado = 1 and connom.aplica_desc_adic_vac = 1
and dedley.id_tipo_doc = $id_tipo_doc and dedley.num_doc = $num_doc        
EOD;

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

                        foreach ($results as $conceptos) {

                            $id_concep_nomina = $conceptos['id_concep_nomina'];
                            $aplica_desc_adic_vac = $conceptos['aplica_desc_adic_vac'];
                            $valor_cuota = $conceptos['valor_cuota'];
                            $porcentaje_cuota = $conceptos['porcentaje_cuota'];
                            $num_cuotas = $conceptos['num_cuotas'];
                            $cuotas_desc = $conceptos['cuotas_desc'];

                            $num_dias = $conceptos['num_dias'];

                            /*
                             * Elimina conceptos creados
                             * Solo un registro por novedad 
                             */
                            $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);
                        }
                    }
                }


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

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

        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_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_tipo_nov_vac = $list_data_post[0]['id_tipo_nov_vac'];
                $id_periodo = $list_data_post[0]['id_periodo'];
                $id_causa_vacac = $list_data_post[0]['id_causa_vacac'];
                $num_dias = $list_data_post[0]['num_dias_vac'];
                $id_novedad_vac = $list_data_post[0]['id_novedad_vac'];

                $num_dias_disfru = $request['num_dias_disfrute'];
                $id_novedad_vac_solit = $request['id_novedad_vac_solit'];
                $estado_general = $request['estado_general'];

                $logger->info("Número de dias  - " . $num_dias_disfru);

                /**
                 * Validaciones nuevas - 20211201::LAVILA
                 * 
                 * 0-Rechazado
                 * 1-Pendiente
                 * 2-Aprobado
                 * 3-Cancelado
                 * 4-Anulado
                 * 5-Aplazado
                 * 6-Interrumpido
                 * 7-Anulación Solicitada
                 */
                if ($id_novedad_vac_solit != 0) {

                    $sql = <<<EOD
UPDATE NO_NOVEDAD_VAC_SOLIT
   SET 
       ID_NOVEDAD_VAC = case when $estado_general = 2 then '$id_novedad_vac' else ID_NOVEDAD_VAC end,
       ID_NOVEDAD_VAC_REINT = case when $estado_general in (5,6) then '$id_novedad_vac' else ID_NOVEDAD_VAC_REINT end
       
WHERE ID_NOVEDAD_VAC_SOLIT = $id_novedad_vac_solit 
EOD;
                    $this->conn->execute($sql);
                }

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



                //SI EL TIPO DE NOVEDAD AFECTA ANTIGUEDAD SE REALIZA LA DISMINUCION DE DIAS
                //Traer operador por tipo de novedvac - 20130815
                //Operador (+) disminuye saldo y el operador (-) suma al saldo en los dias - 20130815

                $sql = <<<EOD
SELECT * FROM NO_TIPO_NOV_VAC WHERE ID_TIPO_NOV_VAC = $id_tipo_nov_vac
EOD;

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

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

                //variable que afecta tiempo_liquidacion
                $tiempo_liqui = $results[0]['tiempo_liqui'];

                $sql = <<<EOD
            SELECT * FROM NO_CONCEP_VAC WHERE ID_TIPO_NOV_VAC = $id_tipo_nov_vac
EOD;

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

                //CREO REGISTRO DE LOS CONCEPTOS ASOCIADOS AL TIPO DE NOVEDAD
                foreach ($results as $conceptos) {

                    $id_concep_nomina = $conceptos['id_concep_nomina'];

                    /*
                     * Cuando se registra una Novedad de Vacaciones se debe colocar por 
                     * defecto 0 dias para los conceptos 1009 - Prima de Vacaciones y 
                     * 1010 - Bonificación Especial de Recreación - 20130503
                     * Trello Nomina Card #57
                     */
                    if ($id_concep_nomina == 9 || $id_concep_nomina == 10) {

                        $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)
    VALUES($id_anhos,$id_meses,$id_periodo,$id_tipo_doc,$num_doc,$id_concep_nomina,
        to_date('$fecha_ingre','YYYY-MM-DD'),to_date('$fecha_hasta','YYYY-MM-DD'),0)
EOD;
                        $this->conn->execute($sql);
                    } else {

                        $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)
    VALUES($id_anhos,$id_meses,$id_periodo,$id_tipo_doc,$num_doc,$id_concep_nomina,
        to_date('$fecha_ingre','YYYY-MM-DD'),to_date('$fecha_hasta','YYYY-MM-DD'),$num_dias)
EOD;
                        $this->conn->execute($sql);
                    }
                }





                //MODIFICO EL NUMERO DE DIAS DISFRUTADOS EN LA TABLA DE NO_CAUSA_VACAC
                if ($operador) {
                    $sql = <<<EOD
UPDATE NO_CAUSA_VACAC SET DIAS_DISFRUTADOS = DIAS_DISFRUTADOS + $num_dias_disfru WHERE ID_CAUSA_VACAC = $id_causa_vacac
EOD;
                    $this->conn->execute($sql);
                } else {
                    $sql = <<<EOD
UPDATE NO_CAUSA_VACAC SET DIAS_DISFRUTADOS = DIAS_DISFRUTADOS - $num_dias_disfru WHERE ID_CAUSA_VACAC = $id_causa_vacac
EOD;
                    $this->conn->execute($sql);
                }


                $sql = <<<EOD
            UPDATE NO_CAUSA_VACAC SET SALDOS_DIAS = NUM_DIAS - DIAS_DISFRUTADOS WHERE ID_CAUSA_VACAC = $id_causa_vacac
EOD;
                $this->conn->execute($sql);




                if ($tiempo_liqui) {

                    /*
                     * Trae el periodo mensual - 20141105
                     */
                    $sql = <<<EOD
SELECT ID_PERIODO FROM no_periodo
where ID_TIPO_PERIODO = 1
and id_meses = (select id_meses from no_periodo where id_periodo = $id_periodo)   
and id_anhos = (select id_anhos from no_periodo where id_periodo = $id_periodo)            
EOD;

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

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


                    $logger->info("Tiempo liqui- " . $tiempo_liqui);

                    $date1 = new DateTime($fecha_ingre);
                    $date2 = new DateTime($fecha_hasta);
                    $date3 = new DateTime($fecha_hasta_periodo);
                    $date4 = new DateTime($fecha_desde_periodo);

                    $fecha_hasta_periodo = explode(" ", $fecha_hasta_periodo);
                    $fecha_hasta_periodo = $fecha_hasta_periodo[0];

                    $logger->info("Fecha Hasta- " . $fecha_hasta_periodo);

                    //VERIFICO SI LA NOVEDAD ESTA ENTRE LOS DIAS DEL PERIODO ACTUAL

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

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


                        //SELECCIONO LOS CONCEPTOS QUE ESTAN AFECTADOS CON VACACIONES

                        $sql = <<<EOD
select 

tab0.id_concepto_periodo, DIAS_RANGO_MES_SIN_TREINTAYUNO(to_date('$fecha_ingre','YYYY-MM-DD'),to_date('$fecha_hasta','YYYY-MM-DD'),$id_meses) num_dias 
    
from no_concepto_periodo tab0

left join no_concep_nomina tab1 ON tab1.id_concep_nomina = tab0.id_concep_nomina

where tab1.aplica_vacac = 1 
and tab0.periodo = $id_periodo and tab0.num_doc = $num_doc
and tab0.fecha_hasta >= to_date('$fecha_hasta_periodo','YYYY-MM-DD')          
EOD;

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

                        foreach ($results as $conceptos) {

                            $id_concep_periodo = $conceptos['id_concepto_periodo'];

                            //MODIFICO EL NUMERO DE DIAS DISFRUTADOS EN LA TABLA DE NO_CAUSA_VACAC - 20161012
                            if ($operador) {
                                $dias_quitar = $conceptos['num_dias'];
                            } else {
                                $dias_quitar = $conceptos['num_dias'] * (-1);
                            }


                            $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO SET NUM_DIAS = NUM_DIAS - $dias_quitar 
    WHERE ID_CONCEPTO_PERIODO = $id_concep_periodo
EOD;
                            $this->conn->execute($sql);
                        }
                    } else if ($date1 < $date4) {

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

                        /**
                         * Reintegrar días de AB y disminur los días AB - 20140930
                         */
                        //SELECCIONO LOS CONCEPTOS QUE ESTAN AFECTADOS CON VACACIONES

                        $sql = <<<EOD
select
                            
tab0.*, DIAS_RANGO_MES_SIN_TREINTAYUNO(to_date('$fecha_ingre','YYYY-MM-DD'),to_date('$fecha_hasta','YYYY-MM-DD'),$id_meses) num_dias_vac 
    
from no_concepto_periodo tab0

left join no_concep_nomina tab1 ON tab1.id_concep_nomina = tab0.id_concep_nomina

where tab1.aplica_vacac = 1 
and tab0.periodo = $id_periodo and tab0.num_doc = $num_doc
and tab0.fecha_hasta >= to_date('$fecha_hasta_periodo','YYYY-MM-DD')          
EOD;

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

                        foreach ($results as $conceptos) {

                            $id_concep_periodo = $conceptos['id_concepto_periodo'];
                            $dias_quitar = $conceptos['num_dias_vac'];
                            $id_concep_nomina = $conceptos['id_concep_nomina'];
                            $valor = $conceptos['valor'];
                            $porcentaje = $conceptos['porcentaje'];

                            if (!($valor != null)) {
                                $valor = 'null';
                            }

                            if (!($porcentaje != null)) {
                                $porcentaje = 'null';
                            }

                            $sql = <<<EOD
UPDATE NO_CONCEPTO_PERIODO SET NUM_DIAS = NUM_DIAS - $dias_quitar 
    WHERE ID_CONCEPTO_PERIODO = $id_concep_periodo
EOD;
                            $this->conn->execute($sql);

                            /*
                             * CREO EL REGISTRO DE 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,NUM_DIAS,VALOR,PORCENTAJE)
    VALUES($id_anhos,$id_meses,$id_periodo,$id_tipo_doc,$num_doc,(select id_concep_rein from no_concep_nomina where id_concep_nomina = $id_concep_nomina ),
        to_date('$fecha_ingre','YYYY-MM-DD'),to_date('$fecha_hasta','YYYY-MM-DD')
            ,DIAS_RANGO_MES_SIN_TREINTAYUNO(to_date('$fecha_ingre','YYYY-MM-DD'),to_date('$fecha_hasta','YYYY-MM-DD'), ($id_meses-1) ),$valor,$porcentaje)
EOD;
                            $this->conn->execute($sql);
                        }
                    }


                    /**
                     * NOM-116 <-> En el registro de Vacaciones, cuando el tipo de novedad de vacaciones tenga la marca (Corre tiempo de Liquidación OK):  
                     * Revisar si en los descuentos de no ley existen conceptos con la marca (punto 1), y que tenga cuotas por descontar.
                     * Para los casos encontrados adicionar en concepto periodo el descuento. - 20150504
                     */
                    if ($operador) {

                        //deducidos de no ley activos
                        $sql = <<<EOD
select 
(select no_dias_mes from no_tipo_periodo where id_tipo_periodo = 1) as num_dias,
dedley.*,
connom.aplica_desc_adic_vac
from no_ded_noley dedley
left join no_concep_nomina connom
on dedley.id_concep_nomina = connom.id_concep_nomina
where 
dedley.estado = 1 and connom.aplica_desc_adic_vac = 1
and dedley.id_tipo_doc = $id_tipo_doc and dedley.num_doc = $num_doc        
EOD;

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

                        foreach ($results as $conceptos) {

                            $id_concep_nomina = $conceptos['id_concep_nomina'];
                            $aplica_desc_adic_vac = $conceptos['aplica_desc_adic_vac'];
                            $valor_cuota = $conceptos['valor_cuota'];
                            $porcentaje_cuota = $conceptos['porcentaje_cuota'];
                            $num_cuotas = $conceptos['num_cuotas'];
                            $cuotas_desc = $conceptos['cuotas_desc'];

                            $num_dias = $conceptos['num_dias'];

                            if ($num_cuotas >= ($cuotas_desc + 1)) {

                                /*
                                 * CREO EL REGISTRO 
                                 */
                                if ($valor_cuota != "") {

                                    $logger->info("Entro a valor_cuota - " . $valor_cuota);

                                    /**
                                     * el porcentaje si viene se actualiza en la tabla para liquidar
                                     */
                                    if ($porcentaje_cuota != "") {
                                        //deja el mismo valor
                                        $porcentaje_cuota = $porcentaje_cuota;
                                    } else {
                                        $porcentaje_cuota = 'null';
                                    }

                                    $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,PORCENTAJE)
    VALUES($id_anhos,$id_meses,$id_periodo,$id_tipo_doc,$num_doc,$id_concep_nomina,
        to_date('$fecha_ingre','YYYY-MM-DD'),to_date('$fecha_hasta','YYYY-MM-DD'),$valor_cuota,$num_dias,$porcentaje_cuota)
EOD;
                                    $this->conn->execute($sql);
                                } else {

                                    $sql = <<<EOD
INSERT INTO NO_CONCEPTO_PERIODO (ID_ANHOS,ID_MESES,PERIODO,ID_TIPO_DOC,NUM_DOC,ID_CONCEP_NOMINA,FECHA_DESDE,FECHA_HASTA,PORCENTAJE,NUM_DIAS)
    VALUES($id_anhos,$id_meses,$id_periodo,$id_tipo_doc,$num_doc,$id_concep_nomina,
        to_date('$fecha_ingre','YYYY-MM-DD'),to_date('$fecha_hasta','YYYY-MM-DD'),$porcentaje_cuota,$num_dias)
EOD;

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

                                $logger->info("No hay mas cuotas para descontar " . $num_cuotas);
                            }
                        }
                    }
                }



                $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") {
            
        }

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

        return $request;
    }

}
