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.cab.document.service.impl;
017    
018    import java.util.ArrayList;
019    import java.util.Collection;
020    import java.util.HashMap;
021    import java.util.Iterator;
022    import java.util.List;
023    import java.util.Map;
024    
025    import org.apache.log4j.Logger;
026    import org.kuali.kfs.integration.purap.CapitalAssetSystem;
027    import org.kuali.kfs.integration.purap.ItemCapitalAsset;
028    import org.kuali.kfs.module.cab.CabConstants;
029    import org.kuali.kfs.module.cab.CabPropertyConstants;
030    import org.kuali.kfs.module.cab.businessobject.PurchasingAccountsPayableDocument;
031    import org.kuali.kfs.module.cab.businessobject.PurchasingAccountsPayableItemAsset;
032    import org.kuali.kfs.module.cab.document.exception.PurApDocumentUnavailableException;
033    import org.kuali.kfs.module.cab.document.service.PurApInfoService;
034    import org.kuali.kfs.module.cab.document.web.struts.PurApLineForm;
035    import org.kuali.kfs.module.cam.CamsConstants;
036    import org.kuali.kfs.module.cam.CamsPropertyConstants;
037    import org.kuali.kfs.module.cam.businessobject.Asset;
038    import org.kuali.kfs.module.cam.document.service.AssetService;
039    import org.kuali.kfs.module.purap.PurapConstants;
040    import org.kuali.kfs.module.purap.PurapPropertyConstants;
041    import org.kuali.kfs.module.purap.businessobject.CreditMemoItem;
042    import org.kuali.kfs.module.purap.businessobject.PaymentRequestItem;
043    import org.kuali.kfs.module.purap.businessobject.PurApItem;
044    import org.kuali.kfs.module.purap.businessobject.PurchaseOrderItem;
045    import org.kuali.kfs.module.purap.businessobject.PurchasingCapitalAssetItem;
046    import org.kuali.kfs.module.purap.document.PurchaseOrderDocument;
047    import org.kuali.kfs.module.purap.document.VendorCreditMemoDocument;
048    import org.kuali.kfs.module.purap.document.service.PurapService;
049    import org.kuali.kfs.module.purap.document.service.PurchaseOrderService;
050    import org.kuali.kfs.module.purap.exception.PurError;
051    import org.kuali.kfs.sys.context.SpringContext;
052    import org.kuali.rice.kns.service.BusinessObjectService;
053    import org.kuali.rice.kns.util.ObjectUtils;
054    
055    
056    /**
057     * This class provides default implementations of {@link PurApLineService}
058     */
059    public class PurApInfoServiceImpl implements PurApInfoService {
060        private static final Logger LOG = Logger.getLogger(PurApInfoServiceImpl.class);
061        private BusinessObjectService businessObjectService;
062    
063        protected static final String PURCHASE_ORDER_CURRENT_INDICATOR = "purchaseOrderCurrentIndicator";
064    
065        /**
066         * @see org.kuali.kfs.module.cab.document.service.PurApInfoService#getDocumentNumberForPurchaseOrderIdentifier(java.lang.Integer)
067         */
068        public PurchaseOrderDocument getCurrentDocumentForPurchaseOrderIdentifier(Integer poId) {
069            Map<String, Object> fieldValues = new HashMap<String, Object>();
070    
071            fieldValues.put(CabPropertyConstants.PurchasingAccountsPayableDocument.PURAP_DOCUMENT_IDENTIFIER, poId);
072            fieldValues.put(PURCHASE_ORDER_CURRENT_INDICATOR, "Y");
073            Collection<PurchaseOrderDocument> poDocs = getBusinessObjectService().findMatching(PurchaseOrderDocument.class, fieldValues);
074            if (poDocs != null && !poDocs.isEmpty()) {
075                Iterator<PurchaseOrderDocument> poIterator = poDocs.iterator();
076                if (poIterator.hasNext()) {
077                    return poIterator.next();
078                }
079            }
080    
081            return null;
082        }
083    
084        /**
085         * @see org.kuali.kfs.module.cab.document.service.PurApLineService#setPurchaseOrderInfo(org.kuali.kfs.module.cab.document.web.struts.PurApLineForm)
086         */
087        public void setPurchaseOrderFromPurAp(PurApLineForm purApLineForm) {
088            PurchaseOrderDocument purchaseOrderDocument = getCurrentDocumentForPurchaseOrderIdentifier(purApLineForm.getPurchaseOrderIdentifier());
089    
090            if (ObjectUtils.isNull(purchaseOrderDocument)) {
091                return;
092            }
093            // Set contact email address.
094            if (purchaseOrderDocument.getInstitutionContactEmailAddress() != null) {
095                purApLineForm.setPurApContactEmailAddress(purchaseOrderDocument.getInstitutionContactEmailAddress());
096            }
097            else if (purchaseOrderDocument.getRequestorPersonEmailAddress() != null) {
098                purApLineForm.setPurApContactEmailAddress(purchaseOrderDocument.getRequestorPersonEmailAddress());
099            }
100    
101            // Set contact phone number.
102            if (purchaseOrderDocument.getInstitutionContactPhoneNumber() != null) {
103                purApLineForm.setPurApContactPhoneNumber(purchaseOrderDocument.getInstitutionContactPhoneNumber());
104            }
105            else if (purchaseOrderDocument.getRequestorPersonPhoneNumber() != null) {
106                purApLineForm.setPurApContactPhoneNumber(purchaseOrderDocument.getRequestorPersonPhoneNumber());
107            }
108    
109            // set reqs_id
110            purApLineForm.setRequisitionIdentifier(purchaseOrderDocument.getRequisitionIdentifier());
111    
112        }
113    
114    
115        /**
116         * Set CAMS transaction type code the user entered in PurAp
117         * 
118         * @param poId
119         */
120        public void setCamsTransactionFromPurAp(List<PurchasingAccountsPayableDocument> purApDocs) {
121            if (ObjectUtils.isNull(purApDocs) || purApDocs.isEmpty()) {
122                return;
123            }
124            Integer poId = purApDocs.get(0).getPurchaseOrderIdentifier();
125            PurchaseOrderDocument purApdocument = getCurrentDocumentForPurchaseOrderIdentifier(poId);
126            if (ObjectUtils.isNull(purApdocument)) {
127                return;
128            }
129    
130            String capitalAssetSystemTypeCode = purApdocument.getCapitalAssetSystemTypeCode();
131            String capitalAssetSystemStateCode = purApdocument.getCapitalAssetSystemStateCode();
132            boolean individualItemLock = false;
133    
134            if (PurapConstants.CapitalAssetTabStrings.INDIVIDUAL_ASSETS.equalsIgnoreCase(capitalAssetSystemTypeCode)) {
135                // If PurAp sets the CAMS as INDIVIDUAL system
136                setIndividualAssetsFromPurAp(poId, purApDocs, capitalAssetSystemStateCode);
137                individualItemLock = true;
138            }
139            else if (PurapConstants.CapitalAssetTabStrings.ONE_SYSTEM.equalsIgnoreCase(capitalAssetSystemTypeCode)) {
140                // If PurAp sets the CAMS as ONE system
141                setOneSystemFromPurAp(poId, purApDocs, capitalAssetSystemStateCode);
142    
143            }
144            else if (PurapConstants.CapitalAssetTabStrings.MULTIPLE_SYSTEMS.equalsIgnoreCase(capitalAssetSystemTypeCode)) {
145                // If PurAp sets the CAMS as MULTIPLE system
146                setMultipleSystemFromPurAp(poId, purApDocs, capitalAssetSystemStateCode);
147            }
148    
149            // Setting locking information based on capital asset system type code. Currently, only individual system can set asset
150            // numbers for each item
151            for (PurchasingAccountsPayableDocument purApDoc : purApDocs) {
152                for (PurchasingAccountsPayableItemAsset itemAsset : purApDoc.getPurchasingAccountsPayableItemAssets()) {
153                    itemAsset.setLockingInformation(individualItemLock ? itemAsset.getAccountsPayableLineItemIdentifier().toString() : CamsConstants.defaultLockingInformation);
154                }
155            }
156        }
157    
158        /**
159         * Set Multiple system capital asset transaction type code and asset numbers.
160         * 
161         * @param poId
162         * @param purApDocs
163         */
164        protected void setMultipleSystemFromPurAp(Integer poId, List<PurchasingAccountsPayableDocument> purApDocs, String capitalAssetSystemStateCode) {
165            List<CapitalAssetSystem> capitalAssetSystems = this.getPurchaseOrderService().retrieveCapitalAssetSystemsForMultipleSystem(poId);
166            if (ObjectUtils.isNotNull(capitalAssetSystems) && !capitalAssetSystems.isEmpty()) {
167                // PurAp doesn't support multiple system asset information for KFS3.0. It works as one system for 3.0.
168                CapitalAssetSystem capitalAssetSystem = capitalAssetSystems.get(0);
169                if (ObjectUtils.isNotNull(capitalAssetSystem)) {
170                    String capitalAssetTransactionType = getCapitalAssetTransTypeForOneSystem(poId);
171                    // if modify existing asset, acquire the assets from Purap
172                    List<ItemCapitalAsset> purApCapitalAssets = null;
173                    if (PurapConstants.CapitalAssetSystemStates.MODIFY.equalsIgnoreCase(capitalAssetSystemStateCode)) {
174                        purApCapitalAssets = getAssetsFromItemCapitalAsset(capitalAssetSystem.getItemCapitalAssets());
175                    }
176    
177                    // set TransactionTypeCode, itemCapitalAssets and system identifier for each item
178                    for (PurchasingAccountsPayableDocument purApDoc : purApDocs) {
179                        setItemAssetsCamsTransaction(capitalAssetSystem.getCapitalAssetSystemIdentifier(), capitalAssetTransactionType, purApCapitalAssets, purApDoc.getPurchasingAccountsPayableItemAssets());
180                    }
181                }
182            }
183        }
184    
185        /**
186         * Set One System capital asset transaction type code and asset numbers.
187         * 
188         * @param poId
189         * @param purApDocs
190         */
191        protected void setOneSystemFromPurAp(Integer poId, List<PurchasingAccountsPayableDocument> purApDocs, String capitalAssetSystemStateCode) {
192            CapitalAssetSystem capitalAssetSystem = this.getPurchaseOrderService().retrieveCapitalAssetSystemForOneSystem(poId);
193            String capitalAssetTransactionTypeCode = getCapitalAssetTransTypeForOneSystem(poId);
194            List<ItemCapitalAsset> purApCapitalAssets = null;
195            // if modify existing asset, acquire the assets from Purap
196            if (PurapConstants.CapitalAssetSystemStates.MODIFY.equalsIgnoreCase(capitalAssetSystemStateCode)) {
197                purApCapitalAssets = getAssetsFromItemCapitalAsset(capitalAssetSystem.getItemCapitalAssets());
198            }
199    
200            for (PurchasingAccountsPayableDocument purApDoc : purApDocs) {
201                // set TransactionTypeCode, itemCapitalAssets and system identifier for each item
202                setItemAssetsCamsTransaction(capitalAssetSystem.getCapitalAssetSystemIdentifier(), capitalAssetTransactionTypeCode, purApCapitalAssets, purApDoc.getPurchasingAccountsPayableItemAssets());
203            }
204        }
205    
206        /**
207         * Update item assets by PurAp Cams Transaction setting
208         * 
209         * @param capitalAssetSystemIdentifier
210         * @param capitRalAssetTransactionTypeCode
211         * @param purApCapitalAssets
212         * @param itemAssets
213         */
214        protected void setItemAssetsCamsTransaction(Integer capitalAssetSystemIdentifier, String capitalAssetTransactionTypeCode, List<ItemCapitalAsset> purApCapitalAssets, List<PurchasingAccountsPayableItemAsset> itemAssets) {
215            for (PurchasingAccountsPayableItemAsset item : itemAssets) {
216                item.setCapitalAssetTransactionTypeCode(capitalAssetTransactionTypeCode);
217                // set for item capital assets
218                if (purApCapitalAssets != null && !purApCapitalAssets.isEmpty()) {
219                    item.getPurApItemAssets().addAll(purApCapitalAssets);
220                }
221                // set for capital asset system ID
222                item.setCapitalAssetSystemIdentifier(capitalAssetSystemIdentifier);
223            }
224        }
225    
226        /**
227         * Get capitalAssetTransactionTypeCode for one system from PurAp.
228         * 
229         * @param poId
230         * @return
231         */
232        protected String getCapitalAssetTransTypeForOneSystem(Integer poId) {
233            PurchaseOrderDocument poDoc = getCurrentDocumentForPurchaseOrderIdentifier(poId);
234            if (ObjectUtils.isNotNull(poDoc)) {
235                List<PurchasingCapitalAssetItem> capitalAssetItems = poDoc.getPurchasingCapitalAssetItems();
236    
237                if (ObjectUtils.isNotNull(capitalAssetItems) && capitalAssetItems.get(0) != null) {
238                    return capitalAssetItems.get(0).getCapitalAssetTransactionTypeCode();
239                }
240            }
241            return null;
242        }
243    
244        /**
245         * Set Individual system asset transaction type and asset numbers.
246         * 
247         * @param poId
248         * @param purApDocs
249         */
250        protected void setIndividualAssetsFromPurAp(Integer poId, List<PurchasingAccountsPayableDocument> purApDocs, String capitalAssetSystemStateCode) {
251            List<PurchasingCapitalAssetItem> capitalAssetItems = this.getPurchaseOrderService().retrieveCapitalAssetItemsForIndividual(poId);
252            String capitalAssetTransactionTypeCode = null;
253            List<ItemCapitalAsset> purApCapitalAssets = null;
254    
255            // For each capitalAssetItem from PurAp, we set it to all matching CAB items
256            for (PurchasingCapitalAssetItem purchasingCapitalAssetItem : capitalAssetItems) {
257                capitalAssetTransactionTypeCode = purchasingCapitalAssetItem.getCapitalAssetTransactionTypeCode();
258                // get matching CAB items origin from the same PO item.
259                List<PurchasingAccountsPayableItemAsset> matchingItems = getMatchingItems(purchasingCapitalAssetItem.getItemIdentifier(), purApDocs);
260                // if modify existing asset, acquire the assets from Puraps
261                if (PurapConstants.CapitalAssetSystemStates.MODIFY.equalsIgnoreCase(capitalAssetSystemStateCode)) {
262                    purApCapitalAssets = getAssetsFromItemCapitalAsset(purchasingCapitalAssetItem.getPurchasingCapitalAssetSystem().getItemCapitalAssets());
263                }
264    
265                // set TransactionTypeCode, itemCapitalAssets and system identifier for each matching item
266                setItemAssetsCamsTransaction(purchasingCapitalAssetItem.getCapitalAssetSystemIdentifier(), capitalAssetTransactionTypeCode, purApCapitalAssets, matchingItems);
267            }
268        }
269    
270        /**
271         * Get asset number list from ItemCapitalAsset list.
272         * 
273         * @param itemCapitalAssets
274         * @return
275         */
276        protected List<ItemCapitalAsset> getAssetsFromItemCapitalAsset(List<ItemCapitalAsset> itemCapitalAssets) {
277            List<ItemCapitalAsset> assetNumbers = new ArrayList<ItemCapitalAsset>();
278    
279            for (ItemCapitalAsset asset : itemCapitalAssets) {
280                if (asset.getCapitalAssetNumber() != null && !isAssetNumberDuplicate(asset.getCapitalAssetNumber(), assetNumbers)) {
281                    assetNumbers.add(asset);
282                }
283            }
284            return assetNumbers;
285        }
286    
287        /**
288         * Check if given capitalAssetNumber is an duplicate number in assetNumbers list.
289         * 
290         * @param capitalAssetNumber
291         * @param assetNumbers
292         * @return
293         */
294        protected boolean isAssetNumberDuplicate(Long candidateNumber, List<ItemCapitalAsset> assetNumbers) {
295            for (ItemCapitalAsset existingNumber : assetNumbers) {
296                if (existingNumber.getCapitalAssetNumber().equals(candidateNumber)) {
297                    return true;
298                }
299            }
300            return false;
301        }
302    
303        /**
304         * Finding out the matching PREQ/CM items originating from the same PurchaseOrderItem.
305         * 
306         * @param itemIdentifier
307         * @param purApDocs
308         * @return
309         */
310        protected List<PurchasingAccountsPayableItemAsset> getMatchingItems(Integer itemIdentifier, List<PurchasingAccountsPayableDocument> purApDocs) {
311            List<PurchasingAccountsPayableItemAsset> matchingItems = new ArrayList<PurchasingAccountsPayableItemAsset>();
312    
313            if (itemIdentifier != null) {
314                for (PurchasingAccountsPayableDocument purApDoc : purApDocs) {
315                    for (PurchasingAccountsPayableItemAsset item : purApDoc.getPurchasingAccountsPayableItemAssets()) {
316                        if (itemIdentifier.equals(item.getPurchaseOrderItemIdentifier())) {
317                            matchingItems.add(item);
318                        }
319                    }
320                }
321            }
322            return matchingItems;
323        }
324    
325    
326        /**
327         * Set CAB line item information from PurAp PaymentRequestItem or CreditMemoItem.
328         * 
329         * @param purchasingAccountsPayableItemAsset
330         * @param docTypeCode
331         */
332        public void setAccountsPayableItemsFromPurAp(PurchasingAccountsPayableItemAsset purchasingAccountsPayableItemAsset, String docTypeCode) {
333            Map<String, Object> pKeys = new HashMap<String, Object>();
334            pKeys.put(PurapPropertyConstants.ITEM_IDENTIFIER, purchasingAccountsPayableItemAsset.getAccountsPayableLineItemIdentifier());
335    
336            // Access PurAp data based on item type(PREQ or CM).
337            if (CabConstants.PREQ.equalsIgnoreCase(docTypeCode)) {
338                // for PREQ document
339                PaymentRequestItem item = (PaymentRequestItem) businessObjectService.findByPrimaryKey(PaymentRequestItem.class, pKeys);
340                if (ObjectUtils.isNull(item)) {
341                    throw new PurApDocumentUnavailableException("PaymentRequestItem with id = " + purchasingAccountsPayableItemAsset.getAccountsPayableLineItemIdentifier() + " doesn't exist in table.");
342                }
343    
344                purchasingAccountsPayableItemAsset.setItemLineNumber(item.getItemLineNumber());
345                if (item.getItemType() != null) {
346                    purchasingAccountsPayableItemAsset.setAdditionalChargeNonTradeInIndicator(item.getItemType().isAdditionalChargeIndicator() & !CabConstants.TRADE_IN_TYPE_CODE.equalsIgnoreCase(item.getItemTypeCode()));
347                    purchasingAccountsPayableItemAsset.setTradeInAllowance(item.getItemType().isAdditionalChargeIndicator() & CabConstants.TRADE_IN_TYPE_CODE.equalsIgnoreCase(item.getItemTypeCode()));
348                    purchasingAccountsPayableItemAsset.setItemTypeCode(item.getItemTypeCode());
349                }
350                purchasingAccountsPayableItemAsset.setItemAssignedToTradeInIndicator(item.getItemAssignedToTradeInIndicator());
351                // PurchaseOrderItemIdentifier will be used when populate PurAp asset data
352                PurchaseOrderItem poi = item.getPurchaseOrderItem();
353                if (poi != null) {
354                    purchasingAccountsPayableItemAsset.setPurchaseOrderItemIdentifier(poi.getItemIdentifier());
355                }
356            }
357            else {
358                // for CM document
359                CreditMemoItem item = (CreditMemoItem) businessObjectService.findByPrimaryKey(CreditMemoItem.class, pKeys);
360                if (ObjectUtils.isNull(item)) {
361                    throw new PurApDocumentUnavailableException("CreditMemoItem with id = " + purchasingAccountsPayableItemAsset.getAccountsPayableLineItemIdentifier() + " doesn't exist in table.");
362                }
363    
364                purchasingAccountsPayableItemAsset.setItemLineNumber(item.getItemLineNumber());
365                if (item.getItemType() != null) {
366                    purchasingAccountsPayableItemAsset.setAdditionalChargeNonTradeInIndicator(item.getItemType().isAdditionalChargeIndicator() & !CabConstants.TRADE_IN_TYPE_CODE.equalsIgnoreCase(item.getItemTypeCode()));
367                    purchasingAccountsPayableItemAsset.setTradeInAllowance(item.getItemType().isAdditionalChargeIndicator() & CabConstants.TRADE_IN_TYPE_CODE.equalsIgnoreCase(item.getItemTypeCode()));
368                    purchasingAccountsPayableItemAsset.setItemTypeCode(item.getItemTypeCode());
369                }
370                purchasingAccountsPayableItemAsset.setItemAssignedToTradeInIndicator(item.getItemAssignedToTradeInIndicator());
371                // PurchaseOrderItemIdentifier will be used when populate PurAp asset data
372                PurchaseOrderItem poi = getPurchaseOrderItemfromCreditMemoItem(item);
373                if (poi != null) {
374                    purchasingAccountsPayableItemAsset.setPurchaseOrderItemIdentifier(poi.getItemIdentifier());
375                }
376                // if PREQ Credit Memo document
377                VendorCreditMemoDocument cmDoc = (VendorCreditMemoDocument) item.getPurapDocument();
378                if (ObjectUtils.isNotNull(cmDoc) && cmDoc.isSourceDocumentPaymentRequest()) {
379                    purchasingAccountsPayableItemAsset.setPaymentRequestIdentifier(cmDoc.getPaymentRequestIdentifier());
380                }
381            }
382        }
383    
384    
385        /**
386         * Retreives a purchase order item for a given CreditMemoItem by inspecting the item type to see if its above the line or below
387         * the line and returns the appropriate type.
388         * 
389         * @param item
390         * @return
391         */
392        protected PurchaseOrderItem getPurchaseOrderItemfromCreditMemoItem(CreditMemoItem item) {
393            if (ObjectUtils.isNotNull(item.getPurapDocumentIdentifier())) {
394                if (ObjectUtils.isNull(item.getPurapDocument())) {
395                    item.refreshReferenceObject(PurapPropertyConstants.PURAP_DOC);
396                }
397            }
398            // ideally we should do this a different way - maybe move it all into the service or save this info somehow (make sure and
399            // update though)
400            if (item.getPurapDocument() != null) {
401                PurchaseOrderDocument po = ((VendorCreditMemoDocument) item.getPurapDocument()).getPurchaseOrderDocument();
402                PurchaseOrderItem poi = null;
403                if (item.getItemType().isLineItemIndicator()) {
404                    if (po.getItems() == null || po.getItems().isEmpty()) {
405                        po.refreshReferenceObject("items");
406                    }
407                    poi = (PurchaseOrderItem) po.getItem(item.getItemLineNumber().intValue() - 1);
408                }
409                else {
410                    // To get the purchaseOrderItem by given CreditMemoItem. Since the additional charge type may be different in CM and
411                    // PO, there could be no PO Item for a given CM item.
412                    poi = (PurchaseOrderItem) SpringContext.getBean(PurapService.class).getBelowTheLineByType(po, item.getItemType());
413                }
414                if (poi != null) {
415                    return poi;
416                }
417                else {
418                    LOG.debug("getPurchaseOrderItemfromCreditMemoItem() Returning null because PurchaseOrderItem object for line number" + item.getItemLineNumber() + "or itemType " + item.getItemTypeCode() + " is null");
419                    return null;
420                }
421            }
422            else {
423    
424                LOG.error("getPurchaseOrderItemfromCreditMemoItem() Returning null because paymentRequest object is null");
425                throw new PurError("Credit Memo Object in Purchase Order item line number " + item.getItemLineNumber() + "or itemType " + item.getItemTypeCode() + " is null");
426            }
427        }
428    
429    
430        public List<Long> retrieveValidAssetNumberForLocking(Integer poId, String capitalAssetSystemTypeCode, PurApItem purApItem) {
431            List<Long> capitalAssetNumbers = new ArrayList<Long>();
432            CapitalAssetSystem capitalAssetSystem = null;
433    
434            if (PurapConstants.CapitalAssetTabStrings.INDIVIDUAL_ASSETS.equalsIgnoreCase(capitalAssetSystemTypeCode)) {
435                // If PurAp sets the CAMS as INDIVIDUAL system
436                capitalAssetSystem = getCapitalAssetSystemForIndividual(poId, purApItem);
437    
438            }
439            else if (PurapConstants.CapitalAssetTabStrings.ONE_SYSTEM.equalsIgnoreCase(capitalAssetSystemTypeCode)) {
440                capitalAssetSystem = this.getPurchaseOrderService().retrieveCapitalAssetSystemForOneSystem(poId);
441            }
442            else if (PurapConstants.CapitalAssetTabStrings.MULTIPLE_SYSTEMS.equalsIgnoreCase(capitalAssetSystemTypeCode)) {
443                List<CapitalAssetSystem> capitalAssetSystems = this.getPurchaseOrderService().retrieveCapitalAssetSystemsForMultipleSystem(poId);
444                if (ObjectUtils.isNotNull(capitalAssetSystems) && !capitalAssetSystems.isEmpty()) {
445                    // PurAp doesn't support multiple system asset information for KFS3.0. It works as One system.
446                    capitalAssetSystem = capitalAssetSystems.get(0);
447                }
448            }
449    
450            if (ObjectUtils.isNotNull(capitalAssetSystem) && capitalAssetSystem.getItemCapitalAssets() != null && !capitalAssetSystem.getItemCapitalAssets().isEmpty()) {
451                for (ItemCapitalAsset itemCapitalAsset : capitalAssetSystem.getItemCapitalAssets()) {
452                    if (itemCapitalAsset.getCapitalAssetNumber() != null) {
453                        Map pKeys = new HashMap<String, Object>();
454                        // Asset must be valid and capital active 'A','C','S','U'
455                        pKeys.put(CamsPropertyConstants.Asset.CAPITAL_ASSET_NUMBER, itemCapitalAsset.getCapitalAssetNumber());
456    
457                        Asset asset = (Asset) businessObjectService.findByPrimaryKey(Asset.class, pKeys);
458                        if (ObjectUtils.isNotNull(asset) && getAssetService().isCapitalAsset(asset) && !getAssetService().isAssetRetired(asset)) {
459                            capitalAssetNumbers.add(itemCapitalAsset.getCapitalAssetNumber());
460                        }
461                    }
462                }
463            }
464            return capitalAssetNumbers;
465        }
466    
467        protected CapitalAssetSystem getCapitalAssetSystemForIndividual(Integer poId, PurApItem purApItem) {
468            List<PurchasingCapitalAssetItem> capitalAssetItems = this.getPurchaseOrderService().retrieveCapitalAssetItemsForIndividual(poId);
469            if (capitalAssetItems == null || capitalAssetItems.isEmpty()) {
470                return null;
471            }
472    
473            Integer purchaseOrderItemIdentifier = null;
474            PurchaseOrderItem poi = null;
475            if (purApItem instanceof PaymentRequestItem) {
476                poi = ((PaymentRequestItem) purApItem).getPurchaseOrderItem();
477    
478            }
479            else if (purApItem instanceof CreditMemoItem) {
480                poi = getPurchaseOrderItemfromCreditMemoItem((CreditMemoItem) purApItem);
481            }
482    
483            if (poi != null) {
484                purchaseOrderItemIdentifier = poi.getItemIdentifier();
485            }
486            for (PurchasingCapitalAssetItem capitalAssetItem : capitalAssetItems) {
487                if (capitalAssetItem.getItemIdentifier().equals(purchaseOrderItemIdentifier)) {
488                    return capitalAssetItem.getPurchasingCapitalAssetSystem();
489                }
490            }
491            return null;
492        }
493    
494        protected AssetService getAssetService() {
495            return SpringContext.getBean(AssetService.class);
496        }
497    
498        /**
499         * Gets the businessObjectService attribute.
500         * 
501         * @return Returns the businessObjectService.
502         */
503        public BusinessObjectService getBusinessObjectService() {
504            return businessObjectService;
505        }
506    
507    
508        /**
509         * Sets the businessObjectService attribute value.
510         * 
511         * @param businessObjectService The businessObjectService to set.
512         */
513        public void setBusinessObjectService(BusinessObjectService businessObjectService) {
514            this.businessObjectService = businessObjectService;
515        }
516    
517    
518        /**
519         * Gets the purchaseOrderService attribute.
520         * 
521         * @return Returns the purchaseOrderService.
522         */
523        public PurchaseOrderService getPurchaseOrderService() {
524            return SpringContext.getBean(PurchaseOrderService.class);
525        }
526    
527    
528    }