<?php

/**
 * formato_proy_rp actions.
 *
 * @package    radicacionVirtualCuentas
 * @subpackage formato_proy_rp
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class formato_proy_rpActions extends sfQuery {
    /*
     * ------------VARIABLES PARA SERVICIOS DE CONSULTA - LIST
     */

    protected $table_names = array(
        'RVC_FORMATO_PROY_RP',
        'PR_RUBRO_PGNSGR_V',
        'PR_ELEMENTOS_GASTO_PGNSGR_V',
        'PR_TIPO_REC',
        'PR_AGRUP_REC'
    ); //tablas para construir el sql, por medio de joins
    protected $table_join_ids = array(
        'PR_RUBRO_PGNSGR_V,LEFT' =>
        array(
            'id_rubro' => 'RVC_FORMATO_PROY_RP',
            'is_rp_sgr-sgr' => 'RVC_FORMATO_PROY_RP'
        ),
        'PR_ELEMENTOS_GASTO_PGNSGR_V,LEFT' =>
        array(
            'id_elementos_gasto' => 'RVC_FORMATO_PROY_RP',
            'is_rp_sgr-sgr' => 'RVC_FORMATO_PROY_RP'
        ),
        'PR_TIPO_REC,LEFT' =>
        array(
            'id_tipo_rec-id' => 'RVC_FORMATO_PROY_RP'
        ),
        'PR_AGRUP_REC,LEFT' =>
        array(
            'id_agrup-id' => 'PR_TIPO_REC'
        )
    ); //si posee tablas para joins, identificar la relacion de los campos con las tablas
    protected $fields = array(
        'RVC_FORMATO_PROY_RP' =>
        array(
            'id_formato_pago' => 'id_formato_pago',
            'id_proyecto_ep' => 'id_proyecto_ep',
            'id_rp' => 'id_rp',
            'vigencia_rp' => 'vigencia_rp',
            'is_rp_sgr' => 'is_rp_sgr',
            'id_rubro' => 'id_rubro',
            'id_elementos_gasto' => 'id_elementos_gasto',
            'valor' => 'valor',
            'id_tipo_rec' => 'id_tipo_rec'
        ),
        'PR_RUBRO_PGNSGR_V' =>
        array(
            'rubro' => 'rubro',
            'descripcion' => 'descripcion_rubro'
        ),
        'PR_ELEMENTOS_GASTO_PGNSGR_V' =>
        array(
            'codigo_gasto' => 'codigo_gasto',
            'codigo_uso' => 'codigo_uso',
            'descripcion_gasto' => 'descripcion_gasto'
        ),
        'PR_TIPO_REC' =>
        array(
            'codigo' => 'codigo_rec',
            'descripcion' => 'descripcio_rec',
            'id_agrup' => 'id_agrup'
        ),
        'PR_AGRUP_REC' =>
        array(
            'codigo' => 'codigo_agrup',
            'descripcion' => 'descripcion_agrup',
            'abreviatura' => 'abreviatura'
        )
    ); //por cada tabla especificar los campos del select

    /*
     * OPCIONES DE FILTRO:
     *
     * LIKEALLPLUS- busqueda comparativa de la cadena dividida por los espacios en blanco en cualquier posición
     * LIKEALL - busqueda comparativa de la cadena en cualquier posición
     * LIKE - busqueda en la cadena que inicie por la variable de filtro
     *
     * _filtroNull / para filtro de not null o null - type debe ser is - para todas las variables
     * TYPE NULL / para filtro de not null o null con el valor de campo desde gwt
     * EJEMPLO: 'titular' => array('NULL' => array('titular')),
     *
     * rownum,start - rownum,end / estos campos para uso del Grid live GWT, numero fijo de filas de consulta
     */
    protected $table_field_conditions = array(
        'RVC_FORMATO_PROY_RP' => array(
            'id_formato_pago,a' => array('!=' => array(-1)),
            'id_formato_pago,b' => array('=' => array('id_formato_pago')),
            'id_proyecto_ep' => array('=' => array('id_proyecto_ep')),
            'id_rp' => array('=' => array('id_rp')),
            'vigencia_rp' => array('=' => array('vigencia_rp')),
            'is_rp_sgr' => array('=' => array('is_rp_sgr')),
            'id_rubro' => array('=' => array('id_rubro')),
            'id_elementos_gasto' => array('=' => array('id_elementos_gasto')),
            'id_tipo_rec' => array('=' => array('id_tipo_rec')),
            'rownum,start' => array('>' => array('_startRow')),
            'rownum,end' => array('<=' => array('_endRow'))
        )
    ); //por cada tabla se dan los campos, opcion de filtro y variable que entra para los posibles filtros
    protected $table_field_or_conditions = array(); // filtros de condicion or
//    protected $query_qualifier = 'DISTINCT'; //Variable para el sql para eliminar filas repetidas
    protected $fields_orderBy = array(
        'id_formato_pago', 'id_proyecto_ep', 'vigencia_rp', 'id_rp', 'is_rp_sgr', 'id_rubro', 'id_elementos_gasto'
    ); //campos para el ordenamiento de la consulta
//    protected $table_field_obligatory = array('id_debito'); //campos obligatorios de filtro - estan en el request

    /*
     * Variables manejo de log
     */
    //true - consulta de administracion
    protected $is_admin = true;
    //si es servicio para filtro agregar campo
//    protected $filtro = 'Area';
    //true - la tabla principal de busqueda no es una vista
    protected $is_filtro = true;



    /*
     * ------------VARIABLES PARA SERVICIOS CRUD
     */
    protected $id_name = null; //identificador de la tabla - solo si es un dato no llave compuesta
    protected $id_names = array('id_formato_pago', 'id_proyecto_ep', 'id_rp', 'vigencia_rp', 'is_rp_sgr',
        'id_rubro', 'id_elementos_gasto', 'id_tipo_rec'); //llave primaria
    protected $field_names = array('valor'); //campos de la tabla, sin la llave primaria
    protected $table_name = 'RVC_FORMATO_PROY_RP'; //tabla en la cual se aplican los cambios
    protected $has_activo = true; //si posee campo en la tabla de nombre activo ---- ESTADO PARA REGALIAS - CARTERA
    protected $has_vigencia = false; //si posee vigencia
    protected $has_cen_op = false; //si posee centro de operacion
    protected $has_id_cia = false; //si posee compañia
    protected $has_secuencia = false; //si posee secuencia la tabla - true si es por tabla, false - trigger
//    protected $en_mayuscula = true; // si se pone, se puede poner en mayucula con true y en minuscula con false, de lo contrario la pone tal cual la BD

    /*
     * campos para fecha sistema
     */
//    protected $campo_fecha_sistema = array(
//        'fecha_crea'
//    );

    /*
     * Manejo de registro log
     */
    protected $id_unico = 'id_formato_pago'; //identificador unico de la tabla
    //false - Registrar log para list - consultar
    protected $log_list = false;
    //false - Registrar log para add - update - remove
    protected $log_crud = false;

    /**
     * Construccion de observacion perzonalizada
     * 
     * Toda variable para tomarla del request con el formato:
     * &request-variable&
     * 
     * false - observacion por defecto
     *
     * @var string 
     */
    protected $observacion_list = false;
    protected $observacion_add = false;
    protected $observacion_update = false;
    protected $observacion_remove = false;

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

        /*
         * Variables request
         */
        $id_formato_pago = $request['id_formato_pago'];
        $id_proyecto_ep = $request['id_proyecto_ep'];
        $id_rp = $request['id_rp'];
        $vigencia_rp = $request['vigencia_rp'];
        $id_rubro = $request['id_rubro'];
        $id_elementos_gasto = $request['id_elementos_gasto'];
        $valor = $request['valor'];
        $id_tipo_rec = $request['id_tipo_rec'];


        /**
         * Incidente #37780, se coloca valiacion para revisar el rubro este en el RP registrado - 20240306::LAVILA
         */
        $sql = <<<EOD
select
rp.*,
asig.id_apropiacion,
apro.id_rubro  
from pr_rp_compromiso rp

left join pr_asig_presup asig
on asig.id = rp.id_asign

left join pr_apropiacion apro
on apro.id = asig.id_apropiacion

where
rp.id_rp = $id_rp
and apro.id_rubro = $id_rubro 

union

select
rp.*,
asig.id_apropiacion,
apro.id_rubro  
from erp_sgr.pr_rp_compromiso rp

left join erp_sgr.pr_asig_presup asig
on asig.id = rp.id_asign

left join erp_sgr.pr_apropiacion apro
on apro.id = asig.id_apropiacion

where
rp.id_rp = $id_rp
and apro.id_rubro = $id_rubro 
EOD;
        $records = CN_TABLE::executeSQL($sql);

        /*
         *  Generar errores en $errors
         */
        if (count($records) == 0) {
            $errors['mensaje'] = "<br/>El rubro seleccionado no se encuentra en el RP($id_rp), recargar y verificar la selección.";
            $errors['servicio'] = "formato_proy_rp";
        }


        /*
         *  Validar la operación, ya sea por SQL
         */
        $sql = <<<EOD
SELECT
    *
FROM RVC_FORMATO_PROY_RP
where
id_formato_pago = $id_formato_pago
and id_proyecto_ep = $id_proyecto_ep
and id_rp = $id_rp
and id_rubro = $id_rubro
and id_elementos_gasto = $id_elementos_gasto
and vigencia_rp = $vigencia_rp
and id_tipo_rec = $id_tipo_rec
EOD;
        $records = CN_TABLE::executeSQL($sql);

        /*
         *  Generar errores en $errors
         */
        if (count($records) > 0) {
            $errors['mensaje'] = "<br/>Ya se encuentra registrado el RP, rubro y uso presupuestal, favor verificar.";
            $errors['servicio'] = "formato_proy_rp";
        }

        /*
         *  Validar tope de valor - 20210831::LAVILA
         */
        $sql = <<<EOD
select  
tab0.id_formato_pago,
sum(tab0.valor) as valor_sum,
max(formt.valor_mensual) as valor_cobro

from rvc_formato_proyecto tab0

join rvc_formato_pago formt
on formt.id_formato_pago = tab0.id_formato_pago
and formt.estado = 1

where  
tab0.id_formato_pago = $id_formato_pago 

group by
tab0.id_formato_pago 
EOD;
        $records_proy = CN_TABLE::executeSQL($sql);

        /*
         *  Generar errores en $errors
         */
        $valor_cobro = 0;
        if (count($records_proy) > 0) {
            $valor_sum = $records_proy[0]['valor_sum'];
            $valor_cobro = $records_proy[0]['valor_cobro'];
        }
        $valor_sum += $valor;
        if ($valor_sum > $valor_cobro) {
            $errors['mensaje'] = "</br>El valor registrado en los proyectos debe corresponder al valor Total de la cuenta de cobro correspondiente.";
            $errors['servicio'] = "formato_proy_rp";
        }


        /*
         * Incidente #32237, El valor del registro NO puede ser mayor al valor Actual por el Proyecto del RP y recurso - 20221011::LAVILA
         */
        $sql = <<<EOD
SELECT
rp.*
from RVC_RUBRO_RPS_V rp
where
rp.id_rp = $id_rp
AND rp.vigencia = $vigencia_rp  
AND rp.id_rubro = $id_rubro
AND rp.id_cpo = (select max(id_cpo) from rvc_formato_proyecto where id_proyecto_ep = $id_proyecto_ep )
AND rp.id_tipo_rec = $id_tipo_rec
EOD;
        $records = CN_TABLE::executeSQL($sql);

        /*
         *  Generar errores en $errors
         */
        if (count($records) > 0) {
            $valor_rp = $records[0]['valor'];

            if ($valor > $valor_rp) {
                $errors['mensaje'] = "<br/>El valor del registro NO puede ser mayor al valor actual por el proyecto del RP y recurso, favor verificar.";
                $errors['servicio'] = "formato_proy_rp";
            }
        }


        /*
         * Validar que no deje por rubro un mayor valor, segun lo aplicado en otras planilla - 20210902::LAVILA
         * Incidente #30708, Validar con el id_tipo_rec - 20220725::LAVILA
         */
        $sql = <<<EOD
select

tab0.*,
nvl(rp.valor,0) - nvl(rpnoejec.valor,0) as valor_rp

from(
    
    SELECT
    tab0.id_proyecto_ep,
    tab0.id_rp,
    tab0.id_rubro,
    tab0.vigencia_rp,
    tab0.is_rp_sgr,
    tab0.id_tipo_rec,
    formproy.id_cpo,
    nvl(sum(tab0.valor),0) as valor_format
    
    FROM RVC_FORMATO_PROY_RP tab0
    
    join rvc_formato_pago formt on formt.id_formato_pago = tab0.id_formato_pago
    and formt.estado = 1
    
    left join rvc_formato_proyecto formproy on formproy.id_formato_pago = tab0.id_formato_pago and formproy.id_proyecto_ep = tab0.id_proyecto_ep
    
    where
    tab0.id_proyecto_ep = $id_proyecto_ep
    and tab0.id_rp = $id_rp
    and tab0.id_rubro = $id_rubro
    and tab0.vigencia_rp = $vigencia_rp
    and tab0.id_tipo_rec = $id_tipo_rec
    
    group by
    tab0.id_proyecto_ep,
    tab0.id_rp,
    tab0.id_rubro,
    tab0.vigencia_rp,
    tab0.is_rp_sgr,
    tab0.id_tipo_rec,
    formproy.id_cpo
    
)tab0
    
left join RVC_RUBRO_RPS_V rp on rp.id_rp = tab0.id_rp and rp.sgr = tab0.IS_RP_SGR  AND rp.vigencia = tab0.vigencia_rp  
AND rp.id_rubro = tab0.id_rubro 
AND rp.id_cpo = tab0.id_cpo 
AND rp.id_tipo_rec = tab0.id_tipo_rec 
                
left join (
        select id_contrato,rp, tipo_recurso,sum(valor) as valor, id_cpo
        from RVC_RPS_SALDO_NO_EJECUTADO
        where estado = 1
        -- and id_contrato in ($P{id_contrato})
	group by id_contrato,rp, tipo_recurso,id_cpo
    )rpnoejec on rp.id_rp = rpnoejec.rp and rp.sgr = rpnoejec.tipo_recurso and rp.id_cpo = rpnoejec.id_cpo
EOD;
        $records = CN_TABLE::executeSQL($sql);

        /*
         *  Generar errores en $errors
         */
        $valor_format = 0;
        $valor_rp = 0;
        if (count($records) > 0) {
            $valor_format = $records[0]['valor_format'];
            $valor_rp = $records[0]['valor_rp'];

            $valor_format += $valor;
            if ($valor_format > $valor_rp) {
                $errors['mensaje'] = "<br/>El valor a registrar supera el rubro de los demas formatos de pago registrados, favor verificar.";
                $errors['servicio'] = "formato_proy_rp";
            }
        }

        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;

        /*
         * Variables request
         */

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

        /*
         * Variables request
         */

        /*
         *  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") {
            //Validar correctamente is_rp_sgr cuando es true - 20210722::LAVILA
            if (isset($request['is_rp_sgr']) && $request['is_rp_sgr'] == 'true') {
                $logger->info("Entro a is_rp_sgr");
                $request['is_rp_sgr'] = 1;
            } else {
                $request['is_rp_sgr'] = 0;
            }
        }

        //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") {

            $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
            $this->conn->beginTransaction();

            try {

                $id_formato_pago = $list_data_post[0]['id_formato_pago'];
                $id_proyecto_ep = $list_data_post[0]['id_proyecto_ep'];
                $id_rp = $list_data_post[0]['id_rp'];
                $vigencia_rp = $list_data_post[0]['vigencia_rp'];
                $id_rubro = $list_data_post[0]['id_rubro'];
                $is_rp_sgr = $list_data_post[0]['is_rp_sgr'];
                if ($is_rp_sgr == 'true') {
                    $is_rp_sgr = 1;
                } elseif ($is_rp_sgr == 'false') {
                    $is_rp_sgr = 0;
                } else {
                    $is_rp_sgr = 0;
                }

                $sql = <<<EOD
update rvc_formato_proyecto 
set valor = nvl((
    select sum(valor) 
    from rvc_formato_proy_rp 
    where 
    id_formato_pago = $id_formato_pago
    and id_proyecto_ep = $id_proyecto_ep 
),0)

where
id_formato_pago = $id_formato_pago
and id_proyecto_ep = $id_proyecto_ep 
EOD;
                $this->conn->execute($sql);

                /**
                 * Incidente #24063, Actualizar registros de carga obligacion siif - 20220406::LAVILA
                 */
                $sql = <<<EOD
SELECT
* 
FROM rvc_formato_proy_rp
where
id_proyecto_ep = $id_proyecto_ep
and id_rp = $id_rp
and vigencia_rp = $vigencia_rp
and is_rp_sgr = $is_rp_sgr
and id_rubro = $id_rubro
and id_formato_pago != $id_formato_pago
order by
id_formato_pago desc
EOD;
                $resultado = CN_TABLE::executeSQL($sql);

                if (count($resultado) > 0) {

                    $tipo_gasto = $resultado[0]['tipo_gasto'];
                    $uso_contable = $resultado[0]['uso_contable'];
                    $tipo_operacion = $resultado[0]['tipo_operacion'];
                    $cuenta_contable = $resultado[0]['cuenta_contable'];

                    $sql = <<<EOD
update rvc_formato_proy_rp set tipo_gasto = '$tipo_gasto', tipo_operacion = '$tipo_operacion', 
    uso_contable = '$uso_contable', cuenta_contable = '$cuenta_contable'
where
id_formato_pago = $id_formato_pago
and id_proyecto_ep = $id_proyecto_ep
and id_rp = $id_rp
and vigencia_rp = $vigencia_rp
and is_rp_sgr = $is_rp_sgr
and id_rubro = $id_rubro
EOD;
                    $this->conn->execute($sql);
                }


                /**
                 * Incidente #32207, Copias de vigencia actual registros de rp y uso, valor = 0, 
                 * para los datos que no registren y segun registros anteriores - 20221026::LAVILA
                 */
                /**
                 * 20221213 se comenta la validacion que solo copia los rps de la vigencia del formato y de esta manera copie todos
                 * 
                 */
                //insert
                $sql = <<<EOD
insert into rvc_formato_proy_rp(ID_FORMATO_PAGO,ID_PROYECTO_EP,ID_RP,
VIGENCIA_RP,IS_RP_SGR,ID_RUBRO,ID_ELEMENTOS_GASTO,VALOR,
ID_TIPO_REC,TIPO_GASTO,TIPO_OPERACION,USO_CONTABLE,CUENTA_CONTABLE)

select distinct 

formt.id_formato_pago,
proyfp.id_proyecto_ep,
proyfp.id_rp,
proyfp.vigencia_rp,
proyfp.is_rp_sgr,
proyfp.id_rubro,
proyfp.id_elementos_gasto,
0 as valor,
proyfp.id_tipo_rec,
proyfp.tipo_gasto,
proyfp.tipo_operacion,
proyfp.uso_contable,
proyfp.cuenta_contable                       
                            
from rvc_formato_pago formt

join rvc_contrato cont
on cont.id_contrato = formt.id_contrato

join co_contrato contco
on contco.id_contrato = cont.id_co_contrato

join co_seleccion_ep sel
on sel.id_seleccion_ep = contco.id_seleccion_ep

join co_proyecto_ep proy
on proy.id_estudios_previos = sel.id_estudios_previos
                        
join (select tab0.*, 
    ROW_NUMBER() OVER (PARTITION BY ID_PROYECTO_EP,ID_RP,VIGENCIA_RP,IS_RP_SGR,ID_RUBRO,ID_ELEMENTOS_GASTO,ID_TIPO_REC 
                ORDER BY ID_FORMATO_PAGO DESC,ID_PROYECTO_EP,ID_RP,VIGENCIA_RP,IS_RP_SGR,ID_RUBRO,ID_ELEMENTOS_GASTO,ID_TIPO_REC) as RN from rvc_formato_proy_rp 
    tab0) proyfp
on proyfp.id_proyecto_ep = proy.id_proyecto_ep and rn=1

where
formt.id_formato_pago = $id_formato_pago
--and proyfp.vigencia_rp = formt.id_anhos 
and (proyfp.id_proyecto_ep,proyfp.id_rp,proyfp.vigencia_rp,proyfp.is_rp_sgr,proyfp.id_rubro) 
    not in ( select id_proyecto_ep,id_rp,vigencia_rp,is_rp_sgr,id_rubro from rvc_formato_proy_rp where id_formato_pago = $id_formato_pago ) 
EOD;

                //ejecuta el sql
                $this->conn->execute($sql);

                /**
                 * COMMIT
                 */
                $this->conn->commit();
            } catch (Exception $e) {

                //ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
                $this->conn->rollback();
                $logger->info("ERROR: - " . $e);
            }
        }

        //accion update
        if ($Action == "UPDATE") {
            
        }

        //accion remove
        if ($Action == "REMOVE") {

            $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
            $this->conn->beginTransaction();

            try {

                $id_formato_pago = $list_data_post[0]['id_formato_pago'];
                $id_proyecto_ep = $list_data_post[0]['id_proyecto_ep'];

                $sql = <<<EOD
update rvc_formato_proyecto 
set valor = nvl((
    select sum(valor) 
    from rvc_formato_proy_rp 
    where 
    id_formato_pago = $id_formato_pago
    and id_proyecto_ep = $id_proyecto_ep 
),0)

where
id_formato_pago = $id_formato_pago
and id_proyecto_ep = $id_proyecto_ep 
EOD;
                $this->conn->execute($sql);

                /**
                 * COMMIT
                 */
                $this->conn->commit();
            } catch (Exception $e) {

                //ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
                $this->conn->rollback();
                $logger->info("ERROR: - " . $e);
            }
        }

        return $request;
    }

}
