2 * Copyright (C) 2017 - 2022 Free Software Foundation
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 package org.mxchange.jbonuscard.model.bonus_card;
19 import java.text.MessageFormat;
20 import java.util.Date;
21 import java.util.Objects;
22 import javax.persistence.Basic;
23 import javax.persistence.CascadeType;
24 import javax.persistence.Column;
25 import javax.persistence.Entity;
26 import javax.persistence.GeneratedValue;
27 import javax.persistence.GenerationType;
28 import javax.persistence.Id;
29 import javax.persistence.JoinColumn;
30 import javax.persistence.OneToOne;
31 import javax.persistence.Table;
32 import javax.persistence.Temporal;
33 import javax.persistence.TemporalType;
34 import javax.persistence.Transient;
35 import org.apache.commons.lang3.StringUtils;
36 import org.mxchange.jcontacts.model.contact.Contact;
37 import org.mxchange.jcontacts.model.contact.UserContact;
38 import org.mxchange.jcontacts.model.utils.ContactUtils;
39 import org.mxchange.jcontactsbusiness.model.basicdata.BasicData;
40 import org.mxchange.jcontactsbusiness.model.basicdata.BusinessBasicData;
41 import org.mxchange.jcontactsbusiness.model.utils.BasicDataUtils;
42 import org.mxchange.jcoreutils.comparable.ComparableUtils;
43 import org.mxchange.jcustomercore.model.customer.ContactCustomer;
44 import org.mxchange.jcustomercore.model.customer.Customer;
45 import org.mxchange.jcustomercore.model.utils.CustomerUtils;
48 * A POJO (entity) for bonus cards
50 * @author Roland Häder<roland@mxchange.org>
52 @Entity (name = "bonus_cards")
56 @SuppressWarnings ("PersistenceUnitPresent")
57 public class RoyalityCard implements BonusCard {
63 private static final long serialVersionUID = 12_586_367_165_980L;
66 * Bar code on bonus card
68 @Column (name = "bonus_card_bar_code", unique = true)
69 private String bonusCardBarCode;
72 * The contact that this card is assigned to
74 @JoinColumn (name = "bonus_card_contact_id", referencedColumnName = "contact_id", nullable = false)
75 @OneToOne (targetEntity = UserContact.class, cascade = CascadeType.REFRESH, optional = false)
76 private Contact bonusCardContact;
79 * Bonus card customer id
81 @JoinColumn (name = "bonus_card_customer_id", referencedColumnName = "customer_id")
82 @OneToOne (targetEntity = ContactCustomer.class, cascade = CascadeType.REFRESH)
83 private Customer bonusCardCustomer;
86 * When this entry has been created
88 @Basic (optional = false)
89 @Column (name = "bonus_card_entry_created", updatable = false, nullable = false)
90 @Temporal (TemporalType.TIMESTAMP)
91 private Date bonusCardEntryCreated;
94 * When this entry has been updated
96 @Column (name = "bonus_card_entry_updated", insertable = false)
97 @Temporal (TemporalType.TIMESTAMP)
98 private Date bonusCardEntryUpdated;
104 @GeneratedValue (strategy = GenerationType.IDENTITY)
105 @Column (name = "bonus_card_id", nullable = false, updatable = false)
106 private Long bonusCardId;
109 * Issuing company of this card
111 @JoinColumn (name = "bonus_card_issuer_id", referencedColumnName = "company_data_id", nullable = false)
112 @OneToOne (targetEntity = BusinessBasicData.class, cascade = CascadeType.REFRESH, optional = false)
113 private BasicData bonusCardIssuer;
118 @Column (name = "bonus_card_number")
119 private String bonusCardNumber;
122 * Partnering/branding company of this card
124 @JoinColumn (name = "bonus_card_partner_id", referencedColumnName = "company_data_id")
125 @OneToOne (targetEntity = BusinessBasicData.class, cascade = CascadeType.REFRESH)
126 private BasicData bonusCardPartner;
129 * Default constructor (required for JPA)
131 public RoyalityCard () {
135 * Constructor with all required fields
137 * @param bonusCardContact Contact instance
138 * @param bonusCardIssuer Issuing company instance
140 public RoyalityCard (final Contact bonusCardContact, final BasicData bonusCardIssuer) {
141 // Call other constructor first
144 // Validate parameter
145 if (null == bonusCardContact) {
147 throw new NullPointerException("bonusCardContact is null"); //NOI18N
148 } else if (bonusCardContact.getContactId() == null) {
150 throw new NullPointerException("bonusCardContact.contactId is null"); //NOI18N
151 } else if (bonusCardContact.getContactId() < 1) {
153 throw new IllegalArgumentException(MessageFormat.format("bonusCardContact.contactId={0} is invalid", bonusCardContact.getContactId())); //NOI18N
154 } else if (null == bonusCardIssuer) {
156 throw new NullPointerException("bonusCardOwner is null"); //NOI18N
157 } else if (bonusCardIssuer.getBasicDataId() == null) {
159 throw new NullPointerException("bonusCardOwner.baseDataId is null"); //NOI18N
160 } else if (bonusCardIssuer.getBasicDataId() < 1) {
162 throw new IllegalArgumentException(MessageFormat.format("bonusCardOwner.baseDataId={0} is invalid", bonusCardIssuer.getBasicDataId())); //NOI18N
166 this.bonusCardContact = bonusCardContact;
167 this.bonusCardIssuer = bonusCardIssuer;
171 public int compareTo (final BonusCard bonusCard) {
172 // Check parameter on null-reference and equality to this
173 if (null == bonusCard) {
175 throw new NullPointerException("bonusCard is null"); //NOI18N
176 } else if (bonusCard.equals(this)) {
182 final int comparators[] = {
183 // First compare by number
184 StringUtils.compare(this.getBonusCardNumber(), bonusCard.getBonusCardNumber()),
185 // ... next by bar code
186 StringUtils.compare(this.getBonusCardBarCode(), bonusCard.getBonusCardBarCode()),
188 CustomerUtils.compare(this.getBonusCardCustomer(), bonusCard.getBonusCardCustomer()),
189 // ... contact data (card holder)
190 ContactUtils.compare(this.getBonusCardContact(), bonusCard.getBonusCardContact()),
191 // ... issuing company data
192 BasicDataUtils.compare(this.getBonusCardIssuer(), bonusCard.getBonusCardIssuer()),
193 // ... partner company data
194 BasicDataUtils.compare(this.getBonusCardPartner(), bonusCard.getBonusCardPartner())
198 final int comparison = ComparableUtils.checkAll(comparators);
205 public boolean equals (final Object object) {
206 if (this == object) {
208 } else if (null == object) {
211 if (this.getClass() != object.getClass()) {
215 final BonusCard bonusCard = (BonusCard) object;
217 if (!Objects.equals(this.getBonusCardBarCode(), bonusCard.getBonusCardBarCode())) {
219 } else if (!Objects.equals(this.getBonusCardContact(), bonusCard.getBonusCardContact())) {
221 } else if (!Objects.equals(this.getBonusCardCustomer(), bonusCard.getBonusCardCustomer())) {
223 } else if (!Objects.equals(this.getBonusCardId(), bonusCard.getBonusCardId())) {
225 } else if (!Objects.equals(this.getBonusCardIssuer(), bonusCard.getBonusCardIssuer())) {
227 } else if (!Objects.equals(this.getBonusCardNumber(), bonusCard.getBonusCardNumber())) {
229 } else if (!Objects.equals(this.getBonusCardPartner(), bonusCard.getBonusCardPartner())) {
237 public String getBonusCardBarCode () {
238 return this.bonusCardBarCode;
242 public void setBonusCardBarCode (final String bonusCardBarCode) {
243 this.bonusCardBarCode = bonusCardBarCode;
247 public Contact getBonusCardContact () {
248 return this.bonusCardContact;
252 public void setBonusCardContact (final Contact bonusCardContact) {
253 this.bonusCardContact = bonusCardContact;
257 public Customer getBonusCardCustomer () {
258 return this.bonusCardCustomer;
262 public void setBonusCardCustomer (final Customer bonusCardCustomer) {
263 this.bonusCardCustomer = bonusCardCustomer;
267 @SuppressWarnings ("ReturnOfDateField")
268 public Date getBonusCardEntryCreated () {
269 return this.bonusCardEntryCreated;
273 @SuppressWarnings ("AssignmentToDateFieldFromParameter")
274 public void setBonusCardEntryCreated (final Date bonusCardEntryCreated) {
275 this.bonusCardEntryCreated = bonusCardEntryCreated;
279 @SuppressWarnings ("ReturnOfDateField")
280 public Date getBonusCardEntryUpdated () {
281 return this.bonusCardEntryUpdated;
285 @SuppressWarnings ("AssignmentToDateFieldFromParameter")
286 public void setBonusCardEntryUpdated (final Date bonusCardEntryUpdated) {
287 this.bonusCardEntryUpdated = bonusCardEntryUpdated;
291 public Long getBonusCardId () {
292 return this.bonusCardId;
296 public void setBonusCardId (final Long bonusCardId) {
297 this.bonusCardId = bonusCardId;
301 public BasicData getBonusCardIssuer () {
302 return this.bonusCardIssuer;
306 public void setBonusCardIssuer (final BasicData bonusCardIssuer) {
307 this.bonusCardIssuer = bonusCardIssuer;
311 public String getBonusCardNumber () {
312 return this.bonusCardNumber;
316 public void setBonusCardNumber (final String bonusCardNumber) {
317 this.bonusCardNumber = bonusCardNumber;
321 public BasicData getBonusCardPartner () {
322 return this.bonusCardPartner;
326 public void setBonusCardPartner (final BasicData bonusCardPartner) {
327 this.bonusCardPartner = bonusCardPartner;
331 public int hashCode () {
334 hash = 13 * hash + Objects.hashCode(this.getBonusCardBarCode());
335 hash = 13 * hash + Objects.hashCode(this.getBonusCardContact());
336 hash = 13 * hash + Objects.hashCode(this.getBonusCardCustomer());
337 hash = 13 * hash + Objects.hashCode(this.getBonusCardId());
338 hash = 13 * hash + Objects.hashCode(this.getBonusCardIssuer());
339 hash = 13 * hash + Objects.hashCode(this.getBonusCardNumber());
340 hash = 13 * hash + Objects.hashCode(this.getBonusCardPartner());