<?php
include_once "elyte_baremo.php";
// Para iniciar test desde url ppac.asesoramos.net/'item'/#ITEM/$rid/$DOC/$NAME
// MENU REPORTE DE RESULTADOS PPAC = genera resultados y grafica desde el quiz_nid/rid_principal
// uri = simascore/graf : genera grafica (null, 'Bar3DGraph','CylinderGraph','Bar3DGraph')
// uri = simascore/score : genera array de score RES_SQUIZ= [ITEM][Trast][var=quiz,score,max,min,rid]
// uri = simascore/asoc :genera arreglo asociativo del resumen de resultados
// uri = simascore/clean : genera html del resultado sin encabezados y pie de pag
// OBTENER RESULTASDOS : URI= simascore/graf/quiz_nid/rid_ppal/graph graph= opcional ,'Bar3DGraph','CylinderGraph','Bar3DGraph' ej: simascore/graf/276/1188/Bar3DGraph
// ESTE MNODULO SALVA RID EN SIMA DESDE URL Y DIBUJA FRAFICAS Y TABLAS DE RESULTADOS COMUNICAMNDOSE CON SIMATEST(PPAC),
/* ==========================================
AREGLO RESULT: Para graficar y generar tabla de resultados de los test (VER ARCHIVO EXCEL SCORE-GRAPPARA MAS INFO)
==========================================
... (Array) Arreglo de datos
327 (Array) Cuestionario (Quiz) par 1a Gráfica (ID del nodo)
nid => 327 Nodo ID del Cuestionario (Quiz)
vid => 1160 Version Del nid
graf => MultiRadarGraph Tipo de Gráfica
width => (int) 240 Ancho de la grafica en pixeles
titulo => 1.- PPAC-SO Escala: Salud Ocupacional
escala => P Label de score convertido (Ej P= percentil, PD=Puntuacion directa, T, etc)
color => RAV Orden del Color de fondo en gráfica (Rojo Amarillo Verde)
bare_tit => SPSO-1-SO-2019 Titulo del baremo
trast (Array) ARREGLO DE TRASTORNOS/VARIABLES
287 (Array) Arreglo 1a variable (327 es el TID de la variable en Stest)
maxscore => (int) 15 Puntuacion directa (PD) máxima de la variable
num_preg => (int) 5 Cantidad de preguntas en la variable
score => (int) 15 Respuesta de usuario (score) en Puntuacion directa
sname => Autocuidado Nombre corto de la variable (Para colocar dentro del gráfico)
max => 61 Límite máximo para el color intermedio de fondo en gráfica
min => 16 Límite mínimo para el color intermedio de fondo en gráfica
conversion (Array) ARREGLO DE CONVERSION según Baremacion de (PD a P)
15 => 100
14 => 95
13 => 88
12 => 80 Ej: PD=12 equivale a percentil de 80
11 => 61
10 => 47
9 => 32
8 => 16
7 => 7
6 => 5
5 => 3
4 => 1
3 => 0
2 => 0
1 => 0
0 => 0
interp => El ususario posee habilidades y competencias pa... Resultado de interpretacion o variable
link =>
name => Autocuidado Nombre largo de la variable
convert => 100 Score convertido (Resultado aplicada la conversión)
range => 61 Rango de aprobacion de la variable
rangeSgn => >= operador para aprobacion o desaprobacion del rango (ej: aprobado si score>=61)
desc => Descripcion de la variable (se imprime si no existe interp)
680 (Array) Arreglo 2a Variable en la gráfica
290 (Array) Arreglo 3a Variable en la gráfica
291 (Array) Arreglo 4a Variable en la gráfica
277 (Array) Nodo ID del Cuestionario (Quiz) para 2a Gráfica
278 (Array) Nodo ID del Cuestionario (Quiz) para 3a Gráfica
*/
/**
* @file
*
*/
// Habilita overlay en quizes
function elyte_score_graph_custom_theme() {
// match node/1
if (arg(2) == 'take' or arg(0)=='overlay' ) {
return ('seven');
}
}
// Habilita overlay para los links indicados
// Debe darse permisos de overlay al user (role)
function elyte_score_graph_admin_paths() {
$paths = array(
// 'node/*' => 600,
'node/*/take/*' => 600,
'node/*/take' => 600,
'overlay/*' => 600,
);
return $paths;
}
/// Fin de Overlay
########
// MENU REPORTE DE RESULTADOS PPAC = genera resultados y grafica desde el quiz_nid/rid_principal
// uri = simascore/graf/$qids/$rids/$grafs : genera grafica
// uri = simascore/score/$qids/$rids/$grafs : genera array de score RES_SQUIZ= [ITEM][Trast][var=quiz,score,max,min,rid]
// uri = simascore/clean/$qids/$rids/$grafs : genera grafic y tabla sin theme drupal
// /$qids/$rids/$grafs son valores(separados por comas) de cada variable
function elyte_score_graph_menu() {
$items['simascore'] = array(
'title' => 'Resultados Test Psicométrico',
'page callback' => 'graficar_resultados',
'access callback' => TRUE,
'access arguments' => array('access content'),
# 'type' => MENU_SUGGESTED_ITEM,
);
return $items;
}
include_once "elyte_baremo.php";
////////////////////// quiz_result_load(r_id);
/*
OBJETOS USADOS:
-$QUIZ
->title // titulo de la prueba
->nid
->type = "quiz"
->result_type =(tipo_de_resltadooo)
->field_cuestionarios_incluidos['und'][**]['target_id']
-$Q_RESULT = quiz results
->result_id
->nid
->type =(tipo_de_resltadooo)
->field_organizac['und'][0]['target_id']
->field_evaluado['und'][0]['target_id']
->field_numero['und'][0]['value'] // Numero de serie de la prueba en la organizacion
-$ANSWERS[nid de pregunta] = array de resultados a cada pregunta
.[180]->answers[0]['answer_id'] = Nid de Q_RESULT
[180]->field_transtorno['und'][0]['tid'] = tid de Trastorno
[180]->answers[0]['answer'] = Respuesta
[180]->answers[0]['is_correct']
[180]->correct
[180]->qnr_max_score
*/
/*
*
*/
// //**//**dsm(graficar_resultados('score','119','1686',"CylinderGraph"));
function graficar_resultados($accion,$takes,$grap_type="0",$code=null) { // dESDE MENU GRAF_REPORT 0000>> $quizes no se utiliza BORRAR!!!!!
// Funcion que genera los resultados y grafica para imprimir, o genera/decodifica el arreglo de RESUMEN de resultados codificado.
// Para recuperar la informacion desde el resumen codificado desde URL con POSST
/*
* $accion= "score" : calcula y genera el html con grafica
* $accion= "code" : calcula y genera el json de resultados codificados. (no requiere de entidad result )
* $accion= "test" : realiza test haciendo primero code y luego score a partir del code.
* $accion= "clean" : genera el html limpio sin planatilla
* $accion= "asoc" : genera el array json asociativo del resumen
$accion= "info"
* Para generar grafica desde el codigo:
* 1-Por FUNCION: graficar_resultados("score",0,0,$code)
* 2- DESDE URL: POST al URL: /simascore/score/0 y $_POST['codigo']= $code
*
* Extrae solo los datos basicos para almacenar en SIMA (en SIMA alnacena resultados en entidad simaform/stest field_code no RID)
* Arreglos $info: datos de Quiz nid/vid/rid y datos de ref usuario/auth/ en sima
* Arreglo RESULT[QUIZ_ID]=> QUIZ_VID y SCORE para cada uno de los trastornos de cada QUIZ (Campos con # son de referencia a SIMA, (entidad en sima)
¨*/
if(user_has_role(1)) {drupal_access_denied(); return;} // Bloquea Anonimos
$out_tabla=""; // html de salida
$out_grafica=""; // html de salida
if (!$grap_type) $grafica_tipo_arr=explode( ',',$grap_type);
// $TRASTORNOS=array();
$info=$RESUM=$GRAF=array();
// Esta funcion Extrae y procesa resuktados generados directamente por el modulo quiz, o desde el resumen codificado. (Utilizado para almacenar datos en SIMA.
// UTILIZAR graficar_resultados accesible desde URL
//>>>>>>>>>DECODIFICA Si SIMA ENTREGA RESULTADOS CODIFICADOS
if($takes==0 ){
if(!$code) $code=$_POST['codigo'];
//echo $code;
code_decode($RESUM,$info,$code,$accion);
$post=true;
$i=key($RESUM);
//RESTAURA VALORES DE $RESUMEN
if( isset($info)){
$RESUM[$i]['nid']=$info['qid']=$i;
$info['qvid']=$RESUM[$i]['vid'];
// CARGA EL QUIZ PPAL en la version que uso el rid
$QUIZ=node_load($i,$info['qvid']);
}
}
else {
// >>>>>>>>>>>> OBTIENE RESULTADOS DESDE QUIZ/RESULT ID (NO CODIFICADOS)
$rid= quiz_result_load($takes); // $rid principal (0 = hay resultados en POST)
dsm($rid);
//$SALIDA=" DSDE RID >>>>>>>>>>>>";
if (!isset($rid->nid)) return "ERROR No existe RESULTS ID";
$QUIZ=node_load($rid->nid,$rid->vid);
###########
// GERERA ARRAY DE RESULTS ID
// $quizes_arr=explode( ',',$quizes); // no se usa se obtiene de primer obj $results->nid
// Para cada $rid de Quiz- principal(Primario) obtiene los OBJETOS DE LOS RIDS PRIMARIOS ($expanded_rids)
$rid= quiz_result_load($takes); // $rid principal
// Info del examen (auth, evaluado,etc)
$auth=user_load($rid->uid);
$info['#auth']=$auth->field_sima_uid['und'][0]['value']; // UID en SIMA
$info['num']=$rid->field_numero['und'][0]['value'];
$info['date']=$rid->time_start;
$info['tend']=$rid->time_end;
if(!isset($_SESSION['loged_usr']['sas'])) $_SESSION['loged_usr']['sas']="0";
/* if($_SESSION['loged_usr']['sas']=="0") {
$info['#sen']=$rid->field_sima_eva_nid['und'][0]['value'];
$info['#sev']=$rid->field_sima_eva_vid['und'][0]['value'];
}
*/ $info['rid']=$takes;
$info['qid']=$QUIZ->nid; //Primario
$info['qvid']=$QUIZ->vid;
//$info['tit']=$QUIZ->title;
if (isset($rid->field_documento['und'])) {
if(isset($rid->field_ordenes['und'][0])) $info['#ord']=$rid->field_ordenes['und'][0]['value'];
//$info['#auth']=$auth->field_sima_uid['und'][0]['value'];
}
//* else {
$info['doc']=$rid->field_documento['und'][0]['value'];
$info['#name']=$rid->field_nombre['und'][0]['safe_value'];
$info['#last']=$rid->field_apellidos['und'][0]['safe_value'];
$info['#ord']=$rid->field_ordenes['und'][0]['value'];
// } */
}
$info['accion']=$accion;
/* ## PARA SIMA
if($_SESSION['loged_usr']['sas']=="0") {
sima_eva($info);
//OBTIENE DATOS DE AFIL/ORG
# $AFI_SIMA=drupal_json_decode(getws("sima","views/Reportes_SIMA3.json?display_id=profile_data&uid=".$info['#auth']));
$USR_SIMA=drupal_json_decode(getws("sima","user/".$info['#auth'].".json")); // MMODIFIC May-17-2021
dsm($USR_SIMA);
$AFI_SIMA=drupal_json_decode(getws("sima","node/".$USR_SIMA['field_info_personal']['und'][0]['nid'].".json")) ;
dsm($AFI_SIMA);
$info['org']=$AFI_SIMA[0]['org'];
$info['af_name']=$AFI_SIMA[0]['name'];
//$info['#af_uid']=$AFI_SIMA[0]['uid'];
$info['org']=$AFI_SIMA[0]['org'];
}
//PARA SAS
else {
*************PENDIENTE
$info['org']=$
$info['af_name']=;
//$info['#af_uid']=$AFI_SIMA[0]['uid'];
$info['org']=;
}
CAMBIOS MAYO 17-2021 */
# dsm($rid); dsm($auth);
$info['af_name']=$auth->name;
//$info['#af_uid']=$AFI_SIMA[0]['uid'];
/* $t=isset($rid->og_group_ref)? $rid->og_group_ref : $auth->group_access['und'][0]['value'];
$t=node_load($t);
$info['org']=$t->title;
*/
// Para Quiz PPal
if(!isset($QUIZ->field_item_sima_portaf_serv_['und'][0])) {drupal_set_message("No es resultado válido."); drupal_access_denied(); return;}
$alias = "test/".$QUIZ->field_item_sima_portaf_serv_['und'][0]['value'] ;
$path = drupal_lookup_path("source", $alias);
$TEST = menu_get_object("node", 1, $path);
//drupal_set_title("TEST: ".$TEST->title);
$info['tit']=$TEST->title;
// Notas del reporte
if (isset($TEST->field_notas_al_reporte['und'][0])) $info['nota']=$TEST->field_notas_al_reporte['und'][0]['value'];
else $info['nota']="";
// Accion tipo INFo
if($accion== "info" ){ echo drupal_json_encode($info); exit;}
//if(!isset($QUIZ[$i]->field_gr_fica['und'][0])) break;
isset($GRAPH_TYPE) ? $grap_type=$GRAPH_TYPE : //$grap_type=$GRAPH_TYPE[$i];
$grap_type=$QUIZ->field_gr_fica['und'][0]['value'];
// RESULTADOS
if (empty($code)) {
$RESULTADOS[$takes]=$rid;
// EXtrae Nids de secundarios
if(isset($rid->field_rids_secundarios['und'][0]))
foreach($rid->field_rids_secundarios['und'] as $r) {
$RESULTADOS[$r['target_id']]=quiz_result_load($r['target_id']); // si no es primario carga result(ya tiene el del prim) <<<<<<<<<<<<<<<<
}
}
// Itera sobre todos los quizes primario[0] + secundarios[1.2...]
// Para resultados desde RID
if(isset($RESULTADOS )){
foreach ($RESULTADOS as $r=>$val) {
$RESUM[$val->nid]= genera_resumen($val,$info); // $RESUM
}
}
else { // Para resultados en codigo
foreach ($RESUM as $q=>$val) {
$RESUM[$q]['nid']=$q;
genera_resumen(0,$info,$RESUM[$q]);
}
}
calcule_compuestas($RESUM);
//BORRAR DATOS SOBRANTES}
foreach ($RESUM as $q => $rid1)
foreach ($rid1 as $var => $val)
if ($var=="trast")
foreach ($val as $tr => $val1)
foreach ($val1 as $var1 => $val2)
if( $var1=="compuesta") unset($RESUM[$q][$var][$tr][$var1]);
if ($accion=="test") {
code_decode($RESUM,$info,$code);
$salida = " TEST CODED/DECODED--".graficar_resultados("score",0,0,$code,$accion);
}
else if ($accion=="code" OR $accion=="asoc" or 1 or strpos($action,"score")===0){
$Resum_ARR[]=$RESUM;
//code_decode($RESUM,$info,$code,$accion);
//return $code;
}
else if ($accion=="clean" ) {
echo structure_svgraph($RESUM,$info); ////// Retorna html de la grafica
exit ;
}
$salida=structure_svgraph($RESUM,$info);
if ($accion=="clean" ) {
# echo $salida; ////// Retorna html de la grafica
}
else if (isset($Resum_ARR )){
//code_decode($RESUM,$info,$code);
code_decode($Resum_ARR,$info,$code,$accion);
if(isset($_GET['ver'])){
$dec=drupal_json_decode($code);
dsm($dec,"OUT ASOCIATIVE ARRAY");
ob_start();
print_r ("RES:<pre>");print_r($dec);print_r("</pre>");
return ob_get_clean();
}
else {
echo $code;
exit;
}
}
unset ($RESUM,$info, $RESULTADOS, $QUIZ); # Adicion Junio 6 2021
return $salida; ////// Retorna html de la grafica
}
/*
*
*
*
$a=graficar_resultados("code",10570);
dsm(strlen($a));
$c=decodifica_score ($a,$RESUM,$inf);
dsm($RESUM);
dsm($inf);
return graficar_resultados("score",0,null,$a);
*/
function sima_eva(&$info){
$eva=(getws("sima","node/".$info['#sen']."/revision/".$info['#sev'].".json"));
if(empty($eva)) $eva=getws("sima","node/".$info['#sen'].".json");
$info['#EVA']=drupal_json_decode($eva);
$info['#eva']= $info['#EVA']['nid'];
$info['#doc']=$info['#EVA']['title'];
$info['#name']=$info['#EVA']['field_nombre_pac']['und'][0]['value'];
$info['#last']=$info['#EVA']['field_apellidos_pac']['und'][0]['value'];
}
function code_decode(&$RESUM=false,&$info=false,&$code=null,$tipo="score"){
//$tipo= score: comprime y reemplaza las llaves y "asoc" deja las llaves del array asociativo.
#return array ($RESUM,$info);
#dsm($info); dsm($RESUM);
if ($tipo=="json1") { `
$enabled= array_keys(["Afi"=> null,
"#Tst"=> "54",
"FecI"=> "1719428506",
"FecF"=> "1719428562",
"#Res"=> "109479",
"TstId"=> "2653",
"TstVer"=> "3136",
"EvDoc"=> "cc5555",
"#Nom"=> "Pablo",
"#Ape"=> "lkllk",
"trast"=> '',
"score"=> "",
"trast"=> "",
"maxscore"=> 3,
"num_preg"=> 3,
"score"=> 2,
"max"=> "70",
"min"=> "70",
"convert"=> "75",
"range"=> "70",
"rangeSgn"=> "<=",
"max_conv"=> "100",
]);
$kinf= array( '#auth'=>'Afi',
'name'=>'AfNom', // Nombre Afiliado
'name'=>'AfNom', // Nombre Afiliado
'last' =>'AfApe', // Apellido Afiliado
'ord'=>'Ref', // Numero externo de Examen - número de referencia al ingreso
//'org'=>'Org', // Organizaci?? 'num'=>'#Tst', // Número consecutivo del test (por cada test y por cada organizaci?? 'date'=>'FecI', // Fecha de Inicio
'tend'=>'FecF', // Fecha de Finalizac
'rid'=>'#Res', // Numero consecutivo de resultados
'qid'=>'TstId', // Numero único del test (o cuestioario ppal)
'qvid'=>'TstVer', // Versi??el test
# '#sen'=>'y', // SIMA EVA NID
# '#sev'=>'z', // SIMA EVA VID
//'tit'=>'t',
// EVALUADO
'#doc'=>'#doc',
'#name'=>'#Nom',
'#last'=>'#Ape',
'#doc'=>'EvDoc',
'doc'=>'EvDoc',
);
$kres=array(
'maxscore'=>'PdMax',
'convert'=>'Pd',
'#num_preg'=>'NumPreg',
'score'=>'score',
#'nid'=>'n',
#'vid'=>'v',
'trast'=>'Variab',
);
}
if ($tipo=="json2") {
$kinf= array( '#auth'=>'a',
//'doc'=>'d',
//'name'=>'f',
//'last' =>'l',
'#ord'=>'o',
//'org'=>'g',
'num'=>'n',
'date'=>'h',
'tend'=>'e',
// 'rid'=>'r',
// 'qid'=>'q',
// 'qvid'=>'v',
'#sen'=>'y', // SIMA EVA NID
'#sev'=>'z', // SIMA EVA VID
//'tit'=>'t',
);
$kres=array(
//'maxscore'=>'m',
//'num_preg'=>'n',
'score'=>'p',
//'nid'=>'n',
'vid'=>'v',
'trast'=>'t',
);
}
if ($tipo=="json") {
#$kres = array();//array_combine(array_keys($kres),array_flip($kres));
#$kinf = array();//array_combine(array_keys($kinf),array_flip($kinf));
$kinf= array( '#auth'=>'Afi',
'name'=>'AfNom', // Nombre Afiliado
'name'=>'AfNom', // Nombre Afiliado
'last' =>'AfApe', // Apellido Afiliado
'ord'=>'Ref', // Numero externo de Examen - número de referencia al ingreso
'org'=>'Org', // Organización
'num'=>'#Tst', // Número consecutivo del test (por cada test y por cada organización)
'date'=>'FecI', // Fecha de Inicio
'tend'=>'FecF', // Fecha de Finalizac
'rid'=>'#Res', // Numero consecutivo de resultados
'qid'=>'TstId', // Numero único del test (o cuestioario ppal)
'qvid'=>'TstVer', // Versión del test
# '#sen'=>'y', // SIMA EVA NID
# '#sev'=>'z', // SIMA EVA VID
//'tit'=>'t',
// EVALUADO
'#doc'=>'#doc',
'#name'=>'#Nom',
'#last'=>'#Ape',
'#doc'=>'EvDoc',
'doc'=>'EvDoc',
);
$kres=array(
'maxscore'=>'PdMax',
'convert'=>'Pd',
'num_preg'=>'NumPreg',
'score'=>'score',
#'nid'=>'n',
#'vid'=>'v',
'trast'=>'Variab',
);
}
if (empty($code)) { // Codifica
dsm("CIDIFICANDO");
if(isset($enabled))
Foreach ($RESUM as $r =>$resum){
if(is_array($resum)){
$RES[$r]=array_intersect($enabled,$resum);
}else if()
$RESUM=$RES;
$RESUM=replace_keys($RESUM,$kres,1,1);
$info=replace_keys($info,$kinf,1,1);
// $code=gzcompress(drupal_json_encode(array ("i"=>$info,"r"=>$RESUM)),9);
$code=drupal_json_encode(array ("i"=>$info,"r"=>$RESUM));
#dsm($info); dsm($RESUM);
}
else { // DECodifica
dsm("DECODIFIC");
// las variables que no estan en los arraya loa crea con el nombre
// dsm("largo=".strlen($code));
// $data= drupal_json_decode(gzuncompress($code));
$kinf=array_flip($kinf);
$kres=array_flip($kres);
$RESUM=$info=array();
$data= drupal_json_decode($code);
//REORGANIZA/RECONSTRUYE estructura de arrays resum y info (Cambia [quiz nid]=maxcore por [quiz]['maxcore']=maxcore
/* foreach ($data as $d => $var) { // Itera $resumen e info
foreach($var as $k=>$quiz){ // itera var en info / trastornos en $RESUMEN
1
if (is_numeric($quiz) and (!is_array($var))) // ES RESUMEN
$data[$d][$quiz]['maxscore']=$data[$d][$quiz];
if (is_numeric($quiz) and (is_array($q))) { // ES tRASTORNO
foreach($q['trast'] as $tid => $val ){
dsm($val);
$data[$d][$quiz][$tid]=$val['score'];
}
}
}
}
*/
$RESUM=replace_keys($data['r'],$kres,1,1);
$info=replace_keys($data['i'],$kinf,1,1);
}
}
function replace_keys($array,$key,$new=false,$level){
// Modifica/reemplaza las llaves del arreglo poe el equivalente segun arreglo $key
if(!$new) $out= $array; // Sobre escribe el array (o genera nuevo)
else $out=array();
$level++;
foreach($array as $k => $v) {
$var=$v;
if ($k=='trast' ) foreach( $v as $tid =>$v1) $var[$tid]=$v1['score'];
if ($k=='t' ){
foreach ($v as $tid => $score) {
$out['trast'][$tid]['score']=$score;
}
}
else {
if (isset($key[$k]) or is_numeric($k) ) {
//Es arreglo
if (is_array($var)) {
$var=replace_keys($var,$key,$new,$level);
}
if( is_numeric($k)) $out[$k]=$var;
else { $out[$key[$k]]=$var;
unset($out[$k]);
}
}
}
}
return $out;
}
/*
*/
/*
*
*
*/
function calcule_compuestas(&$RESUM){
for( $i=0; $i<=4; $i++) { // Itera hasta 4 veces para calcular vars compuestas dependientes de otras
foreach($RESUM as $k=>$resu){
if (isset($resu['trast']))
foreach($resu['trast'] as $tid=>$val) {
if (isset($val['compuesta']) and !isset($resu['trast'][$tid]['score'])) {
$formula=($val['compuesta']);
// FILTRA Y EXTRAE LOS TIDS DE LA FORMULA en array $var1
//$formula="([293]+[831]+[271])-([295]+[554])";
$variab=preg_replace('/\)|\(|\-|\+|\*|\//', '', $formula); // quita todos los chars y deja solo las tid [123][345][456]
$variab=preg_split('/\[|\]/', $variab);
foreach($variab as $tid1){
if(!empty($tid1)){
$var0[$tid1] = array();
}
}
// OBtieNE score y maxscore para cada variable requerida por la compuesta $var1[$tid_compuesta]= array (score, maxscore)
foreach($var0 as $tid2 =>$var) {
foreach($RESUM as $i=>$resu){
if(isset($resu['trast'][$tid2]['score'])) {
$var1[$tid2]['score']=$resu['trast'][$tid2]['score'];
$var1[$tid2]['maxscore']=$resu['trast'][$tid2]['maxscore'];
}
}
}
// Calcula SCORE y MAXSCORE Aplicando la formula
foreach(array("score","maxscore") as $va) {
$formula1='$res='.preg_replace('/\[([0-9]{2,6})\]/', "\$var1[$1]['".$va."']", $formula).";";
if ($formula1!='$res=Array;')
eval($formula1);
else {
drupal_set_message("<b>ERROR en fórmula de variable compuesta ".$RESUM[$k]['trast'][$tid]['name']."</b>","error");
}
$RESUM[$k]['trast'][$tid][$va]=$res;
}
}
// Convierte PDIR
}
}
}
// Convierte los anteriores valores compuestos nuevamente
foreach($RESUM as $k =>$resum) {
foreach($resum['trast'] as $tid => $v) {
if(!isset($resum['trast'][$tid]['convert']) and isset($resum['trast'][$tid]['conversion'] )) {
$TERM=taxonomy_term_load($tid);
convertir_pdir($TERM,$RESUM[$k]);
}
// SI no existe conversion ni tabla de conversion calacula sobre %
else if (!isset($resum['trast'][$tid]['convert']) and !isset($resum['trast'][$tid]['conversion'] )) {
$RESUM[$k]['trast'][$tid]['convert']=$resum['trast'][$tid]['score']*100/$resum['trast'][$tid]['maxscore'];
$RESUM[$k]['trast'][$tid]['escala']="%";
}
}
}
}
/*
*
*/
/////////////////////////////////////////
/*
* Recibe $r= rid principal
$QUIZ = Quiz Principal
$RESUM= SALIDA de resultados a graficar incluyendo secundarios
ARRAY $RESULTADOS:
trast
<Nombre de variable 1>
tid = 287
min =
max =
sname = Autocuidado
name = Autocuidado
link = sdiag/SPSO/Autocuidado/4
maxscore = 15
score = 12
convert
percent = 80
desc =
<Nombre de variable 2>
...
titulo = 1.- PPAC-SO Escala: Salud Ocupacional
invert = 0
escala = 0
quiz = 327
settings
graph_title = 1.- PPAC-SO Escala: Salud Ocupacional
graf = MultiRadarGraph
*/
/*
*
*/
###########
/*
* structure_svgraph
*/
function structure_svgraph($RESUM,$info=false){
// ******Genera html de grafica (con svggraph) y tabla
// $TIPO= G=grafico R=Resumen
// RECIBE RES_SQUIZ = array con datos de las respuestas y trastornos (limites, interpretacion, ETC) para generar en esta funcion el html de la grafica y tabla
// //**//**dsm($info);
$col['R']=array('#FFf0f0', '#FEE', '#d00202');
$col['A']=array('#FFFFCC', '#FFD', 'yellow');
$col['V']=array('#DFD', '#EFE', '#44ae44');
if ($RESUM==null) unset ($RESUM);
// ELIMINA variable de DE GRAFICA Y TABLA (Muestra en DEBUG) y ADD TITULO EN REVISION (DEBUG)
if (!isset($_SESSION['debug_stest'])) {
foreach ($RESUM as $qu=> $resum) {
foreach($resum['trast'] as $tid=>$var) {
if(isset($var['esconder']))
if($var['esconder']==1) {
unset($RESUM[$qu]['trast'][$tid]);
}
}
}
}
// Divide reporte en varios si existe la variable "bloque"
foreach ($RESUM as $qu=> $resum) {
$band_t=false; // bandera de imprimir titulo una vez
// Mueve reporte a otro cuestionario
foreach($resum['trast'] as $tid=>$var) {
if (isset($resum['trast'][$tid]['bloque'])) { //si hay cambio de cuestionatrio
$i=$resum['trast'][$tid]['bloque'];
if(!isset($RESUM[$i]['graf'])) { // si no se ha creado el nuevo cuestionrio=> lo crea
if (!$band_t) {
isset ($RESUM[$qu]['trast'][$tid]['titulo']) ? $RESUM[$i]['titulo']=$resum['trast'][$tid]['titulo'] : $RESUM[$i]['titulo']= $resum['titulo'];
$band_t=true;
isset ($RESUM[$qu]['trast'][$tid]['bare_tit']) ? $RESUM[$i]['bare_tit']=$resum['trast'][$tid]['bare_tit'] : $RESUM[$i]['bare_tit']= $resum['bare_tit'];
}
isset ($RESUM[$qu]['trast'][$tid]['graf']) ? $RESUM[$i]['graf']=$resum['trast'][$tid]['graf'] : $RESUM[$i]['graf']= $resum['graf'];
isset ($RESUM[$qu]['trast'][$tid]['stitulo']) ? $RESUM[$i]['stitulo']=$resum['trast'][$tid]['stitulo'] : (isset($resum['stitulo']) ? $resum['stitulo'] : $RESUM[$i]['stitulo'] = null);
$RESUM[$i]['escala']= isset ($RESUM[$qu]['trast'][$tid]['escala'])? $resum['trast'][$tid]['escala'] : (isset($resum['escala']) ? $resum['escala'] : NULL) ;
isset ($RESUM[$qu]['trast'][$tid]['color']) ? $RESUM[$i]['color']=$resum['trast'][$tid]['color'] : $RESUM[$i]['color']= $resum['color'];
}
$RESUM[$resum['trast'][$tid]['bloque']]['trast'][$tid]=$var;
unset($RESUM[$qu]['trast'][$tid]);
if (count($RESUM[$qu]['trast'])==0) unset($RESUM[$qu]);
}
}
}
//unset($RESUM[0]);
ksort($RESUM);
// Define configuración de las graficas
include ('settings_graficas.inc');
//// RES_SQUIZ= [ITEM][Trast][var=quiz,score,max,min,rid]
///// --- Genera $data[Quiz][graf][data,settings,conf]
$RESUM=json_decode(json_encode($RESUM),true);
foreach($RESUM as $quiz=>$val) {
if (!isset($val['graf'])) break;
// extrae los archivos de settings para la grafica
if(!isset($settings[$quiz][$val['graf']]['settings'])){
if(isset($settings[$val['graf']])) {
$sett=$settings[$val['graf']];
$sett=array_merge_recursive($sett,$settings['all']);
}
else $sett=$settings['all'];
if(isset($settings[$quiz])) {
$sett=array_merge_recursive($sett,$settings[$quiz]);
if(isset($settings[$quiz]['shape'])) $sett['shape']=$settings[$quiz]['shape'];
}
$data[$quiz][$val['graf']]['settings']=$sett;
}
//$data[$quiz][$val['graf']]['escala']=$val['escala']; //<<<<<<<<<
// ARRAY DE COLORES DE FONDO EN COLOR[][2]
$data[$quiz][$val['graf']]['color']=$val['color']; // PARA PRUEBA ...BORRAR !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
$sel_color=$data[$quiz][$val['graf']]['color'];
// Extrae banderas de Interpretacion y/o Descripcion (Para titulo en tabla si hay una bandera, o titulo antes de descripcion/interpretacion si estan ambas)
$b_interp=$b_desc=0;
if($val!=null) {
foreach($val['trast'] as $v)
if(isset($v['interp'])) $b_interp=1;
else $b_desc=1;
if ($b_interp and $b_desc) {$RESUM[$quiz]['stitulo']=""; $cell_interp="<b>Interpretación: </b>"; $cell_desc="<b>Descripción: </b>"; }
if ($b_interp and !$b_desc) {$RESUM[$quiz]['stitulo']="Interpretación"; $cell_interp=""; $cell_desc=""; }
if ($b_desc and !$b_interp) {$RESUM[$quiz]['stitulo']="Descripción"; $cell_interp=""; $cell_desc=""; }
}
// Extrae datos para grafica
foreach($val['trast'] as $tid=>$val2){
#Escaliza valores superiores a maximo
if(isset($RESUM[$qu]['trast'][$tid]['score']) and $RESUM[$qu]['trast'][$tid]['score']!=0)
$rel=$RESUM[$qu]['trast'][$tid]['maxscore']/$RESUM[$qu]['trast'][$tid]['score'];
if( /*isset($resl) and*/ $rel<1){ // requiere escalizar por valo superior a maxscore
#$RESUM[$qu]['trast'][$tid]['max']=$RESUM[$qu]['trast'][$tid]['max']*$rel;
#$RESUM[$qu]['trast'][$tid]['min']=$RESUM[$qu]['trast'][$tid]['min']*$rel;
$RESUM[$qu]['trast'][$tid]['maxscore']=max($RESUM[$qu]['trast'][$tid]['maxscore'],$RESUM[$qu]['trast'][$tid]['score']);
}
// Obtiene el valor de cada variable para graficar; si no tiene conversion escaliaza el PDirect.
$RESUM[$quiz]['trast'][$tid]['maxscore']= $val2['maxscore']=max($val2['maxscore'],$val2['score']);
$valor= isset($val2['convert']) ? $val2['convert'] : (isset ($val2['score']) ? $val2['score']/$val2['maxscore']*100 : null ) ;
// Obtiene max vr del eje y para escalizar valores del fondo y color del punto en gráfica +++&&
$val2['max_eje_vert']=isset($val2['conversion'])? max($val2['conversion']) : $val2['maxscore']; // +++&&*
if(!isset($val2['conversion'])) $data[$quiz][$val['graf']]['settings']['axis_max_v']=100;
else $data[$quiz][$val['graf']]['settings']['axis_max_v']=max($data[$quiz][$val['graf']]['settings']['axis_max_v'],$val2['max_eje_vert']);
// MSG DE VARIABLES EN ERrOR DE cALCULO
if(isset($val2['conversion']) and !isset($val2['convert'])) {
drupal_set_message("Error en calculo de variable. Consulte el manual para calcularlo.".$val['trast'][$tid]['name'],"warning");
$val2['name']= " ERROR EN CONVERSION (".$val['trast'][$tid]['name'].") ";
} else $error="";
//if(isset($val['trast'][$tid])) // No existen los TERm adicionados
// $val['trast'][$tid]=$val['trast'][$tid];
// Default max/min score/maxscore (Para percentil default = 70
//if($val['escala']=="P" and isset($val2['conversion'])) $val['trast'][$tid]['max']=$val['trast'][$tid]['min']=70;
// else {
if (!isset($val['trast'][$tid]['max'])) $val['trast'][$tid]['max'] = 100;
if (!isset($val['trast'][$tid]['min'])) $val['trast'][$tid]['min'] =0;
//if (!isset($val2['score'])) $val2['maxscore']=$val2['score']=0;
// }
$data[$quiz][$val['graf']]['data'][]= array(
// 'stitulo' => isset($val2['stitulo']) ? $val2['titulo'] : null, // Titulo por cada variable
"sname" => isset($val2['sname']) ? $val2['sname'] : $val2['name'],
"titulo" => $val2['name'],
"tid" => $tid,
"val" => $valor, // VALOR A GRAFICAR (CONVERTIDO)Si existe conversion la selecciona
"label" => (int) $valor,
"score" => $val2['score'], // PUNTUAC DIRECTA (NO CONVERTIDO)
"convert" => isset($val2['convert']) ? $val2['convert'] : null,
"link" => isset($val2['link']) ? $val2['link'] : "",
"max" => $val['trast'][$tid]['max'],///$val2['maxscore']*100, // MAX A GRAFICAR (CONVERTIDO)
"min" => $val['trast'][$tid]['min'],///$val2['maxscore']*100, // MIN A GRAFICAR (CONVERTIDO)
"rango" => $val['trast'][$tid]['range'],
"maxscore" => isset($val2['maxscore']) ? max($val2['score'],$val2['maxscore']): null, // MAXIMO VALOR CONVERTIDO en caso de rangos rn percentiles/T)
'fill' => '#ffffff',
'fill-opacity' => 0.7,
"mark" => (($valor>=$val['trast'][$tid]['max'] or $valor<=$val['trast'][$tid]['min']) ? $col[$sel_color[0]][0] : $col[$sel_color[0]][1]),
// COLORES EN PUNTOS de la GRAFICA y *
"colour" => ($valor>$val['trast'][$tid]['max']*100/$val2['max_eje_vert'] ? $col[$sel_color[2]][2] : ($valor<$val['trast'][$tid]['min']*100/$val2['max_eje_vert'] ? $col[$sel_color[0]][2] : $col[$sel_color[1]][2])), // ++++&&
"interp" => isset($val2['interp']) ? $cell_interp.$val2['interp'] : (isset($val2['desc']) ? $cell_desc.$val2['desc'] : null),
);
if (!isset($old_quiz) or $old_quiz!=$quiz) {
$i=0;
$old_quiz=$quiz;
}
// Pasa datos de Max min para dibujar fondo
if($val['graf']=='MultiRadarGraph'){
$data[$quiz][$val['graf']]['settings']['shape'][0]['points'][]= "u".$i; //MAX BAJO (limite )
$data[$quiz][$val['graf']]['settings']['shape'][0]['points'][]="g".$val['trast'][$tid]['max']/$val2['max_eje_vert']*100; //+++&&
$data[$quiz][$val['graf']]['settings']['shape'][1]['points'][]= "u".$i; // MINIMO ALTO (ROJO
$data[$quiz][$val['graf']]['settings']['shape'][1]['points'][]="g".$val['trast'][$tid]['min']/$val2['max_eje_vert']*100; //+++&&
//array_unshift($data[$quiz][$val['graf']]['settings']['shape'][0]['points'],"g".$val2['min']); // para area cerrada
//array_unshift($data[$quiz][$val['graf']]['settings']['shape'][0]['points'],"u".$i); // para area cerrada
}
$i++;
// Extrae estructura para settings SVGGRAP
if (!isset($data[$quiz][$val['graf']]['settings']['structure'])) {
$data[$quiz][$val['graf']]['settings']['structure']=array(
// 'stitulo' => "stitulo",
'key' => "sname",
'value' => "val",
'label' => "label",
'link' => "link",
'score' => "score",
'rango' => "rango",
'max' => "max",
'min' => "min",
'maxscore' => 'maxscore',
'fill-opacity' => 'fill-opacity',
'fill' => 'fill',
'convert' => 'convert',
'colour' => 'colour',
'marker_stroke_colour'=> 'mark',
'data_label_back_colour_outside' => 'mark',
'description' => 'interp',
);
// Titulo del Quiz
// $data[$quiz][$val['graf']]['settings']['graph_title']= "wwwww".$val['titulo'];
// Imprime encabezado descripcion/interpretacion
$data[$quiz][$val['graf']]['settings']['desc_title']= $RESUM[$quiz]['stitulo'];
}
}
}
// CIERRA/define La grafica de max-min
dibuja_fondo($data,$col);
// Busca ancho maximo de graficas
$width=0; // ancho minimo
foreach ($data as $quiz=>$dat)
foreach ($dat as $graf => $val)
$width= max($width, $val['width']);
$tablas="";
$style='<style>
.resultado, .trazab {
flex-direction: column;
display: flex;
align-items: center;
}
.linea div {
padding: 1px 2px;
flex: 4 4 191px;
background: none;
line-height: 1.1em;
border: 1px solid lightgrey;
border-width: 0;
/* flex-basis: 100%; */
font-size: 7pt;
text-align: left;
}
.name.varname {
flex: 2 2 64px;
}
.name {
font-weight:bold;
}
th {
padding : 3px 7px;
}
.linea.tit_desc {
font-style: oblique;
text-align: center;
font-weight: bold;
font-variant-caps: all-small-caps;
line-height: 1em;
border: 0;
color: #bbbbbb;
background: #FFF ;
}
div.label, div.score-c, div.convert {
flex: 0 0 34px;
text-align: center;
min-width: 34px;
}
div.linea {
display: flex;
font-size: 8pt;
border-width: 1px 0px;
margin: 1px;
min-width: 350px;
}
.bar_nota.linea {
border-bottom: 1px solid grey;
background: #eeeeee;
}
.grafic {
float: left;
min-width: 240px;
text-align: center;
margin-right:5px;
}
.impar{
background: #f0f0f0;
}
trazab, .tit_variab {
/* background: #444; */
border-top: 1px solid black;
clear: both;
font-weight: bold;
padding: 2px 3px 2px;
border-bottom: 1px solid black;
}
/** trazabilidad **/
table#trace, .stest {
line-height: 1.1;
margin: 0 0 10 0;
max-width:7.5in;
}
table#trace td, table#trace th {
font-size: 6pt;
padding: 2px;
}
.titulo.linea {
font-style: italic;
font-family: fantasy;
background: #ddd;
line-height: 1.7em;
}
.linea.tit_desc div {
text-align: center;
}
td {
padding: 2px;
font-size: 7pt;
}
.nota {
margin: 5px 0
border-bottom: 1px;
lightgrey solid;
}
.bloque {
margin: 3px;
}
.grafic.graf_1 {
margin-top: 1px;
}
svg {
height: auto !important;
width: auto;
margin-right: 10px;
}
.graf.CylinderGraph svg {
max-height: 180px;
}
.bloq {
display: flex;
flex-direction: column;
}
div.score {
flex: 1 1 19px !important;
display:flex;
/* width: 22px; */
justify-content: center;
}
.interp {
flex: 2 2 300px;
}
/********************* /
svg {
height: fit-content !important;
}
</style>';
$tabla_2col ='';/*/'<style>
.interp {
overflow: hidden;
}
.stest {
-webkit-column-count: 2;
-moz-column-count: 2;
column-count: 2;
margin : 3px;
height:600px;
}
.linea.tit_desc {
background: gainsboro;
}
.grafic.graf_1 {
text-align: center;
width: 100%;
}
</style> ';
**/
// $out="";
//if(arg(2)==5007)
$out= $tabla_2col; /// TEST EN DOS COLUMNAS CON RID 5007
if (empty($RESUM)) $salida.=" NO SE ENCONTRÓ RESULTADO.";
include_once(libraries_get_path("SVGGraph").'/SVGGraph.php');
//require_once(libraries_get_path("SGCGraph").'/SVGGraph.php');
libraries_load("SVGGraph");
// ENVIA datos a SVGRAP
$i=0;
//$header= array (array("data"=>"",'class'=>'grafic'),array("data"=>"Trastorno",'class'=>'name'),array("data"=>"%",'class'=>'val'),array("data"=>"Interpretación",'class'=>'interp'));
if (isset($data)) {
foreach ($data as $quiz=>$dat) {
//$rows=array();
$num=1;
foreach ($dat as $graf_tipo => $val) {
if (!isset($conf[$graf_tipo])) $conf[$graf_tipo]=array();
// TITULO DEL CUESTIONARIo
if (!empty($val['trast']))
if (isset(reset($val['trast'])['titulo'])) $RESUM[$quiz]['titulo']=reset($val['trast'])['titulo'];
if(isset ($RESUM[$quiz]['titulo'])) {
// $rows[$i] = array( array('data'=>'<h3>'.$titt.'</h3>', 'colspan' => 4, 'class'=>'tit_variab')); //array_keys($val['data'][0]);
// ADICION DE "MODO REVISION" Al titulo
if (isset($_SESSION['debug_stest'])) $RESUM[$quiz]['titulo'].=' [MODO REVISION]';
$out.= '<div class="tit_variab">'.$RESUM[$quiz]['titulo'].'</div>';
}
$i++;
$out .= '<div class="bloque qu'.$quiz.'">';
// ELIMINA VARIABLES DE GRAFICA CON ESCONDER_GR $RESUM[$quiz]['trast'][$v['tid']]['esconder_gr'] ;
foreach ($val['data'] as $i=>$dat) {
$del=0;
if(isset($RESUM[$quiz]['trast'][$val['data'][$i]['tid']]['esconder_gr']))
if ($RESUM[$quiz]['trast'][$val['data'][$i]['tid']]['esconder_gr']==1) $del=1;
if(!$del) $dat_graf[]=$dat; // crea arreglo con datos a graficar
}
// **** Genera HTML de Grafica
if (arg(3)!="txt") { // SI arg(3) es NONE NO IMPRIME ninguna GRAFICA (para PDF).
unset($val['settings']['graph_title']);
// SIN GRAFICA
if ($graf_tipo!="S" and isset($dat_graf)) {
//$rows[$i]= array( 0=>array('data'=> grafica( $val['data'], $val['settings'] ,$graf_tipo, max('130',$val['width'])), 'rowspan' =>count($val['data']), 'class'=>'grafic'));
$out.= '<div class="grafic graf_'.$num.'">'.grafica($dat_graf, $val['settings'] ,$graf_tipo, $val['width']).'</div>';
unset($dat_graf);
}
}
// ***** GENERA HTML DE TABLA
////////////////////////////////
$out .= '<div class="bloque2">';
$l_row="";
//$variables=array("name","label","interp");
// $variables=array("name","score","interp"); // <<<<<< Columnasa Imprimir
$par="par"; // Linea par/impar para fondo gris
$nota_var=""; // Recopila notas de variables desde tabla de conversion
// Imprime el titulo de descripcion/Interpretación
//if(!$val['escala']) $direct="Ptos"; else $direct="%"; // Escalaa en el titulo
// ENCABEZADO DE TABLA
//if(isset($RESUM[$quiz]['escala'])) $txt='PD('.$RESUM[$quiz]['escala'].")"; else
# $txt =isset($RESUM[$quiz]['escala']) ? $RESUM[$quiz]['escala'] : "PD";
$txt ="PD";
if (isset(reset($RESUM[$quiz]['trast'])['range_pd'])) $r= '<div class="score-rng">(Rango)</div>';
else $r="";
if (!isset($RESUM[$quiz]['escala'])) $RESUM[$quiz]['escala']="";
$out.=' <div class="linea tit_desc">
<div class="name varname name-tit">Variable</div>
<div class="score">'.$txt.$r.'</div>
<div class="score-c">'.$RESUM[$quiz]['escala'].'<div class="score">(Rango)</div></div>
<div class="interp">'. $val['settings']['desc_title'].'</div>
</div>';
$div="";
// IMPRIME TABLA DE RESULTADOS
foreach ($val['data'] as $r=>$v) { //{ //**//**dsm($v); if(in_array($r,$variables)) $rows[]=$v;}
// Imprime linea de la tabla (Si tiene score)
if(isset($RESUM[$quiz]['trast'][$v[ 'tid']]['score'])) {
// Imprime SUB-TITULO de Variable/Prueba (Si Existe)
if(isset($RESUM[$quiz]['trast'][$v['tid']]['stitulo'])) {
$out.= $div.'<div class="bloq"><div class="titulo linea">'.$RESUM[$quiz]['trast'][$v['tid']]['stitulo'].'</div>';
$div="</div>";
$par="par";
}
$out.='<div class="linea '.$par.'">';
if($par=="impar") $par="par"; else $par="impar";
// name (Nombre de variable)-------->>>>>>>>
$str="";
if (isset($RESUM[$quiz]['trast'][$v['tid']]['variable']))
if($RESUM[$quiz]['trast'][$v['tid']]['variable'][0]=="+")
$str='<span class="add-name">'.substr($RESUM[$quiz]['trast'][$v['tid']]['variable'], 1).'</span>';
//if (isset($str=$RESUM[$quiz]['titulo'])) $str=$RESUM[$quiz]['titulo'];
//if (isset($RESUM[$quiz]['trast'][$v['tid']]['variable']) $str=$RESUM[$quiz]['trast'][$v['tid']]['variable']: $str=$RESUM[$quiz]['titulo'];
$out.= '<div class="name varname">'.$v['titulo'].$str.'</div>';
# if($v['titulo']!="") $name_tit=1;
// IMPRIME SCORE-------->>>>>>>>>
$escal=isset($RESUM[$quiz]['trast'][$v['tid']]['escala']) ? $RESUM[$quiz]['trast'][$v['tid']]['escala']: (isset($RESUM[$quiz]['escala']) ? $RESUM[$quiz]['escala'] :null);
$score_conv=$percent='';
if ($escal=="%") {
$percent="%";
$escal="";
}
if (isset($v['convert'])) // convert= valor convertido
$score_conv=$escal.round($v['convert'],0).$percent; // $pd="<br>(".$escal.round($v['convert'],0).$p.")";
// RANGO EN SCORE y ASTERISK------->>>>>>>>>>>>>>>>>>>>
$asterisk=$range="";
if ($RESUM[$quiz]['color'][2]=="R") $RESUM[$quiz]['RangoSgn']=$signo="<";
else $RESUM[$quiz]['RangoSgn']=$signo=">=";
if (isset($RESUM[$quiz]['trast'][$v['tid']]['ast'])) $asterisk='<span style="color:red">*</span>';
#dsm(array($v['score'] ,$v['tid']['range']));
/*
if (isset($RESUM[$quiz]['trast'][$v['tid']]['convert'])){
if($RESUM[$quiz]['color'][0]=="R" and !$percent) { // Normal si menor que
$range="(<=".$escal. $v['max'].")";
if ($v['convert']>$RESUM[$quiz]['trast'][$v['tid']]['max']) $asterisk='<span style="color:red">*</span>';
}
if($RESUM[$quiz]['color'][2]=="R" and !$percent) { // Normal si mayor que
$range="(>".$escal.$v['min'].")";
if ($v['convert']<$RESUM[$quiz]['trast'][$v['tid']]['min']) $asterisk='<span style="color:red">*</span>';
}
} */
//>>>>>>>>>>>>>>
/* echo ($v['tid'].": RANG-PD=".$RESUM[$quiz]['trast'][$v['tid']]['range_pd']." |
SIGN=".$signo." |
aster=".$asterisk." |
score_pd=".$v['score']. " |
MAXSC_pd=".$v['maxscore']. " |
score_conv=".$score_conv." |
RANG_conv=".$RESUM[$quiz]['trast'][$v['tid']]['range']
."<br>");
*/
//<<<<<<<<<<<<
// IMPRIME RESULTADOS >>>>>>>>>>>>>>>>>>>>
// GeNRA HTML DE SCORE ...EN DEBUG MUESTRA PUNTUACION DIRECTA
# if (isset($RESUM[$quiz]['trast'][$v['tid']]['range_pd'])) $range="(".$signo.$RESUM[$quiz]['trast'][$v['tid']]['range_pd'].")";
# if (!isset($_SESSION['debug_stest'])) {
//IMPRIME PD
# if ( $escal="PD") { // ESCALA PD
$range= isset($RESUM[$quiz]['trast'][$v['tid']]['range_pd']) ? '<div class="score-rng" >('.$signo.$RESUM[$quiz]['trast'][$v['tid']]['range_pd'].")</div>" : "";
$out.= '<div class="score"><div class="score-val">'.$asterisk.$v['score'].'</div>'.$range.'</div>';
# }
//IMPRIME CONVERSION (P,%,T, etc)
if ( $escal!="PD") { // ESCALA
$range="(".$signo.$RESUM[$quiz]['trast'][$v['tid']]['range'].")";
$out.= '<div class="score-c">'.$asterisk.$score_conv.'<div>'.$range.'</div></div>';
//$maxsc="";
/* //if(isset($v['maxscore']) and !isset($RESUM[$quiz]['trast'][$v['tid']]['compuesta']) and !isset($v['convert']))
if(isset($v['maxscore']) )
$maxsc=' de '.$v['maxscore'];
$out.= '<div class="score">'.$asteri sk.$maxsc.$v['score'].'<br>'.$range.'</div>';
$out.= '<div class="score">'.$asterisk.$score_conv.'</div>';
*/
}
# if ($escal!=null and $escal!="T") // OTRAS ESCALAS
# $out.= '<div class="score">'.$asterisk.$maxsc.$pd.'<br>'.$range.'</div>';
/* }
else {
$pd=$RESUM[$quiz]['trast'][$v['tid']]['score'];
# $out.= '<div class="score">'.$asterisk.$v['score'].$maxsc."<br>".$pd.'<br>'.$range.'</div>';
/* }
*/
// INTERPPRETAC / DESC
//$pd="";//
$out.= '<div class="interp">'.$v['interp'].'</div>';
// Notas (Recopila notas)
if (isset($RESUM[$quiz]['trast'][$v['tid']]['nota'])) $nota_var.=$RESUM[$quiz]['trast'][$v['tid']]['nota'];
$out.='</div>';
$i++;
}
}
$num++;
// Corrige espacio de titulos de tabla en caso de tener referencia a grafica (TEST SPAC)
# if(isset($name_tit)) $out.="<style> div.name.name_tit { min-width: 115px !important; margin-left: 20px; } </style>";
$out.=$div.'</div></div>';
}
//$tablas.=theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('class' => array('resultados'))));
//$header=array(); // deja header solo en primera tabla
}
// NOTA DE BAREMOS Y CONDICIONES SELECCIONADAS
foreach($RESUM as $test) {
if(isset($test['bare_tit']))
$bn[]=$test['bare_tit'];
foreach($test['trast'] as $tid=>$var) {
if(isset($var['condicion'])) { $c[]=$var['sname']."/".$var['cond_name'];
// if (isset($c)) $cond= " <b> Datos evaluado aplicados: </b>". implode ("; ",$c).")"
}
}
}
$salida= '<div class="resultado"><h2>'.$info['tit']."</h2><div class=\"stest\">$out</div></div>".$style;
// TRAZABILIDAD
// Genera html de tabla de INFO/TRAZABILIDAD del quiz (Auth, user, num,etc)
$conv_i="";
if(isset($c)) $conv_i=" [".implode("; ",$c)."]";
if($info) {
$tabla_info= array(
// 'header' => array('TRAZABILIDAD','Num','Orden','Doc','Nombre','Evaluador','Fecha','Vers./Baremos'),
// 'rows' => array ( array($info['org'],$info['num'],$info['#ord'],$info['doc'],$info['#name']." ".$info['last'],$info['auth'],date("Y-m-d h:i:sa", $info['date']),'V.'.$info['qid'].'.'.$info['qvid'].' | '.implode(" | ",$bn).$conv_i)),
'header' => array('TRAZABILIDAD','Num','Doc','Nombre','Evaluador','Fecha (Dur.)','Vers./Baremos'),
'rows' => array ( array($info['org'],$info['num'],$info['doc'],$info['#name']." ".$info['#last'],$info['af_name'],date("Y-m-d h:i", $info['date']).' ('.(intval(($info['tend']-$info['date'])/60)).'\')','V.'.$info['qid'].'.'.$info['qvid'].' | '.implode(" | ",$bn).$conv_i)),
'attributes' => array('ID' => 'trace')
);
$salida.= '<div class="trazab">'.$tablas.theme('table',$tabla_info).'</div>'; //'<div style="float:right;">'.$botones.'</div>'.
if (isset($info['nota'])) $salida.= '<div class="nota"><div class="field-label"><b>Nota:</b></div> '.$info['nota'].'<div class="nota1">'.$nota_var.'</div></div>';
}
}
return $salida;
/* // $salida.='</div>';
if ($acccion=='clean' or $acccion=='code' or $acccion=='score' ) {
echo $salida ;
exit;
}
else return ;
*/
// echo drupal_json_encode($salida);
}
//////////////////////////////////////////
/*
*
* area_fondo
*
*/
function dibuja_fondo (&$data, $col){ // $d[Quiz][graf]=$DATA=[data,settings,conf]
// dsm($data);
// dsm($col);
foreach ($data as $quiz => $gr)
foreach($gr as $graf=>$var){
$data[$quiz][$graf]['width']=ANCHO;
// PARA MultiRadarGraph
if($graf=='MultiRadarGraph'){
$sel_color=$data[$quiz][$graf]['color'];
$data[$quiz][$graf]['settings']['grid_back_colour']=array($col[$sel_color[2]][0],$col[$sel_color[2]][1]); // COLOR MAX (Fondo)
$data[$quiz][$graf]['settings']['shape'][0]['fill'] = array($col[$sel_color[1]][0],$col[$sel_color[0]][1]); // COLOR MIN
$data[$quiz][$graf]['settings']['shape'][0]['fill-opacity'] = 0.5;
$data[$quiz][$graf]['settings']['shape'][1]['fill'] = $col[$sel_color[0]][1]; // COLOR Intermed
$data[$quiz][$graf]['settings']['shape'][1]['fill-opacity'] = 0.5;
}
else {
// PARA 'Bar3DGraph','CylinderGraph','Bar3DGraph'
$data[$quiz][$graf]['settings']['axis_text_angle_h'] =-30;
$ancho_col=max(25/ count($data[$quiz][$graf]),60);
$data[$quiz][$graf]['settings']['bar_width']=40/count($data[$quiz][$graf]);
$data[$quiz][$graf]['settings']['data_label_position'] = "above";
if(count($data[$quiz][$graf])>5) {
$data[$quiz][$graf]['settings']['axis_text_font_size']=7;
$data[$quiz][$graf]['settings']['axis_text_angle_h']=-15;
}
// DIBUJA FONDO DE LIMITES PARA 'Bar3DGraph','CylinderGraph','Bar3DGraph'
if(in_array($graf,array('Bar3DGraph','CylinderGraph','Bar3DGraph'))) { // Offset del fondo para graficas 3D
$num_var =0.85; //0,1,2..
$offs=24; //-$data[$quiz][$graf]['width']/2*0.30;
}
else {
$num_var =0; //0,1,2..
$offs=0;
}
$data[$quiz][$graf]['settings']['fill-opacity']=array(0.4,0.4,0.4);
$data[$quiz][$graf]['settings']['opacity']=array(0.4,0.4,0.4);
//// $data[$quiz][$graf]['settings']['opacity']=
Foreach($data[$quiz][$graf]['data'] as $nomb=>$val) {
$data[$quiz][$graf]['settings']['shape'][]=
array(
'rect',
'x' => 'g'.$num_var,
'y' => 'g'.($val['min']+$offs),
'width' => 'u1',
'height' => 'u'.$val['min'],
'stroke-width' => 0,
'fill' => $col[$data[$quiz][$graf]['color'][0]][0],
'opacity' => 0.6,
);
$data[$quiz][$graf]['settings']['shape'][]=
array(
'rect',
'x' => 'g'.$num_var,
'y' => 'g'.($val['max']+$offs),
'width' => 'u1',
'height' => 'u'.($val['max']-$val['min']),
'stroke-width' => 0,
'fill' => $col[$data[$quiz][$graf]['color'][1]][0],
'opacity' => 0.6
)
;
$data[$quiz][$graf]['settings']['shape'][]=
array(
'rect',
'x' => 'g'.$num_var,
'y' => 'g'.(100+$offs),
'width' => 'u1',
'height' => 'u'.(100-$val['max']),
'stroke-width' => 0,
'fill' => $col[$data[$quiz][$graf]['color'][2]][0],
'opacity' => 0.6,
)
;
$num_var++;
}
$data[$quiz][$graf]['width']= max(count($var['data'])*60,90);
}
}
}
define("ANCHO", 240);
//define("ALTO", 120);
////////////////////////////////
/*
*
*/
// LLAMA SVGGRAPH
function grafica($data_graf, $settings, $grafica_tipo='CylinderGraph ', $width) {
// RETORNA SO REPORTE ES DE TEXTO
if ( $grafica_tipo=="txt") return;
if(isset($_GET['reporte']) and $_GET['reporte']=='T') return;
foreach($data_graf as $n=>$r)
foreach( $r as $k =>$val) {
// Limita maximo en grafica
if ($k=="val")
$data_graf[$n][$k]=min(
$data_graf[$n]['val'],
110);
//Filtra variables necesarias
if ( !in_array($k,array("sname","val","colour")))
unset($data_graf[$n][$k]);
}
$alto=max(120,ANCHO*0.6);
switch ($grafica_tipo) {
case 'MultiRadarGraph':
if (count($data_graf)>4) $alto = $width*0.8;//0.95;
break;
case 'HorizontalBarGraph':
/* $col['R']=array('#FFf0f0', '#FDD', '#d00202');
$col['A']=array('#FFFFCC', '#FFD', 'yellow');
$col['V']=array('#DFD', '#dFd', '#44ae44'); */
// Intercambia eje vertic x horizont
$settings['axis_max_h']=$settings['axis_max_v'];
unset ($settings['axis_max_v']);
$width=160;
$alto= max(60,count($data_graf)*40);
foreach ($settings['shape'] as $i=>$val) {
$x=$settings['shape'][$i]['x'];
if(is_numeric($x)){
$settings['shape'][$i]['x']=$settings['shape'][0]['y']+5;
$settings['shape'][$i]['y']=$x+15;
}
$settings['bar_width']=5;
// $settings['shape'][0]['stroke-width']=2;
$x=$settings['shape'][$i]['width'];
$settings['shape'][$i]['width']=$settings['shape'][0]['height'];
$settings['shape'][$i]['height']=$x;
$settings['bar_space']="4";
}
break;
default:
$width = max(80,count($data_graf)*60);
}
// AJUSTA ALTO DE GRAFICA Proporcional al numero de varioables
ob_start();
$graph = new SVGGraph($width,$alto, $settings);
//$graph->colours = $colours;
//$graph->colours = array('#003366','#80bfff');
$graph->Values($data_graf);
//$graph->Links($links);
$graph->Render($grafica_tipo,null,false);
$grafica = ob_get_contents();
ob_end_clean();
global $base_url;
// GUARDA EN FILE TEMPORAL **** NO FUNCIONA PARA PDF
/* //dsm("eee");
//dsm($base_url."/".variable_get('file_public_path').'/elyte.png');
$file = file_unmanaged_save_data( $grafica,'public://elyte.svg');
var_dump($file);
$grafica ='<img src="'.file_create_url($file).'">';
*/
return '<div class="graf '.$grafica_tipo.'";>'.$grafica.'</div>';
}
/*
*
*
*
*/
function elyte_score_graph_init() {
drupal_add_library('elyte_score_graph', 'SVGGraph');
}
//////////////////////////////////