001    /**
002     * Copyright 2004-2013 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl2.php
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.kuali.hr.lm.leaveblock;
017    
018    import java.math.BigDecimal;
019    import java.sql.Date;
020    import java.sql.Timestamp;
021    import java.util.ArrayList;
022    import java.util.List;
023    
024    import javax.persistence.Transient;
025    
026    import org.apache.commons.collections.CollectionUtils;
027    import org.apache.commons.lang.builder.EqualsBuilder;
028    import org.apache.commons.lang3.StringUtils;
029    import org.joda.time.DateTime;
030    import org.kuali.hr.lm.LMConstants;
031    import org.kuali.hr.lm.accrual.AccrualCategory;
032    import org.kuali.hr.lm.timeoff.SystemScheduledTimeOff;
033    import org.kuali.hr.lm.workflow.LeaveRequestDocument;
034    import org.kuali.hr.time.assignment.AssignmentDescriptionKey;
035    import org.kuali.hr.time.calendar.Calendar;
036    import org.kuali.hr.time.calendar.CalendarEntries;
037    import org.kuali.hr.time.earncode.EarnCode;
038    import org.kuali.hr.time.principal.PrincipalHRAttributes;
039    import org.kuali.hr.time.service.base.TkServiceLocator;
040    import org.kuali.hr.time.task.Task;
041    import org.kuali.hr.time.util.TKUtils;
042    import org.kuali.hr.time.util.TkConstants;
043    import org.kuali.hr.time.workarea.WorkArea;
044    import org.kuali.rice.kew.api.KewApiServiceLocator;
045    import org.kuali.rice.kew.api.document.DocumentStatus;
046    import org.kuali.rice.krad.bo.PersistableBusinessObjectBase;
047    
048    public class LeaveBlock extends PersistableBusinessObjectBase {
049    
050            private static final long serialVersionUID = -8240826812581295376L;
051            
052            private String lmLeaveBlockId;
053            private Date leaveDate;
054            private String description;
055            private String principalId;
056            private String earnCode;
057            private String scheduleTimeOffId;
058            private String accrualCategory;
059            // private Boolean active;
060            private BigDecimal leaveAmount = new BigDecimal("0.0");
061            private String applyToYtdUsed;
062            private String documentId;
063            private String principalIdModified;
064            private Timestamp timestamp;
065            private Boolean accrualGenerated;
066            private Long blockId;
067            private String tkAssignmentId;
068            private String requestStatus;
069            private String leaveBlockType;
070            private String documentStatus;
071            
072            private List<LeaveBlockHistory> leaveBlockHistories = new ArrayList<LeaveBlockHistory>();
073            private SystemScheduledTimeOff systemScheduledTimeOffObj;
074            private AccrualCategory accrualCategoryObj;
075        private String leaveRequestDocumentId;
076    
077            @Transient
078            private boolean submit;
079            @Transient
080            private String reason;
081            @Transient
082            private Timestamp dateAndTime;
083    
084            private Long workArea;
085            private Long jobNumber;
086            private Long task;
087            private String assignmentKey;
088            
089            @Transient
090            private String assignmentTitle;
091            @Transient
092            private String calendarId;
093            @Transient
094            private String planningDescription;
095    
096            private String transactionalDocId;
097    
098            public static class Builder {
099    
100                    // required parameters for the constructor
101                    private final Date leaveDate;
102                    private final String principalId;
103                    private final String documentId;
104                    private final String earnCode;
105                    private final BigDecimal leaveAmount;
106    
107                    private String description = null;
108                    private String applyToYtdUsed = null;
109                    private String principalIdModified = null;
110                    private Timestamp timestamp = null;
111                    private Boolean accrualGenerated = Boolean.FALSE;
112                    private Long blockId = 0L;
113                    private String scheduleTimeOffId;
114                    private String accrualCategory;
115                    private String tkAssignmentId;
116                    private String requestStatus;
117                    private Long workArea;
118                    private Long jobNumber;
119                    private Long task;
120                    private String leaveBlockType;
121    
122                    public Builder(DateTime leaveBlockDate, String documentId,
123                                    String principalId, String earnCode, BigDecimal leaveAmount) {
124                            this.leaveDate = new java.sql.Date(leaveBlockDate.toDate()
125                                            .getTime());
126                            this.documentId = documentId;
127                            this.principalId = principalId;
128                            this.earnCode = earnCode;
129                            this.leaveAmount = leaveAmount;
130                    }
131    
132                    // validations could be done in the builder methods below
133    
134                    public Builder description(String val) {
135                            this.description = val;
136                            return this;
137                    }
138    
139                    public Builder applyToYtdUsed(String val) {
140                            this.applyToYtdUsed = val;
141                            return this;
142                    }
143    
144                    public Builder principalIdModified(String val) {
145                            this.principalIdModified = val;
146                            return this;
147                    }
148    
149                    public Builder timestamp(Timestamp val) {
150                            this.timestamp = val;
151                            return this;
152                    }
153    
154                    public Builder accrualGenerated(Boolean val) {
155                            this.accrualGenerated = val;
156                            return this;
157                    }
158    
159                    public Builder blockId(Long val) {
160                            this.blockId = val;
161                            return this;
162                    }
163    
164                    // TODO: need to hook up the objcets to get the real ids
165                    public Builder scheduleTimeOffId(String val) {
166                            this.scheduleTimeOffId = val;
167                            return this;
168                    }
169    
170                    public Builder accrualCategory(String val) {
171                            this.accrualCategory = val;
172                            return this;
173                    }
174    
175                    public Builder tkAssignmentId(String val) {
176                            this.tkAssignmentId = val;
177                            return this;
178                    }
179    
180                    public Builder workArea(Long val) {
181                            this.workArea = val;
182                            return this;
183                    }
184    
185                    public Builder jobNumber(Long val) {
186                            this.jobNumber = val;
187                            return this;
188                    }
189    
190                    public Builder task(Long val) {
191                            this.task = val;
192                            return this;
193                    }
194    
195                    public Builder requestStatus(String val) {
196                            this.requestStatus = val;
197                            return this;
198                    }
199                    
200                    public Builder leaveBlockType(String leaveBlockType) {
201                            this.leaveBlockType = leaveBlockType;
202                            return this;
203                    }
204    
205                    public LeaveBlock build() {
206                            return new LeaveBlock(this);
207                    }
208    
209            }
210    
211            private LeaveBlock(Builder builder) {
212                    leaveDate = builder.leaveDate;
213                    description = builder.description;
214                    principalId = builder.principalId;
215                    earnCode = builder.earnCode;
216                    leaveAmount = builder.leaveAmount;
217                    applyToYtdUsed = builder.applyToYtdUsed;
218                    documentId = builder.documentId;
219                    principalIdModified = builder.principalIdModified;
220                    timestamp = builder.timestamp;
221                    accrualGenerated = builder.accrualGenerated;
222                    blockId = builder.blockId;
223                    scheduleTimeOffId = builder.scheduleTimeOffId;
224                    accrualCategory = builder.accrualCategory;
225                    tkAssignmentId = builder.tkAssignmentId;
226                    requestStatus = builder.requestStatus;
227                    workArea = builder.workArea;
228                    jobNumber = builder.jobNumber;
229                    task = builder.task;
230                    leaveBlockType = builder.leaveBlockType;
231                    // TODO: need to hook up leaveCodeObj, systemScheduledTimeOffObj,
232                    // accrualCategoryObj, and ids for individual obj
233            }
234    
235            public LeaveBlock() {
236    
237            }
238    
239            public String getAccrualCategory() {
240                    return accrualCategory;
241            }
242    
243            public void setAccrualCategory(String accrualCategory) {
244                    this.accrualCategory = accrualCategory;
245            }
246    
247            public Boolean getAccrualGenerated() {
248                    return accrualGenerated;
249            }
250    
251            public void setAccrualGenerated(Boolean accrualGenerated) {
252                    this.accrualGenerated = accrualGenerated;
253            }
254    
255            // public Boolean getActive() {
256            // return active;
257            // }
258            //
259            // public void setActive(Boolean active) {
260            // this.active = active;
261            // }
262    
263            public String getApplyToYtdUsed() {
264                    return applyToYtdUsed;
265            }
266    
267            public boolean getSubmit() {
268                    return submit;
269            }
270    
271            public void setSubmit(boolean submit) {
272                    this.submit = submit;
273            }
274    
275            public void setApplyToYtdUsed(String applyToYtdUsed) {
276                    this.applyToYtdUsed = applyToYtdUsed;
277            }
278    
279            public Long getBlockId() {
280                    return blockId;
281            }
282    
283            public void setBlockId(Long blockId) {
284                    this.blockId = blockId;
285            }
286    
287            public String getDescription() {
288                    return description;
289            }
290    
291            public void setDescription(String description) {
292                    this.description = description;
293            }
294    
295            public String getDocumentId() {
296                    return documentId;
297            }
298    
299            public void setDocumentId(String documentId) {
300                    this.documentId = documentId;
301            }
302    
303            public BigDecimal getLeaveAmount() {
304                    return leaveAmount;
305            }
306    
307            public void setLeaveAmount(BigDecimal leaveAmount) {
308                    this.leaveAmount = leaveAmount;
309            }
310    
311            public Date getLeaveDate() {
312                    return leaveDate;
313            }
314    
315            public void setLeaveDate(Date leaveDate) {
316                    this.leaveDate = leaveDate;
317            }
318    
319            public String getLmLeaveBlockId() {
320                    return lmLeaveBlockId;
321            }
322    
323            public void setLmLeaveBlockId(String lmLeaveBlockId) {
324                    this.lmLeaveBlockId = lmLeaveBlockId;
325            }
326    
327            public String getPrincipalIdModified() {
328                    return principalIdModified;
329            }
330    
331            public void setPrincipalIdModified(String principalIdModified) {
332                    this.principalIdModified = principalIdModified;
333            }
334    
335            public String getPrincipalId() {
336                    return principalId;
337            }
338    
339            public void setPrincipalId(String principalId) {
340                    this.principalId = principalId;
341            }
342    
343            public String getScheduleTimeOffId() {
344                    return scheduleTimeOffId;
345            }
346    
347            public void setScheduleTimeOffId(String scheduleTimeOffId) {
348                    this.scheduleTimeOffId = scheduleTimeOffId;
349            }
350    
351            public Timestamp getTimestamp() {
352                    return timestamp;
353            }
354    
355            public void setTimestamp(Timestamp timestamp) {
356                    this.timestamp = timestamp;
357            }
358    
359            public AccrualCategory getAccrualCategoryObj() {
360                    return accrualCategoryObj;
361            }
362    
363            public void setAccrualCategoryObj(AccrualCategory accrualCategoryObj) {
364                    this.accrualCategoryObj = accrualCategoryObj;
365            }
366    
367            public SystemScheduledTimeOff getSystemScheduledTimeOffObj() {
368                    return systemScheduledTimeOffObj;
369            }
370    
371            public void setSystemScheduledTimeOffObj(
372                            SystemScheduledTimeOff systemScheduledTimeOffObj) {
373                    this.systemScheduledTimeOffObj = systemScheduledTimeOffObj;
374            }
375    
376            public String getTkAssignmentId() {
377                    return tkAssignmentId;
378            }
379    
380            public void setTkAssignmentId(String tkAssignmentId) {
381                    this.tkAssignmentId = tkAssignmentId;
382            }
383    
384            public String getRequestStatus() {
385                    return requestStatus;
386            }
387    
388            public void setRequestStatus(String requestStatus) {
389                    this.requestStatus = requestStatus;
390            }
391    
392        public String getRequestStatusString() {
393            String status = LMConstants.REQUEST_STATUS_STRINGS.get(getRequestStatus());
394            return status == null ? "usage" : status;
395        }
396    
397            public List<LeaveBlockHistory> getLeaveBlockHistories() {
398                    return leaveBlockHistories;
399            }
400    
401            public void setLeaveBlockHistories(
402                            List<LeaveBlockHistory> leaveBlockHistories) {
403                    this.leaveBlockHistories = leaveBlockHistories;
404            }
405    
406            public String getReason() {
407                    return reason;
408            }
409    
410            public void setReason(String reason) {
411                    this.reason = reason;
412            }
413    
414            public Timestamp getDateAndTime() {
415                    return dateAndTime;
416            }
417    
418            public void setDateAndTime(Timestamp dateAndTime) {
419                    this.dateAndTime = dateAndTime;
420            }
421    
422            public Long getWorkArea() {
423                    return workArea;
424            }
425    
426            public void setWorkArea(Long workArea) {
427                    this.workArea = workArea;
428            }
429    
430            public Long getJobNumber() {
431                    return jobNumber;
432            }
433    
434            public void setJobNumber(Long jobNumber) {
435                    this.jobNumber = jobNumber;
436            }
437    
438            public Long getTask() {
439                    return task;
440            }
441    
442            public void setTask(Long task) {
443                    this.task = task;
444            }
445    
446            public String getAssignmentTitle() {
447                    StringBuilder b = new StringBuilder();
448    
449                    if (this.workArea != null) {
450                            WorkArea wa = TkServiceLocator.getWorkAreaService().getWorkArea(
451                                            this.workArea, TKUtils.getCurrentDate());
452                            if (wa != null) {
453                                    b.append(wa.getDescription());
454                            }
455                            Task task = TkServiceLocator.getTaskService().getTask(
456                                            this.getTask(), this.getLeaveDate());
457                            if (task != null) {
458                                    // do not display task description if the task is the default
459                                    // one
460                                    // default task is created in getTask() of TaskService
461                                    if (!task.getDescription()
462                                                    .equals(TkConstants.TASK_DEFAULT_DESP)) {
463                                            b.append("-" + task.getDescription());
464                                    }
465                            }
466                    }
467                    return b.toString();
468            }
469    
470            public void setAssignmentTitle(String assignmentTitle) {
471                    this.assignmentTitle = assignmentTitle;
472            }
473    
474            public String getCalendarId() {
475                    PrincipalHRAttributes principalHRAttributes = TkServiceLocator.getPrincipalHRAttributeService().getPrincipalCalendar(this.principalId, TKUtils.getCurrentDate());
476                    Calendar pcal= null;
477                    if(principalHRAttributes != null) {
478                            //pcal = principalHRAttributes.getCalendar() != null ? principalHRAttributes.getCalendar() : principalHRAttributes.getLeaveCalObj() ;
479                            pcal = principalHRAttributes.getLeaveCalObj() != null ? principalHRAttributes.getLeaveCalObj() : principalHRAttributes.getCalendar();
480                if(pcal!= null) {
481                                    CalendarEntries calEntries = TkServiceLocator.getCalendarEntriesService().getCurrentCalendarEntriesByCalendarId(pcal.getHrCalendarId(), this.leaveDate);
482                                    if(calEntries != null) {
483                                            this.calendarId = calEntries.getHrCalendarEntriesId();
484                                    }
485                            }
486                    }
487                    return calendarId;
488            }
489    
490            public void setCalendarId(String calendarId) {
491                    this.calendarId = calendarId;
492            }
493    
494            public String getEarnCode() {
495                    return earnCode;
496            }
497    
498            public void setEarnCode(String earnCode) {
499                    this.earnCode = earnCode;
500            }
501            
502            public String getEarnCodeDescription() {
503                    String earnCodeDescription = "";
504                    
505                    EarnCode earnCodeObj = TkServiceLocator.getEarnCodeService().getEarnCode(earnCode, leaveDate);
506                    if (earnCodeObj != null) {
507                            earnCodeDescription = earnCodeObj.getDescription();
508                    }
509                    
510                    return earnCodeDescription;
511            }
512    
513            public String getLeaveBlockType() {
514                    return leaveBlockType;
515            }
516    
517            public void setLeaveBlockType(String leaveBlockType) {
518                    this.leaveBlockType = leaveBlockType;
519            }
520    
521        public boolean isEditable() {
522            return TkServiceLocator.getPermissionsService().canEditLeaveBlock(this);
523        }
524    
525        public boolean isDeletable() {
526            return TkServiceLocator.getPermissionsService().canDeleteLeaveBlock(this);
527        }
528        
529        public String getAssignmentKey() {
530            if (assignmentKey == null) {
531                this.setAssignmentKey(TKUtils.formatAssignmentKey(jobNumber, workArea, task));
532            }
533            return assignmentKey;
534        }
535        public void setAssignmentKey(String assignmentDescription) {
536            this.assignmentKey = assignmentDescription;
537        }
538    
539            public String getDocumentStatus() {
540                    return documentStatus;
541            }
542    
543            public void setDocumentStatus(String documentStatus) {
544                    this.documentStatus = documentStatus;
545            }
546    
547        public String getLeaveRequestDocumentId() {
548            return leaveRequestDocumentId;
549        }
550    
551        public void setLeaveRequestDocumentId(String leaveRequestDocumentId) {
552            this.leaveRequestDocumentId = leaveRequestDocumentId;
553        }
554    
555        @Override
556        public boolean equals(Object obj) {
557            if (obj == null) {
558                return false;
559            }
560            if (obj == this) {
561                return true;
562            }
563            if (obj.getClass() != getClass()) {
564                return false;
565            }
566            LeaveBlock leaveBlock = (LeaveBlock) obj;
567            return new EqualsBuilder()
568                    .append(principalId, leaveBlock.principalId)
569                    .append(jobNumber, leaveBlock.jobNumber)
570                    .append(workArea, leaveBlock.workArea)
571                    .append(task, leaveBlock.task)
572                    .append(earnCode, leaveBlock.earnCode)
573                    .append(leaveDate, leaveBlock.leaveDate)
574                    .append(leaveAmount, leaveBlock.leaveAmount)
575                    .append(accrualCategory, leaveBlock.accrualCategory)
576                    .append(earnCode, leaveBlock.earnCode)
577                    .append(description, leaveBlock.description)
578                    .append(leaveBlockType, leaveBlock.leaveBlockType)
579                    .isEquals();
580        }
581        
582        public String getPlanningDescription() {
583            if(this.getRequestStatus().equals(LMConstants.REQUEST_STATUS.DEFERRED)) {
584                    List<LeaveRequestDocument> lrdList = TkServiceLocator.getLeaveRequestDocumentService().getLeaveRequestDocumentsByLeaveBlockId(this.getLmLeaveBlockId());
585                    if(CollectionUtils.isNotEmpty(lrdList)) {
586                            for(LeaveRequestDocument lrd : lrdList) {                               
587                                    DocumentStatus status = KewApiServiceLocator.getWorkflowDocumentService().getDocumentStatus(lrd.getDocumentNumber());
588                                    if(status != null && DocumentStatus.CANCELED.getCode().equals(status.getCode())) {
589                                            String requestDescription = "";
590                                                    if(StringUtils.isNotEmpty(this.getDescription())) {
591                                                            requestDescription = this.getDescription() + " <br/>";
592                                                    }
593                                                    String actionDateString = TKUtils.formatDate(new Date(lrd.getDocumentHeader().getWorkflowDocument().getDateFinalized().getMillis()));
594                                                    requestDescription += "Approval deferred on " + actionDateString + ". Reason: " + lrd.getDescription();
595                                            this.setPlanningDescription(requestDescription);
596                                                    return planningDescription;
597                                    }
598                            }
599                    }
600            }
601            this.setPlanningDescription(this.getDescription());
602            return planningDescription;
603        }
604    
605            public void setPlanningDescription(String planningDescription) {
606                    this.planningDescription = planningDescription;
607            }
608    
609            public void setTransactionDocId(String documentHeaderId) {
610                    transactionalDocId = documentHeaderId;          
611            }
612            
613            public String getTransactionalDocId() {
614                    return transactionalDocId;
615            }
616    
617    }