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