/**
* Copyright © 2002 Instituto Superior Técnico
*
* This file is part of FenixEdu Academic.
*
* FenixEdu Academic is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* FenixEdu Academic 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with FenixEdu Academic. If not, see <http://www.gnu.org/licenses/>.
*/
package org.fenixedu.academic.domain.accounting.report;
import static org.fenixedu.academic.predicate.AccessControl.check;
import java.util.Collection;
import org.fenixedu.academic.domain.ExecutionYear;
import org.fenixedu.academic.domain.accounting.AccountingTransaction;
import org.fenixedu.academic.domain.accounting.events.AnnualEvent;
import org.fenixedu.academic.domain.accounting.events.gratuity.GratuityEvent;
import org.fenixedu.academic.domain.degree.DegreeType;
import org.fenixedu.academic.predicate.RolePredicates;
import org.joda.time.LocalDate;
public class GratuityReportingService {
public GratuityReport createGratuityReport(final ExecutionYear executionYear, final LocalDate startDate,
final LocalDate endDate, final Collection<DegreeType> degreeTypes) {
check(this, RolePredicates.DIRECTIVE_COUNCIL_PREDICATE);
final GratuityReport report = new GratuityReport();
for (final AnnualEvent event : executionYear.getAnnualEventsSet()) {
if (event instanceof GratuityEvent) {
final GratuityEvent gratuityEvent = (GratuityEvent) event;
if (!degreeTypes.isEmpty() && !degreeTypes.contains(gratuityEvent.getDegree().getDegreeType())) {
continue;
}
for (final AccountingTransaction transaction : event.getNonAdjustingTransactions()) {
if (startDate != null && endDate != null) {
if (transaction.isInsidePeriod(startDate, endDate)) {
report.addGratuityAmount(transaction.getWhenRegistered().toLocalDate(),
transaction.getAmountWithAdjustment());
}
} else if (startDate != null) {
if (!transaction.getWhenRegistered().toLocalDate().isBefore(startDate)) {
report.addGratuityAmount(transaction.getWhenRegistered().toLocalDate(),
transaction.getAmountWithAdjustment());
}
} else if (endDate != null) {
if (!transaction.getWhenRegistered().toLocalDate().isAfter(endDate)) {
report.addGratuityAmount(transaction.getWhenRegistered().toLocalDate(),
transaction.getAmountWithAdjustment());
}
} else {
report.addGratuityAmount(transaction.getWhenRegistered().toLocalDate(),
transaction.getAmountWithAdjustment());
}
}
}
}
return report;
}
}