/** * Axelor Business Solutions * * Copyright (C) 2016 Axelor (<http://axelor.com>). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.axelor.apps.tool.date; import org.joda.time.LocalDate; import org.joda.time.Months; import com.axelor.apps.tool.exception.IExceptionMessage; import com.axelor.i18n.I18n; import com.google.inject.Inject; /** * Classe permettant d'appliquer plusieurs opérations sur une période. * Une période est composée d'une date de début, d'une date de fin, et d'un * attribut booléen qui détermine si l'on fixe l'année sur 360 jours. * */ public class Period { private LocalDate from; private LocalDate to; private boolean days360; @Inject public Period () { } public LocalDate getFrom() { return from; } public void setFrom(LocalDate from) { this.from = from; } public LocalDate getTo() { return to; } public void setTo(LocalDate to) { this.to = to; } public boolean isDays360() { return days360; } public void setDays360(boolean days360) { this.days360 = days360; } public Period(boolean days360) { this.days360 = days360; } public Period(LocalDate from, LocalDate to, boolean days360) { this.from = from; this.to = to; this.days360 = days360; } public Period(LocalDate from, LocalDate to) { this.from = from; this.to = to; this.days360 = false; } public Period(Period p) { this.from = p.getFrom(); this.to = p.getTo(); this.days360 = p.isDays360(); } public int getDays() { return DateTool.daysBetween(this.from, this.to, this.days360); } public int getMonths() { if (this.days360) { return DateTool.days360MonthsBetween(this.from, this.to); } else { return Months.monthsBetween(this.from, this.to).getMonths(); } } public Period prorata(Period period) { return prorata(period.getFrom(), period.getTo()); } public Period prorata(LocalDate date1, LocalDate date2) { Period p = null; if (DateTool.isProrata(this.from, this.to, date1, date2)){ p = new Period(this); if (date1.isAfter(this.from)) { p.setFrom(date1); } if (date2 != null && date2.isBefore(this.to)) { p.setTo(date2); } } return p; } public boolean isProrata (Period period) { return DateTool.isProrata(this.from, this.to, period.getFrom(), period.getTo()); } public boolean fromBetween(LocalDate date1, LocalDate date2) { return DateTool.isBetween(date1, date2, this.from); } public boolean toBetween(LocalDate date1, LocalDate date2) { return DateTool.isBetween(date1, date2, this.to); } public boolean contains(LocalDate date) { return DateTool.isBetween(this.from, this.to, date); } public boolean isNotNull(){ return this.getFrom() != null && this.getTo() != null; } @Override public boolean equals(Object obj){ if (obj == this) { return true ; } if (obj instanceof Period) { Period period = (Period) obj; return this.from.equals(period.getFrom()) && this.to.equals(period.getTo()) && this.days360 == period.isDays360(); } return false; } @Override public int hashCode(){ if (days360) { return from.hashCode() ^ to.hashCode(); } else { return from.hashCode() ^ to.hashCode() * -1; } } @Override public String toString() { return this.from + " - " + this.to + "("+I18n.get(IExceptionMessage.PERIOD_1)+" :" + this.days360 + ")"; } }