TEST

 

 

<?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']).'&nbsp;('.(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');
}


//////////////////////////////////
 

Categoría: