<?php

/**
 * Creado: 20200924::LAVILA
 * generar_det_liq_etapa actions. API para CA_DET_LIQ_REPO_CANON segun anualidades sin liquidacion
 *
 * Link: http://localhost/canon/web/api_dev.php/api/generar_det_liq_etapa/list.json
 * 
 * @package    canon
 * @subpackage generar_det_liq_etapa
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class generar_det_liq_etapaActions extends sfActions {

    /**
     * Executes index action
     *
     * @param sfRequest $request A request object
     */
    public function executeList(sfWebRequest $request) {

        //Log especifico de procesos completos
        $logPath = sfConfig::get('sf_log_dir') . '/liquidacion.log';
        $this->custom_logger = new sfFileLogger(new sfEventDispatcher(), array('file' => $logPath));
        $this->custom_logger->info("---BEGIN Logging request--- (Revisar log liquidacion.log)");
        foreach ($request->getPostParameters() as $key => $value) {
            $this->custom_logger->info("[generar_det_liq_etapa] request[$key] = $value\n");
        }
        $this->custom_logger->info("--------------------------------------------------/  Ip: " . $_SERVER['REMOTE_ADDR']);
        foreach ($request->getGetParameters() as $key => $value) {
            $this->custom_logger->info("[generar_det_liq_etapa] request[$key] = $value");
        }
        $this->custom_logger->info("---END Logging request");


        $sql = <<<EOD
DROP SEQUENCE CA_DET_LIQ_REPO_CANON_SEQ 
EOD;

        CN_TABLE::executeSQL($sql);
        $this->custom_logger->info("[generar_det_liq_etapa] Borrar secuencia");

        $sql = <<<EOD
CREATE SEQUENCE CA_DET_LIQ_REPO_CANON_SEQ  MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE 
EOD;

        CN_TABLE::executeSQL($sql);
        $this->custom_logger->info("[generar_det_liq_etapa] Crear secuencia");

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

        CN_TABLE::executeSQL($sql);
        $this->custom_logger->info("[generar_det_liq_etapa] Borrar tabla");

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

        try {

            $cantidad = 0;

            /**
             * Variables de formula
             */
            $sql = <<<EOD
SELECT
    *
FROM ca_variable                   
EOD;
            $records_var = CN_TABLE::executeSQL($sql);

            /**
             * Consulta de anualidades para calcular formula
             */
            $sql = <<<EOD
select distinct 

REPLACE( REPLACE( ('(case ' || tab.formula) ,';',' else 0 end)') , 'if','when') as formula_case,

case when tab.formula is null then 1 else 0 end as existe_formula, 
nvl(s.valor_mensual,0) as valor_mensual, 
nvl(s.id_smdlv,-1) as id_smdlv,
tab.*, 
hist.ANUALIDADES  as ANU_ETAPA_INICIAL, 
rt.fecha_ter  

from 
(
    select 
    a.liquidado , a.ANUALIDAD,  a.ID_ANUAL_ETAPA, a.fecha_inicio as fecha_inicio_anu,te.ID_ETAPA ,te.ID_TITULO, ta.AREA, tn.id_norma ,to_char(a.fecha_inicio, 'yyyy') vigencia, 
    nvl(repo.existe_canon,0) as existe_canon,		
    formu.formula as formula,
    tm.id_modalidad
    from ca_anual_etapa a 
    join ca_titulo_etapa te on a.id_titulo_etapa =te.id_titulo_etapa and te.actual = 1 and  a.liquidado  = 0 
    and add_months(sysdate,12) > a.fecha_inicio and a.fecha_inicio > to_date('31/12/2000', 'dd/mm/yyyy') 
    join in_titulo_area ta on ta.id_titulo = te.id_titulo and ta.actual = 1
    join ca_titulo_norma tn on tn.id_titulo = te.id_titulo and tn.actual =1 and id_norma != 3
    join rmn_titulo_modalidad tm on tm.id_titulo = te.id_titulo and tm.actual=1 
    join ca_formula formu on formu.id_norma = tn.id_norma and formu.id_etapa = te.id_etapa
    left join (
        select 
        repo.id_anual_etapa,
        count(repo.id_det_liq_canon) as existe_canon 
        from ca_det_liq_repo_canon repo
        where 
        1 = 1
        --a.id_anual_etapa = id_anual_etapa
        group by
        repo.id_anual_etapa
    )repo on repo.id_anual_etapa = a.id_anual_etapa
)tab
    
left join ca_smdlv s on s.vigencia = tab.vigencia	

join (
    select 
    te.id_titulo , max(anualidades) as anualidades 
    from ca_titulo_etapa te join rmn_titulo_modalidad tm on tm.id_titulo = te.id_titulo 
    and te.actual = 1 and tm.actual = 1 
    join ca_etapa_modalidad me on me.id_etapa = te.id_etapa and tm.id_modalidad = me.id_modalidad and orden = 1 
    group by  te.id_titulo
)hist on hist.id_titulo = tab.id_titulo       

join rmn_titulo rt on tab.id_titulo=rt.id_titulo

where 
tab.EXISTE_CANON = 0 and 
tab.liquidado = 0  and 
rt.fecha_ter > fecha_inicio_anu     
--and tab.id_titulo = 36810  

order by
tab.id_titulo                   
EOD;
            $records = CN_TABLE::executeSQL($sql);
            $this->custom_logger->info("[generar_det_liq_etapa] Cantidad de registros para calculo::" . count($records));

            $i = 0;

            foreach ($records as $value) {

                $vigencia = $value['vigencia'];
                $id_titulo = $value['id_titulo'];
                $id_etapa = $value['id_etapa'];
                $id_anual_etapa = $value['id_anual_etapa'];
                $id_smdlv = $value['id_smdlv'];
                $area = $value['area'];
                $anualidad = $value['anualidad'];
                $formula = $value['formula_case'];

                //For para reemplazar variables segun tabla y record
                foreach ($records_var as $value_var) {

                    $id_variable = $value_var['id_variable'];
                    $nombre = strtolower($value_var['nombre']);

                    $id = '$' . $id_variable;
                    $formula = str_replace($id, $value[$nombre], $formula);
                }


                //contador
                $i++;
                $this->custom_logger->info("[generar_det_liq_etapa] Insert de titulo $id_titulo y anual_etapa $id_anual_etapa. Contador::" . $i);

                $sql = <<<EOD
INSERT INTO CA_DET_LIQ_REPO_CANON
(
    VIGENCIA, ID_TITULO, ID_ETAPA, ID_ANUAL_ETAPA, ID_SMDLV, AREA, ANUALIDAD, VALOR
)VALUES(
    $vigencia
    ,$id_titulo
    ,$id_etapa
    ,$id_anual_etapa
    ,$id_smdlv
    ,$area
    ,$anualidad
    ,ROUND(
        $formula
    )
)
EOD;
                $this->conn->execute($sql);
            }

            $cantidad = $i;
            $this->custom_logger->info("[generar_det_liq_etapa] Termino Correctamente. Cantidad::" . $cantidad);

            $this->list_data = array(
                array(
                    'mensaje' => "Termino Correctamente. Cantidad: " . $cantidad
                )
            );
            $this->conn->commit();
        } catch (Exception $e) {

            //rollback de todas las transacciones en caso de que ocurra algun error
            $this->conn->rollback();

            $mensaje = "[generar_det_liq_etapa] ROLLBACK ERROR al Generar valores de anualidades pendientes segun formula. !!!";
            $this->custom_logger->info($mensaje);
            $this->custom_logger->info("state 2");
            $this->custom_logger->info("Code " . $e->getCode());
            $this->custom_logger->info("Message " . $e->getMessage());

            $this->status = 2;
            $this->mensajeError = $mensaje;
            $this->list_data = array(
                array(
                    'Code' => $e->getCode(),
                    'Line' => $e->getLine(),
                    'mensaje' => $mensaje
                )
            );
        }
    }

}
