/* * The Kuali Financial System, a comprehensive financial management system for higher education. * * Copyright 2005-2014 The Kuali Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * 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 org.kuali.kfs.pdp.batch.service.impl; import java.text.MessageFormat; import java.util.Collection; import java.util.Date; import java.util.List; import org.apache.commons.lang.StringUtils; import org.kuali.kfs.pdp.PdpKeyConstants; import org.kuali.kfs.pdp.batch.service.DailyReportService; import org.kuali.kfs.pdp.businessobject.DailyReport; import org.kuali.kfs.pdp.dataaccess.PaymentDetailDao; import org.kuali.kfs.pdp.service.PaymentGroupService; import org.kuali.kfs.sys.service.ReportWriterService; import org.kuali.rice.core.api.config.property.ConfigurationService; import org.kuali.rice.core.api.datetime.DateTimeService; import org.springframework.transaction.annotation.Transactional; @Transactional public class DailyReportServiceImpl implements DailyReportService { private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(DailyReportServiceImpl.class); protected PaymentDetailDao paymentDetailDao; protected DateTimeService dateTimeService; protected PaymentGroupService paymentGroupService; protected ConfigurationService kualiConfigurationService; protected ReportWriterService dailyReportReportWriterService; protected List<DailyReport> getData() { LOG.debug("getData() started"); return paymentDetailDao.getDailyReportData(dateTimeService.getCurrentSqlDate()); } @Override public void runReport() { LOG.debug("runReport() started"); Collection<DailyReport> data = getData(); Date today = dateTimeService.getCurrentDate(); // Title and table header dailyReportReportWriterService.writeSubTitle(dateTimeService.toDateTimeStringForFilename(today)); dailyReportReportWriterService.writeNewLines(1); dailyReportReportWriterService.writeTableHeader(DailyReport.class); // Objects for sort total and total DailyReport dailyReportSortTotal = new DailyReport(); DailyReport dailyReportTotal = new DailyReport(); dailyReportTotal.setSortOrder(this.kualiConfigurationService.getPropertyValueAsString(PdpKeyConstants.DAILY_REPORT_SERVICE_TOTAL_SUBTITLE)); final String DAILY_REPORT_SORT_TOTAL_PROPERTY_STRING = this.kualiConfigurationService.getPropertyValueAsString(PdpKeyConstants.DAILY_REPORT_SERVICE_TOTAL_FOR_SUBTITLE); // first is the first entry (ever) we are writing. firstSortTotal is the first we are writing after sortTotal was written boolean first = true; boolean firstSortTotal = true; for (DailyReport dailyReport : data) { if (!first && this.paymentGroupService.getSortGroupId(dailyReportSortTotal.getPaymentGroup()) != this.paymentGroupService.getSortGroupId(dailyReport.getPaymentGroup())) { // Clause is for if the sort group changed which means we print a sortTotal. Unless this is the first element we print, then this doesn't apply firstSortTotal = true; // write sortTotal row (sub title) dailyReportReportWriterService.writeTableRow(dailyReportSortTotal); dailyReportReportWriterService.writeNewLines(1); // reset subtotal dailyReportSortTotal = new DailyReport(); } else if (first) { first = false; } if (firstSortTotal) { // Set the sortOrder (aka "Title" of the row) since this is the firstSortTotal dailyReport.setSortOrder(this.paymentGroupService.getSortGroupName(this.paymentGroupService.getSortGroupId(dailyReport.getPaymentGroup()))); firstSortTotal = false; } // We always write the row dailyReportReportWriterService.writeTableRow(dailyReport); // Do the summation dailyReportSortTotal.addRow(dailyReport); dailyReportTotal.addRow(dailyReport); // Set the sortTotal title if it hasn't been set yet. There are two scenarios this happens for: Only 1 element in list or we just reset dailyReportSortTotal if (StringUtils.isEmpty(dailyReportSortTotal.getSortOrder())) { String newTotalForSubtitle = MessageFormat.format(DAILY_REPORT_SORT_TOTAL_PROPERTY_STRING, new Object[] { this.paymentGroupService.getSortGroupName(this.paymentGroupService.getSortGroupId(dailyReportSortTotal.getPaymentGroup())) }); dailyReportSortTotal.setSortOrder(newTotalForSubtitle); } } // At the end we still have one sortTotal to write. Unless there was no data if (!first) { // Final subtotal to write if there was one dailyReportReportWriterService.writeTableRow(dailyReportSortTotal); dailyReportReportWriterService.writeNewLines(1); } // Write the final total dailyReportReportWriterService.writeTableRowSeparationLine(dailyReportTotal); dailyReportReportWriterService.writeTableRow(dailyReportTotal); } public void setDateTimeService(DateTimeService dts) { dateTimeService = dts; } public void setPaymentDetailDao(PaymentDetailDao pdd) { paymentDetailDao = pdd; } /** * @see org.kuali.kfs.pdp.batch.service.DailyReportService#setPaymentGroupService(org.kuali.kfs.pdp.service.PaymentGroupService) */ @Override public void setPaymentGroupService(PaymentGroupService paymentGroupService) { this.paymentGroupService = paymentGroupService; } public void setConfigurationService(ConfigurationService kualiConfigurationService) { this.kualiConfigurationService = kualiConfigurationService; } public ReportWriterService getDailyReportReportWriterService() { return dailyReportReportWriterService; } public void setDailyReportReportWriterService(ReportWriterService dailyReportReportWriterService) { this.dailyReportReportWriterService = dailyReportReportWriterService; } }