/*
jBilling - The Enterprise Open Source Billing System
Copyright (C) 2003-2011 Enterprise jBilling Software Ltd. and Emiliano Conde
This file is part of jbilling.
jbilling is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
jbilling is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with jbilling. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sapienter.jbilling.server.user.db;
import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.TableGenerator;
import javax.persistence.Transient;
import javax.persistence.Version;
import com.sapienter.jbilling.server.invoice.db.InvoiceDTO;
import com.sapienter.jbilling.server.notification.db.NotificationMessageArchDTO;
import com.sapienter.jbilling.server.order.db.OrderDTO;
import com.sapienter.jbilling.server.payment.db.PaymentDTO;
import com.sapienter.jbilling.server.user.ContactBL;
import com.sapienter.jbilling.server.user.contact.db.ContactDTO;
import com.sapienter.jbilling.server.user.partner.db.Partner;
import com.sapienter.jbilling.server.user.permisson.db.PermissionUserDTO;
import com.sapienter.jbilling.server.user.permisson.db.RoleDTO;
import com.sapienter.jbilling.server.util.audit.db.EventLogDTO;
import com.sapienter.jbilling.server.util.csv.Exportable;
import com.sapienter.jbilling.server.util.db.CurrencyDTO;
import com.sapienter.jbilling.server.util.db.LanguageDTO;
import org.hibernate.annotations.Cascade;
@Entity
@TableGenerator(
name="base_user_GEN",
table="jbilling_seqs",
pkColumnName = "name",
valueColumnName = "next_id",
pkColumnValue="base_user",
allocationSize = 10
)
// No cache, mutable and critical
@Table(name = "base_user")
public class UserDTO implements Serializable, Exportable {
private int id;
private String userName;
private String password;
private int deleted;
boolean enabled = true;
boolean accountExpired = false;
boolean accountLocked = false;
boolean passwordExpired = false;
private Date createDatetime;
private Date lastStatusChange;
private Date lastLogin;
private int failedAttempts;
private Set<RoleDTO> roles = new HashSet<RoleDTO>(0);
private Set<PermissionUserDTO> permissions = new HashSet<PermissionUserDTO>(0);
private CurrencyDTO currencyDTO;
private CompanyDTO company;
private SubscriberStatusDTO subscriberStatus;
private UserStatusDTO userStatus;
private LanguageDTO language;
private CustomerDTO customer;
private ContactDTO contact;
private Partner partnersForUserId;
private int versionNum;
private Set<PaymentDTO> payments = new HashSet<PaymentDTO>(0);
private Set<AchDTO> achs = new HashSet<AchDTO>(0);
private Set<Partner> partnersForRelatedClerk = new HashSet<Partner>(0);
private Set<OrderDTO> purchaseOrdersForCreatedBy = new HashSet<OrderDTO>(0);
private Set<OrderDTO> orders = new HashSet<OrderDTO>(0);
private Set<CreditCardDTO> creditCards = new HashSet<CreditCardDTO>(0);
private Set<NotificationMessageArchDTO> notificationMessageArchs = new HashSet<NotificationMessageArchDTO>(0);
private Set<EventLogDTO> eventLogs = new HashSet<EventLogDTO>(0);
private Set<InvoiceDTO> invoices = new HashSet<InvoiceDTO>(0);
public UserDTO() {
}
public UserDTO(int id) {
this.id = id;
}
public UserDTO(int id, short deleted, Date createDatetime, int failedAttempts) {
this.id = id;
this.deleted = deleted;
this.createDatetime = createDatetime;
this.failedAttempts = failedAttempts;
}
public UserDTO(int id, CurrencyDTO currencyDTO, CompanyDTO entity, SubscriberStatusDTO subscriberStatus,
UserStatusDTO userStatus, LanguageDTO language, String password, short deleted, Date createDatetime,
Date lastStatusChange, Date lastLogin, String userName, int failedAttempts, Set<PaymentDTO> payments,
Set<AchDTO> achs, Set<PermissionUserDTO> permissionUsers,
Set<Partner> partnersForRelatedClerk, CustomerDTO customer, Partner partnersForUserId,
Set<OrderDTO> purchaseOrdersForCreatedBy, Set<OrderDTO> purchaseOrdersForUserId,
Set<CreditCardDTO> creditCards, Set<NotificationMessageArchDTO> notificationMessageArchs, Set<RoleDTO> roles,
Set<EventLogDTO> eventLogs, Set<InvoiceDTO> invoices) {
this.id = id;
this.currencyDTO = currencyDTO;
this.company = entity;
this.subscriberStatus = subscriberStatus;
this.userStatus = userStatus;
this.language = language;
this.password = password;
this.deleted = deleted;
this.createDatetime = createDatetime;
this.lastStatusChange = lastStatusChange;
this.lastLogin = lastLogin;
this.userName = userName;
this.failedAttempts = failedAttempts;
this.payments = payments;
this.achs = achs;
this.permissions = permissionUsers;
this.partnersForRelatedClerk = partnersForRelatedClerk;
this.customer = customer;
this.partnersForUserId = partnersForUserId;
this.purchaseOrdersForCreatedBy = purchaseOrdersForCreatedBy;
this.orders = purchaseOrdersForUserId;
this.creditCards = creditCards;
this.notificationMessageArchs = notificationMessageArchs;
this.roles = roles;
this.eventLogs = eventLogs;
this.invoices = invoices;
}
public UserDTO(UserDTO another) {
setId(another.getId());
setCurrency(another.getCurrency());
setCompany(another.getCompany());
setSubscriberStatus(another.getSubscriberStatus());
setUserStatus(another.getUserStatus());
setLanguage(another.getLanguage());
setPassword(another.getPassword());
setDeleted(another.getDeleted());
setCreateDatetime(another.getCreateDatetime());
setLastStatusChange(another.getLastStatusChange());
setLastLogin(another.getLastLogin());
setUserName(another.getUserName());
setFailedAttempts(another.getFailedAttempts());
setCustomer(another.getCustomer());
setPartner(another.getPartner());
setPayments(another.getPayments());
setAchs(another.getAchs());
setPermissions(another.getPermissions());
setPartnersForRelatedClerk(another.getPartnersForRelatedClerk());
setPurchaseOrdersForCreatedBy(another.getPurchaseOrdersForCreatedBy());
setOrders(another.getOrders());
setCreditCards(another.getCreditCards());
setNotificationMessageArchs(another.getNotificationMessageArchs());
setRoles(another.getRoles());
setEventLogs(another.getEventLogs());
setInvoices(another.getInvoices());
}
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "base_user_GEN")
@Column(name = "id", unique = true, nullable = false)
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
@Transient
public Integer getUserId() {
return id;
}
@Column(name = "user_name", length = 50)
public String getUserName() {
return this.userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@Column(name = "password", length = 40)
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
/**
* Returns 1 if this user is deleted, 0 if they are active.
* @return is user deleted
*/
@Column(name = "deleted", nullable = false)
public int getDeleted() {
return this.deleted;
}
public void setDeleted(int deleted) {
this.deleted = deleted;
}
/**
* Returns true if this user is enabled and not deleted.
*
* todo: enabled flag is transient, field currently only exists for Spring Security integration
*
* @return true if user enabled
*/
@Transient
public boolean isEnabled() {
return enabled && deleted == 0;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
/**
* Returns true if this user's account is expired.
*
* todo: expired flag is transient, field currently only exists for Spring Security integration
*
* @return true if user expired
*/
@Transient
public boolean isAccountExpired() {
return accountExpired;
}
public void setAccountExpired(boolean accountExpired) {
this.accountExpired = accountExpired;
}
/**
* Returns true if this user's account has been locked, either by a system administrator
* or by too many failed log-in attempts.
*
* todo: locked flag is transient, field currently only exists for Spring Security integration
*
* @return true if user is locked
*/
@Transient
public boolean isAccountLocked() {
return accountLocked;
}
public void setAccountLocked(boolean accountLocked) {
this.accountLocked = accountLocked;
}
/**
* Returns true if the users password has expired.
*
* todo: expired flag is transient, field currently only exists for Spring Security integration
*
* @return true if password has expired
*/
@Transient
public boolean isPasswordExpired() {
return passwordExpired;
}
public void setPasswordExpired(boolean passwordExpired) {
this.passwordExpired = passwordExpired;
}
@Column(name = "create_datetime", nullable = false, length = 29)
public Date getCreateDatetime() {
return this.createDatetime;
}
public void setCreateDatetime(Date createDatetime) {
this.createDatetime = createDatetime;
}
@Column(name = "last_status_change", length = 29)
public Date getLastStatusChange() {
return this.lastStatusChange;
}
public void setLastStatusChange(Date lastStatusChange) {
this.lastStatusChange = lastStatusChange;
}
@Column(name = "last_login", length = 29)
public Date getLastLogin() {
return this.lastLogin;
}
public void setLastLogin(Date lastLogin) {
this.lastLogin = lastLogin;
}
@Column(name = "failed_attempts", nullable = false)
public int getFailedAttempts() {
return this.failedAttempts;
}
public void setFailedAttempts(int failedAttempts) {
this.failedAttempts = failedAttempts;
}
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "user_role_map",
joinColumns = {@JoinColumn(name = "user_id", updatable = false)},
inverseJoinColumns = {@JoinColumn(name = "role_id", updatable = false)})
public Set<RoleDTO> getRoles() {
return this.roles;
}
public void setRoles(Set<RoleDTO> roles) {
this.roles = roles;
}
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "baseUser")
public Set<PermissionUserDTO> getPermissions() {
return this.permissions;
}
public void setPermissions(Set<PermissionUserDTO> permissionUsers) {
this.permissions = permissionUsers;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "currency_id")
public CurrencyDTO getCurrency() {
return this.currencyDTO;
}
public void setCurrency(CurrencyDTO currencyDTO) {
this.currencyDTO = currencyDTO;
}
@Transient
public Integer getCurrencyId() {
if (getCurrency() == null) {
return null;
}
return getCurrency().getId();
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "entity_id")
public CompanyDTO getCompany() {
return this.company;
}
public void setCompany(CompanyDTO entity) {
this.company = entity;
}
@Transient
public CompanyDTO getEntity() {
return getCompany();
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "subscriber_status")
public SubscriberStatusDTO getSubscriberStatus() {
return this.subscriberStatus;
}
public void setSubscriberStatus(SubscriberStatusDTO subscriberStatus) {
this.subscriberStatus = subscriberStatus;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "status_id")
public UserStatusDTO getUserStatus() {
return this.userStatus;
}
public void setUserStatus(UserStatusDTO userStatus) {
this.userStatus = userStatus;
}
@Transient
public UserStatusDTO getStatus() {
return getUserStatus();
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "language_id")
public LanguageDTO getLanguage() {
return this.language;
}
public void setLanguage(LanguageDTO language) {
this.language = language;
}
@Transient
public Integer getLanguageIdField() {
if (getLanguage() == null) {
return getEntity().getLanguageId();
}
return getLanguage().getId();
}
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "baseUser")
public Set<PaymentDTO> getPayments() {
return this.payments;
}
public void setPayments(Set<PaymentDTO> payments) {
this.payments = payments;
}
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "baseUser")
public Set<AchDTO> getAchs() {
return this.achs;
}
public void setAchs(Set<AchDTO> achs) {
this.achs = achs;
}
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "baseUserByRelatedClerk")
public Set<Partner> getPartnersForRelatedClerk() {
return this.partnersForRelatedClerk;
}
public void setPartnersForRelatedClerk(Set<Partner> partnersForRelatedClerk) {
this.partnersForRelatedClerk = partnersForRelatedClerk;
}
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "baseUser")
public CustomerDTO getCustomer() {
return this.customer;
}
public void setCustomer(CustomerDTO customer) {
this.customer = customer;
}
/**
* Convenience mapping for the users primary contact. This association is read-only and
* will not persist or update the users stored contact. use {@link ContactBL} instead.
*
* @return users primary contact
*/
@OneToOne(fetch = FetchType.LAZY, mappedBy = "baseUser")
public ContactDTO getContact() {
return contact;
}
public void setContact(ContactDTO contact) {
this.contact = contact;
}
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "baseUser")
public Partner getPartner() {
return this.partnersForUserId;
}
public void setPartner(Partner partnersForUserId) {
this.partnersForUserId = partnersForUserId;
}
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "baseUserByCreatedBy")
public Set<OrderDTO> getPurchaseOrdersForCreatedBy() {
return this.purchaseOrdersForCreatedBy;
}
public void setPurchaseOrdersForCreatedBy(Set<OrderDTO> purchaseOrdersForCreatedBy) {
this.purchaseOrdersForCreatedBy = purchaseOrdersForCreatedBy;
}
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "baseUserByUserId")
public Set<OrderDTO> getOrders() {
return this.orders;
}
public void setOrders(Set<OrderDTO> purchaseOrdersForUserId) {
this.orders = purchaseOrdersForUserId;
}
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "user_credit_card_map",
joinColumns = {@JoinColumn(name = "user_id", updatable = false)},
inverseJoinColumns = {@JoinColumn(name = "credit_card_id", updatable = false)}
)
public Set<CreditCardDTO> getCreditCards() {
return this.creditCards;
}
public void setCreditCards(Set<CreditCardDTO> creditCards) {
this.creditCards = creditCards;
}
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "baseUser")
public Set<NotificationMessageArchDTO> getNotificationMessageArchs() {
return this.notificationMessageArchs;
}
public void setNotificationMessageArchs(Set<NotificationMessageArchDTO> notificationMessageArchs) {
this.notificationMessageArchs = notificationMessageArchs;
}
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "baseUser")
public Set<EventLogDTO> getEventLogs() {
return this.eventLogs;
}
public void setEventLogs(Set<EventLogDTO> eventLogs) {
this.eventLogs = eventLogs;
}
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "baseUser")
public Set<InvoiceDTO> getInvoices() {
return this.invoices;
}
public void setInvoices(Set<InvoiceDTO> invoices) {
this.invoices = invoices;
}
@Version
@Column(name = "OPTLOCK")
public Integer getVersionNum() {
return versionNum;
}
public void setVersionNum(Integer versionNum) {
this.versionNum = versionNum;
}
@Override
public String toString() {
/* Avoid lazy loaded fields to prevent a LazyInitializationException
when printing users outside of the initial transaction. */
return "UserDTO{"
+ "id=" + id
+ ", userName='" + userName + '\''
+ '}';
}
public void touch() {
// touch
if (getCustomer() != null) {
getCustomer().getTotalSubAccounts();
if (getCustomer().getParent() != null) {
getCustomer().getParent().getBaseUser().getId();
}
}
if (getPartner() != null) {
getPartner().touch();
}
}
@Transient
public String[] getFieldNames() {
return new String[] {
"id",
"userName",
"password",
"status",
"subscriberStatus",
"deleted",
"accountExpired",
"accountLocked",
"passwordExpired",
"lastLogin",
"lastStatusChange",
"createdDateTime",
"language",
"currency",
// customer
"invoiceDeliveryMethod",
"autoPaymentType",
"notes",
"parentUserId",
"isParent",
"invoiceIfChild",
"excludeAging",
"balanceType",
"dynamicBalance",
"creditLimit",
"autoRecharge",
// contact
"organizationName",
"title",
"firstName",
"lastName",
"initial",
"address1",
"address2",
"city",
"stateProvince",
"postalCode",
"countryCode",
"phoneNumber",
"faxNumber",
"email"
};
}
@Transient
public Object[][] getFieldValues() {
ContactBL contactBL = new ContactBL();
contactBL.set(id);
ContactDTO contact = contactBL.getEntity();
return new Object[][] {
{
id,
userName,
password,
(userStatus != null ? userStatus.getDescription() : null),
(subscriberStatus != null ? subscriberStatus.getDescription() : null),
deleted,
accountExpired,
accountLocked,
passwordExpired,
lastLogin,
lastStatusChange,
createDatetime,
(language != null ? language.getDescription() : null),
(currencyDTO != null ? currencyDTO.getDescription() : null),
// customer
(customer != null && customer.getInvoiceDeliveryMethod() != null
? customer.getInvoiceDeliveryMethod().getId()
: null),
(customer != null ? customer.getAutoPaymentType() : null),
(customer != null ? customer.getNotes() : null),
(customer != null && customer.getParent() != null
? customer.getParent().getBaseUser().getId()
: null),
(customer != null ? customer.getIsParent() : null),
(customer != null ? customer.getInvoiceChild() : null),
(customer != null ? customer.getExcludeAging() : null),
(customer != null ? customer.getBalanceType() : null),
(customer != null ? customer.getDynamicBalance() : null),
(customer != null ? customer.getCreditLimit() : null),
(customer != null ? customer.getAutoRecharge() : null),
// contact
(contact != null ? contact.getOrganizationName() : null),
(contact != null ? contact.getTitle() : null),
(contact != null ? contact.getFirstName() : null),
(contact != null ? contact.getLastName() : null),
(contact != null ? contact.getInitial() : null),
(contact != null ? contact.getCity() : null),
(contact != null ? contact.getStateProvince() : null),
(contact != null ? contact.getPostalCode() : null),
(contact != null ? contact.getCountryCode() : null),
(contact != null ? contact.getCompletePhoneNumber() : null),
(contact != null ? contact.getCompleteFaxNumber() : null),
(contact != null ? contact.getEmail() : null),
}
};
}
}