/* * Copyright (c) 2016 Haulmont * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.haulmont.timesheets.global; import com.haulmont.cuba.core.global.AppBeans; import com.haulmont.timesheets.entity.TimeEntry; import javax.annotation.Nullable; import java.math.BigDecimal; import java.util.Calendar; import java.util.Date; import static java.math.BigDecimal.valueOf; /** * Helpful {@link java.math.BigDecimal BigDecimal} wrapper that allow to work with individual time fields (hours and minutes) */ @SuppressWarnings("unused") public class HoursAndMinutes { public static final BigDecimal MINUTES_IN_HOUR = valueOf(60); protected int hours; protected int minutes; public static HoursAndMinutes fromTimeEntry(@Nullable TimeEntry timeEntry) { if (timeEntry == null) { return new HoursAndMinutes(); } Integer minutes = timeEntry.getTimeInMinutes(); return new HoursAndMinutes(0, minutes != null ? minutes : 0); } public static HoursAndMinutes fromString(@Nullable String timeStr) { if (timeStr == null) { return new HoursAndMinutes(); } TimeParser timeParser = AppBeans.get(TimeParser.NAME); return timeParser.parseToHoursAndMinutes(timeStr); } public static HoursAndMinutes fromBigDecimal(@Nullable BigDecimal hours) { if (hours == null) { return new HoursAndMinutes(); } HoursAndMinutes hoursAndMinutes = new HoursAndMinutes(); hoursAndMinutes.addMinutes(hours.multiply(MINUTES_IN_HOUR).intValue()); return hoursAndMinutes; } public static HoursAndMinutes fromDate(@Nullable Date time) { if (time == null) { return new HoursAndMinutes(); } Calendar calendar = Calendar.getInstance(); calendar.setTime(time); return new HoursAndMinutes(calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE)); } public HoursAndMinutes() { } public HoursAndMinutes(int hours, int minutes) { this.hours = hours; this.minutes = minutes; setupInvariants(); } public void setTime(HoursAndMinutes augend) { this.hours = augend.hours; this.minutes = augend.minutes; setupInvariants(); } public void add(HoursAndMinutes augend) { this.hours += augend.hours; this.minutes += augend.minutes; setupInvariants(); } public void add(Date time) { add(HoursAndMinutes.fromDate(time)); } public void add(String time) { add(HoursAndMinutes.fromString(time)); } public void addHours(int hours) { this.hours += hours; setupInvariants(); } public void addMinutes(int minutes) { this.minutes += minutes; setupInvariants(); } protected void setupInvariants() { if (minutes >= 60) { int hours = minutes / 60; minutes = minutes % 60; this.hours += hours; } } public int getHours() { return hours; } public int getMinutes() { return minutes; } public Integer toMinutes() { return hours * 60 + minutes; } public BigDecimal toBigDecimal() { BigDecimal minutes = valueOf(this.minutes); BigDecimal hours = valueOf(this.hours); return hours.add(minutes.divide(MINUTES_IN_HOUR, BigDecimal.ROUND_HALF_EVEN)); } public Date toDate() { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, hours); calendar.set(Calendar.MINUTE, minutes); return calendar.getTime(); } @Override public String toString() { return String.format("%02d:%02d", hours, minutes); } public String getFormattedCaption() { return StringFormatHelper.getDayHoursString(this); } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof HoursAndMinutes)) return false; HoursAndMinutes that = (HoursAndMinutes) o; return hours == that.hours && minutes == that.minutes; } @Override public int hashCode() { int result = hours; result = 31 * result + minutes; return result; } }