<?php

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

    public $conn;

    /**
     * Metodo para actualizar anual_etapa y titulo_etapa al crear det_liq_canon
     *
     * @param sfWebRequest $request
     */
    public function executeUpdate(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");


        /*
         * Manejo de errores
         */
        try {

            $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
            $this->conn->beginTransaction();

            /*
             * Variable Obligatorias
             */

            $id_anual_etapa = $request['id_anual_etapa'];
            $id_titulo = $request['id_titulo'];

            $resultado = array();

            /**
             * Limpiar todas las anualidades que tengan el flag de siguiente anualidad a liquidar prendido            
             * Se hace relacion con "and tab0.id_titulo = tab1.id_titulo " entre la anualidad y la etapa del titulo - 20180607
             */
            $sql = <<<EOD
select 
tab1.*, 
tab0.id_etapa 
    
from ca_titulo_etapa tab0 

join ca_anual_etapa tab1 
on tab0.id_titulo_etapa = tab1.id_titulo_etapa 
and tab0.id_titulo = tab1.id_titulo 
and tab0.actual = 1 

where 
tab1.id_titulo = $id_titulo 
and tab1.estado = 1 
and tab1.liquidado = 0 
EOD;

            $records = CN_TABLE::executeSQL($sql, true);
            $count = count($records);

            if ($count != 0) {

                foreach ($records as $value) {

                    //Anualidad a limpiar
                    $id_anual_etapa_tempo = $value["id_anual_etapa"];

                    $sql = <<<EOD
UPDATE ca_anual_etapa SET estado = 0,
                       liquidado=0,
                       impreso=0
WHERE id_anual_etapa = $id_anual_etapa_tempo AND id_titulo = $id_titulo
EOD;

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

            //Limpiar el apuntador de las etapas de la proyeccion actual
            $sql = <<<EOD
UPDATE ca_titulo_etapa  SET estado = 0
WHERE id_titulo = $id_titulo and actual = 1                                                
EOD;

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

            /*
             * Traer todas las anualidades pendientes por liquidar de todas las etapas de la proyeccion actual
             * Ordenamiento ascendente por fecha de inicio de la anualidad
             * Se hace relacion con "and tab0.id_titulo = tab1.id_titulo " entre la anualidad y la etapa del titulo - 20180607
             */
            $sql = <<<EOD
select 
tab1.*, tab0.id_etapa 
    
from ca_titulo_etapa tab0 
    
join ca_anual_etapa tab1 
on tab0.id_titulo_etapa = tab1.id_titulo_etapa 
and tab0.id_titulo = tab1.id_titulo 
and tab0.actual=1 

where 
tab1.id_titulo=$id_titulo 
and tab1.estado=0 
and tab1.liquidado=0

order by 
tab1.fecha_inicio 
EOD;

            $records = CN_TABLE::executeSQL($sql, true);
            $count = count($records);

            if ($count != 0) {

                //Nuevo apuntador a anualidad y titulo etapa a liquidar
                $id_anual_etapa_liquida = $records[0]['id_anual_etapa'];
                $id_titulo_etapa_liquida = $records[0]['id_titulo_etapa'];

                $sql = <<<EOD
UPDATE ca_anual_etapa SET estado = 1,
                       liquidado=0,
                       impreso=0
WHERE 
id_anual_etapa = $id_anual_etapa_liquida 
AND id_titulo = $id_titulo
EOD;

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

                $sql = <<<EOD
UPDATE ca_titulo_etapa  SET estado = 1
WHERE 
id_titulo = $id_titulo 
and actual=1 
and id_titulo_etapa=$id_titulo_etapa_liquida
EOD;

                $this->conn->execute($sql);
            } else {
                //Si no hay más anualidades 
            }

            /**
             * En todo caso la primera anualidad de cada etapa debe quedar con el apuntador si no esta liquidada aun
             * Se hace relacion con "and tab0.id_titulo = tab1.id_titulo " entre la anualidad y la etapa del titulo - 20180607
             */
            $sql = <<<EOD
select 
tab1.*, tab0.id_etapa 
    
from ca_titulo_etapa tab0 

join ca_anual_etapa tab1 
on tab0.id_titulo_etapa = tab1.id_titulo_etapa 
and tab0.id_titulo = tab1.id_titulo 
and tab0.actual=1 

where 
tab1.id_titulo=$id_titulo 
and tab1.anualidad=1 
and tab1.liquidado=0                           
EOD;

            $records = CN_TABLE::executeSQL($sql, true);
            $count = count($records);

            if ($count != 0) {

                foreach ($records as $value) {
                    //Anualidad a limpiar
                    $id_anual_etapa_p1 = $value["id_anual_etapa"];

                    $sql = <<<EOD
UPDATE ca_anual_etapa SET estado = 1,
                       liquidado=0,
                       impreso=0
WHERE 
id_anual_etapa = $id_anual_etapa_p1 
AND id_titulo = $id_titulo
EOD;

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

            //COMMIT DE TODAS LAS TRANSACCIONES
            $this->conn->commit();
            $this->list_data = array();
            $this->status = 0;
            $this->logMessage("Se actualizo estado de etapa de titulo.");
        } catch (Exception $e) {
            //ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
            $this->conn->rollback();
            $this->status = 1;
            $this->mensajeError = "ERROR!!!";
            $this->list_data = array();
            $this->logMessage("ERROR!!!");
            $this->logMessage($e->getMessage());
        }
    }

    /**
     * Metodo para actualizar anual_etapa y titulo_etapa al anular det_liq_canon
     *
     * @param sfWebRequest $request
     */
    public function executeRemove(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");

        $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
        $this->conn->beginTransaction();

        /*
         * Manejo de errores
         */
        try {

            /*
             * Variable Obligatorias
             */

            $id_anual_etapa = $request['id_anual_etapa'];
            $id_titulo = $request['id_titulo'];

            //No usadas
            if (isset($request["hist"])) {
                $hist = $request["hist"];
            } else {
                $hist = 0;
            }


            //Recopilar informacion anualidad
            $sql = <<<EOD

select tab1.*, tab0.id_etapa 
    
from ca_titulo_etapa tab0 

join ca_anual_etapa tab1 
on tab0.id_titulo_etapa = tab1.id_titulo_etapa 
and tab0.actual=1 
                    
where tab1.id_anual_etapa=$id_anual_etapa
EOD;
            $records = CN_TABLE::executeSQL($sql, true);
            $count = count($records);

            if ($count != 0) {

                //Anular anualidad requerida
                $sql = <<<EOD

UPDATE ca_anual_etapa SET estado = 0,
                       liquidado=0,
                       impreso=0
WHERE id_anual_etapa = $id_anual_etapa
AND id_titulo = $id_titulo
EOD;

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

                /**
                 * Limpiar todas las anualidades que tengan el flag de siguiente anualidad a liquidar prendido
                 * Se hace relacion con "and tab0.id_titulo = tab1.id_titulo " entre la anualidad y la etapa del titulo - 20180607
                 */
                $sql = <<<EOD
                        
select tab1.*, tab0.id_etapa from ca_titulo_etapa tab0 

join ca_anual_etapa tab1 
on tab0.id_titulo_etapa = tab1.id_titulo_etapa 
and tab0.id_titulo = tab1.id_titulo 
and tab0.actual=1 
                        
where tab1.id_titulo=$id_titulo and tab1.estado=1 and tab1.liquidado=0

EOD;

                $records = CN_TABLE::executeSQL($sql, true);
                $count = count($records);

                if ($count != 0) {

                    foreach ($records as $value) {
                        //Anualidad a limpiar
                        $id_anual_etapa_tempo = $value["id_anual_etapa"];

                        $sql = <<<EOD

UPDATE ca_anual_etapa SET estado = 0,
                       liquidado=0,
                       impreso=0
WHERE id_anual_etapa = $id_anual_etapa_tempo AND id_titulo = $id_titulo
EOD;

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

                //Limpiar el apuntador de las etapas de la proyeccion actual

                $sql = <<<EOD

UPDATE ca_titulo_etapa  SET estado = 0
WHERE id_titulo = $id_titulo and actual=1
                                                
EOD;

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

                /** Traer todas las anualidades pendientes por liquidar de todas las etapas de la proyeccion actual
                 * Ordenamiento ascendente por fecha de inicio de la anualidad
                 * Se hace relacion con "and tab0.id_titulo = tab1.id_titulo " entre la anualidad y la etapa del titulo - 20180607
                 */
                $sql = <<<EOD
                        
select tab1.*, tab0.id_etapa from ca_titulo_etapa tab0 
    
join ca_anual_etapa tab1 
on tab0.id_titulo_etapa = tab1.id_titulo_etapa 
and tab0.id_titulo = tab1.id_titulo 
and tab0.actual=1 
                        
where tab1.id_titulo=$id_titulo and tab1.estado=0 and tab1.liquidado=0
order by tab1.fecha_inicio

EOD;

                $records = CN_TABLE::executeSQL($sql, true);
                $count = count($records);

                if ($count != 0) {

                    //Nuevo apuntador a anualidad y titulo etapa a liquidar
                    $id_anual_etapa_liquida = $records[0]['id_anual_etapa'];
                    $id_titulo_etapa_liquida = $records[0]['id_titulo_etapa'];

                    $sql = <<<EOD

UPDATE ca_anual_etapa SET estado = 1,
                       liquidado=0,
                       impreso=0
WHERE id_anual_etapa = $id_anual_etapa_liquida AND id_titulo = $id_titulo
EOD;

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

                    $sql = <<<EOD

UPDATE ca_titulo_etapa  SET estado = 1
WHERE id_titulo = $id_titulo and actual=1 and id_titulo_etapa=$id_titulo_etapa_liquida
                                                
EOD;

                    $this->conn->execute($sql);
                } else {
                    //La anualidad es invalida
                    throw new Exception("A ocurrido un error en la anulación de la anualidad");
                }

                /**
                 * En todo caso la primera anualidad de cada etapa debe quedar con el apuntador si no esta liquidada aun
                 * Se hace relacion con "and tab0.id_titulo = tab1.id_titulo " entre la anualidad y la etapa del titulo - 20180607
                 */
                $sql = <<<EOD
                        
select tab1.*, tab0.id_etapa from ca_titulo_etapa tab0 

join ca_anual_etapa tab1 
on tab0.id_titulo_etapa = tab1.id_titulo_etapa 
and tab0.id_titulo = tab1.id_titulo 
and tab0.actual=1 
                        
where tab1.id_titulo=$id_titulo and tab1.anualidad=1 and tab1.liquidado=0
                          
EOD;

                $records = CN_TABLE::executeSQL($sql, true);
                $count = count($records);

                if ($count != 0) {

                    foreach ($records as $value) {
                        //Anualidad a limpiar
                        $id_anual_etapa_p1 = $value["id_anual_etapa"];

                        $sql = <<<EOD

UPDATE ca_anual_etapa SET estado = 1,
                       liquidado=0,
                       impreso=0
WHERE id_anual_etapa = $id_anual_etapa_p1 AND id_titulo = $id_titulo
EOD;

                        $this->conn->execute($sql);
                    }
                }
            }
            //En este caso solo se anula el detalle de liquidacion
            /*             * else {
              //La anualidad es invalida
              throw new Exception("La anualidad a anular es invalida");
              }* */


            //COMMIT DE TODAS LAS TRANSACCIONES
            $this->conn->commit();


            // Solo registra log la primera vez de consulta
            //Operaciones: 1-CONSULTAR, 2-ACTUALIZAR, 3-ADICIONAR, 4-ELIMINAR, 5-ANULAR
            $id_ope_bd = 5;
            //obtener id maestro tabla
            $id_mae_bd = CN_TABLE::consultarIdTablaBD('ca_anual_etapa');
            //registro de consulta en tabla de log- la observacion puede o no enviarse ($request, $id_ope_bd, $id_mae_bd, $observacion)
            $sql = CN_TABLE::registrarLog($request, $id_ope_bd, $id_mae_bd, "Anulación de anualidad " . $id_anual_etapa . " para el título: " . $id_titulo);


            /*
             * Resultados de Accion
             */
            $this->list_data = array();
            $this->status = 0;
            $this->logMessage("Se actualizo estado por anulacion de etapa de titulo.");
        } catch (Exception $e) {

            //ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
            $this->conn->rollback();
            $this->status = 1;
            $this->mensajeError = "ERROR!!! " . $e->getMessage();
            $this->list_data = array();
            $this->logMessage("ERROR!!!");
            $this->logMessage($e->getMessage());
        }
    }

}
