<?php

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

    /**
     * Metodo list de accesos
     *
     * @param sfRequest $request A request object
     */
    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");


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

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

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



        //Parametros generales
        $fechaActual = CN_TABLE::fechaSistema();


        //Parametros generales
        $id_titulo = $request['id_titulo'];
        $cod_titulo = $request['cod_titulo'];
        $motivoAnu = "Anulado por funcionalidad de anulación de proyecciones de títulos históricos. " . $request['motivo_anu'];
        /*
         * Manejo de errores
         */
        try {


            //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_det_liq_canon');
            //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, "Se anulo toda la proyeccion para el titulo: " . $cod_titulo);


            //Detalles de liquidaciones en CA_DET_LIQ_CANON
            $sql = <<<EOD
   
select * from ca_det_liq_canon det where det.anulado=0 and det.id_titulo=$id_titulo
            
EOD;

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

            //Anular suspenciones anteriores, se deben registrar nuevas - 20200309
            $sql = <<<EOD
update ca_novedad set aprobada = 0, observaciones = observaciones || '. No se aprueban por novedad de anulacion de proyecciones' 
    where id_titulo = $id_titulo and id_tipo_novedad = 10               
EOD;

            CN_TABLE::executeSQL($sql, true);

            //Liberar todas las notas debito que puedan usarse en proximas proyecciones, para que aun si no es por funcionalidad de debitos quite la asociacion - 20190913
            $sql = <<<EOD

UPDATE CA_ANUAL_ETAPA_DEB
SET ID_ANUAL_ETAPA  = NULL
WHERE ID_TITULO = $id_titulo 
            
EOD;

            CN_TABLE::executeSQL($sql, true);


            if (count($recordsDetLiq) != 0) {

                foreach ($recordsDetLiq as $value) {

                    $idDetLiq = $value["id_det_liq_canon"];
                    $vigLiq = $value["vigencia"];

                    //Recibos de las anualidades liquidadas en CA_RECIBO
                    $sql = <<<EOD

select * from ca_recibo rec where rec.id_det_liq_canon=$idDetLiq and rec.vig_liq=$vigLiq
            
EOD;

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


                    if (count($recordsRecibos) != 0) {

                        foreach ($recordsRecibos as $value2) {

                            $idRecibo = $value2["id_recibo"];
                            $vigRec = $value2["vigencia"];
//                            $idDebitoCar = $value2["id_debito"];
//                            $secDebito = $value2["sec_debito"];
                            //Validar si la(s) nota(s) débito esta(n) anulada(s)
                            $sql = <<<EOD

select nvl(sum(nvl(deb.estado,0)),0) as estado from CA_RECIBO_DEBITO rec 
join ca_debito@WEBSAFI deb on rec.id_debito=deb.id_debito 
where rec.id_recibo=$idRecibo and rec.VIGENCIA=$vigRec
            
EOD;

                            $recordsDebito = CN_TABLE::executeSQL($sql, true);
                            //Error en caso de que la nota débito no este anulada
                            if (count($recordsDebito) != 0 && $recordsDebito[0]['estado'] != 0) {
                                throw new Exception("El recibo No " . $idRecibo . " de " . $vigRec . " ya tiene asociado una nota débito con secuencia débito en estado activo, por lo que el proceso no puede completarse.");
                            }

                            //Pagos históricos de los recibos en CA_PAGO_HISTORICO
                            $sql = <<<EOD

select * from ca_pago_historico pag where pag.id_recibo=$idRecibo and vigencia=$vigRec
            
EOD;
                            $recordsPagos = CN_TABLE::executeSQL($sql, true);

                            if (count($recordsPagos) != 0) {

                                foreach ($recordsPagos as $value3) {

                                    $idPago = $value3["id_pago_historico"];

                                    //Borrar fechas de pagos históricos en CA_FECHA_PAGO_HIST          
                                    $sql = <<<EOD

DELETE
FROM CA_FECHA_PAGO_HIST
WHERE ID_PAGO_HISTORICO    = $idPago
            
EOD;
                                    CN_TABLE::executeSQL($sql, true);


                                    //Borrar pagos histórico en CA_PAGO_HISTORICO          
                                    $sql = <<<EOD

DELETE
FROM CA_PAGO_HISTORICO
WHERE ID_PAGO_HISTORICO = $idPago
AND ID_RECIBO           = $idRecibo
AND VIGENCIA            = $vigRec

            
EOD;
                                    CN_TABLE::executeSQL($sql, true);
                                }
                            } else {
                                //No hay pagos históricos
                                $this->logMessage("[HIST_ANUL_PROYECCION] No hay pagos históricos");
                            }


                            //Anular recibo en CA_RECIBO         
                            $sql = <<<EOD

UPDATE CA_RECIBO
SET anulado             =1,
fecha_anula             ='$fechaActual'
WHERE ID_RECIBO         = $idRecibo
AND VIGENCIA            = $vigRec

            
EOD;
                            CN_TABLE::executeSQL($sql, true);
                        }
                    } else {
                        //No hay recibos para anular
                        $this->logMessage("[HIST_ANUL_PROYECCION] No hay recibos para anular");
                    }

                    //Anular detalle liquidacion en CA_DET_LIQ_CANON         
                    $sql = <<<EOD

UPDATE CA_DET_LIQ_CANON
SET anulado            =1,
aprobado               =0,
fecha_anula            ='$fechaActual',
motivo_anu             ='$motivoAnu'

WHERE ID_DET_LIQ_CANON = $idDetLiq
AND VIGENCIA           = $vigLiq
AND ID_TITULO          = $id_titulo
            
EOD;
                    CN_TABLE::executeSQL($sql, true);
                }

                //Dejar sin proyección al título en CA_TITULO_ETAPA
                $sql = <<<EOD

   
UPDATE CA_TITULO_ETAPA
SET actual              =0
WHERE ID_TITULO         =$id_titulo

EOD;

                CN_TABLE::executeSQL($sql, true);
            } else {

                //Dejar sin proyección al título en CA_TITULO_ETAPA
                $sql = <<<EOD

   
UPDATE CA_TITULO_ETAPA
SET actual              =0
WHERE ID_TITULO         =$id_titulo

EOD;

                CN_TABLE::executeSQL($sql, true);
            }


            $this->conn->commit();

            $this->totalRows = 1;
            $this->startRow = 0;
            $this->endRow = 1;
            $this->status = 0;
            $this->list_data = array();
            $this->logMessage("[HIST_ANUL_PROYECCION] Consulta exitosa.");
        } catch (Exception $e) {

            $this->conn->rollback();
            $error = "[HIST_ANUL_PROYECCION] ERROR: " . $e->getMessage();
            $this->status = 1;
            $this->list_data = array();
            $this->mensajeError = $error;
            $this->logMessage($error);
        }
    }

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

}
