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.endow.document.service.impl; 017 018 import org.kuali.kfs.module.endow.businessobject.EndowmentTransactionLine; 019 import org.kuali.kfs.module.endow.businessobject.EndowmentTransactionSecurity; 020 import org.kuali.kfs.module.endow.businessobject.EndowmentTransactionTaxLotLine; 021 import org.kuali.kfs.module.endow.businessobject.HoldingTaxLot; 022 import org.kuali.kfs.module.endow.businessobject.Security; 023 import org.kuali.kfs.module.endow.document.AssetDecreaseDocument; 024 import org.kuali.kfs.module.endow.document.AssetIncreaseDocument; 025 import org.kuali.kfs.module.endow.document.service.HoldingTaxLotService; 026 import org.kuali.kfs.module.endow.document.service.KEMService; 027 import org.kuali.kfs.module.endow.document.service.SecurityService; 028 import org.kuali.kfs.module.endow.document.service.UpdateAssetDecreaseDocumentTaxLotsService; 029 import org.kuali.rice.kns.util.KualiDecimal; 030 import org.kuali.rice.kns.util.ObjectUtils; 031 032 /** 033 * Provides an implementation for the transaction line related tax lots update for the AssetIncreaseDocument. 034 */ 035 public class UpdateAssetDecreaseDocumentTaxLotsServiceImpl implements UpdateAssetDecreaseDocumentTaxLotsService { 036 037 private HoldingTaxLotService taxLotService; 038 private SecurityService securityService; 039 private KEMService kemService; 040 041 /** 042 * 043 * @see org.kuali.kfs.module.endow.document.service.UpdateAssetDecreaseDocumentTaxLotsService#updateTransactionLineTaxLots(org.kuali.kfs.module.endow.document.AssetDecreaseDocument, org.kuali.kfs.module.endow.businessobject.EndowmentTransactionLine) 044 */ 045 public void updateTransactionLineTaxLots(AssetDecreaseDocument adDocument, EndowmentTransactionLine transLine) { 046 EndowmentTransactionTaxLotLine taxLotLine = null; 047 boolean newLine = false; 048 EndowmentTransactionSecurity endowmentTransactionSecurity = adDocument.getSourceTransactionSecurity(); 049 050 // updating an existing tax lot 051 if (transLine.getTaxLotLines() != null && transLine.getTaxLotLines().size() > 0) { 052 // there is only one tax lot line per each transaction line 053 taxLotLine = transLine.getTaxLotLines().get(0); 054 } 055 // or adding a new one 056 else { 057 // create and set a new tax lot line 058 newLine = true; 059 taxLotLine = new EndowmentTransactionTaxLotLine(); 060 taxLotLine.setDocumentNumber(adDocument.getDocumentNumber()); 061 taxLotLine.setDocumentLineNumber(transLine.getTransactionLineNumber()); 062 taxLotLine.setTransactionHoldingLotNumber(1); 063 taxLotLine.setKemid(transLine.getKemid()); 064 taxLotLine.setSecurityID(endowmentTransactionSecurity.getSecurityID()); 065 taxLotLine.setRegistrationCode(endowmentTransactionSecurity.getRegistrationCode()); 066 taxLotLine.setIpIndicator(transLine.getTransactionIPIndicatorCode()); 067 } 068 069 taxLotLine.setLotUnits(transLine.getTransactionUnits().bigDecimalValue().negate()); 070 taxLotLine.setLotHoldingCost(transLine.getTransactionAmount().bigDecimalValue().negate()); 071 072 // set the tax lot acquired date 073 setTaxLotAcquiredDate(taxLotLine, adDocument, transLine); 074 075 // set the new lot indicator 076 setNewLotIndicator(taxLotLine, adDocument); 077 078 if (newLine) { 079 transLine.getTaxLotLines().add(taxLotLine); 080 } 081 082 } 083 084 /** 085 * Sets the Acquired date for the given tax lot line. If the tax lot indicator for the security (END_TRAN_SEC_T: 086 * SEC_TAX_LOT_IND) is No then for the lot acquired date - LOT_AQ_DATE - Search the END_HLDG_TAX_LOT_T records by KEMID by 087 * SEC_ID by REGIS_CD by HLDG_IP_IND [where HLDG_IP_IND is equal to END_TRAN_LN_T: TRAN_IP_IND_CD] by HLDG_LOT_NBR where 088 * HLDG_LOT_NBR is equal to 1 and return the HLDG_ACQD_DT: - If a lot exists for the security in END_HLDG_TAX_LOT_T, but the 089 * HLDG_UNITS and HLDG_COST are zero, insert the current date (System or Process) in LOT_ACQD_DT. - IF no lot exists for the 090 * security, then insert the current date (System or Process) in LOT_ACQD_DT. If the tax lot indicator for the security 091 * (END_TRAN_SEC_T: SEC_TAX_LOT_IND) is Yes: - LOT_AQ_DATE - insert the current date (System or Process) in this field 092 * 093 * @param taxLotLine the tax lot line for which to set the acquired date 094 * @param adDocument the Asset Decrease Document the tax lot line belongs to 095 * @param transLine the transaction line the tax lot is related to 096 */ 097 private void setTaxLotAcquiredDate(EndowmentTransactionTaxLotLine taxLotLine, AssetDecreaseDocument adDocument, EndowmentTransactionLine transLine) { 098 EndowmentTransactionSecurity endowmentTransactionSecurity = adDocument.getSourceTransactionSecurity(); 099 100 Security security = securityService.getByPrimaryKey(endowmentTransactionSecurity.getSecurityID()); 101 102 // if security tax lot indicator is 'No' and a tax lot exists for the kemid, security, registration code and income 103 // principal indicator - set the lot acquired date to be the tax lot holding acquired date if units and cost is not zero; 104 // otherwise set the date to be the current date 105 if (ObjectUtils.isNotNull(security) && !security.getClassCode().isTaxLotIndicator()) { 106 HoldingTaxLot holdingTaxLot = taxLotService.getByPrimaryKey(transLine.getKemid(), endowmentTransactionSecurity.getSecurityID(), endowmentTransactionSecurity.getRegistrationCode(), 1, transLine.getTransactionIPIndicatorCode()); 107 if (ObjectUtils.isNotNull(holdingTaxLot)) { 108 if (holdingTaxLot.getUnits().equals(KualiDecimal.ZERO) && holdingTaxLot.getCost().equals(KualiDecimal.ZERO)) { 109 taxLotLine.setLotAcquiredDate(kemService.getCurrentDate()); 110 } 111 else { 112 taxLotLine.setLotAcquiredDate(holdingTaxLot.getAcquiredDate()); 113 } 114 } 115 else { 116 taxLotLine.setLotAcquiredDate(kemService.getCurrentDate()); 117 } 118 119 } 120 // if security tax lot indicator is 'Yes' set the lot acquired date to be the current date 121 else { 122 taxLotLine.setLotAcquiredDate(kemService.getCurrentDate()); 123 } 124 } 125 126 /** 127 * Sets the new lot indicator for the tax lot: -- if the security tax lot indicator is No then I think we should set the field 128 * to 'N'. When the batch process runs we might need to create a new entry on the holding tax lot table in case no entry is 129 * found for the given KEMID, security ID, registration code, holding ip indicator, and holding lot number = 1. In case there is 130 * an entry we will just update that one; -- if the security tax lot is Yes then the field should be set to 'Y'.We are always 131 * creating a new field with the lot number being the next sequential lot number. 132 * 133 * @param taxLotLine 134 * @param adDocument 135 */ 136 private void setNewLotIndicator(EndowmentTransactionTaxLotLine taxLotLine, AssetDecreaseDocument adDocument) { 137 EndowmentTransactionSecurity endowmentTransactionSecurity = adDocument.getSourceTransactionSecurity(); 138 Security security = securityService.getByPrimaryKey(endowmentTransactionSecurity.getSecurityID()); 139 140 if (ObjectUtils.isNotNull(security)) { 141 // if the security tax lot indicator is No then I think we should set the field to 'N'. When the batch process runs we 142 // might need to create a new entry on the holding tax lot table in case no entry is found for the given KEMID, security 143 // ID, registration code, holding ip indicator, and holding lot number = 1. In case there is an entry we will just 144 // update that one 145 if (!security.getClassCode().isTaxLotIndicator()) { 146 147 taxLotLine.setNewLotIndicator(false); 148 } 149 // if the security tax lot is Yes then the field should be set to 'Y'.We are always creating a new field with the lot 150 // number being the next sequential lot number. 151 else { 152 taxLotLine.setNewLotIndicator(true); 153 } 154 } 155 } 156 157 /** 158 * Gets the taxLotService. 159 * 160 * @return taxLotService 161 */ 162 protected HoldingTaxLotService getTaxLotService() { 163 return taxLotService; 164 } 165 166 /** 167 * Sets the taxLotService. 168 * 169 * @param taxLotService 170 */ 171 public void setTaxLotService(HoldingTaxLotService taxLotService) { 172 this.taxLotService = taxLotService; 173 } 174 175 /** 176 * Gets the securityService. 177 * 178 * @return securityService 179 */ 180 protected SecurityService getSecurityService() { 181 return securityService; 182 } 183 184 /** 185 * Sets the securityService. 186 * 187 * @param securityService 188 */ 189 public void setSecurityService(SecurityService securityService) { 190 this.securityService = securityService; 191 } 192 193 /** 194 * Gets the kemService. 195 * 196 * @return kemService 197 */ 198 protected KEMService getKemService() { 199 return kemService; 200 } 201 202 /** 203 * Sets the kemService. 204 * 205 * @param kemService 206 */ 207 public void setKemService(KEMService kemService) { 208 this.kemService = kemService; 209 } 210 }