View Javadoc

1   /**
2    * Copyright 2005-2012 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl2.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package edu.sampleu.travel.approval.dataobject;
17  
18  import org.kuali.rice.krad.bo.PersistableBusinessObjectBase;
19  import java.sql.Timestamp;
20  import java.util.LinkedHashMap;
21  import javax.persistence.Column;
22  import javax.persistence.Entity;
23  import javax.persistence.GeneratedValue;
24  import javax.persistence.Id;
25  import javax.persistence.JoinColumn;
26  import javax.persistence.ManyToOne;
27  import javax.persistence.SequenceGenerator;
28  import javax.persistence.Table;
29  import org.kuali.rice.krad.util.KRADPropertyConstants;
30  //import org.kuali.kfs.module.tem.TemConstants.TravelParameters;
31  //import org.kuali.kfs.sys.KFSConstants;
32  //import org.kuali.kfs.sys.context.SpringContext;
33  //import org.kuali.rice.kns.service.ParameterService;
34  import org.kuali.rice.core.api.util.type.KualiDecimal;
35  import org.kuali.rice.krad.util.ObjectUtils;
36  
37  @Entity
38  @Table(name="TRVL_PER_DIEM_EXP_T")
39  public class PerDiemExpense extends PersistableBusinessObjectBase {
40  
41      @Id
42      @GeneratedValue(generator = "TEM_PER_DIEM_EXP_ID_SEQ")
43      @SequenceGenerator(name = "TEM_PER_DIEM_EXP_ID_SEQ", sequenceName = "TEM_PER_DIEM_EXP_ID_SEQ", allocationSize = 5)
44      @Column(name = "ID", nullable = false)
45      private Integer id;
46      private String documentNumber;
47      private String countryState;
48      private String county;
49      private String primaryDestination;
50      //boolean flag if it gets disabled due to duplicate
51      private Boolean breakfast = Boolean.TRUE;
52      private Boolean lunch = Boolean.TRUE;
53      private Boolean dinner = Boolean.TRUE;
54      private Boolean personal = Boolean.FALSE;
55      private Boolean incidentalsWithMealsOnly;
56  
57      private KualiDecimal breakfastValue = KualiDecimal.ZERO;
58      private KualiDecimal lunchValue = KualiDecimal.ZERO;
59      private KualiDecimal dinnerValue = KualiDecimal.ZERO;
60      private KualiDecimal incidentalsValue = KualiDecimal.ZERO;
61  
62      @Column(name = "per_diem_id")
63      private Integer perDiemId;
64  
65      @ManyToOne
66      @JoinColumn(name = "per_diem_id")
67      //private PerDiem perDiem;
68  
69      private Integer miles = new Integer(0);
70      private Timestamp mileageDate;
71      //private MileageRate mileageRate;
72      private Integer mileageRateId;
73  
74      private String accommodationTypeCode;
75      private String accommodationName;
76      private String accommodationPhoneNum;
77      private String accommodationAddress;
78      //private AccommodationType accommodationType;
79  
80      private KualiDecimal lodging = KualiDecimal.ZERO;
81      private boolean prorated = false;
82  
83      public Integer getId() {
84          return id;
85      }
86  
87      public void setId(Integer id) {
88          this.id = id;
89      }
90  
91      @Column(name = "FDOC_NBR", length = 14, nullable = false)
92      public String getDocumentNumber() {
93          return documentNumber;
94      }
95  
96      public void setDocumentNumber(String documentNumber) {
97          this.documentNumber = documentNumber;
98      }
99  
100     @Column(name = "COUNTRY", length = 100, nullable = false)
101     public String getCountryState() {
102         return countryState;
103     }
104 
105     public void setCountryState(String countryState) {
106         this.countryState = countryState;
107     }
108 
109     @Column(name = "COUNTY_CD", length = 100, nullable = false)
110     public String getCounty() {
111         return county;
112     }
113 
114     public void setCounty(String county) {
115         this.county = county;
116     }
117 
118     @Column(name = "PRI_DEST", length = 100, nullable = false)
119     public String getPrimaryDestination() {
120         return primaryDestination;
121     }
122 
123     public void setPrimaryDestination(String primaryDestination) {
124         this.primaryDestination = primaryDestination;
125     }
126 
127     @Column(name = "BREAKFAST_IND", nullable = false, length = 1)
128     public Boolean getBreakfast() {
129         return breakfast;
130     }
131 
132     public void setBreakfast(Boolean breakfast) {
133         this.breakfast = breakfast;
134     }
135 
136     @Column(name = "LUNCH_IND", nullable = false, length = 1)
137     public Boolean getLunch() {
138         return lunch;
139     }
140 
141     public void setLunch(Boolean lunch) {
142         this.lunch = lunch;
143     }
144 
145     @Column(name = "DINNER_IND", nullable = false, length = 1)
146     public Boolean getDinner() {
147         return dinner;
148     }
149 
150     public void setDinner(Boolean dinner) {
151         this.dinner = dinner;
152     }
153 
154     /**
155      * Gets the perDiemId attribute.
156      *
157      * @return Returns the perDiemId.
158      */
159     public Integer getPerDiemId() {
160         return perDiemId;
161     }
162 
163     /**
164      * Sets the perDiemId attribute value.
165      *
166      * @param perDiemId The perDiemId to set.
167      */
168     public void setPerDiemId(Integer perDiemId) {
169         this.perDiemId = perDiemId;
170     }
171 
172     /**
173      * Gets the perDiem attribute.
174      *
175      * @return Returns the perDiem.
176      */
177     /**
178     public PerDiem getPerDiem() {
179         return perDiem;
180     }
181       */
182     /**
183      * Sets the perDiem attribute value.
184      *
185      * @param perDiem The perDiem to set.
186      */
187     /**
188     public void setPerDiem(PerDiem perDiem) {
189         this.perDiem = perDiem;
190 
191         setupCustomPerDiem();
192     }
193        */
194     /**
195      * This method gets the accommodation type code associated with this day
196      *
197      * @return accoomodation type code
198      */
199     @Column(name = "ACCOM_TYP_CD", length = 4)
200     public String getAccommodationTypeCode() {
201         return accommodationTypeCode;
202     }
203 
204     /**
205      * This method sets the accommodation type code for this day
206      *
207      * @param accommodationTypeCode
208      */
209     public void setAccommodationTypeCode(String accommodationTypeCode) {
210         this.accommodationTypeCode = accommodationTypeCode;
211     }
212 
213     /**
214      * This method returns the current accommodation Type for this TripDetailEstimate
215      *
216      * @return accommodation Type
217      */
218     /**
219     @ManyToOne
220     @JoinColumn(name = "ACCOM_TYP_CD")
221     public AccommodationType getAccommodationType() {
222         return accommodationType;
223     }
224         /*
225     /**
226      * This method is only used for when the object is initially populated from OJB
227      *
228      * @param accommodationType
229      */
230     /**
231     public void setAccommodationType(AccommodationType accommodationType) {
232         this.accommodationType = accommodationType;
233     }
234         */
235     /**
236      * This method returns the name of the accommodation for this day
237      *
238      * @return accommodation name
239      */
240     @Column(name = "ACCOM_NM")
241     public String getAccommodationName() {
242         return accommodationName;
243     }
244 
245     /**
246      * This method sets the accommodation name for this day
247      *
248      * @param accommodationName
249      */
250     public void setAccommodationName(String accommodationName) {
251         this.accommodationName = accommodationName;
252     }
253 
254     /**
255      * This method returns the accommodation's phone
256      *
257      * @return the phone number for the accommodation
258      */
259     @Column(name = "ACCOM_PH")
260     public String getAccommodationPhoneNum() {
261         return accommodationPhoneNum;
262     }
263 
264     /**
265      * This method sets the accommodation phone number
266      *
267      * @param accommodationPhoneNum
268      */
269     public void setAccommodationPhoneNum(String accommodationPhoneNum) {
270         this.accommodationPhoneNum = accommodationPhoneNum;
271     }
272 
273     /**
274      * This method returns the accommodation's address
275      *
276      * @return accommodation's address
277      */
278     @Column(name = "ACCOM_ADDRESS")
279     public String getAccommodationAddress() {
280         return accommodationAddress;
281     }
282 
283     /**
284      * This method sets the accommodation's address
285      *
286      * @param accommodationAddress
287      */
288     public void setAccommodationAddress(String accommodationAddress) {
289         this.accommodationAddress = accommodationAddress;
290     }
291 
292     /**
293      * This method gets the lodging cost for this day. This method does not take into account personal expenses. Use getLodgingTotal() for that.
294      *
295      * @return lodging cost
296      */
297     @Column(name = "LODGING", precision = 19, scale = 2)
298     public KualiDecimal getLodging() {
299         if (ObjectUtils.isNotNull(lodging) && this.lodging.isGreaterThan(KualiDecimal.ZERO)) {
300             return lodging;
301         }
302 
303         return KualiDecimal.ZERO;
304     }
305 
306     public KualiDecimal getLodging(boolean defaultZero) {
307         return defaultZero? getLodging() : lodging;
308     }
309 
310     /**
311      * This method sets the lodging cost for this day
312      *
313      * @param lodging
314      */
315     public void setLodging(KualiDecimal lodging) {
316         this.lodging = lodging;
317     }
318 
319     @Column(name = "MILES", nullable = false)
320     public Integer getMiles() {
321         if (ObjectUtils.isNotNull(miles) && miles > 0) {
322             return miles;
323         }
324 
325         return 0;
326     }
327 
328     public Integer getMiles(boolean defaultZero) {
329         return defaultZero? getMiles() : miles;
330     }
331 
332     public void setMiles(Integer miles) {
333         this.miles = miles;
334     }
335 
336     /**
337      * Gets the breakfastValue attribute.
338      *
339      * @return Returns the breakfastValue.
340      */
341     public KualiDecimal getBreakfastValue() {
342         if (ObjectUtils.isNotNull(breakfastValue) && this.breakfastValue.isGreaterThan(KualiDecimal.ZERO)) {
343             return breakfastValue;
344         }
345 
346         return KualiDecimal.ZERO;
347     }
348 
349     public KualiDecimal getBreakfastValue(boolean defaultZero) {
350         return defaultZero? getBreakfastValue() : breakfastValue;
351     }
352 
353     /**
354      * Sets the breakfastValue attribute value.
355      *
356      * @param breakfastValue The breakfastValue to set.
357      */
358     public void setBreakfastValue(KualiDecimal breakfastValue) {
359         this.breakfastValue = breakfastValue;
360     }
361 
362     /**
363      * Gets the lunchValue attribute.
364      *
365      * @return Returns the lunchValue.
366      */
367     public KualiDecimal getLunchValue() {
368         if (ObjectUtils.isNotNull(lunchValue) && this.lunchValue.isGreaterThan(KualiDecimal.ZERO)) {
369             return lunchValue;
370         }
371 
372         return KualiDecimal.ZERO;
373     }
374 
375     public KualiDecimal getLunchValue(boolean defaultZero) {
376         return defaultZero? getLunchValue() : lunchValue;
377     }
378 
379     /**
380      * Sets the lunchValue attribute value.
381      *
382      * @param lunchValue The lunchValue to set.
383      */
384     public void setLunchValue(KualiDecimal lunchValue) {
385         this.lunchValue = lunchValue;
386     }
387 
388     /**
389      * Gets the dinnerValue attribute.
390      *
391      * @return Returns the dinnerValue.
392      */
393     public KualiDecimal getDinnerValue() {
394         if (ObjectUtils.isNotNull(dinnerValue) && this.dinnerValue.isGreaterThan(KualiDecimal.ZERO)) {
395             return dinnerValue;
396         }
397 
398         return KualiDecimal.ZERO;
399     }
400 
401     public KualiDecimal getDinnerValue(boolean defaultZero) {
402         return defaultZero? getDinnerValue() : dinnerValue;
403     }
404 
405     /**
406      * Sets the dinnerValue attribute value.
407      *
408      * @param dinnerValue The dinnerValue to set.
409      */
410     public void setDinnerValue(KualiDecimal dinnerValue) {
411         this.dinnerValue = dinnerValue;
412     }
413     /**
414     @ManyToOne
415     @JoinColumn(name = "MILEAGE_RT_ID")
416     public MileageRate getMileageRate() {
417         return mileageRate;
418     }
419 
420     public void setMileageRate(MileageRate mileageRate) {
421         this.mileageRate = mileageRate;
422     }
423      */
424     @Column(name = "MILEAGE_RT_ID", precision = 19, scale = 2, nullable = false)
425     public Integer getMileageRateId() {
426         return mileageRateId;
427     }
428 
429     public void setMileageRateId(Integer mileageRateId) {
430         this.mileageRateId = mileageRateId;
431     }
432 
433     @Column(name = "MILEAGE_TOT", precision = 19, scale = 2, nullable = false)
434     public KualiDecimal getMileageTotal() {
435         KualiDecimal total = KualiDecimal.ZERO;
436         if (!personal) {
437             if (ObjectUtils.isNotNull(this.mileageRateId) && ObjectUtils.isNotNull(this.miles) && this.miles > 0) {
438                 this.refreshReferenceObject("mileageRate");
439                 //total = new KualiDecimal(miles).multiply(mileageRate.getRate());
440             }
441         }
442 
443         return total;
444     }
445 
446     public KualiDecimal getDailyTotal() {
447         KualiDecimal total = KualiDecimal.ZERO;
448         if (!personal) {
449             total = total.add(this.getMileageTotal());
450             total = total.add(this.getLodging());
451             total = total.add(getMealsAndIncidentals());
452         }
453 
454         return total;
455     }
456 
457     /**
458      *
459      * This method gets the mealsTotal with
460      * @return
461      */
462     public KualiDecimal getMealsTotal() {
463         KualiDecimal total = KualiDecimal.ZERO;
464         if (!personal) {
465             if (breakfast) {
466                 total = total.add(this.getBreakfastValue());
467             }
468             if (lunch) {
469                 total = total.add(this.getLunchValue());
470             }
471             if (dinner) {
472                 total = total.add(this.getDinnerValue());
473             }
474         }
475         return total;
476     }
477 
478     /**
479      *
480      * This method gets the Lodging Total if it is not a personal expense.
481      * @return
482      */
483     public KualiDecimal getLodgingTotal() {
484         if (!personal) {
485             return this.getLodging();
486         }
487         return KualiDecimal.ZERO;
488     }
489 
490     /**
491      * Retrieve the Mileage date of per diem
492      *
493      * CLEANUP: mileage date should be the per diem expense date
494      *
495      * @return mileage date
496      */
497     @Column(name = "MLG_DT")
498     public Timestamp getMileageDate() {
499         return mileageDate;
500     }
501 
502     public KualiDecimal getMealsAndIncidentals() {
503         KualiDecimal total = KualiDecimal.ZERO;
504         if (!personal) {
505             total = total.add(getMealsTotal());
506             total = total.add(getIncidentalsValue());
507         }
508         return total;
509     }
510 
511 
512     public static KualiDecimal calculateMealsAndIncidentalsProrated(KualiDecimal total, Integer perDiemPercent) {
513         KualiDecimal percent = new KualiDecimal(perDiemPercent).divide(new KualiDecimal(100));
514         total = total.multiply(percent);
515         return total;
516     }
517 
518     /**
519      *
520      * This method split mealsAndIncidentals into breakfast, lunch, dinner and incidentals (overriding the existing breakfast, lunch, dinner and incidentals values).
521      * @param mealsAndIncidentals
522      */
523     public void setMealsAndIncidentals(KualiDecimal mealsAndIncidentals) {
524         KualiDecimal meal = mealsAndIncidentals.divide(new KualiDecimal(4));
525         setBreakfastValue(meal);
526         setLunchValue(meal);
527         setDinnerValue(meal);
528         setIncidentalsValue(mealsAndIncidentals.subtract(getMealsTotal()));
529     }
530 
531     /**
532      * This method returns whether or not this is a personal expense or not (true for personal expense, false otherwise)
533      *
534      * @return true for personal expense, false otherwise
535      */
536     @Column(name = "PERSONAL", nullable = false, length = 1)
537     public Boolean getPersonal() {
538         return personal;
539     }
540 
541     /**
542      * This method sets true if this is a personal expense
543      *
544      * @param true for personal expense
545      */
546     public void setPersonal(Boolean personal) {
547         this.personal = personal;
548     }
549 
550     /**
551      * Assign the Mileage date of per diem
552      *
553      * @param mileageDate as Date
554      */
555     public void setMileageDate(final Timestamp mileageDate) {
556         this.mileageDate = mileageDate;
557     }
558 
559     protected LinkedHashMap toStringMapper() {
560         LinkedHashMap map = new LinkedHashMap();
561         map.put("id", id);
562         map.put("countryState", this.countryState);
563         map.put("county", this.county);
564         map.put("primaryDestination", this.primaryDestination);
565 
566         return map;
567     }
568 
569     /**
570     public KualiDecimal getDefaultMealsAndIncidentals() {
571         KualiDecimal total = KualiDecimal.ZERO;
572         refreshPerDiem();
573         if (!personal && this.perDiem != null) {
574             if (breakfast) {
575                 total = total.add(new KualiDecimal(this.perDiem.getBreakfast()));
576             }
577             if (lunch) {
578                 total = total.add(new KualiDecimal(this.perDiem.getLunch()));
579             }
580             if (dinner) {
581                 total = total.add(new KualiDecimal(this.perDiem.getDinner()));
582             }
583 
584             // finally add in the incidentals
585             if (getIncludeIncidentals()) {
586                 total = total.add(this.perDiem.getIncidentals());
587             }
588         }
589         return total;
590     }
591 
592 
593     public void refreshPerDiem() {
594         if (!isCustomPerDiem()) {
595             this.refreshReferenceObject("perDiem");
596         }
597 
598         setupCustomPerDiem();
599     }
600      */
601     /**
602      * This method generates a custom perDiem if perDiem is null
603 
604     private void setupCustomPerDiem() {
605         if (this.perDiem == null) {
606             this.perDiem = new PerDiem();
607             this.perDiem.setId(TemConstants.CUSTOM_PER_DIEM_ID);
608         }
609     }
610 
611     public boolean isCustomPerDiem() {
612         return this.perDiem == null || this.perDiem.getId() == null ? true : this.perDiem.getId() == TemConstants.CUSTOM_PER_DIEM_ID;
613     }
614      */
615     /**
616      * This method checks for incidentals inclusion to the mealsAndIncidentals calculation.
617      *
618      * @return
619      */
620     /**
621     public Boolean getIncludeIncidentals() {
622         return !(!breakfast && !lunch && !dinner && getIncidentalsWithMealsOnly());
623     }
624      /*
625    /**
626     public Boolean getIncidentalsWithMealsOnly() {
627         if (incidentalsWithMealsOnly == null) {
628             String incidentalsWithMealsOnlyParam = SpringContext.getBean(ParameterService.class).getParameterValue(PARAM_NAMESPACE, DOCUMENT_DTL_TYPE, TravelParameters.INCIDENTALS_WITH_MEALS_ONLY_IND);
629 
630             //incidentalsWithMealsOnly = incidentalsWithMealsOnlyParam != null && incidentalsWithMealsOnlyParam.equals(KFSConstants.DocumentTypeAttributes.INDICATOR_ATTRIBUTE_TRUE_VALUE);
631             incidentalsWithMealsOnly = incidentalsWithMealsOnlyParam != null && incidentalsWithMealsOnlyParam.equals(KFSConstants.ParameterValues.YES);
632         }
633 
634         return incidentalsWithMealsOnly;
635     }
636          */
637     public void setIncidentalsWithMealsOnly(Boolean incidentalsWithMealsOnly) {
638         this.incidentalsWithMealsOnly = incidentalsWithMealsOnly;
639     }
640 
641     /**
642      * This method returns incidentalsValue affected by INCIDENTALS_WITH_MEALS_ONLY_IND parameter
643      *
644      * @return
645      */
646     public KualiDecimal getIncidentalsValue() {
647         //if (getIncludeIncidentals()) {
648             if (ObjectUtils.isNotNull(incidentalsValue) && this.incidentalsValue.isGreaterThan(KualiDecimal.ZERO)) {
649                 return incidentalsValue;
650             }
651         //}
652 
653         return KualiDecimal.ZERO;
654     }
655 
656     public KualiDecimal getIncidentalsValue(boolean defaultZero) {
657         return defaultZero? getIncidentalsValue() : incidentalsValue;
658     }
659 
660     public void setIncidentalsValue(KualiDecimal incidentalsValue) {
661         this.incidentalsValue = incidentalsValue;
662     }
663 
664     public boolean isProrated() {
665         //if(isCustomPerDiem()){
666         //    return false;
667        // }
668 
669         return prorated;
670     }
671 
672     public void setProrated(boolean prorated) {
673         this.prorated = prorated;
674     }
675 }