<?php
/**
 * Clase que define un servicio del sistema de banco del tiempo de Málaga.
 **/
class ServicioBtMalaga extends ComponenteBtMalaga {
 
    /**
     * Nombre utilizado para el parametro que identifica al autor del servicio.
     **/
    const AUTOR_SERVICIO = "usuario";
 	
    /**
     * Nombre utilizado para indicar que existe un servicio ya seleccionado.
     **/
    const SERVICIO_SELECCIONADO = "servicioSeleccionado";
 	
    //campos del contenido.
    static $db = array(
                       'Titulo' => 'Text',
 	                 'Descripcion' => 'Text',
 	                 'Borrado' => 'Boolean', //por defecto es 0
 	                 'Publicado' => 'Boolean',
 	                 'EstadoNotificacion' => "Enum('NUEVO,NOTIFICADONUEVO,MODIFICADO,NOTIFICADOMODIFICADO','NUEVO')",
                       'TipoPrecio' => "Enum('PorHoras,Fijo,Aconvenir','Aconvenir')",
                       'Precio' => 'Float' 
                      );
 	                                  					  
    static $has_many = array(
	                     'Imagen' => 'ImagenBtMalaga'
			    );
				                       
    static $has_one = array(
	                    'Sistema' => 'SistemaBtMalaga',
	                    'Categoria' => 'CategoriaServicioBtMalaga'
                           );				                       
 	                                  
    public $AccionPedirServicio;
    public $DescripcionFormateada;
    public $AccionPublicar;
    
    /**
     * Almacena la categoria de un servicio.
     **/
    private $categoriaServicio;
    
    /**
     * Almacena el componente usuario.
     **/
    private $componenteUsuario;
    
    /**
     * Indica el autor del servicio.
     **/
    private $autorServicio;

    function __construct($record = null, $isSingleton = false) {
	parent::__construct($record, $isSingleton);
        if (strlen($this->Descripcion) > 50) {
     	    $this->DescripcionFormateada = substr($this->Descripcion, 0, 47).'...';
     	} else {
     	    $this->DescripcionFormateada = $this->Descripcion;
     	}
    }		

    /**
     * Función que indica los campos para poner en el grid de listado.
     * Nota: debe ser sobreescrito por cada componentes.
     **/
    protected function camposGrid() {
        $resultado = parent::camposGrid();
	//$resultado .= '{"Nombre": "", "Columna":"AccionPublicar", "Ordenacion":"na", "Tipo":"img", "Tamano":20, "Filtro":"&nbsp;", "Alineacion":"left"},';
	//$resultado .= '{"Nombre": "", "Columna":"AccionPedirServicio", "Ordenacion":"na", "Tipo":"img", "Tamano":20, "Filtro":"&nbsp;", "Alineacion":"left"},';		
	$resultado .= '{"Nombre": "T&iacute;tulo", "Columna":"Titulo", "Ordenacion":"str", "Tipo":"ro", "Tamano":200, "Filtro":"#text_filter", "Alineacion":"left"},';
	$resultado .= '{"Nombre": "Descripci&oacute;n", "Columna":"DescripcionFormateada", "Ordenacion":"str", "Tipo":"ro", "Tamano":"*", "Filtro":"#text_filter", "Alineacion":"left"}';
	return $resultado;
    }
	
    /**
     * Función que devuelve los campos para editar
     * el contenido en modo principal.
     **/
    protected function cargarEdicionPrincipal() {
        $pestanasEditable = parent::cargarEdicionPrincipal();       
        
        //Categoria del servicio.
        $categorias = DataObject::get('CategoriaServicioBtMalaga');
        $mapaCategorias = $categorias->toDropdownMap('ID', 'Texto', ' ', true);
        $fieldCategorias = new DropdownField('CategoriaID', 'Categoria:', $mapaCategorias, $this->CategoriaID);
	  $campoCategoria = new CampoEditable();
	  $campoCategoria->setNombre('Categoria');
	  $campoCategoria->setField($fieldCategorias);
	  $pestanasEditable->add("Contenido", $campoCategoria);	

        //Titulo del contenido.
	  $campoTitulo = new CampoEditable();
	  $campoTitulo->setNombre('T&iacute;tulo');
	  $campoTitulo->setField(new TextField('Titulo', 'Titulo', $this->Titulo));
	  $campoTitulo->setValidador(new CampoRequeridoValidador());
	  $pestanasEditable->add("Contenido", $campoTitulo);

	  //Descripción del contenido.
	  $campoDescripcion = new CampoEditable();
	  $campoDescripcion->setNombre('Descripci&oacute;n');
	  $campoDescripcion->setField(new TextareaField('Descripcion', 'Descripcion', 8, 3, $this->Descripcion));
	  $campoDescripcion->setValidador(new CampoRequeridoValidador());
	  $pestanasEditable->add('Contenido', $campoDescripcion);

        //Tipo del precio
        $campoTipoPrecio = new CampoEditable();
        $campoTipoPrecio->setNombre('Tipo del precio');
        $grupoSeleccion = new OptionsetField($name = "TipoPrecio",
                                             $title = "TipoPrecio",
                                             $source = array(
                                                             "PorHoras" => "Por horas",
                                                             "Fijo" => "Fijo",
                                                             "Aconvenir" => "A convenir"
                                                            ),
                                             $value = $this->TipoPrecio
                                            );
        $grupoSeleccion->value = $this->TipoPrecio;
        $campoTipoPrecio->setField($grupoSeleccion);
	  $pestanasEditable->add('Contenido', $campoTipoPrecio);

        //Precio del servicio.
        $nombreMoneda = '';
        if (($sistema = Session::get(ComponenteBtMalagaControl::SISTEMA)) != null) {
        	$objSistema = DataObject::get_by_id('SistemaBtMalaga',$sistema);
            $nombreMoneda = ' ('.$objSistema->TipoMoneda()->SimboloPlural.')';
        }
	  $campoPrecio = new CampoEditable();
	  $campoPrecio->setNombre('Precio'.$nombreMoneda);
	  $campoPrecio->setField(new TextField('Precio', 'Precio', $this->Precio));
	  $campoPrecio->setValidador(new NumeroValidador());
	  $pestanasEditable->add('Contenido', $campoPrecio);
	
        //Imágenes.
        $campoImagen = new CampoEditable();
        $campoImagen->setNombre('Imagen');
        $campoImagen->setMinOccurs(0);
	  $campoImagen->setMaxOccurs('unbounded');
	  $campoImagen->setSubCampos($this->Imagen());
	  $campoImagen->setTipoSubCampos('ImagenBtMalaga');
	  $campoImagen->setCampoSubCampos('Imagen');
	  $campoImagen->setPonerHeredados(false);
        $pestanasEditable->add("Contenido",$campoImagen);
        
	if (($sistema = Session::get(ComponenteBtMalagaControl::SISTEMA)) == null) {
  	    //Sistema.
	    $columnasSistema = '{"Campos":[{"Nombre": "", "Columna":"Seleccionado", "Ordenacion":"na", "Tipo":"ra", "Tamano":20, "Filtro":"&nbsp;", "Alineacion":"left"},
	                                   {"Nombre": "Nombre", "Columna":"Nombre", "Ordenacion":"str", "Tipo":"ro", "Tamano":180, "Filtro":"#text_filter", "Alineacion":"left"},
                                           {"Nombre": "Descripci&oacute;n", "Columna":"Descripcion", "Ordenacion":"str", "Tipo":"ro", "Tamano":"*", "Filtro":"#text_filter", "Alineacion":"left"}
                                          ]}';
            $sistemas = DataObject::get('SistemaBtMalaga', 'Borrado=0');
	    $sistemaField = new DataGridField('SistemaID',
	                                      $columnasSistema,
                                              $sistemas,
	                                      $this->SistemaID
	                                     );     
            $campoSistema = new CampoEditable();
            $campoSistema->setNombre('Sistema');
            $campoSistema->setField($sistemaField);
            $campoSistema->setValidador(new ReferenciaRequeridaValidador());
            $pestanasEditable->add('Sistema', $campoSistema);
        } else {
	    $campoSistema = new CampoEditable();
	    $campoSistema->setNombre('Sistema');
	    $campoSistema->setField(new HiddenField('SistemaID', 'SistemaID', $sistema));
	    $campoSistema->setVisible(false);
	    $pestanasEditable->add('Contenido', $campoSistema);                        
        }        
	
        return $pestanasEditable;
    }
    
    /**
     * Asigna las acciones al control. Esto no funciona en el constructor y por 
     * tanto se pone en una función aparte que se llama al cargar los contenidos
     * en el DataGrid.
     **/
    public function cargarAcciones() {    	
        //parent::cargarAcciones();      	
	$this->AccionVer = 'btmalaga/images/show.png^Ver^javascript:verComponente('.$this->ID.')^_self'; 

        $usuario = $this->obtenerUsuarioConectado();
        if (($this->Borrado) || ((($this->AutorID == $usuario->ID) || (!$this->Publicado)) || (!$this->tieneCredito()))) {
            $this->AccionPedirServicio ='btmalaga/images/peticionserviciodisabled.png^Solicitar servicio';
        } else {
     	    $this->AccionPedirServicio ='btmalaga/images/peticionservicio.png^Solicitar servicio^javascript:solicitarServicio('.$this->ID.')^_self';
     	}

     	//si existe una factura asociada al servicio ya no se puede editar ni borrar.
     	$facturasAsociadas = DataObject::get('ServicioFacturaBtMalaga', 'ServicioID='.$this->ID);
     	if (($facturasAsociadas != null) && ($facturasAsociadas->Count() > 0)) {
     	    if ($this->puedeEscribir()) {
              if ($this->Borrado) {
  	          $this->AccionBorrar = 'btmalaga/images/accept-icon.png^Restaurar^javascript:restaurarComponente('.$this->ID.')^_self';
	          $this->AccionEditar = 'btmalaga/images/copy-icondisabled.png^Clonar servicio';		
              } else {
  	          $this->AccionBorrar = 'btmalaga/images/remove-icon.png^Borrar^javascript:borradoLogicoComponente('.$this->ID.')^_self';
                $this->AccionEditar = 'btmalaga/images/copy-icon.png^Clonar servicio^javascript:clonarServicio('.$this->ID.')^_self';		              
              }
            } else {
	        $this->AccionEditar = 'btmalaga/images/copy-icondisabled.png^Clonar servicio';		
	        $this->AccionBorrar = 'btmalaga/images/remove-icondisabled.png^Quitar servicio';
            }  
     	} else {
     	    if ($this->puedeEscribir()) {
	        $this->AccionEditar = 'btmalaga/images/edit.gif^Editar^javascript:editarComponente('.$this->ID.')^_self';
		$this->AccionBorrar = 'btmalaga/images/delete.gif^Borrar^javascript:borrarComponente('.$this->ID.')^_self';
            } else {
	        $this->AccionEditar = 'btmalaga/images/editdisabled.gif^Editar';		
		$this->AccionBorrar = 'btmalaga/images/deletedisabled.gif^Borrar';
            }	      
     	}

     	//para publicar un servicio.
     	if ((!$this->Borrado) && ($this->puedePublicar())) {
     	    if ($this->Publicado) {	
                $this->AccionPublicar = 'btmalaga/images/button-turn-off-icon.png^Despublicar^javascript:cambiarEstadoPublicacion('.$this->ID.',0)^_self';             
     	    } else {
   	        $this->AccionPublicar = 'btmalaga/images/button-reload-icon.png^Publicar^javascript:cambiarEstadoPublicacion('.$this->ID.',1)^_self';     	   
     	    }       	 	
     	} else {
     	    if ($this->Publicado) {
     	        $this->AccionPublicar = 'btmalaga/images/button-turn-off-icondisabled.png^Despublicar';
            } else {
     	        $this->AccionPublicar = 'btmalaga/images/button-reload-icondisabled.png^Publicar';	
            }
     	}
    }
      
    /**
     * Función para clonar un servicio.
     * Nota: debe ser sobreescrito por cada hijo.
     **/
    public function clonarServicio() {
    	return $this->duplicate(false);
    }
     
    /**
     * Sobreescribe el borrado para quitar las imágenes.
     **/
    public function borrar() {
        $imagenes = $this->Imagen(); 
        foreach ($imagenes as $imagen) {
            $imagen->delete();
        }
       parent::borrar();
    }
     
    /**
     * Devuelve el código par ver el componente.
     **/	
    protected function CodigoVer() {
        Requirements::css('btmalaga/javascript/jsparty/popeye/css/jquery.popeye.css');
        Requirements::css('btmalaga/javascript/jsparty/popeye/css/jquery.popeye.style.css');
        Requirements::javascript('btmalaga/javascript/jsparty/popeye/lib/jquery.min.js');
        Requirements::javascript('btmalaga/javascript/jsparty/popeye/lib/jquery.popeye-1.0.min.js');
        return $this->renderWith('PlantillaVerServicio');
    }
    
    /**
     * Sobreescribe la función guardar para tratar el envio de 
     * notificaciones en todos los servicios y además poner
     * el valor publicado a false cada vez que se cambie su valor.
     */
    public function guardar($datos) {
    	//cambia el estado de la notificación en caso de requerirlo.
    	if (((($this->EstadoNotificacion == 'NOTIFICADONUEVO') || ($this->EstadoNotificacion == 'NOTIFICADOMODIFICADO'))) && ($this->Publicado)) {
    	    $this->EstadoNotificacion = 'MODIFICADO';
    	}
    	
    	//despublica el servicio.
    	$this->Publicado = false;
    	
    	//sigue guardando.
    	parent::guardar($datos);
    }
    
    /**
     * Clase que devuelve los botones para el toolbar.
     * Nota: debe ser sobreescrito por cada componente.
     **/
    public function botonesToolbar() {
        $xml = parent::botonesToolbar();
        $xml .= '<item id="solicitar#'.$this->ID.'" type="button" text="Solicitar" img="btmalaga/images/peticionservicio.png" imgdis="btmalaga/images/peticionserviciodisabled.png"';
	$usuario = $this->obtenerUsuarioConectado();
        if ((($this->AutorID == $usuario->ID) || (!$this->Publicado)) || (!$this->tieneCredito())) {
            $xml .= ' enabled="false"';
     	}        
        $xml .= '></item>';

        //si existe una factura asociada al servicio ya no se puede editar ni borrar.
     	$facturasAsociadas = DataObject::get('ServicioFacturaBtMalaga', 'ServicioID='.$this->ID);
     	if (($facturasAsociadas != null) && ($facturasAsociadas->Count() > 0)) {
     	    if ($this->puedeEscribir()) {
              if ($this->Borrado) {
                  $xml .= '<item id="restaurar#'.$this->ID.'" type="button" text="Restaurar" img="btmalaga/images/accept-icon.png" imgdis="btmalaga/images/accept-icondisabled.png"></item>';		        
              } else {
                  $xml .= '<item id="clonar#'.$this->ID.'" type="button" text="Clonar" img="btmalaga/images/copy-icon.png" imgdis="btmalaga/images/copy-icondisabled.png"></item>';		        
                  $xml .= '<item id="borradoLogico#'.$this->ID.'" type="button" text="Borrar" img="btmalaga/images/remove-icon.png" imgdis="btmalaga/images/remove-icondisabled.png"></item>';		        
              }
            } else {
                  $xml .= '<item id="clonar#'.$this->ID.'" type="button" text="Clonar" img="btmalaga/images/copy-icon.png" imgdis="btmalaga/images/copy-icondisabled.png" enabled="false"></item>';		        
                  $xml .= '<item id="borradoLogico#'.$this->ID.'" type="button" text="Borrar" img="btmalaga/images/remove-icon.png" imgdis="btmalaga/images/remove-icondisabled.png" enabled="false"></item>';		        
            }  
     	} else {
     	    if ($this->puedeEscribir()) {
                $xml .= '<item id="editar#'.$this->ID.'" type="button" text="Editar" img="btmalaga/images/edit.gif" imgdis="btmalaga/images/editdisabled.gif"></item>';		        
                $xml .= '<item id="borrar#'.$this->ID.'" type="button" text="Borrar" img="btmalaga/images/delete.gif" imgdis="btmalaga/images/deletedisabled.gif"></item>';		        
            } else {
	        $xml .= '<item id="editar#'.$this->ID.'" type="button" text="Editar" img="btmalaga/images/edit.gif" imgdis="btmalaga/images/editdisabled.gif" enabled="false"></item>';		        
                $xml .= '<item id="borrar#'.$this->ID.'" type="button" text="Editar" img="btmalaga/images/delete.gif" imgdis="btmalaga/images/deletedisabled.gif" enabled="false"></item>';		        
            }	      
     	}
                
        //botón para publicar.
	if ((!$this->Borrado) && ($this->puedePublicar())) {           	    	
     	    if ($this->Publicado) {	
                $xml .= '<item id="despublicar#'.$this->ID.'" type="button" text="Despublicar" img="btmalaga/images/button-turn-off-icon.png"';            
     	    } else {
     	    $xml .= '<item id="publicar#'.$this->ID.'" type="button" text="Publicar" img="btmalaga/images/button-reload-icon.png"';     	   
        }       	 	
        $xml .= '></item>';
	}
        
        return $xml;
    }    
    
    /**
     * Indica si el usuario conectado tiene crédito para solicitar el servicio.
     **/
    public function tieneCredito() {
    	return true;
    }        
     
    /**
     * Devuelve los campos para el formulario para el filtrado de datos.
     **/
    public function formularioFiltroTodos() {
        if (($sistema = Session::get(ComponenteBtMalagaControl::SISTEMA)) != null) {
            $fieldSistema = new HiddenField('Sistema','Sistema',$sistema);
        } else {
            $sistemas = DataObject::get('SistemaBtMalaga');
            if ($sistemas) {
	        $sistemas = $sistemas->toDropdownMap('ID', 'Nombre', ' ', true);
                $fieldSistema = new DropdownField('Sistema', 'Sistema:', $sistemas);
	    }
        }
        $estadosPublicacion = array('' => ' ',
                                    '0' => 'No publicada',
                                    '1' => 'Publicada'
                                   );
        $fieldEstados = new DropdownField('EstadoPublicacion','Estado de publicaci&oacute;n:',$estadosPublicacion);      
        $categorias = DataObject::get('CategoriaServicioBtMalaga');
        if ($categorias) {
          $categorias = $categorias->toDropdownMap('ID', 'Texto', ' ', true);
          $fieldCategorias = new DropdownField('Categoria', 'Categoria:', $categorias);
        }
        $fields = new FieldSet($fieldSistema,
                               $fieldCategorias,
                               $fieldEstados,                               
                               new CalendarDateField('FCreacionAntes', 'Creada antes de:', ''),
                               new CalendarDateField('FCreacionDespues', 'Creada desp&uacute;es de:', '')
                              );
        return $fields;
    }

    /**
     * Devuelve los campos para el formulario para el filtrado de datos.
     **/
    public function formularioFiltro() {
        if (($sistema = Session::get(ComponenteBtMalagaControl::SISTEMA)) != null) {
            $fieldSistema = new HiddenField('Sistema','Sistema',$sistema);
        } else {
            $sistemas = DataObject::get('SistemaBtMalaga');
            if ($sistemas) {
	        $sistemas = $sistemas->toDropdownMap('ID', 'Nombre', ' ', true);
                $fieldSistema = new DropdownField('Sistema', 'Sistema:', $sistemas);
	    }
        }
        $categorias = DataObject::get('CategoriaServicioBtMalaga');
        if ($categorias) {
          $categorias = $categorias->toDropdownMap('ID', 'Texto', ' ', true);
          $fieldCategorias = new DropdownField('Categoria', 'Categoria:', $categorias);
        }        
        $fields = new FieldSet($fieldSistema,
                               $fieldCategorias,
                               new CalendarDateField('FCreacionAntes', 'Creada antes de:', ''),
                               new CalendarDateField('FCreacionDespues', 'Creada desp&uacute;es de:', '')
                              );
        return $fields;
    }
    
    /**
     * Devuelve los campos para el formulario para el filtrado de datos por usuario.
     **/
    public function formularioFiltroUsuario() {
        $this->variablePuedeEditarEnListado = true;
        $usuario = $this->obtenerUsuarioConectado();
        $this->autorServicio = $usuario;
        if (($sistema = Session::get(ComponenteBtMalagaControl::SISTEMA)) != null) {
            $fieldSistema = new HiddenField('Sistema','Sistema',$sistema);
        } else {
            $sistemas = DataObject::get('SistemaBtMalaga');
            if ($sistemas) {
	        $sistemas = $sistemas->toDropdownMap('ID', 'Nombre', ' ', true);
                $fieldSistema = new DropdownField('Sistema', 'Sistema:', $sistemas);
	    }
        }
        $estadosPublicacion = array('' => ' ',
                                    '0' => 'No publicada',
                                    '1' => 'Publicada'
                                   );
        $fieldEstados = new DropdownField('EstadoPublicacion','Estado de publicaci&oacute;n:',$estadosPublicacion);      
        $categorias = DataObject::get('CategoriaServicioBtMalaga');
        $mapaCategorias = $categorias->toDropdownMap('ID', 'Texto', ' ', true);
        $fieldCategoria = new DropdownField('Categoria', 'Categoria', $mapaCategorias);

        $fields = new FieldSet($fieldSistema,
                               $fieldCategoria,
                               $fieldEstados,
                               new CalendarDateField('FCreacionAntes', 'Creada antes de:', ''),
                               new CalendarDateField('FCreacionDespues', 'Creada desp&uacute;es de:', ''),
                               new HiddenField('Autor', 'Autor', $usuario->ID)
                              );
        return $fields;
    }    
    
    /**
     * Devuelve los parametros para el listado.
     **/
    public function parametrosListado() {
        $parametros = '';
        if ($this->autorServicio) {
            $parametros = '&'.ServicioBtMalaga::AUTOR_SERVICIO.'='.$this->autorServicio->ID;
        }
        return $parametros;
    }
    
    /**
     * Devuelve la categoria del servicio.
     **/
    public function CategoriaServicio() {
        if (!$this->categoriaServicio) {
            $this->categoriaServicio = DataObject::get_by_id('CategoriaServicioBtMalaga',$this->CategoriaID);
        }
        return $this->categoriaServicio;
    }
    
    /**
     * Devuelve el componente usuario.
     **/
    public function ComponenteUsuario() {
        return $this->componenteUsuario;
    }
    
    public function setComponenteUsuario($componente) {
        $this->componenteUsuario = $componente;
    }

    public function TipoPrecioAMostar() {
        $resultado = '';
        if ($this->TipoPrecio == 'Fijo') {
            $resultado = ', precio fijo';
        } else if ($this->TipoPrecio == 'PorHoras') {
            $resultado = ' por hora';
        } else {
            $resultado = ' a convenir';
        }
        return $resultado;
    }
 	                                  
 }
?>
