<?php

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

    /**
     * Afiliacion completa
     * Genera para todos la afiliacion y retiro a la anterior que posean
     *
     * @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");

        $records = array();

        /**
         * Abrir nueva conexion con la Base de Datos
         */
        $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
        $this->conn->beginTransaction();

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

        try {

            /*
             * Variables de filtro
             */
            $fecha_abono = $request['fecha_abono'];
            $valor_bruto = $valor_abono = $request['valor_abono'];
            $id_planifica_fp = $request['id_planifica_fp'];
            $id_abono_cuota_dif = 'null';
            
            $num_doc_sop = 'null';
            if (isset($request['num_doc_sop'])) {
                $num_doc_sop = $request['num_doc_sop'];
            }

            /**
             * Verificar cuotas pendientes de pago
             */
            $sql = <<<EOD
select 
detcuo.*,
plaf.fecha_inicio,
plaf.numero_cuotas,
plaf.id_tasa_interes_mora,
plaf.id_tasa_interes_corriente,
tasamor.valor as tasa_mora,
tasacor.valor as tasa_corri 
from cbr_detalle_cuota_v detcuo
join cbr_planifica_fp plaf on plaf.id_planifica_fp = detcuo.id_planifica_fp
left join ca_tasa_interes tasamor on tasamor.id_tasa_interes = plaf.id_tasa_interes_mora
left join ca_tasa_interes tasacor on tasacor.id_tasa_interes = plaf.id_tasa_interes_corriente
where
detcuo.id_planifica_fp = $id_planifica_fp
and detcuo.pagada = 0
order by
detcuo.numero_cuota asc
EOD;

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

            if (count($records) > 0) {

                $numero_cuota = $records[0]['numero_cuota'];
                $fecha_cuota = $records[0]['fecha_cuota'];
                $valor_cuota = $records[0]['valor_cuota'];
                $valor_int_corri = $records[0]['valor_int_corri'];
                $valor_total = $records[0]['valor_total'];
                $tasa_mora = $records[0]['tasa_mora'];
                $tasa_corri = $records[0]['tasa_corri'];

                $valor_int_corri_dif = $valor_int_corri - $records[0]['valor_int_corri_abocuo'];

                //Traigo la cuota anterior segun la planifica_fp y numero de cuota de pago
                $sql = <<<EOD
select 
* 
from cbr_detalle_cuota_v
where 
id_planifica_fp = $id_planifica_fp
and numero_cuota < $numero_cuota
order by
numero_cuota desc 
EOD;

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

                //Cuotas anteriores
                if (count($records_cuoant) > 0) {
                    $this->logMessage("Tiene Cuotas anteriores");
                    $numero_cuota_cuoant = $records_cuoant[0]['numero_cuota'];
                    $valor_saldo_cuoant = $records_cuoant[0]['valor_saldo'];
                    $id_detalle_cuota_cuoant = $records_cuoant[0]['id_detalle_cuota'];

                    //Verifica si la cuota anterior tiene saldo a favor o en contra
                    if ($valor_saldo_cuoant < 0) {
                        $this->logMessage("Cuota anterior con saldo a favor.o");

                        //Restar valor para pago cuota nueva
                        $valor_bruto = $valor_abono - $valor_saldo_cuoant;

                        $sql = <<<EOD
select 
* 
from cbr_abono_cuota
where 
id_detalle_cuota = $id_detalle_cuota_cuoant
order by
id_detalle_cuota desc,
fecha_abono desc,
id_abono_cuota desc 
EOD;

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

                        $id_abono_cuota_dif = $records_detant[0]['id_abono_cuota'];
                    } else {
                        $this->logMessage("Cuota anterior sin saldo a favor o cero.");
                    }
                }


                //Realizar pagos por cuota, en consecutivo hasta agotar abono
                $this->logMessage("Realizar pagos por cuota, en consecutivo hasta agotar abono");
                foreach ($records as $record) {

                    $id_detalle_cuota_rec = $record['id_detalle_cuota'];
                    $numero_cuota = $record['numero_cuota'];
                    $valor_cuota_rec = $record['valor_cuota'];
                    $fecha_cuota_rec = $record['fecha_cuota'];
                    $valor_int_corri = $record['valor_int_corri'];

                    $valor_int_corri_dif = $valor_int_corri - $record['valor_int_corri_abocuo'];

                    /**
                     * Otros campos de la cuota
                     */
                    $capital = $valor_cuota_rec;
                    $tasa_mora = $record['tasa_mora'];
                    $fecha_ini = $fecha_cuota_rec;
                    $fecha_fin = $fecha_abono;

                    /*
                     * valores_cuota
                     */
                    $valores_cuota = CN_TABLE::valoresCuota($capital, $tasa_mora, $fecha_ini, $fecha_fin, $valor_bruto, $valor_int_corri_dif);
                    /*
                     * interes mora
                     */
                    $dias_mora_rec = $valores_cuota['dias_mora'];
                    $valor_int_mora_rec = $valores_cuota['valor_int_mora'];

                    /*
                     * interes corriente 
                     */
                    $valor_int_corri_rec = $valores_cuota['valor_int_corri'];

                    /*
                     * capital y diferencia
                     */
                    $valor_abono_capital_rec = $valores_cuota['valor_abono_capital'];
                    $valor_diferencia_rec = $valores_cuota['valor_diferencia'];

                    /*
                     * Insertar pago de cuota anterior
                     */
                    $sql = <<<EOD
Insert into CBR_ABONO_CUOTA (ID_ABONO_CUOTA,ID_DETALLE_CUOTA,FECHA_ABONO,VALOR_ABONO,VALOR_BRUTO,
    DIAS_MORA,VALOR_INT_MORA,VALOR_INT_CORRI,VALOR_ABONO_CAPITAL,VALOR_DIFERENCIA,ID_ABONO_CUOTA_DIF, NUM_DOC_SOP) 
values (null,$id_detalle_cuota_rec,to_date('$fecha_abono','YYYY-MM-DD'),'$valor_abono','$valor_bruto',
    $dias_mora_rec,'$valor_int_mora_rec','$valor_int_corri_rec','$valor_abono_capital_rec','$valor_diferencia_rec', $id_abono_cuota_dif, $num_doc_sop)
EOD;
                    //Ejecutar SQL
                    $this->conn->execute($sql);

                    /**
                     * Validar saldo del abono y cuota pagada
                     */
                    if ($valor_diferencia_rec < 0) {
                        $this->logMessage("[abono_cuota_extraordinaria] Validar saldo del abono y cuota pagada, cuota final de abono:" . $numero_cuota);

                        //Actualizar cuota paga, cuota anterior - 20151130
                        $sql = <<<EOD
UPDATE CBR_DETALLE_CUOTA SET PAGADA = 1 where id_detalle_cuota = $id_detalle_cuota_rec 
EOD;
                        //Ejecutar SQL
                        $this->conn->execute($sql);

                        //ultimo pago de cuota insertada, por pago cuota pendiente - 20151130
                        $sql = <<<EOD
select 
* 
from cbr_abono_cuota
where 
id_detalle_cuota = $id_detalle_cuota_rec
order by
id_detalle_cuota desc,
fecha_abono desc,
id_abono_cuota desc 
EOD;

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

                        $id_abono_cuota_dif = $records_detant[0]['id_abono_cuota'];
                        $valor_abono = $valor_bruto = $valor_diferencia_rec * (-1);
                    } elseif ($valor_diferencia_rec == 0) {
                        $this->logMessage("[abono_cuota_extraordinaria] Validar saldo del abono y cuota total pagada, cuota final de abono:" . $numero_cuota);

                        //Actualizar cuota paga, cuota anterior - 20151130
                        $sql = <<<EOD
UPDATE CBR_DETALLE_CUOTA SET PAGADA = 1 where id_detalle_cuota = $id_detalle_cuota_rec 
EOD;
                        //Ejecutar SQL
                        $this->conn->execute($sql);

                        //Termina el foreach
                        break;
                    } else {
                        $this->logMessage("[abono_cuota_extraordinaria] Se termino el saldo del abono, cuota final de abono:" . $numero_cuota);

                        //Termina el foreach
                        break;
                    }
                }

                /*
                 * COMMIT DE TODAS LAS TRANSACCIONES
                 */
                $this->conn->commit();
                $this->status = 0;
                $this->list_data = array();
                $this->logMessage("[abono_cuota_extraordinaria] Pago extraordinario exitoso.");
            } else {


                /*
                 * ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
                 */
                $this->conn->rollback();
                $this->status = 1;
                $this->mensajeError = "No tiene cuotas pendientes de pago.";
                $this->list_data = array();
                $this->logMessage("[abono_cuota_extraordinaria]" + $this->mensajeError);
            }
        } catch (Exception $e) {

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

}
