diff --git a/pom.xml b/pom.xml index 43dde998..215a470a 100644 --- a/pom.xml +++ b/pom.xml @@ -326,6 +326,13 @@ mail 1.4.3 + + + + joda-time + joda-time + 2.4 + diff --git a/src/main/java/info/bukova/isspst/services/tripbill/TripBillServiceImpl.java b/src/main/java/info/bukova/isspst/services/tripbill/TripBillServiceImpl.java index 2e9f171d..91c2e662 100644 --- a/src/main/java/info/bukova/isspst/services/tripbill/TripBillServiceImpl.java +++ b/src/main/java/info/bukova/isspst/services/tripbill/TripBillServiceImpl.java @@ -12,12 +12,14 @@ import java.math.BigDecimal; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; -import java.util.Date; import java.util.List; -import java.util.concurrent.TimeUnit; import org.hibernate.LazyInitializationException; import org.hibernate.Query; +import org.joda.time.DateTime; +import org.joda.time.Days; +import org.joda.time.Hours; +import org.joda.time.LocalTime; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.transaction.annotation.Transactional; @@ -33,7 +35,9 @@ public class TripBillServiceImpl extends AbstractOwnedService implemen TripBill bill = new TripBill(); bill.setRequirement(requirement); - long daysCount = TimeUnit.DAYS.convert(requirement.getEndDate().getTime() - requirement.getTripDate().getTime(), TimeUnit.MILLISECONDS) + 1; + + int daysCount = Days.daysBetween((new DateTime(requirement.getTripDate())).withTimeAtStartOfDay(), + (new DateTime(requirement.getEndDate())).withTimeAtStartOfDay()).getDays() + 1; for (int i = 0 ; i < daysCount ; i++) { TripBillItem item = new TripBillItem(); @@ -91,49 +95,35 @@ public class TripBillServiceImpl extends AbstractOwnedService implemen } private void calculateItem(TripBillItem item) { - Calendar cal = Calendar.getInstance(); - Date to = item.getToArrival(); - - if (to == null) { - to = new Date(); - cal.setTime(to); - cal.set(Calendar.HOUR_OF_DAY, 0); - cal.set(Calendar.MINUTE, 0); + LocalTime timeTo; + LocalTime timeBack; + boolean allDay = false; + + if (item.getToArrival() == null) { + timeTo = (new LocalTime()).withHourOfDay(0).withMinuteOfHour(0); } else { - cal.setTime(to); + timeTo = new LocalTime(item.getToArrival()); } - - cal.set(Calendar.DAY_OF_MONTH, 1); - cal.set(Calendar.MONTH, 1); - cal.set(Calendar.YEAR, 2000); - - to.setTime(cal.getTimeInMillis()); - - Date back = item.getBackDeparture(); - if (back == null) { - back = new Date(to.getTime()); - } - - cal.setTime(back); - - if (back.equals(to)) { - cal.set(Calendar.HOUR_OF_DAY, 23); - cal.set(Calendar.MINUTE, 59); + if (item.getBackDeparture() == null) { + timeBack = (new LocalTime()).withHourOfDay(23).withMinuteOfHour(59); + allDay = true; + } else { + timeBack = new LocalTime(item.getBackDeparture()); } - cal.set(Calendar.DAY_OF_MONTH, 1); - cal.set(Calendar.MONTH, 1); - cal.set(Calendar.YEAR, 2000); - back.setTime(cal.getTimeInMillis()); - - if (to.getTime() > back.getTime()) { + if (timeTo.isAfter(timeBack)) { item.setTotal(BigDecimal.ZERO); return; } SettingsData settings = globalSettings.getSettings(); - long hours = TimeUnit.HOURS.convert(back.getTime() - to.getTime(), TimeUnit.MILLISECONDS); + int hours = Hours.hoursBetween(timeTo, timeBack).getHours(); + + if (allDay) { + ++hours; + } + int refundHour = 0; List refundHours = new ArrayList(settings.getRefunds().keySet()); Collections.sort(refundHours);