001 /* 002 * Copyright 2011 The Kuali Foundation. 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.kfs.module.ld.util; 017 018 import java.util.ArrayList; 019 import java.util.List; 020 021 import org.kuali.kfs.module.ld.LaborConstants; 022 import org.kuali.kfs.module.ld.businessobject.LaborOriginEntry; 023 import org.kuali.kfs.sys.KFSConstants; 024 import org.kuali.kfs.sys.KFSPropertyConstants; 025 import org.kuali.kfs.sys.ObjectUtil; 026 import org.kuali.rice.kns.util.KualiDecimal; 027 import org.kuali.rice.kns.util.ObjectUtils; 028 029 /** 030 * This class is a working unit of labor origin entry. It is formed by a group of slimilar labor origin entries. If any two entries 031 * have the same values for the given fields, then they are similar and can be grouped. 032 */ 033 public class LaborLedgerUnitOfWork { 034 private LaborOriginEntry workingEntry; 035 private List<String> keyFields; 036 private int numOfMember; 037 038 /** 039 * Constructs a LaborLedgerUnitOfWork.java. 040 */ 041 public LaborLedgerUnitOfWork() { 042 this(null); 043 } 044 045 /** 046 * Constructs a LaborLedgerUnitOfWork.java. 047 * 048 * @param laborOriginEntry the given origin entry 049 */ 050 public LaborLedgerUnitOfWork(LaborOriginEntry laborOriginEntry) { 051 this.resetLaborLedgerUnitOfWork(laborOriginEntry); 052 } 053 054 /** 055 * Intialize the default key fields of the labor ledger unit of work with the given origin entry 056 * 057 * @param laborOriginEntry the given origin entry 058 */ 059 public void resetLaborLedgerUnitOfWork(LaborOriginEntry laborOriginEntry) { 060 this.resetLaborLedgerUnitOfWork(laborOriginEntry, null); 061 } 062 063 /** 064 * Intialize the specified key fields of the labor ledger unit of work with the given origin entry 065 * 066 * @param laborOriginEntry the given origin entry 067 * @param keyFields the keys to which values will be assigned 068 */ 069 public void resetLaborLedgerUnitOfWork(LaborOriginEntry laborOriginEntry, List<String> keyFields) { 070 this.workingEntry = new LaborOriginEntry(); 071 this.setKeyFields(keyFields); 072 073 if (laborOriginEntry != null) { 074 ObjectUtil.buildObject(workingEntry, laborOriginEntry, this.getKeyFields()); 075 076 boolean creditIndicator = KFSConstants.GL_CREDIT_CODE.equals(laborOriginEntry.getTransactionDebitCreditCode()); 077 KualiDecimal entryAmount = laborOriginEntry.getTransactionLedgerEntryAmount(); 078 KualiDecimal unitAmount = creditIndicator ? entryAmount.negated() : entryAmount; 079 080 workingEntry.setTransactionLedgerEntryAmount(unitAmount); 081 workingEntry.setTransactionDebitCreditCode(laborOriginEntry.getTransactionDebitCreditCode()); 082 numOfMember = 1; 083 } 084 } 085 086 /** 087 * add the given origin entry as a member of the working unit 088 * 089 * @param laborOriginEntry the given origin entry 090 * @return true if the given origin entry is successfully added into the current unit of work; otherwise, false 091 */ 092 public boolean addEntryIntoUnit(LaborOriginEntry laborOriginEntry) { 093 if (this.hasSameKey(laborOriginEntry)) { 094 KualiDecimal unitAmount = workingEntry.getTransactionLedgerEntryAmount(); 095 KualiDecimal entryAmount = laborOriginEntry.getTransactionLedgerEntryAmount(); 096 097 // if the input entry has a "credit" code , then subtract its amount from the unit total amount 098 boolean creditIndicator = KFSConstants.GL_CREDIT_CODE.equals(laborOriginEntry.getTransactionDebitCreditCode()); 099 unitAmount = creditIndicator ? unitAmount.subtract(entryAmount) : unitAmount.add(entryAmount); 100 101 workingEntry.setTransactionLedgerEntryAmount(unitAmount); 102 numOfMember++; 103 104 return true; 105 } 106 return false; 107 } 108 109 /** 110 * Determine if the given origin entry belongs to the current unit of work 111 * 112 * @param laborOriginEntry the given origin entry 113 * @return true if the given origin entry belongs to the current unit of work; otherwise, false 114 */ 115 public boolean canContain(LaborOriginEntry laborOriginEntry) { 116 return this.hasSameKey(laborOriginEntry); 117 } 118 119 /** 120 * Determine if the given origin entry has the same key as the current unit of work 121 * 122 * @param laborOriginEntry the given origin entry 123 * @return true if the given origin entry has the same key as the current unit of work; otherwise, false 124 */ 125 public boolean hasSameKey(LaborOriginEntry laborOriginEntry) { 126 if(ObjectUtils.isNull(laborOriginEntry)) { 127 return false; 128 } 129 130 return ObjectUtil.equals(workingEntry, laborOriginEntry, this.getKeyFields()); 131 } 132 133 /** 134 * @see java.lang.Object#toString() 135 */ 136 @Override 137 public String toString() { 138 List<String> printablekeyFields = new ArrayList<String>(this.getKeyFields()); 139 printablekeyFields.add(KFSPropertyConstants.TRANSACTION_LEDGER_ENTRY_AMOUNT); 140 return ObjectUtil.buildPropertyMap(workingEntry, printablekeyFields).toString(); 141 } 142 143 /** 144 * Gets the workingEntry attribute. 145 * 146 * @return Returns the workingEntry. 147 */ 148 public LaborOriginEntry getWorkingEntry() { 149 return this.workingEntry; 150 } 151 152 /** 153 * Sets the workingEntry attribute value. 154 * 155 * @param workingEntry The workingEntry to set. 156 */ 157 public void setWorkingEntry(LaborOriginEntry workingEntry) { 158 this.workingEntry = workingEntry; 159 } 160 161 /** 162 * Gets the keyFields attribute. 163 * 164 * @return Returns the keyFields. 165 */ 166 public List<String> getKeyFields() { 167 return keyFields; 168 } 169 170 /** 171 * Sets the keyFields attribute value. 172 * 173 * @param keyFields The keyFields to set. 174 */ 175 public void setKeyFields(List<String> keyFields) { 176 this.keyFields = (keyFields != null) ? keyFields : this.getDefaultKeyFields(); 177 } 178 179 /** 180 * Gets the numOfMember attribute. 181 * 182 * @return Returns the numOfMember. 183 */ 184 public int getNumOfMember() { 185 return numOfMember; 186 } 187 188 /** 189 * Sets the numOfMember attribute value. 190 * 191 * @param numOfMember The numOfMember to set. 192 */ 193 public void setNumOfMember(int numOfMember) { 194 this.numOfMember = numOfMember; 195 } 196 197 /** 198 * Get the default key fields as a list 199 */ 200 protected List<String> getDefaultKeyFields() { 201 List<String> defaultKeyFields = new ArrayList<String>(LaborConstants.consolidationAttributesOfOriginEntry()); 202 defaultKeyFields.remove(KFSPropertyConstants.TRANSACTION_LEDGER_ENTRY_AMOUNT); 203 defaultKeyFields.remove(KFSPropertyConstants.TRANSACTION_DEBIT_CREDIT_CODE); 204 205 return defaultKeyFields; 206 } 207 }