00001 <?php 00002 00003 class Cuestionario{ 00004 00005 protected $cue_id; 00006 protected $cue_nombre; 00007 protected $cue_inv_id; 00008 protected $cue_tipo; 00009 protected $cue_instrucciones; 00010 00011 protected $cue_origen_id = 0; 00012 00013 protected $cue_gra_tipo; 00014 protected $cue_gra_estadistico; 00015 protected $cue_gra_analisis; 00016 00017 protected $cue_gra_rangos; 00018 00019 private $cue_dimensiones; 00020 private $cue_preguntas; 00021 00022 const TIPO_AUTO_EVALUACION = 0; 00023 const TIPO_OTROS_EVALUACION = 1; 00024 const TIPO_DEMOGRAFICO = 2; 00025 00026 const PREGUNTA_TIPO_UNIDIMENSIONAL = 0; 00027 const PREGUNTA_TIPO_BIDIMENSIONAL = 1; 00028 const PREGUNTA_TIPO_MULTIDIMENSIONAL = 2; 00029 const PREGUNTA_TIPO_PARES = 3; 00030 00031 const PREGUNTA_DEMOGRAFICO_TIPO_CARACTER = 0; 00032 const PREGUNTA_DEMOGRAFICO_TIPO_NUMERICO = 1; 00033 const PREGUNTA_DEMOGRAFICO_TIPO_FECHA = 2; 00034 const PREGUNTA_DEMOGRAFICO_TIPO_SELECCION_SIMPLE = 3; 00035 const PREGUNTA_DEMOGRAFICO_TIPO_SELECCION_MULTIPLE = 4; 00036 const PREGUNTA_DEMOGRAFICO_TIPO_LISTA_DESPLEGABLE = 5; 00037 00038 const GRAFICO_ESTADISTICO_SUMATORIA = 0; 00039 const GRAFICO_ESTADISTICO_PROMEDIO = 1; 00040 const GRAFICO_ESTADISTICO_PROMEDIO_PONDERADO = 2; 00041 00042 const GRAFICO_ANALISIS_DIMENSIONES = 1; 00043 const GRAFICO_ANALISIS_SUBDIMENSIONES = 2; 00044 const GRAFICO_ANALISIS_PREGUNTAS_DIMENSIONES = 4; 00045 const GRAFICO_ANALISIS_PREGUNTAS_SUBDIMENSIONES = 8; 00046 const GRAFICO_ANALISIS_DIM_PROMEDIO_GRUPAL = 16; 00047 const GRAFICO_ANALISIS_SUBDIM_PROMEDIO_GRUPAL = 32; 00048 00049 public function __construct( ){ } 00050 00056 private function limpiar( ){ 00057 foreach( get_object_vars($this) as $name => $value ) 00058 switch( $name ){ 00059 case 'cue_origen_id': $this->{$name} = 0; break; 00060 default: $this->{$name} = NULL; break; 00061 } 00062 } 00063 00075 public function getCuestionario( $data ){ 00076 00077 $this->limpiar( ); 00078 00079 $db = Database::getInstance( ); 00080 00081 $query = 00082 'SELECT ' 00083 .'cue_id, cue_nombre, cue_inv_id, cue_tipo, cue_instrucciones, cue_origen_id, cue_gra_rangos, ' 00084 .'cue_gra_tipo, cue_gra_estadistico, cue_gra_analisis ' 00085 .'FROM cuestionarios WHERE '.$data['where']; 00086 00087 $consulta = $db->prepare( $query ); 00088 $consulta->execute( $data['data'] ); 00089 00090 $resultado = $consulta->fetch( PDO::FETCH_ASSOC ); 00091 unset( $consulta ); 00092 00093 if( !$resultado ) return false; 00094 00095 foreach( $resultado as $name => $value ) $this->{$name} = $value; 00096 00097 return true; 00098 } 00099 00112 public function getCuestionarioPorId( $id ){ 00113 00114 return $this->getCuestionario( array( 00115 'where'=>'cue_id = :id', 00116 'data'=>array( ':id' => $id ) 00117 )); 00118 00119 } 00120 00135 public function eliminar( ){ 00136 00137 if( !$this->getId( ) ) return 0; 00138 00139 $db = Database::getInstance(); 00140 $db->exec( 'DELETE FROM preguntas WHERE pre_cue_id = '.$this->getId( ) ); 00141 $rt = $db->exec( 'DELETE FROM cuestionarios WHERE cue_id = '.$this->getId( ).' OR cue_origen_id = '.$this->getId( ) ); 00142 00143 $this->limpiar( ); 00144 return $rt ? $rt : 0; 00145 } 00146 00156 public function guardar( ){ 00157 $data = array( 00158 ':cue_nombre'=>$this->cue_nombre, 00159 ':cue_inv_id'=>$this->cue_inv_id, 00160 ':cue_tipo'=>$this->cue_tipo, 00161 ':cue_instrucciones'=>$this->cue_instrucciones, 00162 ':cue_origen_id'=>$this->cue_origen_id, 00163 ':cue_gra_tipo'=>$this->cue_gra_tipo, 00164 ':cue_gra_estadistico'=>$this->cue_gra_estadistico, 00165 ':cue_gra_analisis'=>$this->cue_gra_analisis, 00166 ':cue_gra_rangos'=> $this->cue_gra_rangos 00167 ); 00168 00169 if( !$this->getId( ) ) 00170 $query = 00171 'INSERT INTO cuestionarios ( ' 00172 .'cue_nombre, cue_inv_id, cue_tipo, cue_instrucciones, cue_origen_id, cue_gra_rangos, ' 00173 .'cue_gra_tipo, cue_gra_estadistico, cue_gra_analisis ' 00174 .')VALUES( ' 00175 .':cue_nombre, :cue_inv_id, :cue_tipo, :cue_instrucciones, :cue_origen_id, :cue_gra_rangos,' 00176 .':cue_gra_tipo, :cue_gra_estadistico, :cue_gra_analisis' 00177 .')'; 00178 else{ 00179 $data[':cue_id']=$this->cue_id; 00180 $query = 00181 'UPDATE cuestionarios SET ' 00182 .'cue_nombre=:cue_nombre, cue_inv_id=:cue_inv_id, cue_tipo=:cue_tipo, cue_instrucciones=:cue_instrucciones, ' 00183 .'cue_origen_id=:cue_origen_id, cue_gra_rangos=:cue_gra_rangos, ' 00184 .'cue_gra_tipo=:cue_gra_tipo, cue_gra_estadistico=:cue_gra_estadistico, cue_gra_analisis=:cue_gra_analisis ' 00185 .'WHERE cue_id = :cue_id'; 00186 } 00187 00188 $db = Database::getInstance( ); 00189 $consulta = $db->prepare( $query ); 00190 $consulta->execute( $data ); 00191 $consulta->closeCursor( ); unset( $consulta ); 00192 00193 if( !$this->getId( ) ){ 00194 $preg = $this->cue_preguntas; 00195 $dim = $this->cue_dimensiones; 00196 00197 $this->getCuestionarioPorId( Database::lastInsertId( 'cuestionarios_seq' ) ); 00198 00199 $this->guardarDimensiones( $dim ); 00200 $this->guardarPreguntas( $preg ); 00201 } 00202 00203 } 00204 00218 private function guardarDimensiones( $val ){ 00219 00220 if( $this->getCuestionarioOrigen( ) != 0 ) return ; 00221 00222 if( !is_array( $val ) || sizeof( $val ) == 0 ) 00223 return ; 00224 00225 $db = Database::getInstance( ); 00226 00227 $query = 00228 'INSERT INTO dimensiones ( dim_padre_id, dim_cue_id, dim_nombre, dim_rangos, dim_connotacion_negativa )' 00229 .'values( :dim_padre_id, :dim_cue_id, :dim_nombre, :dim_rangos, :dim_connotacion_negativa )'; 00230 00231 $consulta = $db->prepare( $query ); 00232 foreach( $val as $key => $dim ){ 00233 if( !is_object( $dim ) ) $dim = (object)$dim; 00234 00235 $consulta->execute( array( 00236 ':dim_padre_id' => 0, 00237 ':dim_cue_id'=> $this->getId( ), 00238 ':dim_nombre'=> $dim->Nombre, 00239 ':dim_connotacion_negativa'=> $dim->ConnotacionNegativa, 00240 ':dim_rangos'=> isset( $dim->Rangos ) && is_array( $dim->Rangos ) ? json_encode( $dim->Rangos ) : '' 00241 ) ); 00242 $padre_id = Database::lastInsertId( 'dimensiones_seq' ); 00243 $childs = array( ); 00244 00245 if( isset( $dim->Dimensiones ) ) 00246 $childs = $dim->Dimensiones; 00247 00248 if( is_array( $childs ) ) 00249 foreach( $childs as $key => $subdim ){ 00250 if( !is_object( $subdim ) ) $subdim = (object)$subdim; 00251 $consulta->execute( array( 00252 ':dim_padre_id' => $padre_id, 00253 ':dim_cue_id'=> $this->getId( ), 00254 ':dim_nombre'=> $subdim->Nombre, 00255 ':dim_connotacion_negativa'=> $subdim->ConnotacionNegativa, 00256 ':dim_rangos'=> is_array( $subdim->Rangos ) ? json_encode( $subdim->Rangos ) : '' 00257 ) ); 00258 } 00259 00260 } 00261 $consulta->closeCursor( ); unset( $consulta ); 00262 00263 } 00264 00265 public function editDimensiones( $val ){ 00266 00267 if( !$this->getId( ) || !is_array( $val ) ) return ; 00268 00269 $db = Database::getInstance( ); 00270 00271 $consulta = $db->prepare( 00272 'UPDATE dimensiones SET ' 00273 .'dim_nombre = :dim_nombre, dim_connotacion_negativa = :dim_connotacion, dim_rangos = :dim_rangos ' 00274 .'WHERE dim_id=:dim_id' 00275 ); 00276 foreach( $val as $key => $dim ){ 00277 if( !is_object( $dim ) )$dim = ( object ) $dim; 00278 $consulta->execute( array( 00279 ':dim_id'=> $dim->Id, 00280 ':dim_nombre'=> $dim->Nombre, 00281 ':dim_connotacion'=> $dim->ConnotacionNegativa, 00282 ':dim_rangos' => is_array( $dim->Rangos ) ? json_encode( $dim->Rangos ) : '' 00283 ) ); 00284 } 00285 $consulta->closeCursor( ); unset( $consulta ); 00286 00287 } 00288 00305 private function guardarPreguntas( $val ){ 00306 00307 if( !is_array( $val ) || sizeof( $val ) == 0 ) 00308 return ; 00309 00310 $db = Database::getInstance( ); 00311 00312 $consulta = $db->prepare('SELECT * FROM dimensiones WHERE dim_cue_id = :cue_id ORDER BY dim_id ASC '); 00313 $consulta->execute( array( 00314 ':cue_id' => ( $this->getCuestionarioOrigen( ) == 0 ? $this->getId( ) : $this->getCuestionarioOrigen( ) ) 00315 ) ); 00316 00317 $dimensiones = $consulta->fetchAll( ); 00318 $consulta->closeCursor( ); 00319 unset( $consulta ); 00320 00321 $alternativas = array( ); 00322 00323 if( Database::driver( ) == 'oci' ) 00324 $query = 00325 'INSERT INTO preguntas ( ' 00326 .'pre_enunciado, pre_enunciado_b, pre_cue_id, pre_orden, pre_tipo, ' 00327 .'pre_dimension_a, pre_dimension_b, ' 00328 .'pre_pp_peso' 00329 .')values( ' 00330 .':pre_enunciado, :pre_enunciado_b, :pre_cue_id, :pre_orden, :pre_tipo, ' 00331 .':pre_dimension_a, :pre_dimension_b, ' 00332 ."to_number(:pre_pp_peso, '999999.999999') " 00333 .')'; 00334 else 00335 $query = 00336 'INSERT INTO preguntas ( ' 00337 .'pre_enunciado, pre_enunciado_b, pre_cue_id, pre_orden, pre_tipo, ' 00338 .'pre_dimension_a, pre_dimension_b, ' 00339 .'pre_pp_peso' 00340 .')values( ' 00341 .':pre_enunciado, :pre_enunciado_b, :pre_cue_id, :pre_orden, :pre_tipo, ' 00342 .':pre_dimension_a, :pre_dimension_b, ' 00343 .':pre_pp_peso ' 00344 .')'; 00345 00346 $consulta = $db->prepare( $query ); 00347 00348 foreach( $val as $key => $pre ){ 00349 if( is_array( $pre ) ) $pre = ( object ) $pre; 00350 00351 if( $this->getTipo( ) == Cuestionario::TIPO_DEMOGRAFICO ){ 00352 $nReg = array( 00353 ':pre_enunciado' => $pre->Enunciado, 00354 ':pre_enunciado_b' => '', 00355 ':pre_cue_id'=> $this->getId( ), 00356 ':pre_orden'=> trim( $pre->Orden ), 00357 ':pre_tipo'=> trim( $pre->Tipo ), 00358 ':pre_pp_peso'=> '1.0', 00359 ':pre_dimension_a' => 0, 00360 ':pre_dimension_b' => 0 00361 ); 00362 }else{ 00363 $nReg = array( 00364 ':pre_enunciado' => $pre->Enunciado, 00365 ':pre_enunciado_b' => $pre->EnunciadoB, 00366 ':pre_cue_id'=> $this->getId( ), 00367 ':pre_orden'=> trim( $pre->Orden ), 00368 ':pre_tipo'=> trim( $pre->Tipo ), 00369 ':pre_pp_peso'=> trim( isset( $pre->PromedioPonderadoPeso ) ? $pre->PromedioPonderadoPeso : '1.0' ), 00370 ':pre_dimension_a' => ( $pre->Tipo != 3 || is_null( $dimensiones[ $pre->DimensionA ][ 'dim_id' ] ) ) ? 00371 0 00372 : 00373 $dimensiones[ $pre->DimensionA ][ 'dim_id' ], 00374 ':pre_dimension_b' => ( $pre->Tipo != 3 || is_null( $dimensiones[ $pre->DimensionB ] ) ) ? 00375 0 00376 : 00377 $dimensiones[ $pre->DimensionB ][ 'dim_id' ] 00378 ); 00379 } 00380 00381 $consulta->execute( $nReg ); 00382 $pre_id = Database::lastInsertId( 'preguntas_seq' ); 00383 @$childs = $pre->Alternativas; 00384 00385 if( is_array( $childs ) ) 00386 foreach( $childs as $key => $alt ){ 00387 if( is_array( $alt ) ) $alt = ( object ) $alt; 00388 if( $pre->Tipo == Cuestionario::PREGUNTA_TIPO_PARES || $this->getTipo( ) == Cuestionario::TIPO_DEMOGRAFICO ) 00389 $alt->Dimension = -1; 00390 $alt->Pregunta = $pre_id; 00391 array_push($alternativas, $alt); 00392 } 00393 } 00394 $consulta->closeCursor( ); unset( $consulta ); 00395 00396 $query = 00397 'INSERT INTO alternativas ( alt_pre_id, alt_dim_id, alt_valor, alt_valor_texto, alt_texto, alt_orden )' 00398 .'values( :alt_pre_id, :alt_dim_id, :alt_valor, :alt_valor_texto, :alt_texto, :alt_orden )'; 00399 00400 $consulta = $db->prepare( $query ); 00401 foreach( $alternativas as $key => $alt ){ 00402 $nReg = array( 00403 ':alt_pre_id'=> $alt->Pregunta, 00404 ':alt_dim_id'=> $alt->Dimension < 0 ? 0 : $dimensiones[ $alt->Dimension ][ 'dim_id' ], 00405 ':alt_valor'=> $this->getTipo( ) == Cuestionario::TIPO_DEMOGRAFICO ? 0 : (float)( $alt->Valor ), 00406 ':alt_valor_texto'=> $this->getTipo( ) == Cuestionario::TIPO_DEMOGRAFICO ? $alt->Valor : '', 00407 ':alt_texto'=> $alt->Texto, 00408 ':alt_orden'=> $alt->Orden 00409 ); 00410 00411 $consulta->execute( $nReg ); 00412 } 00413 $consulta->closeCursor( ); unset( $consulta ); 00414 00415 } 00416 00417 public function addPreguntas( $val ){ 00418 00419 if( !$this->getId( ) || !is_array( $val ) || $this->Respondido( ) ) return ; 00420 00421 if( sizeof( $val ) == 0 )return; 00422 00423 $db = Database::getInstance( ); 00424 $alternativas = array( ); 00425 00426 if( Database::driver( ) == 'oci' ) 00427 $query = 00428 'INSERT INTO preguntas ( ' 00429 .'pre_enunciado, pre_enunciado_b, pre_cue_id, pre_orden, pre_tipo, ' 00430 .'pre_dimension_a, pre_dimension_b, ' 00431 .'pre_pp_peso' 00432 .')values( ' 00433 .':pre_enunciado, :pre_enunciado_b, :pre_cue_id, :pre_orden, :pre_tipo, ' 00434 .':pre_dimension_a, :pre_dimension_b, ' 00435 ."to_number(:pre_pp_peso, '999999.999999') " 00436 .')'; 00437 else 00438 $query = 00439 'INSERT INTO preguntas ( ' 00440 .'pre_enunciado, pre_enunciado_b, pre_cue_id, pre_orden, pre_tipo, ' 00441 .'pre_dimension_a, pre_dimension_b, ' 00442 .'pre_pp_peso' 00443 .')values( ' 00444 .':pre_enunciado, :pre_enunciado_b, :pre_cue_id, :pre_orden, :pre_tipo, ' 00445 .':pre_dimension_a, :pre_dimension_b, ' 00446 .':pre_pp_peso ' 00447 .')'; 00448 00449 $consulta = $db->prepare( $query ); 00450 00451 foreach( $val as $key => $pre ){ 00452 if( !is_object( $pre ) )$pre = (object)$pre; 00453 00454 if( $this->getTipo( ) == Cuestionario::TIPO_DEMOGRAFICO ){ 00455 $consulta->execute( array( 00456 ':pre_cue_id'=> $this->getId( ), 00457 ':pre_tipo'=> trim( $pre->Tipo ), 00458 ':pre_orden'=> trim( $pre->Orden ), 00459 ':pre_pp_peso'=> '1.0', 00460 ':pre_dimension_a' => 0, 00461 ':pre_dimension_b' => 0, 00462 ':pre_enunciado' => $pre->Enunciado, 00463 ':pre_enunciado_b' => '', 00464 )); 00465 }else{ 00466 $consulta->execute( array( 00467 ':pre_cue_id'=> $this->getId( ), 00468 ':pre_tipo'=> $pre->Tipo, 00469 ':pre_orden'=> $pre->Orden, 00470 ':pre_pp_peso'=> $pre->PromedioPonderadoPeso, 00471 ':pre_dimension_a' => $pre->DimensionA, 00472 ':pre_dimension_b' => $pre->DimensionB, 00473 ':pre_enunciado' => $pre->Enunciado, 00474 ':pre_enunciado_b' => $pre->EnunciadoB 00475 ) ); 00476 } 00477 00478 $pre_id = Database::lastInsertId( 'preguntas_seq' ); 00479 00480 if( is_array( $pre->Alternativas ) ) 00481 foreach( $pre->Alternativas as $key => $alt ){ 00482 if( is_array( $alt ) ) $alt = ( object ) $alt; 00483 if( $pre->Tipo == Cuestionario::PREGUNTA_TIPO_PARES || $this->getTipo( ) == Cuestionario::TIPO_DEMOGRAFICO ) 00484 $alt->Dimension = -1; 00485 $alt->Pregunta = $pre_id; 00486 array_push($alternativas, $alt); 00487 } 00488 } 00489 $consulta->closeCursor( ); unset( $consulta ); 00490 00491 $query = 00492 'INSERT INTO alternativas ( alt_pre_id, alt_dim_id, alt_valor, alt_valor_texto, alt_texto, alt_orden )' 00493 .'VALUES( :alt_pre_id, :alt_dim_id, :alt_valor, :alt_valor_texto, :alt_texto, :alt_orden )'; 00494 00495 $consulta = $db->prepare( $query ); 00496 foreach( $alternativas as $key => $alt ){ 00497 if( !is_object( $alt ) )$alt = (object)$alt; 00498 $consulta->execute( array( 00499 ':alt_pre_id'=> $alt->Pregunta, 00500 ':alt_dim_id'=> $alt->Dimension < 0 ? 0 : $alt->Dimension, 00501 ':alt_valor'=> $this->getTipo( ) == Cuestionario::TIPO_DEMOGRAFICO ? 0 : (float)( $alt->Valor ), 00502 ':alt_valor_texto'=> $this->getTipo( ) == Cuestionario::TIPO_DEMOGRAFICO ? $alt->Valor : '', 00503 ':alt_texto'=> $alt->Texto, 00504 ':alt_orden'=> $alt->Orden 00505 ) ); 00506 } 00507 $consulta->closeCursor( ); unset( $consulta ); 00508 } 00509 00510 public function editPreguntas( $val ){ 00511 00512 if( !$this->getId( ) || !is_array( $val ) ) return ; 00513 if( sizeof( $val ) == 0 )return; 00514 00515 $db = Database::getInstance( ); 00516 00517 $alternativas = array( ); 00518 00519 if( !$this->Respondido( ) ){ 00520 00521 if( Database::driver( ) == 'oci' ) 00522 $query = 00523 'UPDATE preguntas SET ' 00524 .'pre_enunciado = :pre_enunciado, pre_enunciado_b = :pre_enunciado_b, ' 00525 .'pre_orden = :pre_orden, pre_tipo = :pre_tipo, ' 00526 .'pre_dimension_a = :pre_dimension_a, pre_dimension_b = :pre_dimension_b, ' 00527 ."pre_pp_peso = to_number(:pre_pp_peso, '999999.999999') " 00528 .'WHERE pre_id=:pre_id '; 00529 else 00530 $query = 00531 'UPDATE preguntas SET ' 00532 .'pre_enunciado = :pre_enunciado, pre_enunciado_b = :pre_enunciado_b, ' 00533 .'pre_orden = :pre_orden, pre_tipo = :pre_tipo, ' 00534 .'pre_dimension_a = :pre_dimension_a, pre_dimension_b = :pre_dimension_b, ' 00535 ."pre_pp_peso = :pre_pp_peso " 00536 .'WHERE pre_id=:pre_id '; 00537 00538 $consulta = $db->prepare( $query ); 00539 foreach( $val as $key => $pre ){ 00540 if( !is_object( $pre ) )$pre = ( object ) $pre; 00541 00542 if( $this->getTipo( ) == Cuestionario::TIPO_DEMOGRAFICO ){ 00543 $consulta->execute( array( 00544 ':pre_id'=> $pre->Id, 00545 ':pre_enunciado' => $pre->Enunciado, 00546 ':pre_enunciado_b' => '', 00547 ':pre_tipo'=> trim( $pre->Tipo ), 00548 ':pre_pp_peso'=> '1.0', 00549 ':pre_dimension_a' => 0, 00550 ':pre_dimension_b' => 0, 00551 ':pre_orden'=> trim( $pre->Orden ) 00552 )); 00553 }else{ 00554 $consulta->execute( array( 00555 ':pre_id'=> $pre->Id, 00556 ':pre_enunciado' => $pre->Enunciado, 00557 ':pre_enunciado_b' => $pre->EnunciadoB, 00558 ':pre_tipo'=>trim($pre->Tipo), 00559 ':pre_pp_peso'=> isset( $pre->PromedioPonderadoPeso ) ? $pre->PromedioPonderadoPeso : '1.0', 00560 ':pre_dimension_a'=> isset( $pre->DimensionA ) ? $pre->DimensionA : 0, 00561 ':pre_dimension_b'=> isset( $pre->DimensionB ) ? $pre->DimensionB : 0, 00562 ':pre_orden'=> trim($pre->Orden) 00563 ) ); 00564 } 00565 00566 if( is_array( $pre->Alternativas ) ) 00567 foreach( $pre->Alternativas as $key => $alt ){ 00568 if( is_array( $alt ) ) $alt = ( object ) $alt; 00569 if( $pre->Tipo == Cuestionario::PREGUNTA_TIPO_PARES || $this->getTipo( ) == Cuestionario::TIPO_DEMOGRAFICO ) 00570 $alt->Dimension = -1; 00571 $alt->Pregunta = $pre->Id; 00572 array_push($alternativas, $alt); 00573 } 00574 00575 } 00576 $consulta->closeCursor( ); unset( $consulta ); 00577 00578 $consulta = $db->prepare( 'DELETE FROM alternativas WHERE alt_pre_id=:pre_id' ); 00579 foreach( $val as $key => $pre ){ 00580 if( !is_object( $pre ) )$pre = ( object ) $pre; 00581 $consulta->execute( array( ':pre_id'=> $pre->Id ) ); 00582 } 00583 $consulta->closeCursor( ); unset( $consulta ); 00584 00585 $consulta = $db->prepare( 00586 'INSERT INTO alternativas ( alt_pre_id, alt_dim_id, alt_valor, alt_valor_texto, alt_texto, alt_orden )' 00587 .'VALUES( :alt_pre_id, :alt_dim_id, :alt_valor, :alt_valor_texto, :alt_texto, :alt_orden )' 00588 ); 00589 foreach( $alternativas as $key => $alt ){ 00590 if( !is_object( $alt ) )$alt = (object)$alt; 00591 $consulta->execute( array( 00592 ':alt_pre_id'=> $alt->Pregunta, 00593 ':alt_dim_id'=> $alt->Dimension < 0 ? 0 : $alt->Dimension, 00594 ':alt_valor'=> $this->getTipo( ) == Cuestionario::TIPO_DEMOGRAFICO ? 0 : (float)( $alt->Valor ), 00595 ':alt_valor_texto'=> $this->getTipo( ) == Cuestionario::TIPO_DEMOGRAFICO ? $alt->Valor : '', 00596 ':alt_texto'=> $alt->Texto, 00597 ':alt_orden'=> $alt->Orden 00598 ) ); 00599 } 00600 $consulta->closeCursor( ); unset( $consulta ); 00601 }else{ 00602 $consulta = $db->prepare( 00603 'UPDATE preguntas SET pre_enunciado=:pre_enunciado, pre_enunciado_b=:pre_enunciado_b WHERE pre_id=:pre_id' 00604 ); 00605 foreach( $val as $key => $pre ){ 00606 if( !is_object( $pre ) )$pre = ( object ) $pre; 00607 00608 $consulta->execute( array( 00609 ':pre_id'=> $pre->Id, 00610 ':pre_enunciado' => $pre->Enunciado, 00611 ':pre_enunciado_b' => $pre->EnunciadoB 00612 ) ); 00613 00614 if( is_array( $pre->Alternativas ) ) 00615 foreach( $pre->Alternativas as $key => $alt ) 00616 array_push( $alternativas, $alt ); 00617 } 00618 $consulta->closeCursor( ); unset( $consulta ); 00619 00620 $consulta = $db->prepare( 'UPDATE alternativas SET alt_texto = :alt_texto WHERE alt_id = :alt_id' ); 00621 00622 foreach( $alternativas as $key => $alt ){ 00623 if( is_array( $alt ) )$alt = ( object ) $alt; 00624 $consulta->execute( array( 00625 ':alt_id'=> $alt->Id, 00626 ':alt_texto'=> $alt->Texto 00627 )); 00628 } 00629 $consulta->closeCursor( ); unset( $consulta ); 00630 } 00631 00632 } 00633 00634 public function delPreguntas( $val ){ 00635 00636 if( !$this->getId( ) || !is_array( $val ) || $this->Respondido( ) ) return ; 00637 if( sizeof( $val ) == 0 )return; 00638 00639 $db = Database::getInstance( ); 00640 00641 $consulta = $db->prepare( 'DELETE FROM preguntas WHERE pre_id=:pre_id' ); 00642 foreach( $val as $key => $pre ) 00643 $consulta->execute( array( ':pre_id'=> $pre ) ); 00644 00645 $consulta->closeCursor( ); unset( $consulta ); 00646 } 00647 00655 public function getId( ){ return $this->cue_id ? $this->cue_id : NULL; } 00656 00664 public function getNombre( ){ return $this->cue_nombre; } 00665 00671 public function setNombre( $val ){ $this->cue_nombre = $val; } 00672 00680 public function getTipo( ){ return $this->cue_tipo; } 00681 00690 public function setTipo( $val ){ $this->cue_tipo = $val; } 00691 00700 public function getInventarioId( ){ return $this->cue_inv_id; } 00701 00710 public function setInventarioId( $val ){ $this->cue_inv_id = $val; } 00711 00720 public function getInstrucciones( ){ return $this->cue_instrucciones; } 00721 00730 public function setInstrucciones( $val ){ $this->cue_instrucciones = $val; } 00731 00732 00741 public function setTipoDeGrafico( $val ){ $this->cue_gra_tipo = $val; } 00742 00751 public function getTipoDeGrafico( ){ return $this->cue_gra_tipo; } 00752 00761 public function setTipoDeEstadistica( $val ){ $this->cue_gra_estadistico = $val; } 00762 00771 public function getTipoDeEstadistica( ){ return $this->cue_gra_estadistico; } 00772 00781 public function setAnalisis( $val ){ $this->cue_gra_analisis = $val; } 00782 00791 public function getAnalisis( ){ return $this->cue_gra_analisis; } 00792 00802 public function setCuestionarioOrigen( $val ){ $this->cue_origen_id = $val; } 00803 00813 public function getCuestionarioOrigen( ){ return $this->cue_origen_id; } 00814 00823 public function getCuestionarioDependiente( ){ 00824 if( !$this->getId( ) ) return 0; 00825 $db = Database::getInstance( ); 00826 $consulta = $db->prepare( 'SELECT cue_id FROM cuestionarios WHERE cue_origen_id = :cue_id' ); 00827 $consulta->execute( array( ':cue_id' => $this->getId( ) ) ); 00828 $rt = $consulta->fetch( ); 00829 $consulta->CloseCursor( ); unset( $consulta ); 00830 return $rt[0]; 00831 } 00832 00846 public function getDimensiones( ){ 00847 00848 if( $this->cue_dimensiones ) return $this->cue_dimensiones; 00849 00850 $cue_dim = array( ); 00851 00852 $db = Database::getInstance( ); 00853 00854 $consulta = $db->prepare( 00855 'SELECT ' 00856 .'p.dim_id as id, p.dim_nombre as nombre, p.dim_rangos as rangos, ' 00857 .'p.dim_connotacion_negativa as connotacion_negativa, ' 00858 .'c.dim_id as c_id, c.dim_nombre as c_nombre, c.dim_rangos as c_rangos, ' 00859 .'c.dim_connotacion_negativa as c_connotacion_negativa ' 00860 .'FROM dimensiones p ' 00861 .'LEFT JOIN dimensiones c ON ( c.dim_padre_id = p.dim_id ) ' 00862 .'WHERE p.dim_padre_id = 0 AND p.dim_cue_id = :cue_id ' 00863 .'ORDER BY p.dim_id, c.dim_id ' 00864 ); 00865 00866 $consulta->execute( array( 00867 ':cue_id' => ( $this->getCuestionarioOrigen( ) == 0 ? $this->getId( ) : $this->getCuestionarioOrigen( ) ) 00868 ) ); 00869 while( $resultado = $consulta->fetch( PDO::FETCH_ASSOC, PDO::FETCH_ORI_NEXT ) ){ 00870 if( sizeof( $cue_dim ) == 0 || $cue_dim[ sizeof( $cue_dim )-1 ]->Id != $resultado['id'] ){ 00871 $dim = new stdClass( ); 00872 $dim->Id=$resultado['id']; 00873 $dim->Nombre=$resultado['nombre']; 00874 $dim->Rangos=json_decode( $resultado['rangos'] ); 00875 $dim->Padre=0; 00876 $dim->Dimensiones = array( ); 00877 $dim->ConnotacionNegativa = $resultado['connotacion_negativa']; 00878 array_push( $cue_dim, $dim ); 00879 } 00880 if( $resultado['c_id'] ){ 00881 $dim = new stdClass( ); 00882 $dim->Id=$resultado['c_id']; 00883 $dim->Nombre=$resultado['c_nombre']; 00884 $dim->Rangos=json_decode( $resultado['c_rangos'] ); 00885 $dim->Padre=$resultado['id']; 00886 $dim->ConnotacionNegativa = $resultado['c_connotacion_negativa']; 00887 array_push( $cue_dim[ sizeof( $cue_dim )-1 ]->Dimensiones, $dim ); 00888 } 00889 } 00890 00891 $this->cue_dimensiones = $cue_dim; 00892 00893 return $this->cue_dimensiones; 00894 00895 } 00896 00910 public function getDimensionesArray( ){ 00911 00912 $cue_dim = array( ); 00913 00914 $db = Database::getInstance( ); 00915 00916 $consulta = $db->prepare( 00917 'SELECT dim_id as id, dim_padre_id as padre, dim_nombre as nombre, dim_rangos as rangos, ' 00918 .'dim_connotacion_negativa as connotacion_negativa ' 00919 .'FROM dimensiones WHERE dim_cue_id = :cue_id ORDER BY dim_id ' 00920 ); 00921 00922 $consulta->execute( array( 00923 ':cue_id' => ( $this->getCuestionarioOrigen( ) == 0 ? $this->getId( ) : $this->getCuestionarioOrigen( ) ) 00924 ) ); 00925 while( $resultado = $consulta->fetch( PDO::FETCH_ASSOC, PDO::FETCH_ORI_NEXT ) ){ 00926 $dim = new stdClass( ); 00927 $dim->Id=$resultado['id']; 00928 $dim->Nombre=$resultado['nombre']; 00929 $dim->Padre=$resultado['padre']; 00930 $dim->ConnotacionNegativa=$resultado['connotacion_negativa']; 00931 $dim->Rangos = $resultado['rangos'] != '' ? json_decode( $resultado['rangos'] ) : array( ); 00932 array_push( $cue_dim, $dim ); 00933 } 00934 00935 return $cue_dim; 00936 00937 } 00938 00952 public function getDimensionesSimple( ){ 00953 00954 $cue_dim = array( ); 00955 00956 $db = Database::getInstance( ); 00957 00958 $consulta = $db->prepare( 00959 'SELECT ' 00960 .'p.dim_id as id, p.dim_nombre as nombre, p.dim_rangos as rangos, ' 00961 .'p.dim_connotacion_negativa as connotacion_negativa, ' 00962 .'c.dim_id as c_id, c.dim_nombre as c_nombre, c.dim_rangos as c_rangos, ' 00963 .'c.dim_connotacion_negativa as c_connotacion_negativa ' 00964 .'FROM dimensiones p ' 00965 .'LEFT JOIN dimensiones c ON ( c.dim_padre_id = p.dim_id ) ' 00966 .'WHERE p.dim_padre_id = 0 AND p.dim_cue_id = :cue_id ' 00967 .'ORDER BY p.dim_id, c.dim_id ' 00968 ); 00969 00970 $consulta->execute( array( 00971 ':cue_id' => ( $this->getCuestionarioOrigen( ) == 0 ? $this->getId( ) : $this->getCuestionarioOrigen( ) ) 00972 ) ); 00973 while( $resultado = $consulta->fetch( PDO::FETCH_ASSOC, PDO::FETCH_ORI_NEXT ) ){ 00974 if( sizeof( $cue_dim ) == 0 || $cue_dim[ sizeof( $cue_dim )-1 ]->Id != $resultado['id'] ){ 00975 $dim = new stdClass( ); 00976 $dim->Id=$resultado['id']; 00977 $dim->Nombre=$resultado['nombre']; 00978 $dim->ConnotacionNegativa=$resultado['connotacion_negativa']; 00979 $dim->Rangos=json_decode( $resultado['rangos'] ); 00980 $dim->Padre=0; 00981 array_push( $cue_dim, $dim ); 00982 } 00983 if( $resultado['c_id'] ){ 00984 $dim = new stdClass( ); 00985 $dim->Id=$resultado['c_id']; 00986 $dim->Nombre=$resultado['c_nombre']; 00987 $dim->ConnotacionNegativa=$resultado['c_connotacion_negativa']; 00988 $dim->Rangos=json_decode( $resultado['c_rangos'] ); 00989 $dim->Padre=$resultado['id']; 00990 array_push( $cue_dim, $dim ); 00991 } 00992 } 00993 00994 return $cue_dim; 00995 00996 } 00997 01008 public function setDimensiones( $val ){ $this->cue_dimensiones = $val; } 01009 01019 public function getPreguntas( ){ 01020 01021 if( $this->cue_preguntas ) return $this->cue_preguntas; 01022 01023 $cue_pre = array( ); 01024 01025 $db = Database::getInstance( ); 01026 01027 $consulta = $db->prepare( 01028 'SELECT * FROM preguntas pre LEFT JOIN alternativas alt ON ( alt.alt_pre_id = pre.pre_id ) ' 01029 .'WHERE pre.pre_cue_id = :cue_id ORDER BY pre.pre_orden, alt.alt_orden' 01030 ); 01031 01032 $consulta->execute( array( ':cue_id'=>$this->getId( ) ) ); 01033 while( $resultado = $consulta->fetch( PDO::FETCH_ASSOC, PDO::FETCH_ORI_NEXT ) ){ 01034 if( sizeof($cue_pre) == 0 || $cue_pre[sizeof($cue_pre)-1]->Id != $resultado['pre_id'] ){ 01035 $pre = new stdClass( ); 01036 $pre->Id = $resultado['pre_id']; 01037 $pre->Enunciado = $resultado['pre_enunciado']; 01038 $pre->EnunciadoB = $resultado['pre_enunciado_b']; 01039 $pre->DimensionA = is_null( $resultado['pre_dimension_a'] ) ? 0 : $resultado['pre_dimension_a']; 01040 $pre->DimensionB = is_null( $resultado['pre_dimension_b'] ) ? 0 : $resultado['pre_dimension_b']; 01041 $pre->Orden = $resultado['pre_orden']; 01042 $pre->Tipo = $resultado['pre_tipo']; 01043 $pre->PromedioPonderadoPeso = $resultado['pre_pp_peso']; 01044 $pre->Alternativas = array( ); 01045 array_push( $cue_pre, $pre ); 01046 } 01047 if( $resultado['alt_id'] ){ 01048 $alt = new stdClass( ); 01049 $alt->Id = $resultado['alt_id']; 01050 $alt->Dimension = $resultado['alt_dim_id']; 01051 $alt->Valor = $this->getTipo( ) == Cuestionario::TIPO_DEMOGRAFICO ? 01052 $resultado['alt_valor_texto'] : $resultado['alt_valor']; 01053 $alt->Texto = $resultado['alt_texto']; 01054 $alt->Orden = $resultado['alt_orden']; 01055 array_push( $cue_pre[sizeof( $cue_pre ) - 1]->Alternativas, $alt ); 01056 } 01057 } 01058 01059 $this->cue_preguntas = $cue_pre; 01060 return $this->cue_preguntas; 01061 } 01062 01091 public function getPreguntasLista( $pg=1, $limit=5, $eva, $par, $eval, $eval_tipo ){ 01092 01093 if( !$this->getId( ) ) return new stdClass( ); 01094 01095 $cue_pre = array( ); 01096 01097 $db = Database::getInstance( ); 01098 01099 $consulta = NULL; 01100 $pager = new stdClass( ); 01101 $rt = new stdClass( ); 01102 01103 $consulta = $db->prepare( 01104 'SELECT count(*) as rowCount FROM preguntas pre ' 01105 .'JOIN cuestionarios cue ON ( cue.cue_id = pre.pre_cue_id ) ' 01106 .'JOIN inventarios inv ON ( inv.inv_id = cue.cue_inv_id ) ' 01107 .'JOIN evaluaciones_inventarios eva_inv ON ( eva_inv.inv_id = inv.inv_id ) ' 01108 .'WHERE eva_inv.eva_id = :eva_id AND cue.cue_id = :cue_id AND NOT EXISTS ( ' 01109 .'SELECT * FROM respuestas res WHERE pre.pre_id=res.pre_id AND res.eva_id=eva_inv.eva_id ' 01110 .'AND res.par_id=:par_id AND res.eval_id=:eval_id' 01111 .') ORDER BY pre.pre_orden ASC' 01112 ); 01113 01114 $consulta->execute( array( ':cue_id'=>$this->getId( ), ':eva_id'=>$eva, ':par_id'=>$par, ':eval_id'=>$eval ) ); 01115 $resultado = $consulta->fetch(PDO::FETCH_ASSOC); $consulta->closeCursor( ); unset($consulta); 01116 01117 if( !$resultado || $resultado['rowcount'] == 0){ 01118 $rt->PageCount=1; 01119 $rt->Pagina = 1; 01120 $rt->RowCount = 0; 01121 $rt->Preguntas = array( ); 01122 return $rt; 01123 } 01124 $rt->RowCount = $resultado['rowcount']; 01125 01126 $pager->pageCount = ceil( $resultado['rowcount'] / $limit ); 01127 $pager->offset = $limit * ( ( $pg > $pager->pageCount ? $pager->pageCount : $pg ) -1 ); 01128 01129 $query = Database::limit( 01130 'SELECT pre.* FROM preguntas pre ' 01131 .'JOIN cuestionarios cue ON ( cue.cue_id = pre.pre_cue_id ) ' 01132 .'JOIN inventarios inv ON ( inv.inv_id = cue.cue_inv_id ) ' 01133 .'JOIN evaluaciones_inventarios eva_inv ON ( eva_inv.inv_id = inv.inv_id ) ' 01134 .'WHERE eva_inv.eva_id = :eva_id AND cue.cue_id = :cue_id AND NOT EXISTS ( ' 01135 .'SELECT * FROM respuestas res WHERE pre.pre_id=res.pre_id AND res.eva_id=eva_inv.eva_id ' 01136 .'AND res.par_id=:par_id AND res.eval_id=:eval_id' 01137 .') ORDER BY pre.pre_orden ASC' 01138 , $limit, $pager->offset ); 01139 $consulta = $db->prepare( $query ); 01140 01141 $consulta->execute( array( ':cue_id'=>$this->getId( ), ':eva_id'=>$eva, ':par_id'=>$par, ':eval_id'=>$eval ) ); 01142 while( $resultado = $consulta->fetch( PDO::FETCH_ASSOC, PDO::FETCH_ORI_NEXT ) ){ 01143 $pre = new stdClass( ); 01144 $pre->Id = $resultado['pre_id']; 01145 $pre->Enunciado = Utilitario::convertir_especiales_html( $resultado['pre_enunciado'] ); 01146 $pre->EnunciadoB = Utilitario::convertir_especiales_html( $resultado['pre_enunciado_b'] ); 01147 $pre->Orden = $resultado['pre_orden']; 01148 $pre->Tipo = $resultado['pre_tipo']; 01149 $pre->DimensionA = $resultado['pre_dimension_a']; 01150 $pre->DimensionB = $resultado['pre_dimension_b']; 01151 $pre->Alternativas = array( ); 01152 $pre->SubTipo = 1; 01153 array_push( $cue_pre, $pre ); 01154 } 01155 $consulta->closeCursor( ); unset($consulta); 01156 01157 $consulta = $db->prepare( 'SELECT * FROM alternativas WHERE alt_pre_id = :pre_id ORDER BY alt_orden ASC ' ); 01158 foreach( $cue_pre as $idx => &$pre ){ 01159 $consulta->execute( array( ':pre_id'=>$pre->Id ) ); 01160 while( $resultado = $consulta->fetch( PDO::FETCH_ASSOC, PDO::FETCH_ORI_NEXT ) ){ 01161 $alt = new stdClass( ); 01162 $alt->Id = $resultado['alt_id']; 01163 $alt->Texto = Utilitario::convertir_especiales_html( $resultado['alt_texto'] ); 01164 $alt->Orden = $resultado['alt_orden']; 01165 $alt->Valor = $resultado['alt_valor']; 01166 $alt->Dimension = $resultado['alt_dim_id']; 01167 array_push( $pre->Alternativas, $alt ); 01168 if( $alt->Texto != '' )$pre->SubTipo = 0; 01169 } 01170 } 01171 $consulta->closeCursor( ); unset($consulta); 01172 01173 $rt->PageCount = $pager->pageCount; 01174 $rt->Pagina = (string)($pg > $rt->PageCount ? $rt->PageCount : $pg); 01175 $rt->Preguntas = $cue_pre; 01176 01177 return $rt; 01178 } 01179 01188 public function getPreguntasCount( ){ 01189 01190 $db = Database::getInstance( ); 01191 01192 $consulta = $db->prepare( 'SELECT count(*) as rowCount FROM preguntas WHERE pre_cue_id = :cue_id' ); 01193 01194 $consulta->execute( array( ':cue_id'=>$this->getId( ) ) ); 01195 $resultado = $consulta->fetch(PDO::FETCH_ASSOC); $consulta->closeCursor( ); unset($consulta); 01196 01197 return $resultado['rowcount']; 01198 01199 } 01200 01211 public function setPreguntas( $val ){ $this->cue_preguntas = $val; } 01212 01222 public function setRangosDelGrafico( $val ){ $this->cue_gra_rangos = json_encode( $val ); } 01223 01232 public function getRangosDelGrafico( ){ return json_decode( $this->cue_gra_rangos ); } 01233 01243 public function Respondido( ){ 01244 $db = Database::getInstance( ); 01245 01246 $consulta = $db->prepare( 'SELECT COUNT( * ) as res FROM respuestas WHERE cue_id = :cue_id' ); 01247 $consulta->execute( array( ':cue_id'=>$this->getId( ) ) ); 01248 $resultado = $consulta->fetch( PDO::FETCH_ASSOC ); 01249 $consulta->closeCursor( ); unset( $consulta ); 01250 01251 return $resultado['res'] > 0 ? true : false ; 01252 } 01253 01266 public function Estructura( $force_encode = false ){ 01267 01268 if( !$this->getId( ) ) return ''; 01269 01270 $db = Database::getInstance( ); 01271 01272 $rt = ''; 01273 01274 $Cuestionario = (object)array( 01275 'Id' => $this->getId( ), 01276 'Tipo' => $this->getTipo( ), 01277 'Origen' => $this->getCuestionarioOrigen( ), 01278 'Nombre' => $force_encode ? utf8_encode( $this->getNombre( ) ) : $this->getNombre( ), 01279 'Instrucciones' => $force_encode ? utf8_encode( $this->getInstrucciones( ) ) : $this->getInstrucciones( ), 01280 'TipoGrafico' => $this->getTipoDeGrafico( ), 01281 'Estadistico' => $this->getTipoDeEstadistica( ), 01282 'AnalisisGrafico' => $this->getAnalisis( ), 01283 'Escala' => (object)array( 01284 'Minimo' => $this->getEscalaMinimo( ), 01285 'Maximo' => $this->getEscalaMinimo( ) 01286 ), 01287 'Rangos' => $this->getRangosDelGrafico( ), 01288 'Dimensiones' => $this->getDimensiones( ), 01289 'Dim_idx_match' => array( ), 01290 'Preguntas' => $this->getPreguntas( ) 01291 ); 01292 01293 foreach( $Cuestionario->Dimensiones as $i=>$dim ){ 01294 $Cuestionario->Dim_idx_match[$dim->Id] = $i; 01295 foreach( $dim->Dimensiones as $j=>$subdim ) 01296 $Cuestionario->Dim_idx_match[$subdim->Id] = $i; 01297 } 01298 01299 foreach( $Cuestionario->Preguntas as $i => &$Pre ) 01300 foreach( $Pre->Alternativas as $j => &$Alt ) 01301 $Alt->Dimension = $Cuestionario->Dim_idx_match[$Alt->Dimension]; 01302 01303 return $Cuestionario; 01304 } 01305 01306 }