<?php

/**
 * Servicio anterior, para optener datos de las vistas directas de planview - 20191107
 * inf_porcentaje_asig_recursos actions.
 *
 * @package    costeoConocCient
 * @subpackage inf_porcentaje_asig_recursos
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class inf_porcentaje_asig_recursosActions extends sfActions {

    /**
     * Executes list action
     *
     * @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");

        /*
         * Paginacion
         */
        if (isset($request['_startRow'])) {
            $rowStart = $request['_startRow'];
        } else {
            $rowStart = 0;
        }

        if (isset($request['_endRow'])) {
            $rowEnd = $request['_endRow'];
        } else {
            $rowEnd = 200;
        }

        /**
         * 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_anhos = $request['id_anhos'];
            $id_meses = $request['id_meses'];

            if ($rowStart == 0) {

                /*
                 *  Borrar datos anteriores 
                 */

                //Sql
                $sql = <<<EOD
TRUNCATE TABLE CCG_RECURSOS_DIARIO   
EOD;
                //Ejecutar SQL
                CN_TABLE::executeSQL($sql);

                //Sql
                $sql = <<<EOD
DELETE FROM CCG_RECURSOS  
EOD;
                //Ejecutar SQL
                CN_TABLE::executeSQL($sql);

                /*
                 * Solo se deben tener en cuenta "EstadoAsignación" =APROBADO,
                 * Otros estados como SOLICITADO  NO se deben tener en cuenta. - 20180409
                 */
                //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 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;
                }

                //Sql - para los recursos en dias
                $sql = <<<EOD
INSERT INTO CCG_RECURSOS_DIARIO (ID_RECURSOS_DIARIO,ID_RECURSOS,PROJECTKEY,RESOURCEKEY,SGCCODE,NOMRECURSO,NROIDENTIFICACION,FECHAINICIO,FECHAFIN,PORCENTAJEASIGNACION,ESTADOASIGNACION,TIPO_RECURSO,ID_ANHOS,ID_MESES,FECHA_DIA)

select distinct 
null as id_recursos_diario,
rec.id_recursos as id_recursos,
rec.projectkey,
rec.resourcekey,
rec.sgccode,
rec.nomrecurso,
rec.nroidentificacion,
rec.fechainicio,
rec.fechafin,
rec.porcentajeasignacion,
rec.estadoasignacion,
nvl(func.id_tipo_doc,0) as tipo_recurso,
EXTRACT(year FROM fes.fecha) as id_anhos,
EXTRACT(month FROM fes.fecha) as id_meses,
fes.fecha as fecha_dia

from ccg_recursos rec

join ccg_dia_calendario fes
on fes.fecha between rec.fechainicio and rec.fechafin

left join no_estado_func_v func
on rec.nroidentificacion = func.num_doc
and func.id_anhos = EXTRACT(year FROM fes.fecha)
and func.id_meses = EXTRACT(month FROM fes.fecha)

where 
EXTRACT(year FROM fes.fecha) = $id_anhos
and EXTRACT(month FROM fes.fecha) = $id_meses
--and rec.id_recursos = $id_rownum 

order by
rec.id_recursos,
fes.fecha  
EOD;
                //Ejecutar SQL
                $this->conn->execute($sql);
            }

            /*
             * TRAE LOS REGISTROS
             */
            //ordenar consulta
            if (isset($request['_sortBy'])) {
                $sortBy = " Order by " . $request['_sortBy'];
            } else {
                $sortBy = ' order by tab0.nroidentificacion, tab0.fecha_dia  ';
            }

            //codigo_proy
            $whereCodigoProy = " ";
            if (isset($request['codigo_proy'])) {
                $whereCodigoProy = " and tab0.sgccode = '" . $request['codigo_proy'] . "'";
            }

            //num_doc
            $whereNroIdentificacion = " ";
            if (isset($request['num_doc'])) {
                $whereNroIdentificacion = " and tab0.nroidentificacion = " . $request['num_doc'];
            }

            //tipo_recurso
            $whereTipoRecurso = " ";
            if (isset($request['tipo_recurso'])) {
                if ($request['tipo_recurso'] == '1') {
                    $whereTipoRecurso = " and tab0.tipo_recurso = 1";
                } elseif ($request['tipo_recurso'] == '0') {
                    $whereTipoRecurso = " and tab0.tipo_recurso = 0";
                } else {
                    $whereTipoRecurso = " ";
                }
            }

            //tope_porcentaje
            $havingTopePorcentaje = " ";
            if (isset($request['tope_porcentaje'])) {
                $havingTopePorcentaje = ' having sum(tab0.porcentajeasignacion) > ' . $request['tope_porcentaje'];
            }


            //sentencia sql
            $sql_consulta = <<<EOD
select
tab0.*
from(

    select
    tab0.id_anhos,
    tab0.id_meses,
    mes.descripcion,
    tab0.nroidentificacion,
    tab0.nomrecurso,
    case when tab0.tipo_recurso = 1 then 'Funcionario' else 'Contratista' end as tipo_recurso,
    tab0.sgccode,
    tab0.porcentajeasignacion,
    listagg(tab0.fecha_dia, ',') within group (order by tab0.fecha_dia) as fecha_dia
    from(
    
        select
        to_char(wm_concat(distinct tab0.sgccode)) as sgccode,
        tab0.nroidentificacion,
        tab0.nomrecurso,
        sum(tab0.porcentajeasignacion) as porcentajeasignacion,
        tab0.tipo_recurso,
        tab0.id_anhos,
        tab0.id_meses,
        tab0.fecha_dia 
        
        from(
        
            select 
            tab0.id_recursos_diario,
            tab0.id_recursos,
            tab0.projectkey,
            tab0.resourcekey,
            tab0.sgccode,
            tab0.nomrecurso,
            tab0.nroidentificacion,
            tab0.fechainicio,
            tab0.fechafin,
            tab0.porcentajeasignacion,
            tab0.estadoasignacion,
            tab0.tipo_recurso,
            tab0.id_anhos,
            tab0.id_meses,
            tab0.fecha_dia 
            
            from ccg_recursos_diario tab0
            
            where    
            tab0.id_anhos = $id_anhos
            and tab0.id_meses = $id_meses
            $whereCodigoProy
            $whereNroIdentificacion        
            $whereTipoRecurso        
            --and tab0.nroidentificacion = 16505627
            --and tab0.sgccode = 1000667
            
            /*
            order by
            fecha_dia,
            id_recursos
            */
        
        )tab0
        
        group by
        tab0.nroidentificacion,
        tab0.nomrecurso,
        tab0.tipo_recurso,
        tab0.id_anhos,
        tab0.id_meses,
        tab0.fecha_dia 
        
        $havingTopePorcentaje            
        /*having sum(tab0.porcentajeasignacion) > 100*/
    
    )tab0
    
    join meses mes
    on mes.id_meses = tab0.id_meses
    
    group by
    tab0.sgccode,
    tab0.nroidentificacion,
    tab0.nomrecurso,
    tab0.porcentajeasignacion,
    tab0.tipo_recurso,
    tab0.id_anhos,
    tab0.id_meses,
    mes.descripcion

)tab0 
EOD;

            /*
             * sql que trae los resultados
             * por los filtros, para totalizar las filas
             */
            $sql = <<<EOD
select count(*) as count from (

$sql_consulta

)
EOD;

            $total_record_count = CN_TABLE::executeSQL($sql);
            $total_record_count = $total_record_count[0]["count"];


            $sql = <<<EOD
SELECT * FROM ( SELECT row_.*, ROWNUM rownum_ FROM (
    
$sql_consulta

$sortBy
          
) row_ WHERE ROWNUM <=  $rowEnd   ) where rownum_ >  $rowStart
EOD;

            $records = CN_TABLE::executeSQL($sql);

            /*
             * COMMIT DE TODAS LAS TRANSACCIONES
             */
            $this->conn->commit();
            $this->status = 0;
            $this->totalRows = $total_record_count;
            $this->startRow = $rowStart;
            $this->endRow = $rowStart + count($records);
            $this->list_data = $records;
        } 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 = "[inf_porcentaje_asig_recursos] Ocurrio un error: " . $e->getMessage();
            $this->list_data = array();
            $this->logMessage("[inf_porcentaje_asig_recursos] ERROR!");
            $this->logMessage($e->getMessage());
        }
    }

    /**
     * Executes add action
     *
     * @param sfRequest $request A request object
     */
    public function executeAdd(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_anhos = $request['id_anhos'];

            /*
             *  Borrar datos anteriores 
             */

            //Sql
            $sql = <<<EOD
TRUNCATE TABLE CCG_RECURSOS_DIARIO   
EOD;
            //Ejecutar SQL
            CN_TABLE::executeSQL($sql);

            //Sql
            $sql = <<<EOD
DELETE FROM CCG_RECURSOS  
EOD;
            //Ejecutar SQL
            CN_TABLE::executeSQL($sql);

            //Sql
            $sql = <<<EOD
SELECT 
ProjectKey,
ResourceKey,
SGCCode,
NomRecurso,
NroIdentificacion,
CONVERT(VARCHAR(10), FechaInicio, 120) as FechaInicio,
CONVERT(VARCHAR(10), FechaFin, 120) as FechaFin,
PorcentajeAsignacion,
EstadoAsignacion 
FROM dbo.Vwebsafi_Recursos                 
order by
SGCCode,
NroIdentificacion,
FechaInicio    
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','$nroidentificacion',to_date('$fechainicio','YYYY-MM-DD'),to_date('$fechafin','YYYY-MM-DD'),
        '$porcentajeasignacion','$estadoasignacion')  
EOD;
                //Ejecutar SQL
                $this->conn->execute($sql);

                $id_rownum++;

                //break;
            }

            //Sql - para los recursos en dias
            $sql = <<<EOD
INSERT INTO CCG_RECURSOS_DIARIO (ID_RECURSOS_DIARIO,ID_RECURSOS,PROJECTKEY,RESOURCEKEY,SGCCODE,NOMRECURSO,NROIDENTIFICACION,FECHAINICIO,FECHAFIN,PORCENTAJEASIGNACION,ESTADOASIGNACION,TIPO_RECURSO,ID_ANHOS,ID_MESES,FECHA_DIA)

select distinct 
null as id_recursos_diario,
rec.id_recursos as id_recursos,
rec.projectkey,
rec.resourcekey,
rec.sgccode,
rec.nomrecurso,
rec.nroidentificacion,
rec.fechainicio,
rec.fechafin,
rec.porcentajeasignacion,
rec.estadoasignacion,
nvl(func.id_tipo_doc,0) as tipo_recurso,
EXTRACT(year FROM fes.fecha) as id_anhos,
EXTRACT(month FROM fes.fecha) as id_meses,
fes.fecha as fecha_dia

from ccg_recursos rec

join ccg_dia_calendario fes
on fes.fecha between rec.fechainicio and rec.fechafin

left join no_estado_func_v func
on rec.nroidentificacion = func.num_doc
and func.id_anhos = EXTRACT(year FROM fes.fecha)
and func.id_meses = EXTRACT(month FROM fes.fecha)

--where rec.id_recursos = $id_rownum 

order by
rec.id_recursos,
fes.fecha  
EOD;
            //Ejecutar SQL
            $this->conn->execute($sql);


            /*
             * COMMIT DE TODAS LAS TRANSACCIONES
             */
            $this->conn->commit();
            $this->status = 0;
            $this->list_data = array();
            $this->logMessage("[inf_porcentaje_asig_recursos] Porcentaje_asig_recursos terminado.");
        } 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 = "[inf_porcentaje_asig_recursos] Ocurrio un error: " . $e->getMessage();
            $this->list_data = array();
            $this->logMessage("[inf_porcentaje_asig_recursos] ERROR!");
            $this->logMessage($e->getMessage());
        }
    }

}
