<?php

/**
 * novedad_devengado_deshacer actions.
 *
 * @package    nomina
 * @subpackage novedad_devengado_deshacer
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class novedad_devengado_deshacerActions extends sfActions {

    /**
     * Metodo que trae nombramientos que se terminan en elsiguiente mes del periodo de filtro
     *
     * @param sfWebRequest $request
     */
    public function executeList(sfWebRequest $request) {

        //Revisar que sea post
        //$this->forward404Unless($request->isMethod('post'));
        //Guardar los parametros del request en el log
        $this->logMessage("---BEGIN Logging request");
        foreach ($request->getPostParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("--------------------------------------------------/  Ip: " . $_SERVER['REMOTE_ADDR']);
        foreach ($request->getGetParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("---END Logging request");

        //sentencia sql
        $sql = <<<EOD
ALTER SESSION SET NLS_DATE_FORMAT = "YYYY-MM-DD"
EOD;

        //ejecuta el sql
        CN_TABLE::executeSQL($sql);

        /*
         * Manejar Errores
         */
        $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
        $this->conn->beginTransaction();

        try {

            /**
             * Variables obligatorias
             */
            $id_nov_dec_adic = $request['id_nov_dec_adic'];
            $progress_key = $request['progress_key'];

            /**
             * caso - deshacer 
              1 si esta activo y tiene fecha termina, verifica que es superior al mes
              fecha ini activo mensual y limpia la fecha fin: novedad, concep_func y concep_periodo
              2 si esta inactivo, validar que no tenga otro activo, y que la fecha
              termina este al mes mensual activo: limpia novedad y la activa, y quita de concep_func y concep_periodo(fin periodo)
             */
            //sentencia sql
            $sql = <<<EOD
SELECT
case when (nov.fecha_fin) >= (SELECT
fecha_ini 
FROM no_periodo
where
id_tipo_periodo = 1
and estado = 1) then 1 else 0 end as tag_estado_per,
nov.* 
                    
FROM no_nov_ded_adic nov
                    
where
nov.id_nov_dec_adic = $id_nov_dec_adic
EOD;
            //ejecuta el sql
            //$this->conn->execute($sql);
            $resultado = CN_TABLE::executeSQL($sql);

            $estado = $resultado[0]['estado'];
            $tag_estado_per = $resultado[0]['tag_estado_per'];
            $num_doc = $resultado[0]['num_doc'];
            $id_tipo_doc = $resultado[0]['id_tipo_doc'];
            $fecha_fin = $resultado[0]['fecha_fin'];
            $id_tipo_nov_ded_adic = $resultado[0]['id_tipo_nov_ded_adic'];

            if ($estado) {
                if ($tag_estado_per == 1) {

                    /**
                     * novedad adicional
                     */
                    //sentencia sql
                    $sql = <<<EOD
update no_nov_ded_adic set fecha_fin = '', estado = 1 where id_nov_dec_adic = $id_nov_dec_adic
EOD;
                    //ejecuta el sql
                    $this->conn->execute($sql);

                    /**
                     * concepto func
                     */
                    //sentencia sql
                    $sql = <<<EOD
update no_concepto_func set fecha_hasta = '', estado = 1, actual = 1 
where 
id_tipo_doc = $id_tipo_doc and num_doc = '$num_doc' 
and id_concep_nomina in (select id_concep_nomina from no_nov_concepto where id_nov_ded_adic = $id_nov_dec_adic)
and fecha_hasta = TO_DATE('$fecha_fin','yyyy-mm-dd')
EOD;
                    //ejecuta el sql
                    $this->conn->execute($sql);

                    /**
                     * concepto_periodo
                     */
                    //sentencia sql
                    $sql = <<<EOD
update no_concepto_periodo set fecha_hasta = LAST_DAY(fecha_desde), num_dias = 30
where 
id_tipo_doc = $id_tipo_doc and num_doc = '$num_doc' 
and id_concep_nomina in (select id_concep_nomina from no_nov_concepto where id_nov_ded_adic = $id_nov_dec_adic)
and id_anhos in (SELECT
id_anhos 
FROM no_periodo
where
id_tipo_periodo = 1
and estado = 1)
and id_meses in (SELECT
id_meses 
FROM no_periodo
where
id_tipo_periodo = 1
and estado = 1)
and id_periodo_ajuste is null
and fecha_hasta = TO_DATE('$fecha_fin','yyyy-mm-dd')
EOD;
                    //ejecuta el sql
                    $this->conn->execute($sql);
                } else {
                    throw new Exception("Se valida que la fecha de terminación no es superior al periodo inicial mensual, verificar novedad.");
                }
            } else {

                //sentencia sql
                $sql = <<<EOD
SELECT
*
FROM no_nov_ded_adic 
where 
id_tipo_nov_ded_adic = $id_tipo_nov_ded_adic
and id_tipo_doc = $id_tipo_doc
and num_doc = '$num_doc'
and estado = 1
and fecha_ini >= TO_DATE('$fecha_fin','yyyy-mm-dd')
EOD;
                //ejecuta el sql
                //$this->conn->execute($sql);
                $resultado_sig = CN_TABLE::executeSQL($sql);


                if (count($resultado_sig) == 0) {
                    /**
                     * novedad adicional
                     */
                    //sentencia sql
                    $sql = <<<EOD
update no_nov_ded_adic set fecha_fin = '', estado = 1 where id_nov_dec_adic = $id_nov_dec_adic
EOD;
                    //ejecuta el sql
                    $this->conn->execute($sql);

                    /**
                     * concepto func
                     */
                    //sentencia sql
                    $sql = <<<EOD
update no_concepto_func set fecha_hasta = '', estado = 1, actual = 1 
where 
id_tipo_doc = $id_tipo_doc and num_doc = '$num_doc' 
and id_concep_nomina in (select id_concep_nomina from no_nov_concepto where id_nov_ded_adic = $id_nov_dec_adic)
and fecha_hasta = TO_DATE('$fecha_fin','yyyy-mm-dd')
EOD;
                    //ejecuta el sql
                    $this->conn->execute($sql);

                    /**
                     * concepto_periodo
                     */
                    //sentencia sql
                    $sql = <<<EOD
update no_concepto_periodo set fecha_hasta = LAST_DAY(fecha_desde), num_dias = 30
where 
id_tipo_doc = $id_tipo_doc and num_doc = '$num_doc' 
and id_concep_nomina in (select id_concep_nomina from no_nov_concepto where id_nov_ded_adic = $id_nov_dec_adic)
and id_anhos in (SELECT
id_anhos 
FROM no_periodo
where
id_tipo_periodo = 1
and estado = 1)
and id_meses in (SELECT
id_meses 
FROM no_periodo
where
id_tipo_periodo = 1
and estado = 1)
and id_periodo_ajuste is null
and fecha_hasta = TO_DATE('$fecha_fin','yyyy-mm-dd')
EOD;
                    //ejecuta el sql
                    $this->conn->execute($sql);
                } else {
                    throw new Exception("Tiene una novedad del mismo tipo activa/abierta, verificar novedad.");
                }
            }


            $this->status = 0;
            $this->list_data = array();

            //COMMIT DE TODAS LAS TRANSACCIONE
            $this->conn->commit();
        } catch (Exception $e) {

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

            $this->status = 1;
            $this->totalRows = 0;
            $this->startRow = 0;
            $this->endRow = 0;
            $this->mensajeError = "[novedad_devengado_deshacer] <br>" . $e->getMessage();
            $this->list_data = array();
            $this->logMessage("ERROR!!!");
            $this->logMessage($e->getMessage());
        }
    }

}
