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.mxchange.jcontactsbusiness.model.employee.BusinessEmployee;
41 import org.mxchange.jcontactsbusiness.model.employee.Employable;
42 import org.mxchange.jcontactsbusiness.model.opening_time.BusinessOpeningTime;
43 import org.mxchange.jcontactsbusiness.model.opening_time.OpeningTime;
44 import org.mxchange.jcoreee.utils.Comparables;
45 import org.mxchange.jcoreee.utils.NumberUtils;
46 import org.mxchange.jcoreee.utils.StringUtils;
47 import org.mxchange.jcountry.model.data.Country;
48 import org.mxchange.jcountry.model.data.CountryData;
49 import org.mxchange.jphone.model.phonenumbers.fax.DialableFaxNumber;
50 import org.mxchange.jphone.model.phonenumbers.fax.FaxNumber;
51 import org.mxchange.jphone.model.phonenumbers.landline.DialableLandLineNumber;
52 import org.mxchange.jphone.model.phonenumbers.landline.LandLineNumber;
53 import org.mxchange.jusercore.model.user.LoginUser;
54 import org.mxchange.jusercore.model.user.User;
57 * A POJO for company headquarter data
59 * @author Roland Häder<roland@mxchange.org>
61 @Entity (name = "company_headquarter")
62 @Table (name = "company_headquarter")
65 @NamedQuery (name = "AllHeadquarters", query = "SELECT hq FROM company_headquarter AS hq ORDER BY hq.headquarterId ASC")
68 @SuppressWarnings ("PersistenceUnitPresent")
69 public class BusinessHeadquarter implements Headquarter {
75 private static final long serialVersionUID = 385_752_948_781_761L;
78 * Headquarter' city name
80 @Basic (optional = false)
81 @Column (name = "headquarter_city", length = 100, nullable = false)
82 private String headquarterCity;
85 * Headquarter's company name
87 @Basic (optional = false)
88 @Column (name = "headquarter_company_name", length = 100, nullable = false, unique = true)
89 private String headquarterCompanyName;
92 * Reference to contact person
94 @JoinColumn (name = "headquarter_contact_employee_id", referencedColumnName = "employee_id")
95 @OneToOne (targetEntity = BusinessEmployee.class, cascade = CascadeType.REFRESH)
96 private Employable headquarterContactEmployee;
99 * Headquarter's country code
101 @JoinColumn (name = "headquarter_country_id", nullable = false)
102 @OneToOne (targetEntity = CountryData.class, cascade = CascadeType.REFRESH, optional = false)
103 private Country headquarterCountry;
106 * Timestamp when this entry has been created
108 @Basic (optional = false)
109 @Temporal (TemporalType.TIMESTAMP)
110 @Column (name = "headquarter_entry_created", nullable = false, updatable = false)
111 private Date headquarterCreated;
114 * Email address of headquarter
116 @Column (name = "headquarter_email_address")
117 private String headquarterEmailAddress;
120 * Headquarter' fax number
122 @JoinColumn (name = "headquarter_fax_number_id")
123 @OneToOne (targetEntity = FaxNumber.class, cascade = CascadeType.ALL)
124 private DialableFaxNumber headquarterFaxNumber;
127 * Headquarter' house number
129 @Basic (optional = false)
130 @Column (name = "headquarter_house_number", length = 4, nullable = false)
131 private Short headquarterHouseNumber;
134 * House number's extension
136 @Column (name = "headquarter_house_number_extension")
137 private String headquarterHouseNumberExtension;
143 @GeneratedValue (strategy = GenerationType.IDENTITY)
144 @Column (name = "headquarter_id", nullable = false, updatable = false)
145 private Long headquarterId;
148 * Headquarter' land-line number
150 @JoinColumn (name = "headquarter_landline_number_id")
151 @OneToOne (targetEntity = LandLineNumber.class, cascade = CascadeType.ALL)
152 private DialableLandLineNumber headquarterLandLineNumber;
155 * Headquarter's last house number
157 @Column (name = "headquarter_last_house_number")
158 private Short headquarterLastHouseNumber;
161 * Opening times for this branch office
163 @JoinTable (name = "headquarter_opening_times", joinColumns =
164 @JoinColumn (name = "headquarter_opening_id", referencedColumnName = "headquarter_id"), inverseJoinColumns =
165 @JoinColumn (name = "opening_headquarter_id", referencedColumnName = "opening_times_id"))
166 @ManyToMany (targetEntity = BusinessOpeningTime.class, cascade = CascadeType.ALL)
167 private List<OpeningTime> headquarterOpeningTimes;
170 * Headquarter' store number (multi-store building only)
172 @Column (name = "headquarter_store", length = 3)
173 private Short headquarterStore;
176 * Headquarter' street name
178 @Basic (optional = false)
179 @Column (name = "headquarter_street", length = 100, nullable = false)
180 private String headquarterStreet;
183 * Headquarter' suite number
185 @Column (name = "headquarter_suite_number", length = 4)
186 private Short headquarterSuiteNumber;
189 * User owner instance
191 @JoinColumn (name = "headquarter_user_id")
192 @OneToOne (targetEntity = LoginUser.class, cascade = CascadeType.REFRESH)
193 private User headquarterUserOwner;
196 * Headquarter' ZIP code
198 @Basic (optional = false)
199 @Column (name = "headquarter_zip_code", length = 6, nullable = false)
200 private Integer headquarterZipCode;
203 * Default constructor
205 public BusinessHeadquarter () {
209 * Constructor with all required fields
211 * @param headquarterCompanyName Headquarter's company name
212 * @param headquarterCity City
213 * @param headquarterCountry Country
214 * @param headquarterStreet Street name
215 * @param headquarterZipCode ZIP code
216 * @param headquarterHouseNumber House number
218 public BusinessHeadquarter (final String headquarterCompanyName, final String headquarterCity, final Country headquarterCountry, final String headquarterStreet, final Integer headquarterZipCode, final Short headquarterHouseNumber) {
219 // Call other constructor first
222 // First, validate all parameter
223 if (headquarterCompanyName == null) {
225 throw new NullPointerException("headquarterCompanyName is null"); //NOI18N
226 } else if (headquarterCompanyName.isEmpty()) {
228 throw new IllegalArgumentException("headquarterCompanyName is empty"); //NOI18N
229 } else if (null == headquarterCity) {
231 throw new NullPointerException("headquarterCity is null"); //NOI18N
232 } else if (headquarterCity.isEmpty()) {
234 throw new IllegalArgumentException("headquarterCity is empty"); //NOI18N
235 } else if (null == headquarterCountry) {
237 throw new NullPointerException("headquarterCountry is null"); //NOI18N
238 } else if (headquarterCountry.getCountryId() == null) {
240 throw new NullPointerException("headquarterCountry.countryId is null"); //NOI18N
241 } else if (headquarterCountry.getCountryId() < 1) {
243 throw new IllegalArgumentException(MessageFormat.format("headquarterCountry.countryId={0} is not valid.", headquarterCountry.getCountryId())); //NOI18N
244 } else if (null == headquarterHouseNumber) {
246 throw new NullPointerException("headquarterHouseNumber is null"); //NOI18N
247 } else if (headquarterHouseNumber < 1) {
249 throw new IllegalArgumentException(MessageFormat.format("headquarterHouseNumber={0} is invalid.", headquarterHouseNumber)); //NOI18N
250 } else if (null == headquarterStreet) {
252 throw new NullPointerException("headquarterStreet is null"); //NOI18N
253 } else if (headquarterStreet.isEmpty()) {
255 throw new IllegalArgumentException("headquarterStreet is empty"); //NOI18N
256 } else if (null == headquarterZipCode) {
258 throw new NullPointerException("headquarterZipCode is null"); //NOI18N
259 } else if (headquarterZipCode < 1) {
261 throw new IllegalArgumentException(MessageFormat.format("headquarterZipCode={0} is invalid.", headquarterZipCode)); //NOI18N
265 this.headquarterCompanyName = headquarterCompanyName;
266 this.headquarterCity = headquarterCity;
267 this.headquarterCountry = headquarterCountry;
268 this.headquarterHouseNumber = headquarterHouseNumber;
269 this.headquarterStreet = headquarterStreet;
270 this.headquarterZipCode = headquarterZipCode;
274 public int compareTo (final Headquarter headquarter) {
275 // For performance reasons
276 if (null == headquarter) {
278 throw new NullPointerException("headquarter is null"); //NOI18N
279 } else if (Objects.equals(this, headquarter)) {
285 final int comparators[] = {
286 // First check company name
287 this.getHeadquarterCompanyName().compareTo(headquarter.getHeadquarterCompanyName()),
289 this.getHeadquarterCountry().compareTo(headquarter.getHeadquarterCountry()),
291 NumberUtils.compare(this.getHeadquarterZipCode(), headquarter.getHeadquarterZipCode()),
293 this.getHeadquarterCity().compareTo(headquarter.getHeadquarterCity()),
295 StringUtils.compareToIgnoreCase(this.getHeadquarterStreet(), headquarter.getHeadquarterStreet()),
297 NumberUtils.compare(this.getHeadquarterHouseNumber(), headquarter.getHeadquarterHouseNumber()),
298 // ... last house number
299 NumberUtils.compare(this.getHeadquarterLastHouseNumber(), headquarter.getHeadquarterLastHouseNumber()),
301 StringUtils.compareToIgnoreCase(this.getHeadquarterHouseNumberExtension(), headquarter.getHeadquarterHouseNumberExtension()),
303 NumberUtils.compare(this.getHeadquarterStore(), headquarter.getHeadquarterStore()),
305 NumberUtils.compare(this.getHeadquarterSuiteNumber(), headquarter.getHeadquarterSuiteNumber()),
306 // ... last email address
307 StringUtils.compareToIgnoreCase(this.getHeadquarterEmailAddress(), headquarter.getHeadquarterEmailAddress())
311 final int comparison = Comparables.checkAll(comparators);
318 public boolean equals (final Object object) {
319 if (null == object) {
321 } else if (this.getClass() != object.getClass()) {
325 final Headquarter headquarter = (Headquarter) object;
327 if (!Objects.equals(this.getHeadquarterId(), headquarter.getHeadquarterId())) {
329 } else if (!Objects.equals(this.getHeadquarterCity(), headquarter.getHeadquarterCity())) {
331 } else if (!Objects.equals(this.getHeadquarterCountry(), headquarter.getHeadquarterCountry())) {
333 } else if (!Objects.equals(this.getHeadquarterHouseNumber(), headquarter.getHeadquarterHouseNumber())) {
335 } else if (!Objects.equals(this.getHeadquarterLastHouseNumber(), headquarter.getHeadquarterLastHouseNumber())) {
337 } else if (!Objects.equals(this.getHeadquarterStore(), headquarter.getHeadquarterStore())) {
339 } else if (!Objects.equals(this.getHeadquarterStreet(), headquarter.getHeadquarterStreet())) {
341 } else if (!Objects.equals(this.getHeadquarterSuiteNumber(), headquarter.getHeadquarterSuiteNumber())) {
343 } else if (!Objects.equals(this.getHeadquarterZipCode(), headquarter.getHeadquarterZipCode())) {
351 public String getHeadquarterCity () {
352 return this.headquarterCity;
356 public void setHeadquarterCity (final String headquarterCity) {
357 this.headquarterCity = headquarterCity;
361 public String getHeadquarterCompanyName () {
362 return this.headquarterCompanyName;
366 public void setHeadquarterCompanyName (final String headquarterCompanyName) {
367 this.headquarterCompanyName = headquarterCompanyName;
371 public Employable getHeadquarterContactEmployee () {
372 return this.headquarterContactEmployee;
376 public void setHeadquarterContactEmployee (final Employable headquarterContactEmployee) {
377 this.headquarterContactEmployee = headquarterContactEmployee;
381 public Country getHeadquarterCountry () {
382 return this.headquarterCountry;
386 public void setHeadquarterCountry (final Country headquarterCountry) {
387 this.headquarterCountry = headquarterCountry;
391 @SuppressWarnings ("ReturnOfDateField")
392 public Date getHeadquarterCreated () {
393 return this.headquarterCreated;
397 @SuppressWarnings ("AssignmentToDateFieldFromParameter")
398 public void setHeadquarterCreated (final Date headquarterCreated) {
399 this.headquarterCreated = headquarterCreated;
403 public String getHeadquarterEmailAddress () {
404 return this.headquarterEmailAddress;
408 public void setHeadquarterEmailAddress (final String headquarterEmailAddress) {
409 this.headquarterEmailAddress = headquarterEmailAddress;
413 public DialableFaxNumber getHeadquarterFaxNumber () {
414 return this.headquarterFaxNumber;
418 public void setHeadquarterFaxNumber (final DialableFaxNumber headquarterFaxNumber) {
419 this.headquarterFaxNumber = headquarterFaxNumber;
423 public Short getHeadquarterHouseNumber () {
424 return this.headquarterHouseNumber;
428 public void setHeadquarterHouseNumber (final Short headquarterHouseNumber) {
429 this.headquarterHouseNumber = headquarterHouseNumber;
433 public String getHeadquarterHouseNumberExtension () {
434 return this.headquarterHouseNumberExtension;
438 public void setHeadquarterHouseNumberExtension (final String headquarterHouseNumberExtension) {
439 this.headquarterHouseNumberExtension = headquarterHouseNumberExtension;
443 public Long getHeadquarterId () {
444 return this.headquarterId;
448 public void setHeadquarterId (final Long headquarterId) {
449 this.headquarterId = headquarterId;
453 public DialableLandLineNumber getHeadquarterLandLineNumber () {
454 return this.headquarterLandLineNumber;
458 public void setHeadquarterLandLineNumber (final DialableLandLineNumber headquarterLandLineNumber) {
459 this.headquarterLandLineNumber = headquarterLandLineNumber;
463 public Short getHeadquarterLastHouseNumber () {
464 return this.headquarterLastHouseNumber;
468 public void setHeadquarterLastHouseNumber (final Short headquarterLastHouseNumber) {
469 this.headquarterLastHouseNumber = headquarterLastHouseNumber;
473 @SuppressWarnings ("ReturnOfCollectionOrArrayField")
474 public List<OpeningTime> getHeadquarterOpeningTimes () {
475 return this.headquarterOpeningTimes;
479 @SuppressWarnings ("AssignmentToCollectionOrArrayFieldFromParameter")
480 public void setHeadquarterOpeningTimes (final List<OpeningTime> headquarterOpeningTimes) {
481 this.headquarterOpeningTimes = headquarterOpeningTimes;
485 public Short getHeadquarterStore () {
486 return this.headquarterStore;
490 public void setHeadquarterStore (final Short headquarterStore) {
491 this.headquarterStore = headquarterStore;
495 public String getHeadquarterStreet () {
496 return this.headquarterStreet;
500 public void setHeadquarterStreet (final String headquarterStreet) {
501 this.headquarterStreet = headquarterStreet;
505 public Short getHeadquarterSuiteNumber () {
506 return this.headquarterSuiteNumber;
510 public void setHeadquarterSuiteNumber (final Short headquarterSuiteNumber) {
511 this.headquarterSuiteNumber = headquarterSuiteNumber;
515 public User getHeadquarterUserOwner () {
516 return this.headquarterUserOwner;
520 public void setHeadquarterUserOwner (final User headquarterUserOwner) {
521 this.headquarterUserOwner = headquarterUserOwner;
525 public Integer getHeadquarterZipCode () {
526 return this.headquarterZipCode;
530 public void setHeadquarterZipCode (final Integer headquarterZipCode) {
531 this.headquarterZipCode = headquarterZipCode;
535 public int hashCode () {
538 hash = 47 * hash + Objects.hashCode(this.getHeadquarterId());
539 hash = 47 * hash + Objects.hashCode(this.getHeadquarterCity());
540 hash = 47 * hash + Objects.hashCode(this.getHeadquarterCountry());
541 hash = 47 * hash + Objects.hashCode(this.getHeadquarterHouseNumber());
542 hash = 47 * hash + Objects.hashCode(this.getHeadquarterLastHouseNumber());
543 hash = 47 * hash + Objects.hashCode(this.getHeadquarterStore());
544 hash = 47 * hash + Objects.hashCode(this.getHeadquarterStreet());
545 hash = 47 * hash + Objects.hashCode(this.getHeadquarterSuiteNumber());
546 hash = 47 * hash + Objects.hashCode(this.getHeadquarterZipCode());