/*
* 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.gl.batch.service.impl;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.gl.businessobject.CollectorDetail;
import org.kuali.kfs.gl.businessobject.OriginEntryFull;
import org.kuali.kfs.gl.businessobject.Transaction;
/**
* This class represents document group-related data
*/
public class DocumentGroupData {
protected String documentNumber;
protected String financialDocumentTypeCode;
protected String financialSystemOriginationCode;
public DocumentGroupData(Transaction entry) {
documentNumber = entry.getDocumentNumber();
financialDocumentTypeCode = entry.getFinancialDocumentTypeCode();
financialSystemOriginationCode = entry.getFinancialSystemOriginationCode();
}
public DocumentGroupData(String documentNumber, String financialDocumentTypeCode, String financialSystemOriginationCode) {
this.documentNumber = documentNumber;
this.financialDocumentTypeCode = financialDocumentTypeCode;
this.financialSystemOriginationCode = financialSystemOriginationCode;
}
/**
* Returns true if DocumentGroupData objects have the same document number, document type code, and financial system origination code
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof DocumentGroupData)) {
return false;
}
DocumentGroupData o2 = (DocumentGroupData) obj;
return StringUtils.equals(documentNumber, o2.documentNumber) && StringUtils.equals(financialDocumentTypeCode, o2.financialDocumentTypeCode) && StringUtils.equals(financialSystemOriginationCode, o2.financialSystemOriginationCode);
}
/**
* Returns true if this document group data object's and the transaction have the same document number, document type code, and origination code match the passed
*
* @param transaction transaction to compare
* @return true if this document group data object's and the transaction have the same document number, document type code, and origination code match the passed
*/
public boolean matchesTransaction(Transaction transaction) {
return StringUtils.equals(documentNumber, transaction.getDocumentNumber()) && StringUtils.equals(financialDocumentTypeCode, transaction.getFinancialDocumentTypeCode()) && StringUtils.equals(financialSystemOriginationCode, transaction.getFinancialSystemOriginationCode());
}
public boolean matchesCollectorDetail(CollectorDetail detail) {
return StringUtils.equals(documentNumber, detail.getDocumentNumber()) && StringUtils.equals(financialDocumentTypeCode, detail.getFinancialDocumentTypeCode()) && StringUtils.equals(financialSystemOriginationCode, detail.getFinancialSystemOriginationCode());
}
/**
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
// hash based on the doc #, because it's likely to have the most variation within an origin entry doc
if (documentNumber == null) {
return "".hashCode();
}
return documentNumber.hashCode();
}
/**
* This returns an origin entry with document number, document type code, origination code set from this DocumentGroupData's document number, document type code, and origination code
*
* @return populated origin entry
*/
public OriginEntryFull populateDocumentGroupDataFieldsInOriginEntry() {
OriginEntryFull entry = new OriginEntryFull();
entry.setDocumentNumber(documentNumber);
entry.setFinancialDocumentTypeCode(financialDocumentTypeCode);
entry.setFinancialSystemOriginationCode(financialSystemOriginationCode);
return entry;
}
/**
* Gets the documentNumber attribute.
*
* @return Returns the documentNumber.
*/
public String getDocumentNumber() {
return documentNumber;
}
/**
* Sets the documentNumber attribute value.
*
* @param documentNumber The documentNumber to set.
*/
public void setDocumentNumber(String documentNumber) {
this.documentNumber = documentNumber;
}
/**
* Gets the financialDocumentTypeCode attribute.
*
* @return Returns the financialDocumentTypeCode.
*/
public String getFinancialDocumentTypeCode() {
return financialDocumentTypeCode;
}
/**
* Sets the financialDocumentTypeCode attribute value.
*
* @param financialDocumentTypeCode The financialDocumentTypeCode to set.
*/
public void setFinancialDocumentTypeCode(String financialDocumentTypeCode) {
this.financialDocumentTypeCode = financialDocumentTypeCode;
}
/**
* Gets the financialSystemOriginationCode attribute.
*
* @return Returns the financialSystemOriginationCode.
*/
public String getFinancialSystemOriginationCode() {
return financialSystemOriginationCode;
}
/**
* Sets the financialSystemOriginationCode attribute value.
*
* @param financialSystemOriginationCode The financialSystemOriginationCode to set.
*/
public void setFinancialSystemOriginationCode(String financialSystemOriginationCode) {
this.financialSystemOriginationCode = financialSystemOriginationCode;
}
/**
* Given an iterator of {@link Transaction} objects, return a set of all the document groups (doc #, doc type, origination code)
* for these transactions
*
* @param transactions iterator of transactions
* @return Set of all of the document groups for this these trasnactions
*/
public static <E extends Transaction> Set<DocumentGroupData> getDocumentGroupDatasForTransactions(Iterator<E> transactions) {
Set<DocumentGroupData> documentGroupDatas = new HashSet<DocumentGroupData>();
while (transactions.hasNext()) {
Transaction transaction = transactions.next();
documentGroupDatas.add(new DocumentGroupData(transaction));
}
return documentGroupDatas;
}
}