]> git.mxchange.org Git - jcontacts-business-core.git/blob - src/org/mxchange/jcontactsbusiness/model/headquarter/BusinessHeadquarter.java
Continued:
[jcontacts-business-core.git] / src / org / mxchange / jcontactsbusiness / model / headquarter / BusinessHeadquarter.java
1 /*
2  * Copyright (C) 2016 KLC
3  *
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.
8  *
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.
13  *
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/>.
16  */
17 package org.mxchange.jcontactsbusiness.model.headquarter;
18
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;
55
56 /**
57  * A POJO for company headquarter data
58  * <p>
59  * @author Roland Häder<roland@mxchange.org>
60  */
61 @Entity (name = "company_headquarter")
62 @Table (name = "company_headquarter")
63 @NamedQueries (
64                 {
65                         @NamedQuery (name = "AllHeadquarters", query = "SELECT hq FROM company_headquarter AS hq ORDER BY hq.headquarterId ASC")
66                 }
67 )
68 @SuppressWarnings ("PersistenceUnitPresent")
69 public class BusinessHeadquarter implements Headquarter {
70
71         /**
72          * Serial number
73          */
74         @Transient
75         private static final long serialVersionUID = 385_752_948_781_761L;
76
77         /**
78          * Headquarter' city name
79          */
80         @Basic (optional = false)
81         @Column (name = "headquarter_city", length = 100, nullable = false)
82         private String headquarterCity;
83
84         /**
85          * Headquarter's company name
86          */
87         @Basic (optional = false)
88         @Column (name = "headquarter_company_name", length = 100, nullable = false, unique = true)
89         private String headquarterCompanyName;
90
91         /**
92          * Reference to contact person
93          */
94         @JoinColumn (name = "headquarter_contact_employee_id", referencedColumnName = "employee_id")
95         @OneToOne (targetEntity = BusinessEmployee.class, cascade = CascadeType.REFRESH)
96         private Employable headquarterContactEmployee;
97
98         /**
99          * Headquarter's country code
100          */
101         @JoinColumn (name = "headquarter_country_id", nullable = false)
102         @OneToOne (targetEntity = CountryData.class, cascade = CascadeType.REFRESH, optional = false)
103         private Country headquarterCountry;
104
105         /**
106          * Timestamp when this entry has been created
107          */
108         @Basic (optional = false)
109         @Temporal (TemporalType.TIMESTAMP)
110         @Column (name = "headquarter_entry_created", nullable = false, updatable = false)
111         private Date headquarterCreated;
112
113         /**
114          * Email address of headquarter
115          */
116         @Column (name = "headquarter_email_address")
117         private String headquarterEmailAddress;
118
119         /**
120          * Headquarter' fax number
121          */
122         @JoinColumn (name = "headquarter_fax_number_id")
123         @OneToOne (targetEntity = FaxNumber.class, cascade = CascadeType.ALL)
124         private DialableFaxNumber headquarterFaxNumber;
125
126         /**
127          * Headquarter' house number
128          */
129         @Basic (optional = false)
130         @Column (name = "headquarter_house_number", length = 4, nullable = false)
131         private Short headquarterHouseNumber;
132
133         /**
134          * House number's extension
135          */
136         @Column (name = "headquarter_house_number_extension")
137         private String headquarterHouseNumberExtension;
138
139         /**
140          * Id number
141          */
142         @Id
143         @GeneratedValue (strategy = GenerationType.IDENTITY)
144         @Column (name = "headquarter_id", nullable = false, updatable = false)
145         private Long headquarterId;
146
147         /**
148          * Headquarter' land-line number
149          */
150         @JoinColumn (name = "headquarter_landline_number_id")
151         @OneToOne (targetEntity = LandLineNumber.class, cascade = CascadeType.ALL)
152         private DialableLandLineNumber headquarterLandLineNumber;
153
154         /**
155          * Headquarter's last house number
156          */
157         @Column (name = "headquarter_last_house_number")
158         private Short headquarterLastHouseNumber;
159
160         /**
161          * Opening times for this branch office
162          */
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;
168
169         /**
170          * Headquarter' store number (multi-store building only)
171          */
172         @Column (name = "headquarter_store", length = 3)
173         private Short headquarterStore;
174
175         /**
176          * Headquarter' street name
177          */
178         @Basic (optional = false)
179         @Column (name = "headquarter_street", length = 100, nullable = false)
180         private String headquarterStreet;
181
182         /**
183          * Headquarter' suite number
184          */
185         @Column (name = "headquarter_suite_number", length = 4)
186         private Short headquarterSuiteNumber;
187
188         /**
189          * User owner instance
190          */
191         @JoinColumn (name = "headquarter_user_id")
192         @OneToOne (targetEntity = LoginUser.class, cascade = CascadeType.REFRESH)
193         private User headquarterUserOwner;
194
195         /**
196          * Headquarter' ZIP code
197          */
198         @Basic (optional = false)
199         @Column (name = "headquarter_zip_code", length = 6, nullable = false)
200         private Integer headquarterZipCode;
201
202         /**
203          * Default constructor
204          */
205         public BusinessHeadquarter () {
206         }
207
208         /**
209          * Constructor with all required fields
210          * <p>
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
217          */
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
220                 this();
221
222                 // First, validate all parameter
223                 if (headquarterCompanyName == null) {
224                         // Is null
225                         throw new NullPointerException("headquarterCompanyName is null"); //NOI18N
226                 } else if (headquarterCompanyName.isEmpty()) {
227                         // Is null
228                         throw new IllegalArgumentException("headquarterCompanyName is empty"); //NOI18N
229                 } else if (null == headquarterCity) {
230                         // Throw NPE
231                         throw new NullPointerException("headquarterCity is null"); //NOI18N
232                 } else if (headquarterCity.isEmpty()) {
233                         // Throw IAE
234                         throw new IllegalArgumentException("headquarterCity is empty"); //NOI18N
235                 } else if (null == headquarterCountry) {
236                         // Throw NPE
237                         throw new NullPointerException("headquarterCountry is null"); //NOI18N
238                 } else if (headquarterCountry.getCountryId() == null) {
239                         // Throw NPE again
240                         throw new NullPointerException("headquarterCountry.countryId is null"); //NOI18N
241                 } else if (headquarterCountry.getCountryId() < 1) {
242                         // Throw IAE
243                         throw new IllegalArgumentException(MessageFormat.format("headquarterCountry.countryId={0} is not valid.", headquarterCountry.getCountryId())); //NOI18N
244                 } else if (null == headquarterHouseNumber) {
245                         // Throw NPE
246                         throw new NullPointerException("headquarterHouseNumber is null"); //NOI18N
247                 } else if (headquarterHouseNumber < 1) {
248                         // Throw IAE
249                         throw new IllegalArgumentException(MessageFormat.format("headquarterHouseNumber={0} is invalid.", headquarterHouseNumber)); //NOI18N
250                 } else if (null == headquarterStreet) {
251                         // Throw NPE
252                         throw new NullPointerException("headquarterStreet is null"); //NOI18N
253                 } else if (headquarterStreet.isEmpty()) {
254                         // Throw IAE
255                         throw new IllegalArgumentException("headquarterStreet is empty"); //NOI18N
256                 } else if (null == headquarterZipCode) {
257                         // Throw NPE
258                         throw new NullPointerException("headquarterZipCode is null"); //NOI18N
259                 } else if (headquarterZipCode < 1) {
260                         // Throw IAE
261                         throw new IllegalArgumentException(MessageFormat.format("headquarterZipCode={0} is invalid.", headquarterZipCode)); //NOI18N
262                 }
263
264                 // Set all fields
265                 this.headquarterCompanyName = headquarterCompanyName;
266                 this.headquarterCity = headquarterCity;
267                 this.headquarterCountry = headquarterCountry;
268                 this.headquarterHouseNumber = headquarterHouseNumber;
269                 this.headquarterStreet = headquarterStreet;
270                 this.headquarterZipCode = headquarterZipCode;
271         }
272
273         @Override
274         public int compareTo (final Headquarter headquarter) {
275                 // For performance reasons
276                 if (null == headquarter) {
277                         // Should not happen
278                         throw new NullPointerException("headquarter is null"); //NOI18N
279                 } else if (Objects.equals(this, headquarter)) {
280                         // Same object
281                         return 0;
282                 }
283
284                 // Init comparators
285                 final int comparators[] = {
286                         // First check company name
287                         this.getHeadquarterCompanyName().compareTo(headquarter.getHeadquarterCompanyName()),
288                         // ... next country
289                         this.getHeadquarterCountry().compareTo(headquarter.getHeadquarterCountry()),
290                         // ... then ZIP code
291                         NumberUtils.compare(this.getHeadquarterZipCode(), headquarter.getHeadquarterZipCode()),
292                         // ... and city
293                         this.getHeadquarterCity().compareTo(headquarter.getHeadquarterCity()),
294                         // ... street name
295                         StringUtils.compareToIgnoreCase(this.getHeadquarterStreet(), headquarter.getHeadquarterStreet()),
296                         // ... house number
297                         NumberUtils.compare(this.getHeadquarterHouseNumber(), headquarter.getHeadquarterHouseNumber()),
298                         // ... last house number
299                         NumberUtils.compare(this.getHeadquarterLastHouseNumber(), headquarter.getHeadquarterLastHouseNumber()),
300                         // ... extension
301                         StringUtils.compareToIgnoreCase(this.getHeadquarterHouseNumberExtension(), headquarter.getHeadquarterHouseNumberExtension()),
302                         // ... store number
303                         NumberUtils.compare(this.getHeadquarterStore(), headquarter.getHeadquarterStore()),
304                         // ... suite number
305                         NumberUtils.compare(this.getHeadquarterSuiteNumber(), headquarter.getHeadquarterSuiteNumber()),
306                         // ... last email address
307                         StringUtils.compareToIgnoreCase(this.getHeadquarterEmailAddress(), headquarter.getHeadquarterEmailAddress())
308                 };
309
310                 // Check all values
311                 final int comparison = Comparables.checkAll(comparators);
312
313                 // Return value
314                 return comparison;
315         }
316
317         @Override
318         public boolean equals (final Object object) {
319                 if (null == object) {
320                         return false;
321                 } else if (this.getClass() != object.getClass()) {
322                         return false;
323                 }
324
325                 final Headquarter headquarter = (Headquarter) object;
326
327                 if (!Objects.equals(this.getHeadquarterId(), headquarter.getHeadquarterId())) {
328                         return false;
329                 } else if (!Objects.equals(this.getHeadquarterCity(), headquarter.getHeadquarterCity())) {
330                         return false;
331                 } else if (!Objects.equals(this.getHeadquarterCountry(), headquarter.getHeadquarterCountry())) {
332                         return false;
333                 } else if (!Objects.equals(this.getHeadquarterHouseNumber(), headquarter.getHeadquarterHouseNumber())) {
334                         return false;
335                 } else if (!Objects.equals(this.getHeadquarterLastHouseNumber(), headquarter.getHeadquarterLastHouseNumber())) {
336                         return false;
337                 } else if (!Objects.equals(this.getHeadquarterStore(), headquarter.getHeadquarterStore())) {
338                         return false;
339                 } else if (!Objects.equals(this.getHeadquarterStreet(), headquarter.getHeadquarterStreet())) {
340                         return false;
341                 } else if (!Objects.equals(this.getHeadquarterSuiteNumber(), headquarter.getHeadquarterSuiteNumber())) {
342                         return false;
343                 } else if (!Objects.equals(this.getHeadquarterZipCode(), headquarter.getHeadquarterZipCode())) {
344                         return false;
345                 }
346
347                 return true;
348         }
349
350         @Override
351         public String getHeadquarterCity () {
352                 return this.headquarterCity;
353         }
354
355         @Override
356         public void setHeadquarterCity (final String headquarterCity) {
357                 this.headquarterCity = headquarterCity;
358         }
359
360         @Override
361         public String getHeadquarterCompanyName () {
362                 return this.headquarterCompanyName;
363         }
364
365         @Override
366         public void setHeadquarterCompanyName (final String headquarterCompanyName) {
367                 this.headquarterCompanyName = headquarterCompanyName;
368         }
369
370         @Override
371         public Employable getHeadquarterContactEmployee () {
372                 return this.headquarterContactEmployee;
373         }
374
375         @Override
376         public void setHeadquarterContactEmployee (final Employable headquarterContactEmployee) {
377                 this.headquarterContactEmployee = headquarterContactEmployee;
378         }
379
380         @Override
381         public Country getHeadquarterCountry () {
382                 return this.headquarterCountry;
383         }
384
385         @Override
386         public void setHeadquarterCountry (final Country headquarterCountry) {
387                 this.headquarterCountry = headquarterCountry;
388         }
389
390         @Override
391         @SuppressWarnings ("ReturnOfDateField")
392         public Date getHeadquarterCreated () {
393                 return this.headquarterCreated;
394         }
395
396         @Override
397         @SuppressWarnings ("AssignmentToDateFieldFromParameter")
398         public void setHeadquarterCreated (final Date headquarterCreated) {
399                 this.headquarterCreated = headquarterCreated;
400         }
401
402         @Override
403         public String getHeadquarterEmailAddress () {
404                 return this.headquarterEmailAddress;
405         }
406
407         @Override
408         public void setHeadquarterEmailAddress (final String headquarterEmailAddress) {
409                 this.headquarterEmailAddress = headquarterEmailAddress;
410         }
411
412         @Override
413         public DialableFaxNumber getHeadquarterFaxNumber () {
414                 return this.headquarterFaxNumber;
415         }
416
417         @Override
418         public void setHeadquarterFaxNumber (final DialableFaxNumber headquarterFaxNumber) {
419                 this.headquarterFaxNumber = headquarterFaxNumber;
420         }
421
422         @Override
423         public Short getHeadquarterHouseNumber () {
424                 return this.headquarterHouseNumber;
425         }
426
427         @Override
428         public void setHeadquarterHouseNumber (final Short headquarterHouseNumber) {
429                 this.headquarterHouseNumber = headquarterHouseNumber;
430         }
431
432         @Override
433         public String getHeadquarterHouseNumberExtension () {
434                 return this.headquarterHouseNumberExtension;
435         }
436
437         @Override
438         public void setHeadquarterHouseNumberExtension (final String headquarterHouseNumberExtension) {
439                 this.headquarterHouseNumberExtension = headquarterHouseNumberExtension;
440         }
441
442         @Override
443         public Long getHeadquarterId () {
444                 return this.headquarterId;
445         }
446
447         @Override
448         public void setHeadquarterId (final Long headquarterId) {
449                 this.headquarterId = headquarterId;
450         }
451
452         @Override
453         public DialableLandLineNumber getHeadquarterLandLineNumber () {
454                 return this.headquarterLandLineNumber;
455         }
456
457         @Override
458         public void setHeadquarterLandLineNumber (final DialableLandLineNumber headquarterLandLineNumber) {
459                 this.headquarterLandLineNumber = headquarterLandLineNumber;
460         }
461
462         @Override
463         public Short getHeadquarterLastHouseNumber () {
464                 return this.headquarterLastHouseNumber;
465         }
466
467         @Override
468         public void setHeadquarterLastHouseNumber (final Short headquarterLastHouseNumber) {
469                 this.headquarterLastHouseNumber = headquarterLastHouseNumber;
470         }
471
472         @Override
473         @SuppressWarnings ("ReturnOfCollectionOrArrayField")
474         public List<OpeningTime> getHeadquarterOpeningTimes () {
475                 return this.headquarterOpeningTimes;
476         }
477
478         @Override
479         @SuppressWarnings ("AssignmentToCollectionOrArrayFieldFromParameter")
480         public void setHeadquarterOpeningTimes (final List<OpeningTime> headquarterOpeningTimes) {
481                 this.headquarterOpeningTimes = headquarterOpeningTimes;
482         }
483
484         @Override
485         public Short getHeadquarterStore () {
486                 return this.headquarterStore;
487         }
488
489         @Override
490         public void setHeadquarterStore (final Short headquarterStore) {
491                 this.headquarterStore = headquarterStore;
492         }
493
494         @Override
495         public String getHeadquarterStreet () {
496                 return this.headquarterStreet;
497         }
498
499         @Override
500         public void setHeadquarterStreet (final String headquarterStreet) {
501                 this.headquarterStreet = headquarterStreet;
502         }
503
504         @Override
505         public Short getHeadquarterSuiteNumber () {
506                 return this.headquarterSuiteNumber;
507         }
508
509         @Override
510         public void setHeadquarterSuiteNumber (final Short headquarterSuiteNumber) {
511                 this.headquarterSuiteNumber = headquarterSuiteNumber;
512         }
513
514         @Override
515         public User getHeadquarterUserOwner () {
516                 return this.headquarterUserOwner;
517         }
518
519         @Override
520         public void setHeadquarterUserOwner (final User headquarterUserOwner) {
521                 this.headquarterUserOwner = headquarterUserOwner;
522         }
523
524         @Override
525         public Integer getHeadquarterZipCode () {
526                 return this.headquarterZipCode;
527         }
528
529         @Override
530         public void setHeadquarterZipCode (final Integer headquarterZipCode) {
531                 this.headquarterZipCode = headquarterZipCode;
532         }
533
534         @Override
535         public int hashCode () {
536                 int hash = 7;
537
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());
547
548                 return hash;
549         }
550
551 }