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