<?php
/**
 * Usuario para la Web del Banco del Tiempo de Mï¿½laga.
 **/
class UsuarioBtMalaga extends UsuarioPicasso {

	/**
	 * Extendie los campos.
	 **/
	static $db = array(
			       'SApellido' => 'Varchar',
				 //'TipoDocumento' => "Enum('DNI,NIE', 'DNI')",
				 //'Documento' => 'Varchar(9)',
				 'Sexo' => "Enum('H,M')",
				 'Telefono' => 'Varchar(9)',
				 'Movil' => 'Varchar(9)',
				 //'FNacimiento' => 'Date',
				 'Estado' => "Enum('Pendiente,Activo,Desactivado', 'Pendiente')",
                         'TipoNotificacion' => "Enum('Alerta y Email,Alerta,Email','Alerta y Email')"
		            );
		              
	static $has_many = array(
	                         'PerfilUsuario' => 'PerfilUsuarioBtMalaga',
	                         'GruposUsuario' => 'GruposUsuarioPicasso',
	                         'SistemaUsuario' => 'SistemaUsuarioBtMalaga'
				            );		              
		              		    		        
	/**
	 * Estados del usuario.
	 **/		        
	const PENDIENTE = 'Pendiente';
	const ACTIVO = 'Activo';
	const DESACTIVADO  = 'Desactivado'; 
		

	/**
	 * Devuelve los campos para el formulario de registro.
	 **/
	public function camposFormularioRegistro() {
		$sistemaField = new ComplexTableField(
                                              $this,
                                              'Sistemas',
                                              'SistemaBtMalaga',
                                              array(
                                                    'Nombre' => 'Nombre',
                                                    'Descripcion' => 'Descripcion'
                                                   ),
                                              null,
                                              'Borrado=0'
                                             );
        $sistemaField->Markable = true;
        $sistemaField->setParentClass(false);
        $sistemaField->setPermissions(array());
        
		$fieldSet = new FieldSet(	
						 new TextField('FirstName', 'Nombre*:', $this->FirtsName),
						 new TextField('Surname', 'Primer Apellido*:', $this->Surname),
						 new TextField('SApellido', 'Segundo Apellido', $this->SApellido),
						 //new DropdownField('TipoDocumento', 'Tipo del documento de Identificaci&oacute;n', singleton('UsuarioBtMalaga')->dbObject('TipoDocumento')->enumValues()),
						 //new TextField('Documento', 'Documento de Identificaci&oacute;n', $this->Documento),
						 new DropdownField('Sexo', 'Sexo', array('' => ' ', 'H' => 'Hombre', 'M' => 'Mujer')),
						 new TextField('Telefono', 'Tel&eacute;fono fijo', $this->Telefono),
						 new TextField('Movil', 'Tel&eacute;fono movil', $this->Movil),
						 //new CalendarDateField('FNacimiento', 'Fecha de nacimiento', $this->FNacimiento),
						 new EmailField('Email', 'Email*:', $this->Email),
						 new ConfirmedPasswordField('Password','Password:*'),
						 new EtiquetaField('TextoSistemas','Sistemas disponibles*:'),
						 $sistemaField,
						 new EtiquetaField('etiqueta_obligatoria',$title='<p><small>*Datos obligatorios</small></p>')
						);

		return $fieldSet;
	}

	/**
	 * Devuelve el validador para el formulario de registro.
	 **/
	public function validadorFormularioRegistro() {
		$validator = new RegistroValidador();
		return $validator;
	}		
	
    /**
     * Devuelve el valor de los impuestos de una factura.
     **/
    public function valorImpuestoFactura($factura) {
        $valor = 0;
        if ($factura->TipoImpuestos == 'Porcentual') {
          $valor = ($factura->Precio*$factura->ValorImpuesto)/100;   
        } else {
          $valor = $factura->ValorImpuesto;
        }
        return $valor;
    }
    
   /**
    * Devuelve el credito del usuario.
    **/
   public function CreditoDisponible() {
   	$credito = 0;   	
   	$sistema = 0;
   	if (Session::get(ComponenteBtMalagaControl::SISTEMA)) {
            $sistema = Session::get(ComponenteBtMalagaControl::SISTEMA);
        }
   	$sql = "select distinct ContenidoEditable.ClassName,
	                        ContenidoEditableConPermisos.*,
				FacturaBtMalaga.Estado, 
				if (((ContenidoEditableServicio.ClassName='OfertaBtMalaga' 
				        and ContenidoEditableConPermisos.AutorID=Usuario.ID) 
					or (ContenidoEditableServicio.ClassName='DemandaBtMalaga' 
					     and ContenidoEditableConPermisos.AutorID<>Usuario.ID)),
                                      if (FacturaBtMalaga.TipoPrecio='Fijo',FacturaBtMalaga.Precio*-1,FacturaBtMalaga.Precio*FacturaBtMalaga.Horas*-1),if (FacturaBtMalaga.TipoPrecio='Fijo',FacturaBtMalaga.Precio-if(FacturaBtMalaga.TipoImpuestos='Porcentual',(FacturaBtMalaga.Precio*FacturaBtMalaga.ValorImpuesto)/100,FacturaBtMalaga.ValorImpuesto),(FacturaBtMalaga.Precio*FacturaBtMalaga.Horas)-if(FacturaBtMalaga.TipoImpuestos='Porcentual',(FacturaBtMalaga.Precio*FacturaBtMalaga.Horas*FacturaBtMalaga.ValorImpuesto)/100,FacturaBtMalaga.ValorImpuesto))) as Precio 
                                from ContenidoEditable,
				     ContenidoEditableConPermisos,
				     FacturaBtMalaga,
				     ServicioFacturaBtMalaga,
				     ServicioBtMalaga,
				     ContenidoEditable ContenidoEditableServicio,
				     OfertaBtMalaga, 
				     DemandaBtMalaga, 
				     Member Usuario 
                                where ContenidoEditable.ID=FacturaBtMalaga.ID 
				  and ContenidoEditableConPermisos.ID=ContenidoEditable.ID 
				  and ServicioFacturaBtMalaga.FacturaID=FacturaBtMalaga.ID 
				  and ServicioFacturaBtMalaga.ServicioID=ServicioBtMalaga.ID 
				  and ContenidoEditableServicio.ID=ServicioBtMalaga.ID 
				  and ((ContenidoEditableConPermisos.AutorID=Usuario.ID) 
				          or ((OfertaBtMalaga.ID=ContenidoEditableServicio.ID or DemandaBtMalaga.ID=ContenidoEditableServicio.ID) 
				  and if (ContenidoEditableServicio.ClassName='OfertaBtMalaga',OfertaBtMalaga.OfertanteID=Usuario.ID,DemandaBtMalaga.DemandanteID=Usuario.ID))) 
				  and FacturaBtMalaga.Estado='REALIZADA' 
				  and ServicioBtMalaga.SistemaID=".$sistema 
				  ." and Usuario.ID=".$this->ID;
				  
        $records = DB::query($sql);
         if ($records) {
             foreach ($records as $record) {
                 $credito += $record['Precio'];
             }
         }
     
        //por último mira las factuas en las que gana por impuestos.
        $facturasImpuestos = DataObject::get('FacturaBtMalaga','DestinatarioImpuestosID='.$this->ID." AND Estado='REALIZADA'");
        if ($facturasImpuestos) {
            foreach ($facturasImpuestos as $facturaImpuesto) {
                $servicioFactura = $facturaImpuesto->Servicio()->First();
                if ($servicioFactura->Servicio()->SistemaID == $sistema) {
                    $credito += $this->valorImpuestoFactura($facturaImpuesto);
                }
            } 
        }

        return round($credito,2);
    }
   
	/**
	 * Devuelve un array con los sistemas del usuario.
	 **/
	public function obtenerSistemas() {
	  $resultados = DB::query('SELECT DISTINCT sistema.ID, sistema.Nombre 
	                                                  FROM SistemaBtMalaga sistema, SistemaUsuarioBtMalaga susuario 
	                                                    WHERE susuario.UsuarioID = '.$this->ID.'
                                                                 AND susuario.SistemaID = sistema.ID
                                                                 AND sistema.Borrado=0');
	  $sistemas = array();
	  foreach ($resultados as $fila) {
	    $sistemas[$fila['ID']]= $fila['Nombre'];
	  }
	  return $sistemas;
	}
	
	/**
	 * Indica si el usuario pertenece al grupo de Administradores
	 */
	public function esAdministrador() {
		$es = false;
		$resultados = DB::query("SELECT DISTINCT gu.ID 
	                                    FROM GruposUsuarioPicasso gu, GrupoPicasso gp 
	                                      WHERE gp.Nombre='Administrador'
                                            AND gp.ID=gu.GrupoID
                                            AND gu.UsuarioID=".$this->ID);		
		foreach ($resultados as $resultado) {
			$es = true;
		}
		return $es;
	}
	
	/**
	 * Indica si el usuario pertenece al grupo de UsuarioActivo
	 */
	public function esUsuarioActivo() {
		$es = false;
		$resultados = DB::query("SELECT DISTINCT gu.ID 
	                                    FROM GruposUsuarioPicasso gu, GrupoPicasso gp 
	                                      WHERE gp.Nombre='UsuarioActivo'
                                            AND gp.ID=gu.GrupoID
                                            AND gu.UsuarioID=".$this->ID);		
		foreach ($resultados as $resultado) {
			$es = true;
		}
		return $es;
	}	
		
    /**
     * Indica si el usuario conectado tiene crédito para solicitar el servicio.
     */
    public function tieneCredito($precio) {
    	$tiene = false;
      $tienePerfil = false;
    	$creditoDisponible = $this->CreditoDisponible();
    	if ($creditoDisponible >= $precio) {
    		$tiene = true;
    	} else {
    		//busca si tiene un perfil de confianza
    		$perfiles = $this->PerfilUsuario();
    		if ($perfiles != null) {
    			$sistema = Session::get(ComponenteBtMalagaControl::SISTEMA);
    			foreach ($perfiles as $perfilUsuario) {
    				$perfil = $perfilUsuario->Perfil();
    				if ($perfil->SistemaID == $sistema) { 
                              $tienePerfil = true;
    					if (($perfil->Credito + $creditoDisponible) >= $precio) {
    						$tiene = true;
    					}
    					break; //sólo hay un perfil por sistema
    				}
    			}
            }
    	}
      if ((!$tiene) && (!$tienePerfil)) {
        //mira el crédito por defecto del sistema
        if (Session::get(ComponenteBtMalagaControl::SISTEMA) == null) {
          $tiene = true;
        } else {
          $sistema = DataObject::get_by_id('SistemaBtMalaga',Session::get(ComponenteBtMalagaControl::SISTEMA));
          if ($sistema->TipoCredito == 'Ilimitado') {
            $tiene = true;
          } else {
            if (($sistema->Credito + $creditoDisponible) >= $precio) {
    		  $tiene = true;
            }
    	    }
        }
      }
    	return $tiene;
    }      	
		
}  
?>
