]> 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.JobPosition;
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 JobPosition 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 check company data (BasicData)
217                         this.getEmployeeBasicData().compareTo(employable.getEmployeeBasicData()),
218                         // ... next headquarters
219                         Headquarters.compare(this.getEmployeeHeadquarter(), employable.getEmployeeHeadquarter()),
220                         // ... branch office
221                         BranchOffices.compare(this.getEmployeeBranchOffice(), employable.getEmployeeBranchOffice()),
222                         // ... department
223                         Departments.compare(this.getEmployeeDepartment(), employable.getEmployeeDepartment()),
224                         // ... job position
225                         JobPositions.compare(this.getEmployeeJobPosition(), employable.getEmployeeJobPosition()),
226                         // ... employee's number
227                         StringUtils.compareIgnoreCase(this.getEmployeeNumber(), employable.getEmployeeNumber()),
228                         // ... employee's email address
229                         StringUtils.compareIgnoreCase(this.getEmployeeEmailAddress(), employable.getEmployeeEmailAddress()),
230                         // ... finally contact data
231                         Contacts.compare(this.getEmployeePersonalData(), employable.getEmployeePersonalData())
232                 };
233
234                 // Check all values
235                 final int comparison = Comparables.checkAll(comparators);
236
237                 // Return value
238                 return comparison;
239         }
240
241         @Override
242         public boolean equals (final Object object) {
243                 if (null == object) {
244                         return false;
245                 } else if (this.getClass() != object.getClass()) {
246                         return false;
247                 }
248
249                 final Employable employee = (Employable) object;
250
251                 if (!Objects.equals(this.getEmployeeId(), employee.getEmployeeId())) {
252                         return false;
253                 } else if (!Objects.equals(this.getEmployeeBasicData(), employee.getEmployeeBasicData())) {
254                         return false;
255                 } else if (!Objects.equals(this.getEmployeeNumber(), employee.getEmployeeNumber())) {
256                         return false;
257                 } else if (!Objects.equals(this.getEmployeePersonalData(), employee.getEmployeePersonalData())) {
258                         return false;
259                 }
260
261                 return true;
262         }
263
264         @Override
265         public BasicData getEmployeeBasicData () {
266                 return this.employeeBasicData;
267         }
268
269         @Override
270         public void setEmployeeBasicData (final BasicData employeeBasicData) {
271                 this.employeeBasicData = employeeBasicData;
272         }
273
274         @Override
275         public BranchOffice getEmployeeBranchOffice () {
276                 return this.employeeBranchOffice;
277         }
278
279         @Override
280         public void setEmployeeBranchOffice (final BranchOffice employeeBranchOffice) {
281                 this.employeeBranchOffice = employeeBranchOffice;
282         }
283
284         @Override
285         @SuppressWarnings ("ReturnOfDateField")
286         public Date getEmployeeCreated () {
287                 return this.employeeCreated;
288         }
289
290         @Override
291         @SuppressWarnings ("AssignmentToDateFieldFromParameter")
292         public void setEmployeeCreated (final Date employeeCreated) {
293                 this.employeeCreated = employeeCreated;
294         }
295
296         @Override
297         public Department getEmployeeDepartment () {
298                 return this.employeeDepartment;
299         }
300
301         @Override
302         public void setEmployeeDepartment (final Department employeeDepartment) {
303                 this.employeeDepartment = employeeDepartment;
304         }
305
306         @Override
307         public String getEmployeeEmailAddress () {
308                 return this.employeeEmailAddress;
309         }
310
311         @Override
312         public void setEmployeeEmailAddress (final String employeeEmailAddress) {
313                 this.employeeEmailAddress = employeeEmailAddress;
314         }
315
316         @Override
317         public Headquarter getEmployeeHeadquarter () {
318                 return this.employeeHeadquarter;
319         }
320
321         @Override
322         public void setEmployeeHeadquarter (final Headquarter employeeHeadquarter) {
323                 this.employeeHeadquarter = employeeHeadquarter;
324         }
325
326         @Override
327         public Long getEmployeeId () {
328                 return this.employeeId;
329         }
330
331         @Override
332         public void setEmployeeId (final Long employeeId) {
333                 this.employeeId = employeeId;
334         }
335
336         @Override
337         public JobPosition getEmployeeJobPosition () {
338                 return this.employeeJobPosition;
339         }
340
341         @Override
342         public void setEmployeeJobPosition (final JobPosition employeeJobPosition) {
343                 this.employeeJobPosition = employeeJobPosition;
344         }
345
346         @Override
347         public DialableMobileNumber getEmployeeMobileNumber () {
348                 return this.employeeMobileNumber;
349         }
350
351         @Override
352         public void setEmployeeMobileNumber (final DialableMobileNumber employeeMobileNumber) {
353                 this.employeeMobileNumber = employeeMobileNumber;
354         }
355
356         @Override
357         public String getEmployeeNumber () {
358                 return this.employeeNumber;
359         }
360
361         @Override
362         public void setEmployeeNumber (final String employeeNumber) {
363                 this.employeeNumber = employeeNumber;
364         }
365
366         @Override
367         public Contact getEmployeePersonalData () {
368                 return this.employeePersonalData;
369         }
370
371         @Override
372         public void setEmployeePersonalData (final Contact employeePersonalData) {
373                 this.employeePersonalData = employeePersonalData;
374         }
375
376         @Override
377         public Integer getEmployeePhoneExtension () {
378                 return this.employeePhoneExtension;
379         }
380
381         @Override
382         public void setEmployeePhoneExtension (final Integer employeePhoneExtension) {
383                 this.employeePhoneExtension = employeePhoneExtension;
384         }
385
386         @Override
387         public User getEmployeeUserOwner () {
388                 return this.employeeUserOwner;
389         }
390
391         @Override
392         public void setEmployeeUserOwner (final User employeeUserOwner) {
393                 this.employeeUserOwner = employeeUserOwner;
394         }
395
396         @Override
397         public int hashCode () {
398                 int hash = 3;
399
400                 hash = 97 * hash + Objects.hashCode(this.getEmployeeId());
401                 hash = 97 * hash + Objects.hashCode(this.getEmployeeBasicData());
402                 hash = 97 * hash + Objects.hashCode(this.getEmployeeNumber());
403                 hash = 97 * hash + Objects.hashCode(this.getEmployeePersonalData());
404
405                 return hash;
406         }
407
408 }