]> git.mxchange.org Git - jcontacts-business-core.git/blob - src/org/mxchange/jcontactsbusiness/model/employee/BusinessEmployee.java
Continued:
[jcontacts-business-core.git] / src / org / mxchange / jcontactsbusiness / model / employee / BusinessEmployee.java
1 /*
2  * Copyright (C) 2016 - 2018 Free Software Foundation
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.employee;
18
19 import java.util.Date;
20 import java.util.Objects;
21 import javax.persistence.Basic;
22 import javax.persistence.CascadeType;
23 import javax.persistence.Column;
24 import javax.persistence.Entity;
25 import javax.persistence.GeneratedValue;
26 import javax.persistence.GenerationType;
27 import javax.persistence.Id;
28 import javax.persistence.JoinColumn;
29 import javax.persistence.NamedQueries;
30 import javax.persistence.NamedQuery;
31 import javax.persistence.OneToOne;
32 import javax.persistence.Table;
33 import javax.persistence.Temporal;
34 import javax.persistence.TemporalType;
35 import javax.persistence.Transient;
36 import org.apache.commons.lang3.StringUtils;
37 import org.mxchange.jcontacts.model.contact.Contact;
38 import org.mxchange.jcontacts.model.contact.Contacts;
39 import org.mxchange.jcontacts.model.contact.UserContact;
40 import org.mxchange.jcontactsbusiness.model.basicdata.BasicData;
41 import org.mxchange.jcontactsbusiness.model.basicdata.BusinessBasicData;
42 import org.mxchange.jcontactsbusiness.model.branchoffice.BranchOffice;
43 import org.mxchange.jcontactsbusiness.model.branchoffice.BranchOffices;
44 import org.mxchange.jcontactsbusiness.model.branchoffice.BusinessBranchOffice;
45 import org.mxchange.jcontactsbusiness.model.department.BusinessDepartment;
46 import org.mxchange.jcontactsbusiness.model.department.Department;
47 import org.mxchange.jcontactsbusiness.model.department.Departments;
48 import org.mxchange.jcontactsbusiness.model.headquarter.BusinessHeadquarter;
49 import org.mxchange.jcontactsbusiness.model.headquarter.Headquarter;
50 import org.mxchange.jcontactsbusiness.model.headquarter.Headquarters;
51 import org.mxchange.jcontactsbusiness.model.jobposition.EmployeePosition;
52 import org.mxchange.jcontactsbusiness.model.jobposition.HireableJobPosition;
53 import org.mxchange.jcontactsbusiness.model.jobposition.JobPositions;
54 import org.mxchange.jcoreutils.Comparables;
55 import org.mxchange.jphone.model.phonenumbers.mobile.DialableMobileNumber;
56 import org.mxchange.jphone.model.phonenumbers.mobile.MobileNumber;
57 import org.mxchange.jusercore.model.user.LoginUser;
58 import org.mxchange.jusercore.model.user.User;
59
60 /**
61  * A POJO for company employees (including CEO)
62  * <p>
63  * @author Roland Häder<roland@mxchange.org>
64  */
65 @Entity (name = "company_employees")
66 @Table (name = "company_employees")
67 @NamedQueries (
68                 {
69                         @NamedQuery (name = "AllEmployees", query = "SELECT e FROM company_employees AS e ORDER BY e.employeeId ASC"),}
70 )
71 @SuppressWarnings ("PersistenceUnitPresent")
72 public class BusinessEmployee implements Employable {
73
74         /**
75          * Serial number
76          */
77         @Transient
78         private static final long serialVersionUID = 48_959_819_859_812_076L;
79
80         /**
81          * Company the employee is working at
82          */
83         @JoinColumn (name = "employee_company_id", nullable = false, updatable = false)
84         @OneToOne (targetEntity = BusinessBasicData.class, cascade = CascadeType.REFRESH, optional = false)
85         private BasicData employeeBasicData;
86
87         /**
88          * Branch office (if the employee works there)
89          */
90         @JoinColumn (name = "employee_branch_id")
91         @OneToOne (targetEntity = BusinessBranchOffice.class, cascade = CascadeType.REFRESH)
92         private BranchOffice employeeBranchOffice;
93
94         /**
95          * Timestamp when this entry has been created
96          */
97         @Basic (optional = false)
98         @Temporal (TemporalType.TIMESTAMP)
99         @Column (name = "employee_entry_created", nullable = false, updatable = false)
100         private Date employeeCreated;
101
102         /**
103          * Department the employee works at
104          */
105         @JoinColumn (name = "employee_department_id")
106         @OneToOne (targetEntity = BusinessDepartment.class, cascade = CascadeType.REFRESH)
107         private Department employeeDepartment;
108
109         /**
110          * Employee's email address
111          */
112         @Column (name = "employee_email_address", length = 30)
113         private String employeeEmailAddress;
114
115         /**
116          * Head quarters id number (if the employee works there)
117          */
118         @JoinColumn (name = "employee_headquarter_id")
119         @OneToOne (targetEntity = BusinessHeadquarter.class, cascade = CascadeType.REFRESH)
120         private Headquarter employeeHeadquarter;
121
122         /**
123          * Id number
124          */
125         @Id
126         @Column (name = "employee_id", nullable = false, updatable = false)
127         @GeneratedValue (strategy = GenerationType.IDENTITY)
128         private Long employeeId;
129
130         /**
131          * Employee's position (example: CEO)
132          */
133         @JoinColumn (name = "employee_position_id")
134         @OneToOne (targetEntity = EmployeePosition.class, cascade = CascadeType.REFRESH)
135         private HireableJobPosition employeeJobPosition;
136
137         /**
138          * Employee's business mobile number
139          */
140         @JoinColumn (name = "employee_mobile_number_id")
141         @OneToOne (targetEntity = MobileNumber.class, cascade = CascadeType.REFRESH)
142         private DialableMobileNumber employeeMobileNumber;
143
144         /**
145          * Employee's staff number
146          */
147         @Column (name = "employee_staff_number", length = 20)
148         private String employeeNumber;
149
150         /**
151          * Employee's personal data
152          */
153         @JoinColumn (name = "employee_personal_data_id")
154         @OneToOne (targetEntity = UserContact.class, cascade = CascadeType.REFRESH)
155         private Contact employeePersonalData;
156
157         /**
158          * Employee's phone extension (or number if different)
159          */
160         @Column (name = "employee_phone_extension", length = 10)
161         private Integer employeePhoneExtension;
162
163         /**
164          * User owner instance
165          */
166         @JoinColumn (name = "employee_user_id")
167         @OneToOne (targetEntity = LoginUser.class, cascade = CascadeType.REFRESH)
168         private User employeeUserOwner;
169
170         /**
171          * Default constructor
172          */
173         public BusinessEmployee () {
174         }
175
176         /**
177          * Constructor with all required data
178          * <p>
179          * @param employeeCompany      Basic company data
180          * @param employeeNumber       Employee number (alternative or extra to
181          *                             contact)
182          * @param employeePersonalData Personal data (contact)
183          */
184         public BusinessEmployee (final BasicData employeeCompany, final String employeeNumber, final Contact employeePersonalData) {
185                 // Call other constructor
186                 this();
187
188                 // Validate parameter
189                 if (null == employeeCompany) {
190                         // Throw NPE
191                         throw new NullPointerException("employeeCompany is null"); //NOI18N
192                 } else if (((null == employeeNumber) || (employeeNumber.isEmpty())) && (null == employeePersonalData)) {
193                         // At least one must be given
194                         throw new NullPointerException("employeeNumber or employeePersonalData must be set."); //NOI18N
195                 }
196
197                 // Set all fields
198                 this.employeeBasicData = employeeCompany;
199                 this.employeeNumber = employeeNumber;
200                 this.employeePersonalData = employeePersonalData;
201         }
202
203         @Override
204         public int compareTo (final Employable employable) {
205                 // Check parameter on null-reference and equality to this
206                 if (null == employable) {
207                         // Should not happen
208                         throw new NullPointerException("employable is null"); //NOI18N
209                 } else if (employable.equals(this)) {
210                         // Same object
211                         return 0;
212                 }
213
214                 // Init comparisons
215                 final int[] comparators = {
216                         // First employee's number
217                         // First employee's number
218                         // First employee's number
219                         // First employee's number
220                         StringUtils.compareIgnoreCase(this.getEmployeeNumber(), employable.getEmployeeNumber()),
221                         // ... finally contact data
222                         Contacts.compare(this.getEmployeePersonalData(), employable.getEmployeePersonalData()),
223                         // ... employee's email address
224                         StringUtils.compareIgnoreCase(this.getEmployeeEmailAddress(), employable.getEmployeeEmailAddress()),
225                         // ... company data (BasicData)
226                         this.getEmployeeBasicData().compareTo(employable.getEmployeeBasicData()),
227                         JobPositions.compare(this.getEmployeeJobPosition(), employable.getEmployeeJobPosition()),
228                         // ... department
229                         Departments.compare(this.getEmployeeDepartment(), employable.getEmployeeDepartment()),
230                         // ... branch office
231                         BranchOffices.compare(this.getEmployeeBranchOffice(), employable.getEmployeeBranchOffice()),
232                         // ... next headquarters
233                         Headquarters.compare(this.getEmployeeHeadquarter(), employable.getEmployeeHeadquarter()),
234                 };
235
236                 // Check all values
237                 final int comparison = Comparables.checkAll(comparators);
238
239                 // Return value
240                 return comparison;
241         }
242
243         @Override
244         public boolean equals (final Object object) {
245                 if (null == object) {
246                         return false;
247                 } else if (this.getClass() != object.getClass()) {
248                         return false;
249                 }
250
251                 final Employable employee = (Employable) object;
252
253                 if (!Objects.equals(this.getEmployeeId(), employee.getEmployeeId())) {
254                         return false;
255                 } else if (!Objects.equals(this.getEmployeeBasicData(), employee.getEmployeeBasicData())) {
256                         return false;
257                 } else if (!Objects.equals(this.getEmployeeNumber(), employee.getEmployeeNumber())) {
258                         return false;
259                 } else if (!Objects.equals(this.getEmployeePersonalData(), employee.getEmployeePersonalData())) {
260                         return false;
261                 }
262
263                 return true;
264         }
265
266         @Override
267         public BasicData getEmployeeBasicData () {
268                 return this.employeeBasicData;
269         }
270
271         @Override
272         public void setEmployeeBasicData (final BasicData employeeBasicData) {
273                 this.employeeBasicData = employeeBasicData;
274         }
275
276         @Override
277         public BranchOffice getEmployeeBranchOffice () {
278                 return this.employeeBranchOffice;
279         }
280
281         @Override
282         public void setEmployeeBranchOffice (final BranchOffice employeeBranchOffice) {
283                 this.employeeBranchOffice = employeeBranchOffice;
284         }
285
286         @Override
287         @SuppressWarnings ("ReturnOfDateField")
288         public Date getEmployeeCreated () {
289                 return this.employeeCreated;
290         }
291
292         @Override
293         @SuppressWarnings ("AssignmentToDateFieldFromParameter")
294         public void setEmployeeCreated (final Date employeeCreated) {
295                 this.employeeCreated = employeeCreated;
296         }
297
298         @Override
299         public Department getEmployeeDepartment () {
300                 return this.employeeDepartment;
301         }
302
303         @Override
304         public void setEmployeeDepartment (final Department employeeDepartment) {
305                 this.employeeDepartment = employeeDepartment;
306         }
307
308         @Override
309         public String getEmployeeEmailAddress () {
310                 return this.employeeEmailAddress;
311         }
312
313         @Override
314         public void setEmployeeEmailAddress (final String employeeEmailAddress) {
315                 this.employeeEmailAddress = employeeEmailAddress;
316         }
317
318         @Override
319         public Headquarter getEmployeeHeadquarter () {
320                 return this.employeeHeadquarter;
321         }
322
323         @Override
324         public void setEmployeeHeadquarter (final Headquarter employeeHeadquarter) {
325                 this.employeeHeadquarter = employeeHeadquarter;
326         }
327
328         @Override
329         public Long getEmployeeId () {
330                 return this.employeeId;
331         }
332
333         @Override
334         public void setEmployeeId (final Long employeeId) {
335                 this.employeeId = employeeId;
336         }
337
338         @Override
339         public HireableJobPosition getEmployeeJobPosition () {
340                 return this.employeeJobPosition;
341         }
342
343         @Override
344         public void setEmployeeJobPosition (final HireableJobPosition employeeJobPosition) {
345                 this.employeeJobPosition = employeeJobPosition;
346         }
347
348         @Override
349         public DialableMobileNumber getEmployeeMobileNumber () {
350                 return this.employeeMobileNumber;
351         }
352
353         @Override
354         public void setEmployeeMobileNumber (final DialableMobileNumber employeeMobileNumber) {
355                 this.employeeMobileNumber = employeeMobileNumber;
356         }
357
358         @Override
359         public String getEmployeeNumber () {
360                 return this.employeeNumber;
361         }
362
363         @Override
364         public void setEmployeeNumber (final String employeeNumber) {
365                 this.employeeNumber = employeeNumber;
366         }
367
368         @Override
369         public Contact getEmployeePersonalData () {
370                 return this.employeePersonalData;
371         }
372
373         @Override
374         public void setEmployeePersonalData (final Contact employeePersonalData) {
375                 this.employeePersonalData = employeePersonalData;
376         }
377
378         @Override
379         public Integer getEmployeePhoneExtension () {
380                 return this.employeePhoneExtension;
381         }
382
383         @Override
384         public void setEmployeePhoneExtension (final Integer employeePhoneExtension) {
385                 this.employeePhoneExtension = employeePhoneExtension;
386         }
387
388         @Override
389         public User getEmployeeUserOwner () {
390                 return this.employeeUserOwner;
391         }
392
393         @Override
394         public void setEmployeeUserOwner (final User employeeUserOwner) {
395                 this.employeeUserOwner = employeeUserOwner;
396         }
397
398         @Override
399         public int hashCode () {
400                 int hash = 3;
401
402                 hash = 97 * hash + Objects.hashCode(this.getEmployeeId());
403                 hash = 97 * hash + Objects.hashCode(this.getEmployeeBasicData());
404                 hash = 97 * hash + Objects.hashCode(this.getEmployeeNumber());
405                 hash = 97 * hash + Objects.hashCode(this.getEmployeePersonalData());
406
407                 return hash;
408         }
409
410 }