<?php

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

    /**
     * Incidente #6514 - Calculadora web - 20171109
     *
     * @param sfWebRequest $request
     */
    public function executeDato(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 {

            /**
             * Variable de consulta
             */
            $fecha_ini = $request['fecha_ini'];
            $fecha_fin = $request['fecha_fin'];
            $tasa = $request['tasa'];
            $valor = $request['valor'];
            
            $vig_ini = substr($fecha_ini, 0, 4);
            $mes_ini = substr($fecha_ini, 5, 2);
            $dia_ini = substr($fecha_ini, 8, 2);
            $vig_fin = substr($fecha_fin, 0, 4);
            $mes_fin = substr($fecha_fin, 5, 2);

            /**
             * Obtener valor de la base de datos
             */
            if ($tasa == 1) {
                $this->logMessage('Tasa interes = ' . $tasa);

                //Sql
                $sql = <<<EOD
select 
consulta_sql_interes_normal($vig_ini,$mes_ini,$dia_ini,
$vig_fin,$mes_fin,
'$fecha_ini','$fecha_fin',$valor,$tasa) as valor
from dual 
EOD;

                //ejecuta y obtiene el resultado del sql
                $records = CN_TABLE::executeSQL($sql);
            } else {
                $this->logMessage('Tasa Usura = ' . $tasa);

                //Sql
                $sql = <<<EOD
select 
consulta_sql_interes($vig_ini,$mes_ini,
$vig_fin,$mes_fin,
'$fecha_ini','$fecha_fin',$valor) as valor
from dual  
EOD;

                //ejecuta y obtiene el resultado del sql
                $records = CN_TABLE::executeSQL($sql);
            }

            //Valor de respuesta
            if (count($records) > 0) {
                $this->dato = $records[0]['valor'];
            } else {
                $this->dato = 0;
            }
        } catch (Exception $e) {

            //Valor para controlar el error
            $this->dato = -9999;
        }

        //guardar dato en el log
        $this->logMessage('Dato de la consulta = ' . $this->dato);
    }

    /**
     * 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");

        /*
         * 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
             */

            //Si es init traer el concecutivo de la tabla
            $init = 0;
            if (isset($request['init'])) {
                $init = $request['init'];
            }
            //tmpNumber
            $tmpNumber = 0;
            if (isset($request['tmp_num'])) {
                $tmpNumber = $request['tmp_num'];
            }

            $DIAS_ANHO = 365;


            /*
             * sql que trae los resultados
             * por los filtros, para totalizar las filas
             */

            if ($init == 1) {
                $sql = "SELECT nvl(CA_PROYEC_INT_TMP_SEQ.nextval,0) as tmp_num, $DIAS_ANHO as dias_anho FROM DUAL";

                //ejecuta y obtiene el resultado del sql
                $records = CN_TABLE::executeSQL($sql);
                $total_record_count = 1;
            } else {

                /**
                 * UNIFICACION DE CALCULO DE INTERESES#6543
                 * Calculo Trimestral - 20170704
                 * Arreglo agrupamiento informe, cuando no tiene trimestre tasa normal, no agrupa  - 20170724
                 */
                $query = "
select 
tab0.*, 
tab0.VALOR_INTERES+VALOR_CAPITAL as VALOR_TOTAL

from(
                    
    SELECT 
    max(ID_PROYECCION) as ID_PROYECCION,
    min(FECHA_PAGO_OPORTUNO) as FECHA_PAGO_OPORTUNO,
    max(FECHA_PAGO) as FECHA_PAGO,
    to_char(FECHA_PAGO, 'yyyy') as vigencia,
    LISTAGG(to_char(FECHA_PAGO, 'mm'), ',') WITHIN GROUP (ORDER BY mes.id_meses) as mes,
    nvl(mes.trimestre,rownum+100) as trimestre,
    VALOR_CAPITAL,
    TI.nombre,
    TI.valor as tasa,
    TMP_NUM,
    TMP_NUM_SEC,
    sum(TRUNC(FECHA_PAGO)-TRUNC(FECHA_PAGO_OPORTUNO)+1) AS DIAS_MORA,
    --ROUND(VALOR_CAPITAL * ((TI.VALOR/100)/$DIAS_ANHO) * NVL(TRUNC(FECHA_PAGO)-TRUNC(FECHA_PAGO_OPORTUNO),0)) AS VALOR_INTERES,
    --ROUND((POWER(1+(TI.VALOR/100),(NVL(TRUNC(FECHA_PAGO)-TRUNC(FECHA_PAGO_OPORTUNO),0)/$DIAS_ANHO))-1)*VALOR_CAPITAL) AS VALOR_INTERES 
    --ROUND((POWER((1+(TI.VALOR/100)), (1/$DIAS_ANHO))-1)*VALOR_CAPITAL*(NVL(TRUNC(FECHA_PAGO)-TRUNC(FECHA_PAGO_OPORTUNO)+1,0))) AS VALOR_INTERES
    ROUND(( POWER((1+(TI.VALOR/100)), ( sum((NVL(TRUNC(FECHA_PAGO)-TRUNC(FECHA_PAGO_OPORTUNO)+1,0))) /$DIAS_ANHO)) -1 )*VALOR_CAPITAL) AS VALOR_INTERES

    FROM CA_PROYEC_INT_TMP INT 
    JOIN CA_TASA_INTERES TI ON INT.ID_TASA_INTERES=TI.ID_TASA_INTERES
    left join meses mes on mes.id_meses = ti.id_meses

    where tmp_num=" . $tmpNumber . "

    group by
    to_char(FECHA_PAGO, 'yyyy'),
    nvl(mes.trimestre,rownum+100),
    VALOR_CAPITAL,
    TI.nombre,
    TI.valor,
    TMP_NUM,
    TMP_NUM_SEC

)tab0

order by
tab0.ID_PROYECCION,
tab0.vigencia,
tab0.mes 
";

                $sql = <<<EOD
select count(*) as count from(
 
$query     
 
)tabla
EOD;

                $records = CN_TABLE::executeSQL($sql);
                $total_record_count = $records[0]['count'];

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

                    /*
                     * Obtiene los accesos para un perfil
                     */
                    $sql = <<<EOD
SELECT * FROM ( SELECT row_.*, ROWNUM rownum_ FROM (
      
   $query   
            
) row_ WHERE ROWNUM <=  $rowEnd   ) where rownum_ >  $rowStart
EOD;

                    //ejecuta y obtiene el resultado del sql
                    $records = CN_TABLE::executeSQL($sql);
                }
            }

            if ($total_record_count > 0) {
                $this->totalRows = $total_record_count;
                $this->startRow = 0;
                $this->endRow = $total_record_count;
                $this->status = 0;
                $this->list_data = $records;
                $this->logMessage("[CA_PROYEC_INT_TMP] Consulta exitosa.");
            } else {

                $mensaje = "[CA_PROYEC_INT_TMP] No hay registros de consulta.";
                $this->status = 0;
                $this->list_data = array();
                $this->logMessage($mensaje);
            }
        } catch (Exception $e) {
            $error = "[CA_PROYEC_INT_TMP] ERROR: " . $e->getMessage();
            $this->status = 1;
            $this->list_data = array();
            $this->mensajeError = $error;
            $this->logMessage($error);
        }
    }

    public function executeAdd(sfWebRequest $request) {
        $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 {

            /*
             * variables del add
             */
            $idProyeccion = $request['id_proyeccion'];
            $fecha_pago_oportuno = $request['fecha_pago_oportuno'];
            $fecha_pago = $request['fecha_pago'];
            $valor_capital = str_replace(".", "", $request['valor_capital']);
            $valor_capital = explode(",", $valor_capital);
            $valor_capital = $valor_capital[0];

            $tmp_num = $request['tmp_num'];
            $tmp_num_sec = 0;
            $tasaInteres = $request['id_tasa_interes'];
            $aplica_usura = $request['aplica_usura'];

            /**
             * TMP_NUM_SEC consecutivo para agrupacion de informe - 20170926
             */
            $sql = <<<EOD
SELECT nvl( max(TMP_NUM_SEC) ,0) + 1 as TMP_NUM_SEC FROM CA_PROYEC_INT_TMP 
    where TMP_NUM = $tmp_num 
EOD;

            //ejecuta y obtiene el resultado del sql
            $records = CN_TABLE::executeSQL($sql);
            if (count($records) > 0) {
                $tmp_num_sec = $records[0]['tmp_num_sec'];
            }

            /**
             * Incidente #6059, calcula para cada mes el valor para cada tasa, no el total por todo el tiempo - 20170519
             */
            if ($aplica_usura == 'true') {

                $sql = <<<EOD
select 
to_date('$fecha_pago_oportuno', 'yyyy-mm-dd') as FECHA_PAGO_OPORTUNO,
to_char(to_date('$fecha_pago_oportuno', 'yyyy-mm-dd'), 'mm') as FECHA_PAGO_OPORTUNO_mes,
to_char(to_date('$fecha_pago_oportuno', 'yyyy-mm-dd'), 'yyyy') as FECHA_PAGO_OPORTUNO_anho,
to_date('$fecha_pago', 'yyyy-mm-dd') as FECHA_PAGO,
to_char(to_date('$fecha_pago', 'yyyy-mm-dd'), 'mm') as FECHA_PAGO_mes,
to_char(to_date('$fecha_pago', 'yyyy-mm-dd'), 'yyyy') as FECHA_PAGO_anho
from dual 
EOD;

                //ejecuta y obtiene el resultado del sql
                $records = CN_TABLE::executeSQL($sql);
                $anho_req = $records[0]['fecha_pago_oportuno_anho'];
                $mes_req = $records[0]['fecha_pago_oportuno_mes'];
                $comparar_req = $anho_req . str_pad($mes_req, 2, '0', STR_PAD_LEFT);
                $comparar = $records[0]['fecha_pago_anho'] . str_pad($records[0]['fecha_pago_mes'], 2, '0', STR_PAD_LEFT);

                //Recorre cada mes y coloca un registro por tasa
                while ($comparar_req <= $comparar) {




                    $sql = <<<EOD
INSERT
INTO CA_PROYEC_INT_TMP
  (
    ID_PROYECCION,
    FECHA_PAGO_OPORTUNO,
    FECHA_PAGO,
    VALOR_CAPITAL,
    TMP_NUM,
    ID_TASA_INTERES,
    VIGENCIA_MES,
    TMP_NUM_SEC                            
  )
VALUES
(                    
    null,
    case when to_char(to_date('$fecha_pago_oportuno', 'yyyy-mm-dd'), 'yyyymm') = $anho_req$mes_req then to_date('$fecha_pago_oportuno', 'yyyy-mm-dd') else to_date('$anho_req-$mes_req-01', 'yyyy-mm-dd') end,
    case when to_char(to_date('$fecha_pago', 'yyyy-mm-dd'), 'yyyymm') = $anho_req$mes_req then to_date('$fecha_pago', 'yyyy-mm-dd') else last_day(to_date('$anho_req-$mes_req-01', 'yyyy-mm-dd')) end,
    $valor_capital,
    $tmp_num, 
    nvl((select max(id_tasa_interes) as id_tasa_interes from ca_tasa_interes where vigencia = $anho_req and id_meses = $mes_req),1),
    $comparar_req,
    $tmp_num_sec                        
                    
)
            
EOD;

                    //Insertar nuevo registro
                    CN_TABLE::executeSQL($sql);

                    $ref_siguiente = CN_TABLE::fechaSiguiente($anho_req, $mes_req);

                    //variables del request - actualiza por siguientes
                    $anho_req = $ref_siguiente['id_anhos'];
                    $mes_req = $ref_siguiente['id_meses'];

                    //validar ciclo infinito
                    if ($anho_req > 2111) {
                        die();
                    }

                    /*
                     * Cambio por ciclo comparacion fecha - 20120724
                     */
                    $mes_req = str_pad($mes_req, 2, '0', STR_PAD_LEFT);
                    $comparar_req = $anho_req . $mes_req;
                }
            } else {

                //Incidente #6809, si no es usura, calcula por rango de años - 20170727
                $sql = <<<EOD
select 
to_date('$fecha_pago_oportuno', 'yyyy-mm-dd') as FECHA_PAGO_OPORTUNO,
to_char(to_date('$fecha_pago_oportuno', 'yyyy-mm-dd'), 'dd') as FECHA_PAGO_OPORTUNO_dia,
to_char(to_date('$fecha_pago_oportuno', 'yyyy-mm-dd'), 'mm') as FECHA_PAGO_OPORTUNO_mes,
to_char(to_date('$fecha_pago_oportuno', 'yyyy-mm-dd'), 'yyyy') as FECHA_PAGO_OPORTUNO_anho,
to_date('$fecha_pago', 'yyyy-mm-dd') as FECHA_PAGO,
to_char(to_date('$fecha_pago', 'yyyy-mm-dd'), 'mm') as FECHA_PAGO_mes,
to_char(to_date('$fecha_pago', 'yyyy-mm-dd'), 'yyyy') as FECHA_PAGO_anho
from dual 
EOD;

                //ejecuta y obtiene el resultado del sql
                $records = CN_TABLE::executeSQL($sql);
                $anho_req = $records[0]['fecha_pago_oportuno_anho'];
                $mes_req = $records[0]['fecha_pago_oportuno_mes'];
                $dia_req = $records[0]['fecha_pago_oportuno_dia'];
                $comparar_req = $anho_req;
                $comparar = $records[0]['fecha_pago_anho'];

                //Recorre cada mes y coloca un registro por tasa
                while ($comparar_req <= $comparar) {

                    $anho_req_pag = $anho_req + 1;

                    $sql = <<<EOD
INSERT
INTO CA_PROYEC_INT_TMP
  (
    ID_PROYECCION,
    FECHA_PAGO_OPORTUNO,
    FECHA_PAGO,
    VALOR_CAPITAL,
    TMP_NUM,
    ID_TASA_INTERES,
    VIGENCIA_MES,
    TMP_NUM_SEC 
  )
VALUES
(                    
    null,
    case when to_char(to_date('$fecha_pago_oportuno', 'yyyy-mm-dd'), 'yyyy') = $anho_req 
        then to_date('$fecha_pago_oportuno', 'yyyy-mm-dd') 
            else to_date('$anho_req-$mes_req-$dia_req', 'yyyy-mm-dd') end,
    case when to_char(to_date('$fecha_pago', 'yyyy-mm-dd'), 'yyyy') = $anho_req then to_date('$fecha_pago', 'yyyy-mm-dd') 
        else case when (to_date('$anho_req_pag-$mes_req-$dia_req', 'yyyy-mm-dd')-1) <= to_date('$fecha_pago', 'yyyy-mm-dd')
            then (to_date('$anho_req_pag-$mes_req-$dia_req', 'yyyy-mm-dd')-1)
                else to_date('$fecha_pago', 'yyyy-mm-dd') end
                    end,
    $valor_capital,
    $tmp_num, 
    $tasaInteres,
    $comparar_req,
    $tmp_num_sec    
                    
)
            
EOD;

                    //Insertar nuevo registro
                    CN_TABLE::executeSQL($sql);

                    //variables del request - actualiza por siguientes
                    $anho_req = $anho_req + 1;

                    //validar ciclo infinito
                    if ($anho_req > 2111) {
                        die();
                    }

                    /*
                     * Cambio por ciclo comparacion fecha - 20120724
                     */
                    $comparar_req = $anho_req;
                }

                //Borrar registros erroneso de fecha - 20170727
                $sql = <<<EOD
delete from ca_proyec_int_tmp
where
fecha_pago < fecha_pago_oportuno             
EOD;

                //Insertar nuevo registro
                CN_TABLE::executeSQL($sql);
            }

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

    public function executeRemove(sfWebRequest $request) {
        $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 {


            $sql = <<<EOD
                    
TRUNCATE TABLE CA_PROYEC_INT_TMP
  
EOD;

            //Insertar nuevo registro TODO REPLACE ORACLE JOB AT NIGHT
            // CN_TABLE::executeSQL($sql);


            $this->status = 0;
            $this->list_data = array();
            $this->logMessage("[CA_PROYEC_INT_TMP-RM] Consulta exitosa.");
        } catch (Exception $e) {
            $this->logMessage("[CA_PROYEC_INT_TMP-RM] Registro Fallido $e");
            $this->status = 1;
            $this->list_data = array();
        }
    }

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

}
