<?php

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

    /**
     * Executes Generar costeo presupuestal
     * 
     * El costeo se cambia de pagos a obligaciones con uso y sin uso - 20201124::LAVILA
     * Se coloca que sean upper(proymen.conocgeocientifico) = 'SI' - 20210908::LAVILA
     *
     * @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");


        /**
         * 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
             */
            //id_periodo
            $id_anhos = $request['id_anhos'];
            $id_meses = $request['id_meses'];
            $progress_key = $request['progress_key'] . $request['username'];

            //id_proyectos
            $id_proyectos = "";
            $whereProyectos = "";
            if (isset($request['id_proyectos'])) {
                $id_proyectos = $request['id_proyectos'];
                $whereProyectos = " AND tab0.id_proyectos = " . $request['id_proyectos'];
            }


            /**
             * Validar que no se pueda regenerar saldos de mas de dos meses de anterioridad
             */
            $sql = <<<EOD
select 
case 
when add_months(to_date('01/'|| extract(month from SYSDATE)||'/'|| extract(YEAR from SYSDATE),'DD/MM/YYYY'),-2)
< to_date('01/$id_meses/$id_anhos','DD/MM/YYYY') then '1'
else '0'
end 
as valid
from dual
EOD;

            //Ejecuta sql
            $records = CN_TABLE::executeSQL($sql);
            $val = $records[0]['valid'];

            //if ($val != 0) {
            if (true) {

                /*
                 *  Borrar datos anteriores Periodo-Funcionario
                 */
                //Sql
                $sql = <<<EOD
DELETE FROM CCG_COSTEO_PRESUP tab0 
WHERE 
tab0.id_anhos = $id_anhos
and tab0.id_meses = $id_meses                     
$whereProyectos 
EOD;
                //Ejecutar SQL
                CN_TABLE::executeSQL($sql);

                /*
                 * Memcache al 30 porciento
                 */
                MemcacheHandler::getInstance()->set($progress_key, 30);

                /*
                 * Tomar valores de presupuesto
                 * Relacion de doble_anualidad para SGR, segun tabla relacion RP y obligacion - 20210622::LAVILA 
                 */
                //Sql
                $sql = <<<EOD
insert into CCG_COSTEO_PRESUP
(ID_COSTEO_PRESUP,ID_ANHOS,ID_MESES,ID_PROYECTOS,SGR,VALOR,ID_PAGO_OBL,ID_OBLIGACION,SECUENCIA,ID_VIGENCIA,VIGENCIA,ID_RP,ID_OBLIGACION_VAL)

select 
tab0.id_costeo_presup,
tab0.id_anhos,
tab0.id_meses,
tab0.id_proyectos,
tab0.sgr,
tab0.valor,
tab0.id_pago_obl,
tab0.id_obligacion,
tab0.secuencia,
tab0.id_vigencia,
tab0.vigencia,
tab0.id_rp,
tab0.id_obligacion_val 
from(

    select 
    null as id_costeo_presup,
    extract(year from obl.fecha_proceso) as id_anhos,
    extract(month from obl.fecha_proceso) as id_meses,
    oblval.id_cpo as id_proyectos,
    0 as sgr,
    nvl(obluso.valor_obligacion_uso,oblval.valor_obligacion) as valor,
    pag.id_pago_obl as id_pago_obl,
    obl.id_obligacion as id_obligacion,
    obl.secuencia as secuencia,
    obl.id_vigencia as id_vigencia,
    obl.ano_fiscal as vigencia,
    obl.id_rp as id_rp,
    oblval.id_obligacion_val as id_obligacion_val
    
    from ts_obligacion obl
    
    --pagobl
    
    join ts_obligacion_val oblval
    on oblval.id_obligacion = obl.id_obligacion
    and oblval.secuencia = obl.secuencia
    and oblval.id_vigencia = obl.id_vigencia
    and oblval.ano_fiscal = obl.ano_fiscal
    
    left join ts_obligacion_val_uso obluso
    on obluso.id_obligacion_val = oblval.id_obligacion_val
    and obluso.id_obligacion = oblval.id_obligacion
    and obluso.secuencia = oblval.secuencia
    and obluso.id_vigencia = oblval.id_vigencia
    and obluso.ano_fiscal = oblval.ano_fiscal
    
    left join objetos_gasto obj
    on obj.id = oblval.id_obj_Gasto
    
    left join pr_elementos_gasto ele
    on ele.id_elementos_gasto = obluso.id_elementos_gasto
    
    left join pr_asig_presup asi
    on asi.id = oblval.id_asign
    
    left join pr_apropiacion apr
    on apr.id = asi.id_apropiacion
    
    left join pr_codif_presup rub
    on rub.id_rubro = apr.id_rubro
    
    join pr_rp rp
    on rp.id = obl.id_rp
    and rp.id_vigencia = obl.id_vigencia
    and rp.vigencia = obl.ano_fiscal
    
    left join(
        select
        max(id_pago_obl) as id_pago_obl, 
        id_obligacion,
        secuencia,
        vigencia,
        id_vigencia
        from ts_pago_obl
        where
        estado is null
        group by
        id_obligacion,
        secuencia,
        vigencia,
        id_vigencia
    )pag
    on pag.id_obligacion = obl.id_obligacion
    and pag.secuencia = obl.secuencia
    and pag.id_vigencia = obl.id_vigencia
    and pag.vigencia = obl.ano_fiscal
    
    where
    obl.fecha_proceso between to_date('$id_anhos-$id_meses-01','yyyy-mm-dd') 
        and LAST_DAY(to_date('$id_anhos-$id_meses-01','yyyy-mm-dd'))
    and obj.excep_costeo = 0
    and rub.excep_costeo = 0
    and nvl(ele.excep_costeo,0) = 0
    
    /*union con sgr*/
    union

    select 
    null as id_costeo_presup,
    extract(year from obl.fecha_proceso) as id_anhos,
    extract(month from obl.fecha_proceso) as id_meses,
    oblval.id_cpo as id_proyectos,
    1 as sgr,
    nvl(obluso.valor_obligacion_uso,oblval.valor_obligacion) as valor,
    pag.id_pago_obl as id_pago_obl,
    obl.id_obligacion as id_obligacion,
    obl.secuencia as secuencia,
    obl.id_vigencia as id_vigencia,
    obl.ano_fiscal as vigencia,
    obl.id_rp as id_rp,
    oblval.id_obligacion_val as id_obligacion_val
    
    from ts_obligacion@PNG_SGR obl
    
    --pagobl
    
    join ts_obligacion_val@PNG_SGR oblval
    on oblval.id_obligacion = obl.id_obligacion
    and oblval.secuencia = obl.secuencia
    and oblval.id_vigencia = obl.id_vigencia
    and oblval.ano_fiscal = obl.ano_fiscal
    
    left join ts_obligacion_val_uso@PNG_SGR obluso
    on obluso.id_obligacion_val = oblval.id_obligacion_val
    and obluso.id_obligacion = oblval.id_obligacion
    and obluso.secuencia = oblval.secuencia
    and obluso.id_vigencia = oblval.id_vigencia
    and obluso.ano_fiscal = oblval.ano_fiscal
    
    left join objetos_gasto@PNG_SGR obj
    on obj.id = oblval.id_obj_Gasto
    
    left join pr_elementos_gasto@PNG_SGR ele
    on ele.id_elementos_gasto = obluso.id_elementos_gasto
    
    left join pr_asig_presup@PNG_SGR asi
    on asi.id = oblval.id_asign
    
    left join pr_apropiacion@PNG_SGR apr
    on apr.id = asi.id_apropiacion
    
    left join pr_codif_presup@PNG_SGR rub
    on rub.id_rubro = apr.id_rubro
    
    join pr_rp@PNG_SGR rp
    on rp.id = obl.id_rp
    and rp.id_vigencia = obl.id_vigencia
    --and rp.vigencia = obl.ano_fiscal
    and (
        rp.vigencia in ( select vigencia_inicial from doble_anualidad@PNG_SGR where obl.ano_fiscal between vigencia_inicial and vigencia_final) 
        or 
        rp.vigencia in ( select vigencia_final from doble_anualidad@PNG_SGR where obl.ano_fiscal between vigencia_inicial and vigencia_final) 
    )
    
    left join(
        select
        max(id_pago_obl) as id_pago_obl, 
        id_obligacion,
        secuencia,
        vigencia,
        id_vigencia
        from ts_pago_obl@PNG_SGR
        where
        estado is null
        group by
        id_obligacion,
        secuencia,
        vigencia,
        id_vigencia
    )pag
    on pag.id_obligacion = obl.id_obligacion
    and pag.secuencia = obl.secuencia
    and pag.id_vigencia = obl.id_vigencia
    and pag.vigencia = obl.ano_fiscal
    
    where
    obl.fecha_proceso between to_date('$id_anhos-$id_meses-01','yyyy-mm-dd') 
        and LAST_DAY(to_date('$id_anhos-$id_meses-01','yyyy-mm-dd'))
    and obj.excep_costeo = 0
    and rub.excep_costeo = 0
    and nvl(ele.excep_costeo,0) = 0

)tab0

/*solo proyectos parametrizados*/
left join ccg_proyec_cent_cost_v proycc
on proycc.id_proyectos = tab0.id_proyectos
and proycc.sgr = tab0.sgr

left join ccg_proyectos_mensual proymen
on proymen.sgccode = proycc.codigo
and proymen.id_anhos = $id_anhos
and proymen.id_meses = $id_meses

where
1 = 1                        
and proycc.estado = 1
and upper(proymen.conocgeocientifico) = 'SI' 
$whereProyectos 

order by
tab0.id_pago_obl,
tab0.id_obligacion,
tab0.secuencia  
EOD;
                //Ejecutar SQL
                $this->conn->execute($sql);
                
                MemcacheHandler::getInstance()->set($progress_key, 50);

                
                /**
                 * Tabla nueva de excepcion de costeo segun objeto de gasto - 20181212
                 */
                
                /*
                 *  Borrar datos anteriores Periodo-Funcionario
                 */
                //Sql
                $sql = <<<EOD
DELETE FROM CCG_COSTEO_PRESUP_EXCEP tab0 
WHERE 
tab0.id_anhos = $id_anhos
and tab0.id_meses = $id_meses                     
$whereProyectos 
EOD;
                //Ejecutar SQL
                CN_TABLE::executeSQL($sql);

                /*
                 * Memcache al 30 porciento
                 */
                MemcacheHandler::getInstance()->set($progress_key, 70);

                /*
                 * Tomar valores de presupuesto
                 * Relacion de doble_anualidad para SGR, segun tabla relacion RP y obligacion - 20210622::LAVILA 
                 */
                //Sql
                $sql = <<<EOD
insert into CCG_COSTEO_PRESUP_EXCEP
(ID_COSTEO_PRESUP_EXCEP,ID_ANHOS,ID_MESES,ID_PROYECTOS,SGR,VALOR,ID_PAGO_OBL,ID_OBLIGACION,SECUENCIA,ID_VIGENCIA,VIGENCIA,ID_RP,ID_OBLIGACION_VAL)

select 
tab0.id_costeo_presup,
tab0.id_anhos,
tab0.id_meses,
tab0.id_proyectos,
tab0.sgr,
tab0.valor,
tab0.id_pago_obl,
tab0.id_obligacion,
tab0.secuencia,
tab0.id_vigencia,
tab0.vigencia,
tab0.id_rp,
tab0.id_obligacion_val 
from(

    select 
    null as id_costeo_presup,
    extract(year from obl.fecha_proceso) as id_anhos,
    extract(month from obl.fecha_proceso) as id_meses,
    oblval.id_cpo as id_proyectos,
    0 as sgr,
    nvl(obluso.valor_obligacion_uso,oblval.valor_obligacion) as valor,
    pag.id_pago_obl as id_pago_obl,
    obl.id_obligacion as id_obligacion,
    obl.secuencia as secuencia,
    obl.id_vigencia as id_vigencia,
    obl.ano_fiscal as vigencia,
    obl.id_rp as id_rp,
    oblval.id_obligacion_val as id_obligacion_val
    
    from ts_obligacion obl
    
    --pagobl
    
    join ts_obligacion_val oblval
    on oblval.id_obligacion = obl.id_obligacion
    and oblval.secuencia = obl.secuencia
    and oblval.id_vigencia = obl.id_vigencia
    and oblval.ano_fiscal = obl.ano_fiscal
    
    left join ts_obligacion_val_uso obluso
    on obluso.id_obligacion_val = oblval.id_obligacion_val
    and obluso.id_obligacion = oblval.id_obligacion
    and obluso.secuencia = oblval.secuencia
    and obluso.id_vigencia = oblval.id_vigencia
    and obluso.ano_fiscal = oblval.ano_fiscal
    
    left join objetos_gasto obj
    on obj.id = oblval.id_obj_Gasto
    
    left join pr_elementos_gasto ele
    on ele.id_elementos_gasto = obluso.id_elementos_gasto
    
    left join pr_asig_presup asi
    on asi.id = oblval.id_asign
    
    left join pr_apropiacion apr
    on apr.id = asi.id_apropiacion
    
    left join pr_codif_presup rub
    on rub.id_rubro = apr.id_rubro
    
    join pr_rp rp
    on rp.id = obl.id_rp
    and rp.id_vigencia = obl.id_vigencia
    and rp.vigencia = obl.ano_fiscal
    
    left join(
        select
        max(id_pago_obl) as id_pago_obl, 
        id_obligacion,
        secuencia,
        vigencia,
        id_vigencia
        from ts_pago_obl
        where
        estado is null
        group by
        id_obligacion,
        secuencia,
        vigencia,
        id_vigencia
    )pag
    on pag.id_obligacion = obl.id_obligacion
    and pag.secuencia = obl.secuencia
    and pag.id_vigencia = obl.id_vigencia
    and pag.vigencia = obl.ano_fiscal
    
    where
    obl.fecha_proceso between to_date('$id_anhos-$id_meses-01','yyyy-mm-dd') 
        and LAST_DAY(to_date('$id_anhos-$id_meses-01','yyyy-mm-dd'))
    and ( obj.excep_costeo = 1
    or rub.excep_costeo = 1
    or nvl(ele.excep_costeo,0) = 1 )
    
    /*union con sgr*/
    union

    select 
    null as id_costeo_presup,
    extract(year from obl.fecha_proceso) as id_anhos,
    extract(month from obl.fecha_proceso) as id_meses,
    oblval.id_cpo as id_proyectos,
    1 as sgr,
    nvl(obluso.valor_obligacion_uso,oblval.valor_obligacion) as valor,
    pag.id_pago_obl as id_pago_obl,
    obl.id_obligacion as id_obligacion,
    obl.secuencia as secuencia,
    obl.id_vigencia as id_vigencia,
    obl.ano_fiscal as vigencia,
    obl.id_rp as id_rp,
    oblval.id_obligacion_val as id_obligacion_val
    
    from ts_obligacion@PNG_SGR obl
    
    --pagobl
    
    join ts_obligacion_val@PNG_SGR oblval
    on oblval.id_obligacion = obl.id_obligacion
    and oblval.secuencia = obl.secuencia
    and oblval.id_vigencia = obl.id_vigencia
    and oblval.ano_fiscal = obl.ano_fiscal
    
    left join ts_obligacion_val_uso@PNG_SGR obluso
    on obluso.id_obligacion_val = oblval.id_obligacion_val
    and obluso.id_obligacion = oblval.id_obligacion
    and obluso.secuencia = oblval.secuencia
    and obluso.id_vigencia = oblval.id_vigencia
    and obluso.ano_fiscal = oblval.ano_fiscal
    
    left join objetos_gasto@PNG_SGR obj
    on obj.id = oblval.id_obj_Gasto
    
    left join pr_elementos_gasto@PNG_SGR ele
    on ele.id_elementos_gasto = obluso.id_elementos_gasto
    
    left join pr_asig_presup@PNG_SGR asi
    on asi.id = oblval.id_asign
    
    left join pr_apropiacion@PNG_SGR apr
    on apr.id = asi.id_apropiacion
    
    left join pr_codif_presup@PNG_SGR rub
    on rub.id_rubro = apr.id_rubro
    
    join pr_rp@PNG_SGR rp
    on rp.id = obl.id_rp
    and rp.id_vigencia = obl.id_vigencia
    --and rp.vigencia = obl.ano_fiscal
    and (
        rp.vigencia in ( select vigencia_inicial from doble_anualidad@PNG_SGR where obl.ano_fiscal between vigencia_inicial and vigencia_final) 
        or 
        rp.vigencia in ( select vigencia_final from doble_anualidad@PNG_SGR where obl.ano_fiscal between vigencia_inicial and vigencia_final) 
    )
    
    left join(
        select
        max(id_pago_obl) as id_pago_obl, 
        id_obligacion,
        secuencia,
        vigencia,
        id_vigencia
        from ts_pago_obl@PNG_SGR
        where
        estado is null
        group by
        id_obligacion,
        secuencia,
        vigencia,
        id_vigencia
    )pag
    on pag.id_obligacion = obl.id_obligacion
    and pag.secuencia = obl.secuencia
    and pag.id_vigencia = obl.id_vigencia
    and pag.vigencia = obl.ano_fiscal
    
    where
    obl.fecha_proceso between to_date('$id_anhos-$id_meses-01','yyyy-mm-dd') 
        and LAST_DAY(to_date('$id_anhos-$id_meses-01','yyyy-mm-dd'))
    and ( obj.excep_costeo = 1
    or rub.excep_costeo = 1
    or nvl(ele.excep_costeo,0) = 1 )

)tab0

/*solo proyectos parametrizados*/
left join ccg_proyec_cent_cost_v proycc
on proycc.id_proyectos = tab0.id_proyectos
and proycc.sgr = tab0.sgr

left join ccg_proyectos_mensual proymen
on proymen.sgccode = proycc.codigo
and proymen.id_anhos = $id_anhos
and proymen.id_meses = $id_meses

where
1 = 1                        
and proycc.estado = 1
and upper(proymen.conocgeocientifico) = 'SI' 
$whereProyectos 
EOD;
                //Ejecutar SQL
                $this->conn->execute($sql);

                /*
                 * Memcache al 100 porciento
                 */
                MemcacheHandler::getInstance()->set($progress_key, 100);

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

                MemcacheHandler::getInstance()->set($progress_key, 100);

                /**
                 * ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
                 */
                $this->conn->rollback();

                /**
                 * Respuesta del servicio
                 */
                $this->status = 1;
                $this->mensajeError = "[Costeo Presupuestal] No puede generar costeo de hace más de 2 meses.";
                $this->list_data = array();
                $this->logMessage($this->mensajeError);
            }
        } catch (Exception $e) {
            MemcacheHandler::getInstance()->set($progress_key, 100);

            /**
             * ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
             */
            $this->conn->rollback();

            /**
             * Respuesta del servicio
             */
            $this->status = 1;
            $this->mensajeError = "[Costeo Presupuestal] Ocurrio un error: " . $e->getMessage();
            $this->list_data = array();
            $this->logMessage("[Costeo Presupuestal] ERROR!");
            $this->logMessage($e->getMessage());
        }
    }

}
