<?php

/**
 * gen_renuncia_contrato actions. last mod 06/08/12
 *
 * @package    canon
 * @subpackage gen_renuncia_contrato
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class gen_renuncia_contratoActions extends sfActions {

    public $conn;

    /**
     * Metodo list de accesos
     *
     * @param sfRequest $request A request object
     */
    public function executeAdd(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 {

            /*
             * Paginacion
             */
            if (isset($request['_startRow'])) {
                $rowStart = $request['_startRow'];
            } else {
                $rowStart = 0;
            }

            if (isset($request['_endRow'])) {
                $rowEnd = $request['_endRow'];
            } else {
                $rowEnd = 75;
            }

            /*
             * variables de filtro
             */

            if (isset($request['id_titulo'])) {
                $whereTitulo = " AND tab0.id_titulo = '" . $request['id_titulo'] . "' ";
                $titulo_param = $request['id_titulo'];
            }

            if (isset($request['id_novedad'])) {
                $whereNovedad = " AND tab0.id_novedad = '" . $request['id_novedad'] . "' ";
                $novedad_param = $request['id_novedad'];
            }


            if (isset($request['fecha_ter'])) {
                $whereFechaTer = " AND tab0.fecha_ter = '" . $request['fecha_ter'] . "' ";
                $fecha_ter = $request['fecha_ter'];
            }

            // Solo registra log la primera vez de consulta
            //Operaciones: 1-CONSULTAR, 2-ACTUALIZAR, 3-ADICIONAR, 4-ELIMINAR, 5-ANULAR
            $id_ope_bd = 3;
            //obtener id maestro tabla
            $id_mae_bd = CN_TABLE::consultarIdTablaBD('ca_titulo_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, "Generación de renuncia de contrato para el título: " . $titulo_param . " con fecha de terminacion de contrato: " . $fecha_ter);

//PRECONDICION RENUNCIA CONTRATO            
            
            //Anular las anualidades ya liquidadas, en caso de que el recibo ya tenga asociado un debito no podran anularse y el proceso de renuncia no se podra realizar.

            $sql = <<<EOD
select tab2.*, tab0.fecha_ter from rmn_titulo tab0 
join ca_titulo_etapa tab1 on tab0.id_titulo=tab1.id_titulo 
join ca_anual_etapa tab2 on tab1.id_titulo_etapa =tab2.id_titulo_etapa
where tab0.id_titulo=$titulo_param
and tab2.fecha_inicio >=  tab0.fecha_ter
and tab1.actual=1
and liquidado=1
EOD;

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

            if (count($records) != 0) {
                foreach ($records as $value) {

                    $this->anularLiquidada($value['id_anual_etapa'], $request);
                    $this->logMessage("Se anulo anualidad ya liquidada: ".$value['id_anual_etapa']);
                }
            }


//RENUNCIA DE CONTRATO

            //Desactivar las etapas posteriores a la fecha de terminacion del contrato
            $sql = <<<EOD
select tab1.* from rmn_titulo tab0 join ca_titulo_etapa tab1 on tab0.id_titulo=tab1.id_titulo 
where tab0.id_titulo=$titulo_param
and tab0.fecha_ter<tab1.fecha_fin
and tab0.fecha_ter<=tab1.fecha_inicio
and tab1.actual=1 
EOD;

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


            //validar si hay registros
            if (count($records) > 0) {


                foreach ($records as $value) {

                    //TITULO ETAPA
                    $tituloEtapaIdAnt = $value["id_titulo_etapa"];

//Validar que las anualidades NO esten liquidadas
                    $sql = <<<EOD

select nvl(sum(tab2.liquidado),0)as sum_liq from rmn_titulo tab0 join ca_titulo_etapa tab1 on tab0.id_titulo=tab1.id_titulo 
join ca_anual_etapa tab2 on tab1.id_titulo_etapa =tab2.id_titulo_etapa
where tab0.id_titulo=$titulo_param
and tab0.fecha_ter<tab1.fecha_fin
and tab0.fecha_ter<=tab1.fecha_inicio
and tab1.actual=1

EOD;
                    $sum_liq = CN_TABLE::executeSQL($sql, true);
                    $sum_liq = $sum_liq[0]["sum_liq"];

                    if ($sum_liq != 0) {
                        //anularLiquidada
                        throw new Exception("Existe una anualidad ya liquidada posterior a la fecha de terminación del contrato, por lo que no puede ser aprobada esta novedad!.");
                    }

                    $sql = <<<EOD

UPDATE CA_TITULO_ETAPA
SET actual            =0
WHERE ID_TITULO_ETAPA = $tituloEtapaIdAnt

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

//Etapas que se deben modificar debido a la terminacion del contrato inesperada
            $sql = <<<EOD
select tab0.fecha_ter, tab1.*
from rmn_titulo tab0 join ca_titulo_etapa tab1 on tab0.id_titulo=tab1.id_titulo 
where tab0.id_titulo=$titulo_param
and tab0.fecha_ter<tab1.fecha_fin
and tab0.fecha_ter>tab1.fecha_inicio
and tab1.actual=1     
EOD;

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


            //validar si hay registros
            if (count($records) > 0) {

                $tituloEtapaIdAnt = $records[0]["id_titulo_etapa"];

                //Validar que las anualidades que seran truncadas no esten liquidadas, en caso de estar liquidadas se lanzara una excepcion 

                $sql = <<<EOD
select * from(select tab2.* from rmn_titulo tab0 
join ca_titulo_etapa tab1 on tab0.id_titulo=tab1.id_titulo 
join ca_anual_etapa tab2 on tab1.id_titulo_etapa=tab2.id_titulo_etapa
where tab0.id_titulo=$titulo_param
AND tab1.actual=1
and tab1.id_titulo_etapa=$tituloEtapaIdAnt

minus

    select tab2.* from rmn_titulo tab0 
join ca_titulo_etapa tab1 on tab0.id_titulo=tab1.id_titulo 
join ca_anual_etapa tab2 on tab1.id_titulo_etapa=tab2.id_titulo_etapa
where tab0.id_titulo=$titulo_param
AND tab1.actual=1
and tab1.id_titulo_etapa=$tituloEtapaIdAnt
and fecha_ter >  tab2.fecha_inicio)
where liquidado =1     
EOD;

                $val = CN_TABLE::executeSQL($sql, true);
                //TODO COUNT($VAL);
                $val=COUNT($val);

                if ($val != 0) {
                    throw new Exception("Existe una anualidad ya liquidada posterior a la fecha de terminación del contrato, por lo que no puede ser aprobada esta novedad!.");
                }


                //Creacion nueva proyeccion
                $sql = <<<EOD
           select tab2.* from rmn_titulo tab0 
join ca_titulo_etapa tab1 on tab0.id_titulo=tab1.id_titulo 
join ca_anual_etapa tab2 on tab1.id_titulo_etapa=tab2.id_titulo_etapa
where tab0.id_titulo=$titulo_param
and tab1.actual=1
and tab1.id_titulo_etapa=$tituloEtapaIdAnt
and  fecha_ter >  tab2.fecha_inicio
                           
EOD;

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


                //Para el add

                if ($numAnu > 0) {
                    $etapa = $records[0]["id_etapa"];
                    $novedad = $novedad_param;
                    $fecha_inicio = $records[0]["fecha_inicio"];
                    $fecha_fin = $records2[$numAnu - 1]["fecha_fin"];
                    $fecha_inscripcion = $records[0]["fecha_inscripcion"];
                    $anualidades = $numAnu;
                    $estado = $records[0]["estado"];
                    $actual = 1;


                    /**
                     * Se crea un nuevo titulo_etapa para la etapa que se vea afectada por la terminacion del contrato
                     */
                    $sql = <<<EOD

INSERT INTO CA_TITULO_ETAPA (id_titulo_etapa, id_titulo, id_etapa, id_novedad, fecha_inicio, fecha_fin,fecha_inscripcion, anualidades, estado, actual )
VALUES (NULL ,$titulo_param, $etapa, $novedad, to_date('$fecha_inicio','YYYY-MM-DD HH24:MI:SS'), to_date('$fecha_fin', 'YYYY-MM-DD HH24:MI:SS'), to_date('$fecha_inscripcion', 'YYYY-MM-DD HH24:MI:SS'), $anualidades, $estado, $actual)

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

                    $this->logMessage("Inserto CA_TITULO_ETAPA actual nueva");

                    /**
                     * Obtener ultimo id
                     */
                    $sql = <<<EOD
   
SELECT MAX(id_titulo_etapa) AS id_titulo_etapa FROM ca_titulo_etapa

EOD;
                    $tituloEtapaIdAct = CN_TABLE::executeSQL($sql, true);
                    $tituloEtapaIdAct = $tituloEtapaIdAct[0]["id_titulo_etapa"];

                    /**
                     * Se actualiza el título etapa histórico
                     */
                    $this->actualizarTituloEtapaHistorico($titulo_param, $tituloEtapaIdAct, $fecha_inicio);

                    /**
                     * Se actualiza la fila de titulo_etapa que ahora no será de la proyeccion actual
                     */
                    $this->actualizarTituloEtapa($tituloEtapaIdAnt);

                    foreach ($records2 as $value) {

                        $liquidado_anu = $value["liquidado"];
                        $impreso_anu = $value["impreso"];
                        $anualidad_anu = $value["anualidad"];
                        $fecha_inicio_anu = $value["fecha_inicio"];
                        $fecha_fin_anu = $value["fecha_fin"];
                        $estado_anu = $value["estado"];


                        /**
                         * Inserta las antiguas anualidades en la nueva proyeccion
                         */
                        $sql = <<<EOD
   
INSERT INTO CA_ANUAL_ETAPA ( ID_ANUAL_ETAPA, ID_TITULO_ETAPA, ID_TITULO, ANUALIDAD, FECHA_INICIO, FECHA_FIN, ESTADO, LIQUIDADO, IMPRESO)
VALUES(NULL, $tituloEtapaIdAct, $titulo_param, $anualidad_anu, '$fecha_inicio_anu', '$fecha_fin_anu', $estado_anu, $liquidado_anu, $impreso_anu)

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

                        $this->logMessage("Inserto CA_ANUAL_ETAPA nuevas");
                    }
                } else {
                    $this->logMessage("La etapa a modificar no tiene proyecciones en anual etapa");
                }
            }

            /**
             * Aprueba la novedad debido a que la transaccion fue exitosa  
             */
            $sql = <<<EOD
UPDATE CA_NOVEDAD
SET aprobada          =1
WHERE ID_NOVEDAD      = $novedad_param

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

            //COMMIT DE TODAS LAS TRANSACCIONES
            $this->conn->commit();
            $this->status = 0;
            $this->list_data = array();
            $this->logMessage("[GEN_RENUNCIA CONTRATO] Consulta exitosa");
        } catch (Exception $e) {
            //ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
            $this->conn->rollback();
            $this->status = 1;
            $this->mensajeError = "[GEN_RENUNCIA CONTRATO] Ocurrio un error: " . $e->getMessage();
            $this->list_data = array();
            $this->logMessage("[GEN_RENUNCIA CONTRATO] ERROR!");
            $this->logMessage($e->getMessage());
        }
    }

    public function modalidadTitulo($id_titulo) {
        $sql = <<<EOD

SELECT id_modalidad FROM rmn_titulo_modalidad WHERE id_titulo=$id_titulo


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

        return $records[0]["id_modalidad"];
    }

    public function numEtapasModalidad($id_modalidad) {
        $sql = <<<EOD

SELECT MAX(id_etapa) as count FROM ca_etapa_modalidad WHERE id_modalidad=$id_modalidad

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

        return $records[0]["count"];
    }

    public function actualizarTituloEtapa($id_titulo_etapa) {

        /**
         * Se actualiza la fila de titulo_etapa que ahora no será de la proyeccion actual, el estado no se actualiza
         */
        $sql = <<<EOD
        
UPDATE ca_titulo_etapa tab0
SET tab0.actual=0
WHERE tab0.id_titulo_etapa=$id_titulo_etapa

EOD;

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

        $this->logMessage("Actualizo CA_TITULO_ETAPA");
    }

    /**
     * Se mantiene actualizado la historia de los etapa_titulos
     */
    public function actualizarTituloEtapaHistorico($titulo, $titulo_etapa, $vig) {

        //Revisar si existe una proyección histórica para el título 
        $sql = <<<EOD
        
SELECT COUNT(*) AS count 
FROM ca_titulo_etapa_hist 
WHERE id_titulo=$titulo

EOD;

        $total_count = CN_TABLE::executeSQL($sql, true);
        $total_count = $total_count[0]["count"];

        if ($total_count == 0) {
            //Primer historico inserta con 1
            $num_sec_max = 1;
        } else {
            //max(num_proyeccion) + 1 como nuevo consecutivo
            $sql = <<<EOD
   
SELECT MAX(mun_sec) AS max 
FROM ca_titulo_etapa_hist 
WHERE id_titulo=$titulo
             
EOD;

            $max = CN_TABLE::executeSQL($sql, true);
            $max = $max[0]["max"];
            $max = $max + 1;
            $num_sec_max = $max;
        }

        $sql = <<<EOD
   
             INSERT
INTO CA_TITULO_ETAPA_HIST
  (
    ID_TITULO,
    MUN_SEC,
    ID_TITULO_ETAPA,
    VIGENCIA
  )
  VALUES
 ($titulo,$num_sec_max,$titulo_etapa, EXTRACT(YEAR FROM to_date('$vig', 'YYYY-MM-DD HH24:MI:SS')))
             
EOD;

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

        $this->logMessage("Actualizo histórico CA_TITULO_ETAPA");
    }

    private function anularLiquidada($id_anualidad, sfWebRequest $request) {
        
         $fecha_actual = CN_TABLE::fechaSistema();
         
        $sql = <<<EOD

select tab1.*, tab0.vigencia as vigencia_liq, tab0.id_det_liq_canon as det from ca_det_liq_canon tab0 left join ca_recibo tab1 on tab0.id_det_liq_canon=tab1.id_det_liq_canon and tab0.vigencia=tab1.vig_liq
where tab0.id_anual_etapa=$id_anualidad
 
EOD;

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

        if (count($records) != 0) {
            if ($records[0]['id_debito']!=null) {
                throw new Exception("Existe una anualidad ya liquidada posterior a la fecha de terminación del contrato que ya tiene débito asociado.");
            } else {

                $recibo = $records[0]['id_recibo'];
                $vigencia = $records[0]['vigencia'];
                $vigencia_liq = $records[0]['vigencia_liq'];
                $user = $request['id_usuario_log'];
                $id_det_liq = $records[0]['det'];

                //Anular recibo
                $sql = <<<EOD
                 
                 UPDATE CA_RECIBO
SET FECHA_ANULA         =to_date('$fecha_actual', 'YYYY-MM-DD'),
    ANULADO             =1,
    ID_USUARIO_ANULA    = $user
WHERE ID_RECIBO         = $recibo
AND VIGENCIA            = $vigencia

EOD;
                if($recibo!=null)
                {
                    $this->conn->execute($sql);
                }


                //Anular detalle de liquidacion
                $sql = <<<EOD
   
                 UPDATE CA_DET_LIQ_CANON
SET ANULADO            =1,
    APROBADO           =0,
    FECHA_ANULA        =to_date('$fecha_actual', 'YYYY-MM-DD'),
    MOTIVO_ANU         ='Anulación debido a terminación de contrato'       
WHERE ID_DET_LIQ_CANON = $id_det_liq
AND VIGENCIA           = $vigencia_liq

EOD;
                if($id_det_liq!=null)
                {
                    $this->conn->execute($sql);
                }

                //Anular anualidad

                $sql = <<<EOD
   
UPDATE CA_ANUAL_ETAPA
SET LIQUIDADO        =0,
    IMPRESO          =0
WHERE ID_ANUAL_ETAPA = $id_anualidad

EOD;
                if($id_anualidad!=null)
                {
                    $this->conn->execute($sql);
                }

                $this->logMessage("Anulo anualidades ya liquidadas sin debitos");
            }
        }
    }

    // Validate
    /**
     * Ejecuta una validación previa a la ejecución de una operación tipo Add
     *
     * @param sfWebRequest $request
     * @return array 
     */
    protected function validateAdd(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 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 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") {
            
        }

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

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

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

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

        return $request;
    }

}
