function listar_oportunidades_por_puntaje($fecha = array(), $dashboard = NULL)
 {
     $dataset = array();
     $results = array();
     $fields = array("opp.id_oportunidad", "opp.nombre", "HEX(opp.uuid_oportunidad) AS uuid_oportunidad", "HEX(cl.uuid_cliente) AS uuid_cliente", "HEX(opp.uuid_sociedad) AS uuid_sociedad", "HEX(opp.uuid_contacto) AS uuid_contacto", "ccat.etiqueta AS tipo_cliente", "cl.nombre AS nombre_cliente", "clso.nombre_comercial", "ocat.id_cat AS id_etapa", "ocat.etiqueta AS etapa", "opp.fecha_cierre", "opp.fecha_creacion", "prop.valor_alquiler", "CONCAT_WS(' ', IF(usr.nombre != '', usr.nombre, ''), IF(usr.apellido != '', usr.apellido, '')) AS usuario_asignado", "CONCAT_WS(' ', IF(con.nombre != '', con.nombre, ''), IF(con.apellido != '', con.apellido, '')) AS nombre_contacto");
     /**
      * Permiso Default: ver las asignadas o las que ha creado
      */
     $clause = array("ocat.valor NOT IN('vendido','venta_perdida')" => NULL);
     if (!empty($fecha)) {
         $replace = Grafica_usuario::condicion_fecha($fecha);
         $str = str_replace("fecha_creacion", "opp.fecha_creacion", $replace);
         $clause[$str] = NULL;
     } else {
         $clause["MONTH(opp.fecha_creacion) = '" . date('n') . "'"] = NULL;
     }
     /**
      * Array con los uuid de usuarios
      * que el usario actual puede ver.
      */
     if (empty($dashboard)) {
         $ver_usuarios = @CRM_Controller::andrea_ACL();
     } else {
         $ver_usuarios = @CRM_Controller::andrea_ACL('dashboard');
     }
     $this->db->select($fields)->distinct()->from('opp_oportunidades AS opp')->join('cl_clientes AS cl', 'cl.uuid_cliente = opp.uuid_cliente', 'LEFT')->join('cl_cliente_sociedades_contactos AS clcon', 'clcon.uuid_cliente = cl.uuid_cliente', 'LEFT')->join('con_contactos AS con', 'con.uuid_contacto = clcon.uuid_contacto', 'LEFT')->join('opp_oportunidades_cat AS ocat', 'ocat.id_cat = opp.id_etapa_venta', 'LEFT')->join('usuarios AS usr', 'usr.uuid_usuario = opp.id_asignado', 'LEFT')->join('cl_clientes_cat AS ccat', 'ccat.id_cat = cl.id_tipo_cliente', 'LEFT')->join('rpo_propiedades AS prop', 'prop.uuid_propiedad = opp.uuid_propiedad', 'LEFT')->join('cl_clientes_sociedades AS clso', 'clso.uuid_sociedad = opp.uuid_sociedad', 'LEFT');
     /**
      * verificar array $ver_usuarios
      */
     if (!empty($ver_usuarios["uuid_usuario"])) {
         $usuarios = $ver_usuarios["uuid_usuario"];
         $usuarios = !empty($usuarios) ? implode(", ", array_map(function ($usuarios) {
             return "'" . $usuarios . "'";
         }, $usuarios)) : "";
         $clause["HEX(opp.id_asignado) IN(" . $usuarios . ")"] = NULL;
     }
     $this->db->where($clause);
     $oportunidades = $this->db->group_by('opp.id_oportunidad', 'DESC')->get()->result_array();
     if (!empty($oportunidades)) {
         $i = 0;
         foreach ($oportunidades as $oportunidad) {
             $uuid_oportunidad = !empty($oportunidad["uuid_oportunidad"]) ? $oportunidad["uuid_oportunidad"] : "";
             $results[$i]["id_oportunidad"] = !empty($oportunidad["id_oportunidad"]) ? $oportunidad["id_oportunidad"] : "";
             $results[$i]["uuid_oportunidad"] = !empty($oportunidad["uuid_oportunidad"]) ? $oportunidad["uuid_oportunidad"] : "";
             $results[$i]["nombre"] = !empty($oportunidad["nombre"]) ? $oportunidad["nombre"] : "";
             $results[$i]["nombre_comercial"] = !empty($oportunidad["nombre_comercial"]) ? $oportunidad["nombre_comercial"] : "";
             $results[$i]["tipo_cliente"] = !empty($oportunidad["tipo_cliente"]) ? $oportunidad["tipo_cliente"] : "";
             $results[$i]["nombre_cliente"] = !empty($oportunidad["nombre_cliente"]) ? $oportunidad["nombre_cliente"] : "";
             $results[$i]["fecha_creacion"] = !empty($oportunidad["fecha_creacion"]) ? $oportunidad["fecha_creacion"] : "";
             //-------------------------
             // Seleccionar la suma total
             // de las actividades completadas
             // de esta oportunidad.
             //-------------------------
             $fields = array("COALESCE(SUM(actta.puntaje), 0) AS puntaje_total");
             $clause = array("actcat1.valor" => "oportunidades", "act.uuid_oportunidad = UNHEX('{$uuid_oportunidad}')" => NULL, "act.completada" => 1);
             $actividad = $this->db->select($fields)->distinct()->from('act_actividades AS act')->join("act_actividades_cat AS actcat1", "actcat1.id_cat = act.relacionado_con", 'LEFT')->join("act_tipo_actividades AS actta", "actta.uuid_tipo_actividad = act.uuid_tipo_actividad", 'LEFT')->where($clause)->get()->result_array();
             $results[$i]["puntaje_total"] = 0;
             if (!empty($actividad[0]["puntaje_total"]) && $actividad[0]["puntaje_total"] > 0) {
                 $results[$i]["puntaje_total"] = !empty($actividad[0]["puntaje_total"]) ? (int) $actividad[0]["puntaje_total"] : 0;
                 $dataset[$i] = (int) $actividad[0]["puntaje_total"];
                 $i++;
             } else {
                 unset($results[$i]);
                 unset($dataset[$i]);
             }
         }
         //Si no tiene actividad retornar false
         /*if(@Util::is_array_empty($hasActividades)){
         			return false;
         		}*/
         /**
          * Hack: para que la funcion PHPExcel_Calculation_Statistical::PERCENTRANK
          * No envie el siguiente error, si el array $dataset contiene un solo valor:
          *
          * A PHP Error was encountered
          * Severity: Warning
          * Message: Division by zero
          * Filename: Calculation/Statistical.php
          */
         if (count($dataset) == 1) {
             $dataset[] = 0;
         }
         //ordenar los puntajes
         //de menor a mayor
         ksort($dataset);
         //Recorrer los resultados y calcular el PERCENTRANK
         //Usando una clase de la libreria PHPEXcel y introducir
         //el resultado en el array de $results
         $j = 0;
         $percentagerank = "";
         foreach ($results as $result) {
             /*if(empty($result) || empty($result["puntaje_total"]) && $result["puntaje_total"] == ""
             		|| empty($result["puntaje_total"]) && $result["puntaje_total"] <= 0
             		|| !empty($result["puntaje_total"]) && count($dataset) == 1 && $dataset[0] == $result["puntaje_total"]){
             			continue;
             		}*/
             if (!empty($result["puntaje_total"]) && $result["puntaje_total"] != "" && $result["puntaje_total"] > 0) {
                 $percentagerank = PHPExcel_Calculation_Statistical::PERCENTRANK($dataset, $result["puntaje_total"], 2) * 100;
                 //$percentagerank = PHPExcel_Calculation_Statistical::PERCENTRANK($dataset, $result["puntaje_total"], 1);
                 $results[$j]["percentagerank"] = !empty($percentagerank) ? $percentagerank : 0;
             } else {
                 unset($result);
             }
             $j++;
         }
     }
     //Ordenar el arreglo segun los valores de porcentaje. (mayor -> menor)
     usort($results, function ($a, $b) {
         $array_a = !empty($a['percentagerank']) ? $a['percentagerank'] : 0;
         $array_b = !empty($b['percentagerank']) ? $b['percentagerank'] : 0;
         if ($array_a == $array_b) {
             return 0;
         } else {
             if ($array_a > $array_b) {
                 return -1;
             } else {
                 return 1;
             }
         }
     });
     return $results;
 }
 public static function listar_oportunidades_por_puntaje($fecha = array(), $subordinados)
 {
     $dataset = array();
     $results = array();
     $replace = Grafica_usuario::condicion_fecha($fecha);
     $fecha_clause = str_replace("fecha_creacion", "opp.fecha_creacion", $replace);
     $uuid_subordinados = !empty($subordinados) ? implode(", ", array_map(function ($subordinados) {
         return "'" . $subordinados . "'";
     }, $subordinados)) : "";
     $clause = " AND {$fecha_clause}";
     if (!empty($uuid_subordinados)) {
         $clause .= " AND HEX(opp.id_asignado) IN(" . $uuid_subordinados . ")";
     }
     $sql = "SELECT DISTINCT `opp`.`id_oportunidad`, `opp`.`nombre`, HEX(opp.uuid_oportunidad) AS uuid_oportunidad, HEX(cl.uuid_cliente) AS uuid_cliente, HEX(opp.uuid_sociedad) AS uuid_sociedad, HEX(opp.uuid_contacto) AS uuid_contacto,\n\t\t\t\t`ccat`.`etiqueta` AS tipo_cliente, `cl`.`nombre` AS nombre_cliente, `clso`.`nombre_comercial`, `ocat`.`id_cat` AS id_etapa, `ocat`.`etiqueta` AS etapa, `opp`.`fecha_cierre`, `opp`.`fecha_creacion`, `prop`.`valor_alquiler`,\n\t\t\t\tCONCAT_WS(' ', IF(usr.nombre != '', usr.nombre, ''), IF(usr.apellido != '', usr.apellido, '')) AS usuario_asignado,\n\t\t\t\tCONCAT_WS(' ', IF(con.nombre != '', con.nombre, ''), IF(con.apellido != '', con.apellido, '')) AS nombre_contacto\n\t\t\t\tFROM `opp_oportunidades` AS opp\n\t\t\t\tLEFT JOIN `cl_clientes` AS cl ON `cl`.`uuid_cliente` = `opp`.`uuid_cliente`\n\t\t\t\tLEFT JOIN `cl_cliente_sociedades_contactos` AS clcon ON `clcon`.`uuid_cliente` = `cl`.`uuid_cliente`\n\t\t\t\tLEFT JOIN `con_contactos` AS con ON `con`.`uuid_contacto` = `clcon`.`uuid_contacto`\n\t\t\t\tLEFT JOIN `opp_oportunidades_cat` AS ocat ON `ocat`.`id_cat` = `opp`.`id_etapa_venta`\n\t\t\t\tLEFT JOIN `usuarios` AS usr ON `usr`.`uuid_usuario` = `opp`.`id_asignado`\n\t\t\t\tLEFT JOIN `cl_clientes_cat` AS ccat ON `ccat`.`id_cat` = `cl`.`id_tipo_cliente`\n\t\t\t\tLEFT JOIN `rpo_propiedades` AS prop ON `prop`.`uuid_propiedad` = `opp`.`uuid_propiedad`\n\t\t\t\tLEFT JOIN `cl_clientes_sociedades` AS clso ON `clso`.`uuid_sociedad` = `opp`.`uuid_sociedad`\n\t\t\t\tWHERE `ocat`.`valor` NOT IN('vendido','venta_perdida') {$clause}\n\t\t\t\tGROUP BY `opp`.`id_oportunidad`";
     self::$db->sql($sql);
     $oportunidades = self::$db->getResult();
     if (!empty($oportunidades)) {
         $i = 0;
         foreach ($oportunidades as $oportunidad) {
             $uuid_oportunidad = !empty($oportunidad["uuid_oportunidad"]) ? $oportunidad["uuid_oportunidad"] : "";
             $results[$i]["id_oportunidad"] = !empty($oportunidad["id_oportunidad"]) ? $oportunidad["id_oportunidad"] : "";
             $results[$i]["uuid_oportunidad"] = !empty($oportunidad["uuid_oportunidad"]) ? $oportunidad["uuid_oportunidad"] : "";
             $results[$i]["nombre"] = !empty($oportunidad["nombre"]) ? $oportunidad["nombre"] : "";
             $results[$i]["nombre_comercial"] = !empty($oportunidad["nombre_comercial"]) ? $oportunidad["nombre_comercial"] : "";
             $results[$i]["tipo_cliente"] = !empty($oportunidad["tipo_cliente"]) ? $oportunidad["tipo_cliente"] : "";
             $results[$i]["nombre_cliente"] = !empty($oportunidad["nombre_cliente"]) ? $oportunidad["nombre_cliente"] : "";
             $results[$i]["fecha_creacion"] = !empty($oportunidad["fecha_creacion"]) ? $oportunidad["fecha_creacion"] : "";
             $results[$i]["usuario_asignado"] = !empty($oportunidad["usuario_asignado"]) ? $oportunidad["usuario_asignado"] : "";
             $actividad = array();
             if (!empty($oportunidad["uuid_oportunidad"])) {
                 $sql = "SELECT DISTINCT COALESCE(SUM(actta.puntaje), 0) AS puntaje_total\n\t\t\t\t\t\t\tFROM (`act_actividades` AS act)\n\t\t\t\t\t\t\tLEFT JOIN `act_actividades_cat` AS actcat1 ON `actcat1`.`id_cat` = `act`.`relacionado_con`\n\t\t\t\t\t\t\tLEFT JOIN `act_tipo_actividades` AS actta ON `actta`.`uuid_tipo_actividad` = `act`.`uuid_tipo_actividad`\n\t\t\t\t\t\t\tWHERE `actcat1`.`valor` =  'oportunidades'\n\t\t\t\t\t\t\tAND `act`.`uuid_oportunidad` = UNHEX('" . $oportunidad["uuid_oportunidad"] . "')\n\t\t\t\t\t\t\tAND `act`.`completada` =  1";
                 self::$db->sql($sql);
                 $actividad = self::$db->getResult();
             }
             $results[$i]["puntaje_total"] = 0;
             if (!empty($actividad[0]["puntaje_total"]) && $actividad[0]["puntaje_total"] > 0) {
                 $results[$i]["puntaje_total"] = !empty($actividad[0]["puntaje_total"]) ? (int) $actividad[0]["puntaje_total"] : 0;
                 $dataset[$i] = (int) $actividad[0]["puntaje_total"];
                 $i++;
             } else {
                 unset($results[$i]);
                 unset($dataset[$i]);
             }
         }
         /**
          * Hack: para que la funcion PHPExcel_Calculation_Statistical::PERCENTRANK
          * No envie el siguiente error, si el array $dataset contiene un solo valor:
          *
          * A PHP Error was encountered
          * Severity: Warning
          * Message: Division by zero
          * Filename: Calculation/Statistical.php
          */
         if (count($dataset) == 1) {
             $dataset[] = 0;
         }
         //ordenar los puntajes
         //de menor a mayor
         ksort($dataset);
         //Recorrer los resultados y calcular el PERCENTRANK
         //Usando una clase de la libreria PHPEXcel y introducir
         //el resultado en el array de $results
         $j = 0;
         $percentagerank = "";
         foreach ($results as $result) {
             if (!empty($result["puntaje_total"]) && $result["puntaje_total"] != "" && $result["puntaje_total"] > 0) {
                 $percentagerank = PHPExcel_Calculation_Statistical::PERCENTRANK($dataset, $result["puntaje_total"], 2) * 100;
                 $results[$j]["percentagerank"] = !empty($percentagerank) ? $percentagerank : 0;
             } else {
                 unset($result);
             }
             $j++;
         }
     }
     return $results;
 }