/**
 *                                                                            
 *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
 *                                                                            
 *  All rights reserved. This program and the accompanying materials           
 *  are made available under the terms of the Eclipse Public License v1.0       
 *  which accompanies this distribution, and is available at                  
 *  http://www.eclipse.org/legal/epl-v10.html                                 
 *                                                                            
 *  Contributors:                                                      
 * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 * 
 */

import ns org.eclipse.osbp.authentication.account.entities.UserAccount
import ns org.eclipse.osbp.authentication.account.entities.UserAccountFilter

package org.eclipse.osbp.authentication.account.dtos {

	autoDto UserAccountDto wraps UserAccount {

		inheritVar id
		inheritVar email
		inheritVar userName
		inheritVar password
		inheritVar extraPassword
		inheritVar passwordReset
		inheritVar position
		inheritVar defaultPerspective
		inheritVar enabled
		inheritVar locked
		inheritVar superuser
		inheritVar supervisor
		inheritVar forcePwdChange
		inheritVar notRegistered
		inheritVar failedAttempt
		inheritVar
		successfulAttempt
		inheritVar cookieHashCode
		inheritVar localeTag
		inheritVar profileimage
		inheritVar layoutingStrategy
		inheritVar focusingStrategy
		inheritVar theme
		inheritVar printService
		inheritRef userAccountFilter mapto UserAccountFilterDto
	}

	autoDto UserAccountFilterDto wraps UserAccountFilter {

		inheritVar id
		inheritVar ^filter
		inheritVar invers
		inheritRef userAccount mapto UserAccountDto
	}
}