2 * Copyright (C) 2016 KLC
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.jcontactsbusiness.model.headquarter;
19 import java.text.MessageFormat;
20 import java.util.Date;
21 import java.util.List;
22 import java.util.Objects;
23 import javax.persistence.Basic;
24 import javax.persistence.CascadeType;
25 import javax.persistence.Column;
26 import javax.persistence.Entity;
27 import javax.persistence.GeneratedValue;
28 import javax.persistence.GenerationType;
29 import javax.persistence.Id;
30 import javax.persistence.JoinColumn;
31 import javax.persistence.JoinTable;
32 import javax.persistence.ManyToMany;
33 import javax.persistence.NamedQueries;
34 import javax.persistence.NamedQuery;
35 import javax.persistence.OneToOne;
36 import javax.persistence.Table;
37 import javax.persistence.Temporal;
38 import javax.persistence.TemporalType;
39 import javax.persistence.Transient;
40 import org.apache.commons.lang3.StringUtils;
41 import org.mxchange.jcontacts.model.contact.Contact;
42 import org.mxchange.jcontacts.model.contact.UserContact;
43 import org.mxchange.jcontactsbusiness.model.opening_time.BusinessOpeningTime;
44 import org.mxchange.jcontactsbusiness.model.opening_time.OpeningTime;
45 import org.mxchange.jcoreutils.comparable.ComparableUtils;
46 import org.mxchange.jcoreutils.number.SafeNumberUtils;
47 import org.mxchange.jcountry.model.data.Country;
48 import org.mxchange.jcountry.model.data.CountryData;
49 import org.mxchange.jcountry.model.utils.CountryUtils;
50 import org.mxchange.jphone.model.phonenumbers.fax.DialableFaxNumber;
51 import org.mxchange.jphone.model.phonenumbers.fax.FaxNumber;
52 import org.mxchange.jphone.model.phonenumbers.landline.DialableLandLineNumber;
53 import org.mxchange.jphone.model.phonenumbers.landline.LandLineNumber;
54 import org.mxchange.jusercore.model.user.LoginUser;
55 import org.mxchange.jusercore.model.user.User;
58 * A POJO for company headquarter data
60 * @author Roland Häder<roland@mxchange.org>
62 @Entity (name = "company_headquarter")
63 @Table (name = "company_headquarter")
66 @NamedQuery (name = "AllHeadquarters", query = "SELECT hq FROM company_headquarter AS hq ORDER BY hq.headquarterId ASC")
69 @SuppressWarnings ("PersistenceUnitPresent")
70 public class BusinessHeadquarter implements Headquarter {
76 private static final long serialVersionUID = 385_752_948_781_761L;
79 * Headquarter' city name
81 @Basic (optional = false)
82 @Column (name = "headquarter_city", length = 100, nullable = false)
83 private String headquarterCity;
86 * Headquarter's company name
88 @Basic (optional = false)
89 @Column (name = "headquarter_company_name", length = 100, nullable = false, unique = true)
90 private String headquarterCompanyName;
93 * Reference to contact person
95 @JoinColumn (name = "headquarter_contact_employee_id", referencedColumnName = "contact_id")
96 @OneToOne (targetEntity = UserContact.class, cascade = CascadeType.REFRESH)
97 private Contact headquarterContactEmployee;
100 * Headquarter's country code
102 @JoinColumn (name = "headquarter_country_id", nullable = false)
103 @OneToOne (targetEntity = CountryData.class, cascade = CascadeType.REFRESH, optional = false)
104 private Country headquarterCountry;
107 * Email address of headquarter
109 @Column (name = "headquarter_email_address")
110 private String headquarterEmailAddress;
113 * Timestamp when this entry has been created
115 @Basic (optional = false)
116 @Temporal (TemporalType.TIMESTAMP)
117 @Column (name = "headquarter_entry_created", updatable = false, nullable = false)
118 private Date headquarterEntryCreated;
121 * Timestamp when this entry has been updated
123 @Basic (optional = false)
124 @Temporal (TemporalType.TIMESTAMP)
125 @Column (name = "headquarter_entry_updated", insertable = false)
126 private Date headquarterEntryUpdated;
129 * Headquarter' fax number
131 @JoinColumn (name = "headquarter_fax_number_id")
132 @OneToOne (targetEntity = FaxNumber.class, cascade = CascadeType.ALL)
133 private DialableFaxNumber headquarterFaxNumber;
136 * Headquarter' house number
138 @Basic (optional = false)
139 @Column (name = "headquarter_house_number", length = 4, nullable = false)
140 private Short headquarterHouseNumber;
143 * House number's extension
145 @Column (name = "headquarter_house_number_extension")
146 private String headquarterHouseNumberExtension;
152 @GeneratedValue (strategy = GenerationType.IDENTITY)
153 @Column (name = "headquarter_id", nullable = false, updatable = false)
154 private Long headquarterId;
157 * Headquarter' land-line number
159 @JoinColumn (name = "headquarter_landline_number_id")
160 @OneToOne (targetEntity = LandLineNumber.class, cascade = CascadeType.ALL)
161 private DialableLandLineNumber headquarterLandLineNumber;
164 * Headquarter's last house number
166 @Column (name = "headquarter_last_house_number")
167 private Short headquarterLastHouseNumber;
170 * Opening times for this branch office
173 name = "headquarter_opening_times",
176 name = "headquarter_opening_id",
177 referencedColumnName = "headquarter_id"
181 name = "opening_headquarter_id",
182 referencedColumnName = "opening_times_id"
185 @ManyToMany (targetEntity = BusinessOpeningTime.class, cascade = CascadeType.ALL)
186 private List<OpeningTime> headquarterOpeningTimes;
189 * Headquarter' store number (multi-store building only)
191 @Column (name = "headquarter_store", length = 3)
192 private Short headquarterStore;
195 * Headquarter' street name
197 @Basic (optional = false)
198 @Column (name = "headquarter_street", length = 100, nullable = false)
199 private String headquarterStreet;
202 * Headquarter' suite number
204 @Column (name = "headquarter_suite_number", length = 4)
205 private Short headquarterSuiteNumber;
208 * User owner instance
210 @JoinColumn (name = "headquarter_user_id")
211 @OneToOne (targetEntity = LoginUser.class, cascade = CascadeType.REFRESH)
212 private User headquarterUserOwner;
215 * Headquarter' ZIP code
217 @Basic (optional = false)
218 @Column (name = "headquarter_zip_code", length = 6, nullable = false)
219 private Integer headquarterZipCode;
222 * Default constructor
224 public BusinessHeadquarter () {
228 * Constructor with all required fields
230 * @param headquarterCompanyName Headquarter's company name
231 * @param headquarterCity City
232 * @param headquarterCountry Country
233 * @param headquarterStreet Street name
234 * @param headquarterZipCode ZIP code
235 * @param headquarterHouseNumber House number
237 public BusinessHeadquarter (final String headquarterCompanyName, final String headquarterCity, final Country headquarterCountry, final String headquarterStreet, final Integer headquarterZipCode, final Short headquarterHouseNumber) {
238 // Call other constructor first
241 // First, validate all parameter
242 if (null == headquarterCompanyName) {
244 throw new NullPointerException("headquarterCompanyName is null"); //NOI18N
245 } else if (headquarterCompanyName.isEmpty()) {
247 throw new IllegalArgumentException("headquarterCompanyName is empty"); //NOI18N
248 } else if (null == headquarterCity) {
250 throw new NullPointerException("headquarterCity is null"); //NOI18N
251 } else if (headquarterCity.isEmpty()) {
253 throw new IllegalArgumentException("headquarterCity is empty"); //NOI18N
254 } else if (null == headquarterCountry) {
256 throw new NullPointerException("headquarterCountry is null"); //NOI18N
257 } else if (headquarterCountry.getCountryId() == null) {
259 throw new NullPointerException("headquarterCountry.countryId is null"); //NOI18N
260 } else if (headquarterCountry.getCountryId() < 1) {
262 throw new IllegalArgumentException(MessageFormat.format("headquarterCountry.countryId={0} is not valid.", headquarterCountry.getCountryId())); //NOI18N
263 } else if (null == headquarterHouseNumber) {
265 throw new NullPointerException("headquarterHouseNumber is null"); //NOI18N
266 } else if (headquarterHouseNumber < 1) {
268 throw new IllegalArgumentException(MessageFormat.format("headquarterHouseNumber={0} is invalid.", headquarterHouseNumber)); //NOI18N
269 } else if (null == headquarterStreet) {
271 throw new NullPointerException("headquarterStreet is null"); //NOI18N
272 } else if (headquarterStreet.isEmpty()) {
274 throw new IllegalArgumentException("headquarterStreet is empty"); //NOI18N
275 } else if (null == headquarterZipCode) {
277 throw new NullPointerException("headquarterZipCode is null"); //NOI18N
278 } else if (headquarterZipCode < 1) {
280 throw new IllegalArgumentException(MessageFormat.format("headquarterZipCode={0} is invalid.", headquarterZipCode)); //NOI18N
284 this.headquarterCompanyName = headquarterCompanyName;
285 this.headquarterCity = headquarterCity;
286 this.headquarterCountry = headquarterCountry;
287 this.headquarterHouseNumber = headquarterHouseNumber;
288 this.headquarterStreet = headquarterStreet;
289 this.headquarterZipCode = headquarterZipCode;
293 public int compareTo (final Headquarter headquarter) {
294 // Check parameter on null-reference and equality to this
295 if (null == headquarter) {
297 throw new NullPointerException("headquarter is null"); //NOI18N
298 } else if (Objects.equals(this, headquarter)) {
304 final int comparators[] = {
305 // First check company name
306 this.getHeadquarterCompanyName().compareTo(headquarter.getHeadquarterCompanyName()),
308 CountryUtils.compare(this.getHeadquarterCountry(), headquarter.getHeadquarterCountry()),
310 SafeNumberUtils.compare(this.getHeadquarterZipCode(), headquarter.getHeadquarterZipCode()),
312 this.getHeadquarterCity().compareTo(headquarter.getHeadquarterCity()),
314 StringUtils.compareIgnoreCase(this.getHeadquarterStreet(), headquarter.getHeadquarterStreet()),
316 SafeNumberUtils.compare(this.getHeadquarterHouseNumber(), headquarter.getHeadquarterHouseNumber()),
317 // ... last house number
318 SafeNumberUtils.compare(this.getHeadquarterLastHouseNumber(), headquarter.getHeadquarterLastHouseNumber()),
320 StringUtils.compareIgnoreCase(this.getHeadquarterHouseNumberExtension(), headquarter.getHeadquarterHouseNumberExtension()),
322 SafeNumberUtils.compare(this.getHeadquarterStore(), headquarter.getHeadquarterStore()),
324 SafeNumberUtils.compare(this.getHeadquarterSuiteNumber(), headquarter.getHeadquarterSuiteNumber()),
325 // ... last email address
326 StringUtils.compareIgnoreCase(this.getHeadquarterEmailAddress(), headquarter.getHeadquarterEmailAddress())
330 final int comparison = ComparableUtils.checkAll(comparators);
337 public boolean equals (final Object object) {
338 if (null == object) {
340 } else if (this.getClass() != object.getClass()) {
344 final Headquarter headquarter = (Headquarter) object;
346 if (!Objects.equals(this.getHeadquarterCity(), headquarter.getHeadquarterCity())) {
348 } else if (!Objects.equals(this.getHeadquarterCompanyName(), headquarter.getHeadquarterCompanyName())) {
350 } else if (!Objects.equals(this.getHeadquarterContactEmployee(), headquarter.getHeadquarterContactEmployee())) {
352 } else if (!Objects.equals(this.getHeadquarterCountry(), headquarter.getHeadquarterCountry())) {
354 } else if (!Objects.equals(this.getHeadquarterEmailAddress(), headquarter.getHeadquarterEmailAddress())) {
356 } else if (!Objects.equals(this.getHeadquarterFaxNumber(), headquarter.getHeadquarterFaxNumber())) {
358 } else if (!Objects.equals(this.getHeadquarterHouseNumber(), headquarter.getHeadquarterHouseNumber())) {
360 } else if (!Objects.equals(this.getHeadquarterId(), headquarter.getHeadquarterId())) {
362 } else if (!Objects.equals(this.getHeadquarterLandLineNumber(), headquarter.getHeadquarterLandLineNumber())) {
364 } else if (!Objects.equals(this.getHeadquarterLastHouseNumber(), headquarter.getHeadquarterLastHouseNumber())) {
366 } else if (!Objects.equals(this.getHeadquarterStore(), headquarter.getHeadquarterStore())) {
368 } else if (!Objects.equals(this.getHeadquarterStreet(), headquarter.getHeadquarterStreet())) {
370 } else if (!Objects.equals(this.getHeadquarterSuiteNumber(), headquarter.getHeadquarterSuiteNumber())) {
372 } else if (!Objects.equals(this.getHeadquarterUserOwner(), headquarter.getHeadquarterUserOwner())) {
374 } else if (!Objects.equals(this.getHeadquarterZipCode(), headquarter.getHeadquarterZipCode())) {
382 public String getHeadquarterCity () {
383 return this.headquarterCity;
387 public void setHeadquarterCity (final String headquarterCity) {
388 this.headquarterCity = headquarterCity;
392 public String getHeadquarterCompanyName () {
393 return this.headquarterCompanyName;
397 public void setHeadquarterCompanyName (final String headquarterCompanyName) {
398 this.headquarterCompanyName = headquarterCompanyName;
402 public Contact getHeadquarterContactEmployee () {
403 return this.headquarterContactEmployee;
407 public void setHeadquarterContactEmployee (final Contact headquarterContactEmployee) {
408 this.headquarterContactEmployee = headquarterContactEmployee;
412 public Country getHeadquarterCountry () {
413 return this.headquarterCountry;
417 public void setHeadquarterCountry (final Country headquarterCountry) {
418 this.headquarterCountry = headquarterCountry;
422 public String getHeadquarterEmailAddress () {
423 return this.headquarterEmailAddress;
427 public void setHeadquarterEmailAddress (final String headquarterEmailAddress) {
428 this.headquarterEmailAddress = headquarterEmailAddress;
432 @SuppressWarnings ("ReturnOfDateField")
433 public Date getHeadquarterEntryCreated () {
434 return this.headquarterEntryCreated;
438 @SuppressWarnings ("AssignmentToDateFieldFromParameter")
439 public void setHeadquarterEntryCreated (final Date headquarterEntryCreated) {
440 this.headquarterEntryCreated = headquarterEntryCreated;
444 @SuppressWarnings ("ReturnOfDateField")
445 public Date getHeadquarterEntryUpdated () {
446 return this.headquarterEntryUpdated;
450 @SuppressWarnings ("AssignmentToDateFieldFromParameter")
451 public void setHeadquarterEntryUpdated (final Date headquarterEntryUpdated) {
452 this.headquarterEntryUpdated = headquarterEntryUpdated;
456 public DialableFaxNumber getHeadquarterFaxNumber () {
457 return this.headquarterFaxNumber;
461 public void setHeadquarterFaxNumber (final DialableFaxNumber headquarterFaxNumber) {
462 this.headquarterFaxNumber = headquarterFaxNumber;
466 public Short getHeadquarterHouseNumber () {
467 return this.headquarterHouseNumber;
471 public void setHeadquarterHouseNumber (final Short headquarterHouseNumber) {
472 this.headquarterHouseNumber = headquarterHouseNumber;
476 public String getHeadquarterHouseNumberExtension () {
477 return this.headquarterHouseNumberExtension;
481 public void setHeadquarterHouseNumberExtension (final String headquarterHouseNumberExtension) {
482 this.headquarterHouseNumberExtension = headquarterHouseNumberExtension;
486 public Long getHeadquarterId () {
487 return this.headquarterId;
491 public void setHeadquarterId (final Long headquarterId) {
492 this.headquarterId = headquarterId;
496 public DialableLandLineNumber getHeadquarterLandLineNumber () {
497 return this.headquarterLandLineNumber;
501 public void setHeadquarterLandLineNumber (final DialableLandLineNumber headquarterLandLineNumber) {
502 this.headquarterLandLineNumber = headquarterLandLineNumber;
506 public Short getHeadquarterLastHouseNumber () {
507 return this.headquarterLastHouseNumber;
511 public void setHeadquarterLastHouseNumber (final Short headquarterLastHouseNumber) {
512 this.headquarterLastHouseNumber = headquarterLastHouseNumber;
516 @SuppressWarnings ("ReturnOfCollectionOrArrayField")
517 public List<OpeningTime> getHeadquarterOpeningTimes () {
518 return this.headquarterOpeningTimes;
522 @SuppressWarnings ("AssignmentToCollectionOrArrayFieldFromParameter")
523 public void setHeadquarterOpeningTimes (final List<OpeningTime> headquarterOpeningTimes) {
524 this.headquarterOpeningTimes = headquarterOpeningTimes;
528 public Short getHeadquarterStore () {
529 return this.headquarterStore;
533 public void setHeadquarterStore (final Short headquarterStore) {
534 this.headquarterStore = headquarterStore;
538 public String getHeadquarterStreet () {
539 return this.headquarterStreet;
543 public void setHeadquarterStreet (final String headquarterStreet) {
544 this.headquarterStreet = headquarterStreet;
548 public Short getHeadquarterSuiteNumber () {
549 return this.headquarterSuiteNumber;
553 public void setHeadquarterSuiteNumber (final Short headquarterSuiteNumber) {
554 this.headquarterSuiteNumber = headquarterSuiteNumber;
558 public User getHeadquarterUserOwner () {
559 return this.headquarterUserOwner;
563 public void setHeadquarterUserOwner (final User headquarterUserOwner) {
564 this.headquarterUserOwner = headquarterUserOwner;
568 public Integer getHeadquarterZipCode () {
569 return this.headquarterZipCode;
573 public void setHeadquarterZipCode (final Integer headquarterZipCode) {
574 this.headquarterZipCode = headquarterZipCode;
578 public int hashCode () {
581 hash = 47 * hash + Objects.hashCode(this.getHeadquarterCity());
582 hash = 47 * hash + Objects.hashCode(this.getHeadquarterCompanyName());
583 hash = 47 * hash + Objects.hashCode(this.getHeadquarterContactEmployee());
584 hash = 47 * hash + Objects.hashCode(this.getHeadquarterCountry());
585 hash = 47 * hash + Objects.hashCode(this.getHeadquarterEmailAddress());
586 hash = 47 * hash + Objects.hashCode(this.getHeadquarterFaxNumber());
587 hash = 47 * hash + Objects.hashCode(this.getHeadquarterHouseNumber());
588 hash = 47 * hash + Objects.hashCode(this.getHeadquarterHouseNumberExtension());
589 hash = 47 * hash + Objects.hashCode(this.getHeadquarterId());
590 hash = 47 * hash + Objects.hashCode(this.getHeadquarterLandLineNumber());
591 hash = 47 * hash + Objects.hashCode(this.getHeadquarterLastHouseNumber());
592 hash = 47 * hash + Objects.hashCode(this.getHeadquarterStore());
593 hash = 47 * hash + Objects.hashCode(this.getHeadquarterStreet());
594 hash = 47 * hash + Objects.hashCode(this.getHeadquarterSuiteNumber());
595 hash = 47 * hash + Objects.hashCode(this.getHeadquarterUserOwner());
596 hash = 47 * hash + Objects.hashCode(this.getHeadquarterZipCode());