<?php

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

    protected $table_names = array(
        'CCG_RECURSOS_MENSUAL',
        'MESES',
        'USUARIO'
    ); //tablas para construir el sql, por medio de joins
    protected $table_join_ids = array(
        'MESES,LEFT' =>
        array(
            'id_meses' => 'CCG_RECURSOS_MENSUAL'
        ),
        'USUARIO,LEFT' =>
        array(
            'usuario-username' => 'CCG_RECURSOS_MENSUAL'
        )
    ); //si posee tablas para joins, identificar la relacion de los campos con las tablas
    protected $fields = array(
        'CCG_RECURSOS_MENSUAL' =>
        array(
            'id_recursos' => 'id_recursos',
            'id_anhos' => 'id_anhos',
            'id_meses' => 'id_meses',
            'projectkey' => 'projectkey',
            'resourcekey' => 'resourcekey',
            'sgccode' => 'sgccode',
            'nomrecurso' => 'nomrecurso',
            'nroidentificacion' => 'nroidentificacion',
            'fechainicio' => 'fechainicio',
            'fechafin' => 'fechafin',
            'porcentajeasignacion' => 'porcentajeasignacion',
            'estadoasignacion' => 'estadoasignacion',
            'usuario' => 'usuario',
            'fecha_sys' => 'fecha_sys'
        ),
        'MESES' =>
        array(
            'descripcion' => 'mes'
        ),
        'USUARIO' =>
        array(
            'num_doc' => 'num_doc',
            'nombre,||, ,||,apellido' => 'nombre',
            'num_doc,||, - ,||,nombre,||, ,||,apellido' => 'completo'
        )
    ); //por cada tabla especificar los campos del select
    protected $fields_orderBy = array(
        'id_anhos', 'id_meses', 'projectkey', 'resourcekey'
    ); //campos para el ordenamiento de la consulta


    /*
     * 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
     * rownum,start - rownum,end / estos campos para uso del Grid live GWT, numero fijo de filas de consulta
     */
    protected $table_field_conditions = array(
        'CCG_RECURSOS_MENSUAL' =>
        array(
            'id_recursos,a' => array('!=' => array(-1)),
            'id_recursos,b' => array('=' => array('id_recursos')),
            'id_anhos' => array('=' => array('id_anhos')),
            'id_meses' => array('=' => array('id_meses')),
            'sgccode' => array('=' => array('codigo_proy')),
            'nroidentificacion' => array('=' => array('num_doc')),
            'porcentajeasignacion' => array('>' => array('tope_porcentaje')),
            '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'; //Para eliminar filas repetidas

    /*
     * Variable manejo de log
     */
    //si es servicio para filtro agregar campo
    protected $filtro = 'id_recursos';
    //true - la tabla principal de busqueda no es una vista
    protected $is_filtro = true;

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

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

    /**
     * Executes de mes y año proyectos
     * Incidente #39085, cambio de servidor a SIAPPI - 20250505::LAVILA 
     *
     * @param sfRequest $request A request object
     */
    public function executeUpdate(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();

        try {

            /*
             * Filtros
             */
            $id_anhos = $request['id_anhos'];
            $id_meses = $request['id_meses'];
            $username = $request['username'];

            /*
             *  Borrar datos anteriores 
             */
            //Sql
            $sql = <<<EOD
DELETE FROM CCG_RECURSOS  
EOD;
            //Ejecutar SQL
            $this->conn->execute($sql);

            /*
             * Solo se deben tener en cuenta "EstadoAsignación" =APROBADO,
             * Otros estados como SOLICITADO  NO se deben tener en cuenta. - 20180409
             * Se coloco UPPER(proy.ConocGeocientifico) - 20210824::LAVILA
             * Se filtra directo año y mes de consulta - 20250721::LAVILA
             */
            //Sql
            $sql = <<<EOD
SELECT
rec.CODIGO_PROYECTO as PROJECTKEY,
ROWNUM as RESOURCEKEY,
rec.CODIGO_PROYECTO as SGCCODE,
rec.NOMBRE_RECURSO as NOMRECURSO,
rec.CEDULA as NROIDENTIFICACION,
to_char(rec.FECHA_INICIAL,'YYYY-MM-DD') as FECHAINICIO,
to_char(rec.FECHA_FINAL,'YYYY-MM-DD') as FECHAFIN,
rec.PORCENTAJE_UTILIZACION as PORCENTAJEASIGNACION,
rec.ESTADO as ESTADOASIGNACION
--FROM TABLE(SIAPPI2.utilizacion_recursos(add_months(sysdate,-2), sysdate)) rec
FROM TABLE(SIAPPI2.utilizacion_recursos( to_date('01/$id_meses/$id_anhos','dd/mm/yyyy'), LAST_DAY(to_date('01/$id_meses/$id_anhos','dd/mm/yyyy')) )) rec

left join SIAPPI2.V_WEBSAFI_PROYECTOS proy
on proy.SGCCODE = rec.CODIGO_PROYECTO  

where
--rec.CEDULA = 30307406
UPPER(rec.ESTADO) = 'APROBADO'
and UPPER(proy.ConocGeocientifico) = 'SI'

order by
rec.CODIGO_PROYECTO,
rec.CEDULA,
rec.FECHA_INICIAL,
rec.PORCENTAJE_UTILIZACION     
EOD;
            //Ejecutar SQL
            $records = CN_TABLE::executeOracle_connect($sql);

            $id_rownum = 1;

            foreach ($records as $value) {

                //var_dump($value);
                //die();

                $projectkey = $value['PROJECTKEY'];
                $resourcekey = $value['RESOURCEKEY'];
                $sgccode = str_replace(" ", "", $value['SGCCODE']);
                $nomrecurso = $value['NOMRECURSO'];
                $nroidentificacion = $value['NROIDENTIFICACION'];
                $fechainicio = $value['FECHAINICIO'];
                $fechafin = $value['FECHAFIN'];
                $porcentajeasignacion = $value['PORCENTAJEASIGNACION'];
                $estadoasignacion = $value['ESTADOASIGNACION'];

                //Sql - para los recursos de planview
                $sql = <<<EOD
Insert into CCG_RECURSOS (ID_RECURSOS,PROJECTKEY,RESOURCEKEY,
    SGCCODE,NOMRECURSO,NROIDENTIFICACION,FECHAINICIO,FECHAFIN,
        PORCENTAJEASIGNACION,ESTADOASIGNACION) 
values ('$id_rownum','$projectkey','$resourcekey',
    '$sgccode','$nomrecurso',nvl('$nroidentificacion',0),to_date('$fechainicio','YYYY-MM-DD'),to_date('$fechafin','YYYY-MM-DD'),
        '$porcentajeasignacion','$estadoasignacion')  
EOD;
                //Ejecutar SQL
                $this->conn->execute($sql);

                $id_rownum++;

                //break;
            }

            /*
             *  Borrar datos mes y año
             */
            //Sql
            $sql = <<<EOD
DELETE FROM ccg_recursos_mensual  
where
id_anhos = $id_anhos    
and id_meses = $id_meses                        
EOD;
            //Ejecutar SQL
            $this->conn->execute($sql);

            //Sql
            $sql = <<<EOD
insert into ccg_recursos_mensual

select 

id_recursos,
$id_anhos id_anhos,
$id_meses as id_meses,
projectkey,
resourcekey,
sgccode,
nomrecurso,
nroidentificacion,
fechainicio,
fechafin,
porcentajeasignacion,
estadoasignacion,
'$username' as usuario,
sysdate as fecha_sys

from ccg_recursos                         
EOD;
            //Ejecutar SQL
            $this->conn->execute($sql);

            $this->status = 0;
            $this->list_data = array();
            $this->logMessage("[vwebsafi_recursos_mensual] Termino consulta.");

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

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

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

    /**
     * Executes de mes y año proyectos
     *
     * @param sfRequest $request A request object
     */
    public function executeUpdate2(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();

        try {


            //Sql
            $sql = <<<EOD
SELECT 
* 
FROM dbo.Vwebsafi_Recursos                 
order by
SGCCode,
NroIdentificacion,
FechaInicio    
EOD;
            //Ejecutar SQL
//            $records = CN_TABLE::executeMssql_connect($sql);


            /*
             *  Borrar datos anteriores 
             */
            //Sql
            $sql = <<<EOD
DELETE FROM CCG_RECURSOS  
EOD;
            //Ejecutar SQL
            $this->conn->execute($sql);

            /*
             * Solo se deben tener en cuenta "EstadoAsignación" =APROBADO,
             * Otros estados como SOLICITADO  NO se deben tener en cuenta. - 20180409
             * Se coloco UPPER(proy.ConocGeocientifico) - 20210824::LAVILA
             */
            //Sql
            $sql = <<<EOD
SELECT 
rec.ProjectKey,
rec.ResourceKey,
rec.SGCCode,
rec.NomRecurso,
rec.NroIdentificacion,
CONVERT(VARCHAR(10), rec.FechaInicio, 120) as FechaInicio,
CONVERT(VARCHAR(10), rec.FechaFin, 120) as FechaFin,
rec.PorcentajeAsignacion,
rec.EstadoAsignacion 
FROM dbo.Vwebsafi_Recursos rec
--FROM dbo.Vwebsafi_Recursos_historico
left join dbo.VWebSAFI_Proyectos proy
on proy.SGCCode = rec.SGCCode
where 
--rec.NroIdentificacion = 30307406
UPPER(rec.EstadoAsignacion) = 'APROBADO'
and UPPER(proy.ConocGeocientifico) = 'SI'
order by
rec.SGCCode,
rec.NroIdentificacion,
rec.FechaInicio,
rec.PorcentajeAsignacion     
EOD;
            //Ejecutar SQL
            $records = CN_TABLE::executeMssql_connect($sql);

            $id_rownum = 1;

            foreach ($records as $value) {

                //var_dump($value);
                //die();

                $projectkey = $value['ProjectKey'];
                $resourcekey = $value['ResourceKey'];
                $sgccode = str_replace(" ", "", $value['SGCCode']);
                $nomrecurso = $value['NomRecurso'];
                $nroidentificacion = $value['NroIdentificacion'];
                $fechainicio = $value['FechaInicio'];
                $fechafin = $value['FechaFin'];
                $porcentajeasignacion = $value['PorcentajeAsignacion'];
                $estadoasignacion = $value['EstadoAsignacion'];

                //Sql - para los recursos de planview
                $sql = <<<EOD
Insert into CCG_RECURSOS (ID_RECURSOS,PROJECTKEY,RESOURCEKEY,
    SGCCODE,NOMRECURSO,NROIDENTIFICACION,FECHAINICIO,FECHAFIN,
        PORCENTAJEASIGNACION,ESTADOASIGNACION) 
values ('$id_rownum','$projectkey','$resourcekey',
    '$sgccode','$nomrecurso',nvl('$nroidentificacion',0),to_date('$fechainicio','YYYY-MM-DD'),to_date('$fechafin','YYYY-MM-DD'),
        '$porcentajeasignacion','$estadoasignacion')  
EOD;
                //Ejecutar SQL
                $this->conn->execute($sql);

                $id_rownum++;

                //break;
            }

            /*
             * Filtros
             */
            $id_anhos = $request['id_anhos'];
            $id_meses = $request['id_meses'];
            $username = $request['username'];

            /*
             *  Borrar datos mes y año
             */
            //Sql
            $sql = <<<EOD
DELETE FROM ccg_recursos_mensual  
where
id_anhos = $id_anhos    
and id_meses = $id_meses                        
EOD;
            //Ejecutar SQL
            $this->conn->execute($sql);

            //Sql
            $sql = <<<EOD
insert into ccg_recursos_mensual

select 

id_recursos,
$id_anhos id_anhos,
$id_meses as id_meses,
projectkey,
resourcekey,
sgccode,
nomrecurso,
nroidentificacion,
fechainicio,
fechafin,
porcentajeasignacion,
estadoasignacion,
'$username' as usuario,
sysdate as fecha_sys

from ccg_recursos                         
EOD;
            //Ejecutar SQL
            $this->conn->execute($sql);

            $this->status = 0;
            $this->list_data = array();
            $this->logMessage("[vwebsafi_recursos_mensual] Termino consulta.");

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

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

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