<?php
  /**
   * Clase que implementa a un control para gestionar los componentes del
   * portal del Banco del tiempo de M锟絣aga.
   **/
  class ComponenteBtMalagaControl extends ControlPicasso {
  
    /**
     * Constante para indicar la acci锟絥 de crear nuevo componente.
     **/
    const ACCION_CREAR_NUEVO_COMPONENTE = 'crearnuevocompoentebtmalaga';
    
    /**
     * Constante para indicar la acci锟絥 de borrar un componente.
     **/
    const ACCION_BORRAR_COMPONTE = 'borrarcomponentebtmalaga';

    /**
     * Constante para indicar la acci髇 de borrado multiple.
     **/
    const ACCION_BORRADO_MULTIPLE_COMPONENTES = 'borradomultiplecomponentesbtmalaga';
    
    /**
     * Indica la acci锟絥 para activar a un usuario.
     **/
    const ACCION_ACTIVAR_USUARIO = 'activarusuariobtmalaga';
    
    /**
     * Indica la acci锟絥 para desactivar a un usuario.
     **/
    const ACCION_DESACTIVAR_USUARIO = 'desactivarusuariobtmalaga';
    
    /**
     * Indica la acci锟絥 para enviar un mensaje.
     **/
    const ACCION_ENVIAR_MENSAJE = 'enviarmensajebtmalaga';
    
    /**
     * Indica la acci锟絥 para cambiar el estado de una factura.
     **/
    const ACCION_CAMBIAR_ESTADO_FACTURA = 'cambiarestadofacturabtmalaga';
    
    /**
     * Indica la acci锟絥 para clonar un servicio.
     **/
    const ACCION_CLONAR_SERVICIO = 'clonarserviciobtmalaga';
    
    /**
     * Indica el parametro para no actualizar los datos en el DataGrid.
     **/
    const PARAMETRO_ACTUALIZAR_DATOS_GRID = 'actualizardatosgridbtmalaga';
    
    /**
     * Indica la acci锟絥 de obtener los mensajes de la bandeja de entrada.
     **/
    const ACCION_OBTENER_NUM_MENSAJES_BANDEJA_ENTRADA = 'obtenerNumMensajesBandejaBtMalaga';
    
    /**
     * Indica la acci锟絥 para poner el formulario de selecci锟絥 de sistemas.
     **/
    const ACCION_FORMULARIO_SELECCION_SISTEMA = 'seleccionarsistemabtmalaga';
    
    /**
     * Indica el nombre de la variable que almacena el sistema en sesi锟絥.
     **/
    const SISTEMA = 'SistemaUsuarioActualBtMalaga';
    /**
     * Indica la acci锟絥 para obtener la opinion de una factura y el usuario conectado.
     **/
    const ACCION_OBTENER_OPINION_FACTURA = 'obteneropinionserviciobtmalaga';

    /**
     * Acci锟絥 para cambiar el estado de publicaci锟絥 de un componente.
     **/
    const ACCION_CAMBIAR_ESTADO_PUBLICACION = 'cambiarestadopublicacionbtmalaga';

    /**
     * Acci髇 para filtrar los resultados de una b鷖queda.
     **/
    const ACCION_FILTRAR_BUSQUEDA = 'filtrarbusquedabtmalaga';

    /**
     * Acci髇 para el borrado logico.
     **/
    const ACCION_BORRADO_LOGICO = 'borradologicocomponentebtmalaga';

    /**
     * Acci髇 para el restaurar un componente borrado.
     **/
    const ACCION_RESTAURAR_COMPONENTE = 'restaurarcomponentebtmalaga';

    
    /**
     * M锟絫odo para ejecutar acciones sobre el control.
     **/
    public function ejecutarAccion() {
          $datos = $this->Datos();
    	  $accion = $datos[ControlPicasso::PARAMETRO_ACCION];
    	  $resultado = '';
    	  switch ($accion) {
    	  	case ComponenteBtMalagaControl::ACCION_CREAR_NUEVO_COMPONENTE : 
    	  		$resultado = $this->crearNuevoComponente($datos[ComponenteBtMalagaControl::PARAMETRO_TIPO_COMPONENTE]);
    	  		break;
    	  	case ComponenteBtMalagaControl::ACCION_BORRAR_COMPONTE:
    	  	       $resultado = $this->borrarComponente($datos['ID']);
    	  	       break;
    	  	case ComponenteBtMalagaControl::ACCION_BORRADO_MULTIPLE_COMPONENTES:
    	  	       $resultado = $this->borrarComponentes($datos['IDs']);
    	  	       break;
    	  	case ComponenteBtMalagaControl::ACCION_ACTIVAR_USUARIO:
    	  	       $resultado = $this->activarUsuario($datos['ID']);
    	  	       break;
    	  	case ComponenteBtMalagaControl::ACCION_DESACTIVAR_USUARIO:
    	  	       $resultado = $this->desactivarUsuario($datos['ID']);
    	  	       break;
    	  	case ComponenteBtMalagaControl::ACCION_ENVIAR_MENSAJE:
    	  	       $resultado = $this->enviarMensaje($datos['ID']);
    	  	       break;
    	  	case ComponenteBtMalagaControl::ACCION_CAMBIAR_ESTADO_FACTURA:
    	  	       $resultado = $this->cambiarEstadoFactura($datos);
    	  	       break;
            case ComponenteBtMalagaControl::ACCION_CLONAR_SERVICIO:
    	  	       $resultado = $this->clonarServicio($datos);
    	  	       break; 
            case ComponenteBtMalagaControl::ACCION_OBTENER_NUM_MENSAJES_BANDEJA_ENTRADA:
    	  	       $resultado = $this->obtenerNumMensajesBandejaEntrada($datos);
    	  	       break;
            case ComponenteBtMalagaControl::ACCION_FORMULARIO_SELECCION_SISTEMA:
    	  	       $resultado = $this->ponerSistema($datos);
    	  	       break;
            case ComponenteBtMalagaControl::ACCION_OBTENER_OPINION_FACTURA:
    	  	       $resultado = $this->obtenerOpinionServicio($datos);
    	  	       break;
            case ComponenteBtMalagaControl::ACCION_CAMBIAR_ESTADO_PUBLICACION:
    	  	       $resultado = $this->cambiarEstadoPublicacion($datos);
    	  	       break;    
            case ComponenteBtMalagaControl::ACCION_FILTRAR_BUSQUEDA:
    	  	       $resultado = $this->filtrarBusqueda($datos);
    	  	       break;    	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	                  	  	           	  	           	  	           	  	           	  	           	  	           	  	         	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	                  	  	           	  	           	  	           	  	           	  	           	  	           	  	          	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	                  	  	           	  	           	  	           	  	           	  	           	  	           	  	         	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	                  	  	           	  	           	  	           	  	           	  	           	  	           	  	          	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	                  	  	           	  	           	  	           	  	           	  	           	  	           	  	         	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	                  	  	           	  	           	  	           	  	           	  	           	  	           	  	          	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	                  	  	           	  	           	  	           	  	           	  	           	  	           	  	         	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	                  	  	           	  	           	  	           	  	           	  	           	  	           	  	      
            case ComponenteBtMalagaControl::ACCION_BORRADO_LOGICO:
    	  	       $resultado = $this->borradoLogico($datos['ID']);
    	  	       break;    	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	                  	  	           	  	           	  	           	  	           	  	           	  	           	  	         	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	                  	  	           	  	           	  	           	  	           	  	           	  	           	  	          	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	                  	  	           	  	           	  	           	  	           	  	           	  	           	  	         	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	                  	  	           	  	           	  	           	  	           	  	           	  	           	  	          	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	                  	  	           	  	           	  	           	  	           	  	           	  	           	  	         	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	                  	  	           	  	           	  	           	  	           	  	           	  	           	  	          	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	                  	  	           	  	           	  	           	  	           	  	           	  	           	  	         	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	                  	  	           	  	           	  	           	  	           	  	           	  	           	  	      
            case ComponenteBtMalagaControl::ACCION_RESTAURAR_COMPONENTE:
    	  	       $resultado = $this->restaurarComponente($datos['ID']);
    	  	       break;    	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	                  	  	           	  	           	  	           	  	           	  	           	  	           	  	         	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	                  	  	           	  	           	  	           	  	           	  	           	  	           	  	          	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	                  	  	           	  	           	  	           	  	           	  	           	  	           	  	         	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	                  	  	           	  	           	  	           	  	           	  	           	  	           	  	          	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	                  	  	           	  	           	  	           	  	           	  	           	  	           	  	         	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	                  	  	           	  	           	  	           	  	           	  	           	  	           	  	          	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	                  	  	           	  	           	  	           	  	           	  	           	  	           	  	         	  	           	  	           	  	           	  	           	  	           	  	           	  	           	  	                  	  	           	  	           	  	           	  	           	  	           	  	           	  	      
    	  }    	  
          return $resultado; 
    }
    
    /**
     * Para crear un nuevo componente.
     **/
    private function crearNuevoComponente($tipoComponente) {
  	$this->componenteAEditar = new $tipoComponente();
	//pone el autor
	$autor = Member::currentUser();
	$this->componenteAEditar->AutorID = $autor->ID;
        $contenedorPadre = DataObject::get_one('CarpetaEditable', "Nombre = 'Contenedor".$tipoComponente."'");
        $this->componenteAEditar->ParentID = $contenedorPadre->ID;
        //guarda el componente aunque si no se pulsa el bot锟絥 guardar del 
        //formulario se borrara para evitar contenidos sin validar.
        $this->componenteAEditar->write();
        $formularioEdicion = new FormularioEditableBtMalaga();
        $datos = $this->Datos();
        $datos[ControlPicasso::PARAMETRO_RECURSO_A_EDITAR] = $this->componenteAEditar->ID; 
        $formularioEdicion->inicializar($this->Pagina(), null, $datos);
        return $formularioEdicion->renderizar();
    }
    
    /**
     * Funci贸n para borrar un componente.
     **/
    private function borrarComponente($id) {
 	$componente = DataObject::get_by_id('ComponenteBtMalaga', $id);
 	$componente->borrar();
 	return true;
    }
    
    /**
     * FunciOn para borrar multiples componentes.
     **/
    private function borrarComponentes($ids) {
        $arrayIds = explode(',',$ids);
        foreach ($arrayIds as $id) {
            $this->borrarComponente($id);
        } 
        return true;
    }

    /**
     * Activa a un usuario.
     **/
    private function activarUsuario($idUsuario) {
    	$usuario = DataObject::get_by_id('UsuarioBtMalaga', $idUsuario);
    	$usuario->Estado = UsuarioBtMalaga::ACTIVO;
    	$usuario->write();
    	
    	//si el usuario no pertenece al grupo de usuarios activos lo a帽ade
    	if (!$usuario->esUsuarioActivo()) {
    		$grupoActivo = DataObject::get_one('GrupoBtMalaga',"Nombre='UsuarioActivo'");
			$gruposUsuarioBtMalaga = new GruposUsuarioPicasso();
			$gruposUsuarioBtMalaga->GrupoID = $grupoActivo->ID;
			$gruposUsuarioBtMalaga->UsuarioID = $usuario->ID;
			$usuario->GruposPicasso()->add($gruposUsuarioBtMalaga);
    	}
    	
    	return true;
    }
    
    /**
     * Desactiva a un usuario.
     **/
    private function desactivarUsuario($idUsuario) {
    	$usuario = DataObject::get_by_id('UsuarioBtMalaga', $idUsuario);
    	$usuario->Estado = UsuarioBtMalaga::DESACTIVADO;
    	$usuario->write();
    	
        //si el usuario pertenece al grupo de usuarios activos lo borra
    	if ($usuario->esUsuarioActivo()) {
    		$grupoActivo = DataObject::get_one('GrupoBtMalaga',"Nombre='UsuarioActivo'");
			$grupoUsuarioActivo = DataObject::get_one('GruposUsuarioPicasso','GrupoID='.$grupoActivo->ID.' AND UsuarioID='.$usuario->ID);
			$grupoUsuarioActivo->borrar();
    	}
    	
    	return true;
    }

    /**
     * Envia un mensaje.
     **/
    private function enviarMensaje($idMensaje) {
	$mensaje = DataObject::get_by_id('MensajeBtMalaga', $idMensaje);
	$mensaje->EstadoEmisor = 'ENVIADO';
      $receptor = DataObject::get_by_id('UsuarioBtMalaga',$mensaje->ReceptorID);
      $tipoNotificacion = $receptor->TipoNotificacion;
      if (($tipoNotificacion == 'Alerta y Email') || ($tipoNotificacion == 'Alerta')) {
  	  $mensaje->EstadoReceptor = 'ENTRADA';
      }
      $mensaje->FechaEnvio = date('Y-m-d H:i:s');
	$mensaje->write();
      if (($tipoNotificacion == 'Alerta y Email') || ($tipoNotificacion == 'Email')) {
        $autor = $mensaje->Autor();  	  
        $email = new Email($autor->Email, $receptor->Email, $mensaje->Asunto, $mensaje->Texto);
        $email->send();
      }
	return '1';    	
    }
    
    /**
     * Cambia el estado de una factura.
     **/
    private function cambiarEstadoFactura($datos) {
        $idFactura = $datos['idFactura'];
        $nuevoEstado = $datos['estadoFactura'];
        $factura = DataObject::get_by_id('FacturaBtMalaga', $idFactura);
        $factura->Estado = $nuevoEstado;
        $usuario = Member::currentUser();
        $factura->UsuarioModificaID = $usuario->ID;
        $factura->write();
        $factura->cargarAcciones();
        $nuevosValores = 'if (mygrid.doesRowExist('.$idFactura.')) { ';
        //$nuevosValores .= 'mygrid.cells('.$idFactura.', 2).setValue("'.$factura->AccionEditar.'");';
        //$nuevosValores .= 'mygrid.cells('.$idFactura.', 3).setValue("'.$factura->AccionAceptar.'");';
        //$nuevosValores .= 'mygrid.cells('.$idFactura.', 4).setValue("'.$factura->AccionRechazar.'");';
        $nuevosValores .= 'mygrid.cells('.$idFactura.', 4).setValue("'.$factura->EstadoFormateado.'");';
        $nuevosValores .= ' }';
        return $nuevosValores;
    }
    
    /**
     * funci锟絥 para clonar un servicio.
     **/
    private function clonarServicio($datos) {
      $idServicio = $datos['idServicio'];
      $servicio = DataObject::get_by_id('ServicioBtMalaga', $idServicio);
      $nuevoServicio = $servicio->clonarServicio();
      return $nuevoServicio->cargarFilaGrid().' irADireccionSinCargar("'.$nuevoServicio->ID.'")';
    }

    /**
     * Devuelve el n锟絤ero de mensajes que hay en la bandeja de entrada.
     **/
    private function obtenerNumMensajesBandejaEntrada() {
      $resultado = 0;
      $usuario = Member::CurrentUser();
      if ($usuario != null) {
        $resultadoConsulta = DB::Query("select count(*) from MensajeBtMalaga where ReceptorID=".$usuario->ID." and EstadoReceptor='ENTRADA'");
        $resultado = $resultadoConsulta->value();
      }
      return $resultado;
    }
    
    /**
     * Guarda en sesi锟絥 el sistema indicado.
     **/
    private function ponerSistema($datos) {
      $sistema = 0;
      if (isset($datos['Sistema'])) {
        $sistema = $datos['Sistema'];
      }  
      Session::set(ComponenteBtMalagaControl::SISTEMA, $sistema);
      Director::redirectBack();
    }
    
    /**
     * Devuelve la opini锟絥 de la factura que se la pasa como par锟絤etro.
     **/
    private function obtenerOpinionServicio($datos) {
      $idFactura = $datos['idFactura'];
      $idAutor = $datos['idAutor'];
      $opinion = DataObject::get_one('OpinionServicioBtMalaga', 'AutorID='.$idAutor.' AND FacturaID='.$idFactura);
      if ($opinion) {
        return $opinion->ID;
      } else {
        return 0;
      }  
    }
    
    /**
     * Cambia el estado de publicaci锟絥 de un componente.
     */
    private function cambiarEstadoPublicacion($datos) {
    	$idComponente = $datos['idComponente'];
    	$nuevoEstado = $datos['nuevoEstado'];
    	$componente = DataObject::get_by_id('ComponenteBtMalaga', $idComponente);
    	$componente->Publicado = $nuevoEstado;
    	$componente->write();
    	return true;
    }

    /**
     * Filta los resultados y los devuelve en formato XML.
     * No hace nada porque el formulario se envia por AJAX y se trata
     * con otra funci髇.
     **/
    public function filtrarBusqueda($datos) {
      $sql = $datos['sql'];    
      $tipoComponente = $datos['tipocomponente'];
      $records = DB::query($sql);
      $componentes = singleton($tipoComponente)->buildDataObjectSet($records);
      $objComponente = new $tipoComponente();
      $camposGrid = json_decode($objComponente->getCamposGrid());

      $haycomponentes = false;
       $documento = '<?xml version="1.0" encoding="ISO-8859-1" ?><rows>';
	  if ($componentes != null) {
	    foreach ($componentes as $componente) {
	      //if ($componente->puedeLeer()) {
		  //$componente->cargarAcciones();
              $componente->AccionVer = 'btmalaga/images/show.png^Ver^javascript:verComponente('.$componente->ID.')^_self'; 
		  $documento .= '<row id="'.$componente->ID.'">';
		  foreach($camposGrid->Campos as $campoGrid) {
		    $nombreCampo = $campoGrid->Columna;
		    $documento .= '<cell><![CDATA['.htmlentities(utf8_decode($componente->$nombreCampo)).']]></cell>';
		  }
		  $documento .= '</row>';
		//}
	    }
	  }
	$documento .= '</rows>';
	return $documento;
    }

    /**
     * Realiza el borrado logico de un componente.
     **/
    private function borradoLogico($id) {
 	$componente = DataObject::get_by_id('ComponenteBtMalaga', $id);
 	$componente->Borrado = 1;
      $componente->write();
 	return true;
    }

    /**
     * Restaura un componente borrado.
     **/
    private function restaurarComponente($id) {
 	$componente = DataObject::get_by_id('ComponenteBtMalaga', $id);
 	$componente->Borrado = 0;
      $componente->write();
      //$componente->cargarAcciones();
      //$nuevosValores = 'if (mygrid.doesRowExist('.$id.')) { ';
      //$nuevosValores .= 'mygrid.cells('.$id.', 2).setValue("'.$componente->AccionEditar.'");';
      //$nuevosValores .= 'mygrid.cells('.$id.', 3).setValue("'.$componente->AccionBorrar.'");';
      //$nuevosValores .= ' }';
      return 'irADireccionSinCargar("'.$nuevoServicio->ID.'")';
    }

}

?>
