<?php

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

    /**
     * Executes Generar costeo legalizacion
     * 
     * Incluir los gastos desde LEGALIZACION DE COMISIONES, 
     * ESTADO CERRADA (FECHA DE CIERRE) para el costeo, 
     * teniendo en cuenta las excepciones según la CGN
     * 
     * 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_LEGAL 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 legalizacion
                 */
                //Sql
                $sql = <<<EOD
insert into CCG_COSTEO_LEGAL
(ID_COSTEO_LEGAL,ID_ANHOS,ID_MESES,ID_PROYECTOS,SGR,VALOR,ID_LEGALIZACION_COMIS,SECUENCIA,ID_VIGENCIA,VIGENCIA,ID_RP,ID_RP_COMPROMISO)

select 
tab0.id_costeo_legal,
tab0.id_anhos,
tab0.id_meses,
tab0.id_proyectos,
tab0.sgr,
tab0.valor,
tab0.id_legalizacion_comis,
tab0.secuencia,
tab0.id_vigencia,
tab0.vigencia,
tab0.id_rp,
tab0.id_rp_compromiso 
from(

    select 
    null as id_costeo_legal,
    extract(year from cie.fecha_proceso) as id_anhos,
    extract(month from cie.fecha_proceso) as id_meses,
    rpc.id_cpo as id_proyectos,
    0 as sgr,
    nvl(leg.v_bruto,0) as valor,
    leg.id_legalizacion_comis as id_legalizacion_comis,
    leg.secuencia as secuencia,
    leg.id_vigencia as id_vigencia,
    leg.vigencia as vigencia,
    leg.id_rp_comis as id_rp,
    rpc.id as id_rp_compromiso
    
    from pr_legalizacion_comis leg
    
    left join pr_elementos_gasto ele
    on ele.id_elementos_gasto = leg.id_elementos_gasto
    
    left join objetos_gasto obj
    on obj.id = ele.id_objeto_Gasto
    
    left join pr_rp_compromiso rpc
    on rpc.id_rp = leg.id_rp_comis
    and rpc.id_vigencia = leg.id_vigencia
    and rpc.vigencia = leg.vigencia
    and rpc.id_obj_gasto = obj.id
    
    left join pr_asig_presup asi
    on asi.id = rpc.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
    
    left join pr_cierre_comision cie
    on cie.id_rp_comis = leg.id_rp_comis
    and cie.id_vigencia = leg.id_vigencia
    and cie.vigencia = leg.vigencia
    and cie.id_tipo_nov_comis = 29
    
    where
    cie.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_legal,
    extract(year from cie.fecha_proceso) as id_anhos,
    extract(month from cie.fecha_proceso) as id_meses,
    rpc.id_cpo as id_proyectos,
    1 as sgr,
    nvl(leg.v_bruto,0) as valor,
    leg.id_legalizacion_comis as id_legalizacion_comis,
    leg.secuencia as secuencia,
    leg.id_vigencia as id_vigencia,
    leg.vigencia as vigencia,
    leg.id_rp_comis as id_rp,
    rpc.id as id_rp_compromiso
    
    from pr_legalizacion_comis@PNG_SGR leg
    
    left join pr_elementos_gasto@PNG_SGR ele
    on ele.id_elementos_gasto = leg.id_elementos_gasto
    
    left join objetos_gasto@PNG_SGR obj
    on obj.id = ele.id_objeto_Gasto
    
    left join pr_rp_compromiso@PNG_SGR rpc
    on rpc.id_rp = leg.id_rp_comis
    and rpc.id_vigencia = leg.id_vigencia
    and rpc.vigencia = leg.vigencia
    and rpc.id_obj_gasto = obj.id
    
    left join pr_asig_presup@PNG_SGR asi
    on asi.id = rpc.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
    
    left join pr_cierre_comision@PNG_SGR cie
    on cie.id_rp_comis = leg.id_rp_comis
    and cie.id_vigencia = leg.id_vigencia
    and cie.vigencia = leg.vigencia
    and cie.id_tipo_nov_comis = 29
    
    where
    cie.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_legalizacion_comis,
tab0.id_rp,
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_LEGAL_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 legalizacion
                 */
                //Sql
                $sql = <<<EOD
insert into CCG_COSTEO_LEGAL_EXCEP
(ID_COSTEO_LEGAL_EXCEP,ID_ANHOS,ID_MESES,ID_PROYECTOS,SGR,VALOR,ID_LEGALIZACION_COMIS,SECUENCIA,ID_VIGENCIA,VIGENCIA,ID_RP,ID_RP_COMPROMISO)

select 
tab0.id_costeo_legal_excep,
tab0.id_anhos,
tab0.id_meses,
tab0.id_proyectos,
tab0.sgr,
tab0.valor,
tab0.id_legalizacion_comis,
tab0.secuencia,
tab0.id_vigencia,
tab0.vigencia,
tab0.id_rp,
tab0.id_rp_compromiso 
from(

    select 
    null as id_costeo_legal_excep,
    extract(year from cie.fecha_proceso) as id_anhos,
    extract(month from cie.fecha_proceso) as id_meses,
    rpc.id_cpo as id_proyectos,
    0 as sgr,
    nvl(leg.v_bruto,0) as valor,
    leg.id_legalizacion_comis as id_legalizacion_comis,
    leg.secuencia as secuencia,
    leg.id_vigencia as id_vigencia,
    leg.vigencia as vigencia,
    leg.id_rp_comis as id_rp,
    rpc.id as id_rp_compromiso
    
    from pr_legalizacion_comis leg
    
    left join pr_elementos_gasto ele
    on ele.id_elementos_gasto = leg.id_elementos_gasto
    
    left join objetos_gasto obj
    on obj.id = ele.id_objeto_Gasto
    
    left join pr_rp_compromiso rpc
    on rpc.id_rp = leg.id_rp_comis
    and rpc.id_vigencia = leg.id_vigencia
    and rpc.vigencia = leg.vigencia
    and rpc.id_obj_gasto = obj.id
    
    left join pr_asig_presup asi
    on asi.id = rpc.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
    
    left join pr_cierre_comision cie
    on cie.id_rp_comis = leg.id_rp_comis
    and cie.id_vigencia = leg.id_vigencia
    and cie.vigencia = leg.vigencia
    and cie.id_tipo_nov_comis = 29
    
    where
    cie.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_legal,
    extract(year from cie.fecha_proceso) as id_anhos,
    extract(month from cie.fecha_proceso) as id_meses,
    rpc.id_cpo as id_proyectos,
    1 as sgr,
    nvl(leg.v_bruto,0) as valor,
    leg.id_legalizacion_comis as id_legalizacion_comis,
    leg.secuencia as secuencia,
    leg.id_vigencia as id_vigencia,
    leg.vigencia as vigencia,
    leg.id_rp_comis as id_rp,
    rpc.id as id_rp_compromiso
    
    from pr_legalizacion_comis@PNG_SGR leg
    
    left join pr_elementos_gasto@PNG_SGR ele
    on ele.id_elementos_gasto = leg.id_elementos_gasto
    
    left join objetos_gasto@PNG_SGR obj
    on obj.id = ele.id_objeto_Gasto
    
    left join pr_rp_compromiso@PNG_SGR rpc
    on rpc.id_rp = leg.id_rp_comis
    and rpc.id_vigencia = leg.id_vigencia
    and rpc.vigencia = leg.vigencia
    and rpc.id_obj_gasto = obj.id
    
    left join pr_asig_presup@PNG_SGR asi
    on asi.id = rpc.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
    
    left join pr_cierre_comision@PNG_SGR cie
    on cie.id_rp_comis = leg.id_rp_comis
    and cie.id_vigencia = leg.id_vigencia
    and cie.vigencia = leg.vigencia
    and cie.id_tipo_nov_comis = 29
    
    where
    cie.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 
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 Legalizacion] Costeo Legalizacion 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 Legalizacion] 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 Legalizacion] Ocurrio un error: " . $e->getMessage();
            $this->list_data = array();
            $this->logMessage("[Costeo Legalizacion] ERROR!");
            $this->logMessage($e->getMessage());
        }
    }

}
