/* * 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.module.purap.document.service.impl; import java.sql.Date; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import org.kuali.kfs.integration.purap.PurchasingAccountsPayableModuleService; import org.kuali.kfs.integration.purap.PurchasingAccountsPayableSensitiveData; import org.kuali.kfs.module.purap.PurapConstants; import org.kuali.kfs.module.purap.PurapParameterConstants; import org.kuali.kfs.module.purap.businessobject.PaymentRequestView; import org.kuali.kfs.module.purap.businessobject.SensitiveData; import org.kuali.kfs.module.purap.document.PaymentRequestDocument; import org.kuali.kfs.module.purap.document.PurchaseOrderDocument; import org.kuali.kfs.module.purap.document.RequisitionDocument; import org.kuali.kfs.module.purap.document.VendorCreditMemoDocument; import org.kuali.kfs.module.purap.document.service.CreditMemoService; import org.kuali.kfs.module.purap.document.service.PaymentRequestService; import org.kuali.kfs.module.purap.document.service.PurapService; import org.kuali.kfs.module.purap.document.service.PurchaseOrderService; import org.kuali.kfs.module.purap.util.PurApRelatedViews; import org.kuali.kfs.sys.KFSPropertyConstants; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.rice.core.api.util.type.KualiDecimal; import org.kuali.rice.coreservice.framework.parameter.ParameterService; import org.kuali.rice.kew.api.exception.WorkflowException; import org.kuali.rice.krad.bo.Note; import org.kuali.rice.krad.service.BusinessObjectService; import org.kuali.rice.krad.service.DocumentService; import org.kuali.rice.krad.service.NoteService; import org.kuali.rice.krad.util.ObjectUtils; public class PurchasingAccountsPayableModuleServiceImpl implements PurchasingAccountsPayableModuleService { private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(PurchasingAccountsPayableModuleServiceImpl.class); protected PurchaseOrderService purchaseOrderService; protected PurapService purapService; protected DocumentService documentService; protected BusinessObjectService businessObjectService; /** * @see org.kuali.kfs.integration.service.PurchasingAccountsPayableModuleService#addAssignedAssetNumbers(java.lang.Integer, * java.util.List) */ @Override public void addAssignedAssetNumbers(Integer purchaseOrderNumber, String principalId, String noteText) { PurchaseOrderDocument document = purchaseOrderService.getCurrentPurchaseOrder(purchaseOrderNumber); try { Note assetNote = SpringContext.getBean(DocumentService.class).createNoteFromDocument(document, noteText); // set the initiator user info to the new note assetNote.setAuthorUniversalIdentifier(principalId); document.addNote(assetNote); SpringContext.getBean(NoteService.class).save(assetNote); } catch (Exception e) { throw new RuntimeException(e); } } /** * @see org.kuali.kfs.integration.service.PurchasingAccountsPayableModuleService#getPurchaseOrderInquiryUrl(java.lang.Integer) */ @Override public String getPurchaseOrderInquiryUrl(Integer purchaseOrderNumber) { PurchaseOrderDocument po = purchaseOrderService.getCurrentPurchaseOrder(purchaseOrderNumber); if (ObjectUtils.isNotNull(po)) { return "purapPurchaseOrder.do?methodToCall=docHandler&docId=" + po.getDocumentNumber() + "&command=displayDocSearchView"; } else { return ""; } } /** * @see org.kuali.kfs.integration.service.PurchasingAccountsPayableModuleService#getAllSensitiveDatas() */ @Override public List<PurchasingAccountsPayableSensitiveData> getAllSensitiveDatas() { List<PurchasingAccountsPayableSensitiveData> sensitiveDatas = new ArrayList<PurchasingAccountsPayableSensitiveData>(); Collection sensitiveDatasAsObjects = SpringContext.getBean(BusinessObjectService.class).findAll(SensitiveData.class); for (Object rm : sensitiveDatasAsObjects) { sensitiveDatas.add((PurchasingAccountsPayableSensitiveData) rm); } return sensitiveDatas; } /** * @see org.kuali.kfs.integration.service.PurchasingAccountsPayableModuleService#getSensitiveDataByCode(java.lang.String) */ @Override public PurchasingAccountsPayableSensitiveData getSensitiveDataByCode(String sensitiveDataCode) { Map primaryKeys = new HashMap(); primaryKeys.put("sensitiveDataCode", sensitiveDataCode); return SpringContext.getBean(BusinessObjectService.class).findByPrimaryKey(SensitiveData.class, primaryKeys); } /** * @see org.kuali.kfs.integration.service.PurchasingAccountsPayableModuleService#isPurchasingBatchDocument(java.lang.String) */ @Override public boolean isPurchasingBatchDocument(String documentTypeCode) { if (PurapConstants.PurapDocTypeCodes.PAYMENT_REQUEST_DOCUMENT.equals(documentTypeCode) || PurapConstants.PurapDocTypeCodes.CREDIT_MEMO_DOCUMENT.equals(documentTypeCode)) { return true; } return false; } /** * @see org.kuali.kfs.integration.service.PurchasingAccountsPayableModuleService#handlePurchasingBatchCancels(java.lang.String) */ @Override public void handlePurchasingBatchCancels(String documentNumber, String documentTypeCode, boolean primaryCancel, boolean disbursedPayment) { LOG.info("Begin handlePurchasingBatchCancels(documentNumber=" + documentNumber + ", documentTypeCode=" + documentTypeCode + ", primaryCancel=" + primaryCancel + ", disbursedPayment=" + disbursedPayment); ParameterService parameterService = SpringContext.getBean(ParameterService.class); PaymentRequestService paymentRequestService = SpringContext.getBean(PaymentRequestService.class); CreditMemoService creditMemoService = SpringContext.getBean(CreditMemoService.class); String preqCancelNote = parameterService.getParameterValueAsString(PaymentRequestDocument.class, PurapParameterConstants.PURAP_PDP_PREQ_CANCEL_NOTE); String preqResetNote = parameterService.getParameterValueAsString(PaymentRequestDocument.class, PurapParameterConstants.PURAP_PDP_PREQ_RESET_NOTE); String cmCancelNote = parameterService.getParameterValueAsString(VendorCreditMemoDocument.class, PurapParameterConstants.PURAP_PDP_CM_CANCEL_NOTE); String cmResetNote = parameterService.getParameterValueAsString(VendorCreditMemoDocument.class, PurapParameterConstants.PURAP_PDP_CM_RESET_NOTE); if (PurapConstants.PurapDocTypeCodes.PAYMENT_REQUEST_DOCUMENT.equals(documentTypeCode)) { PaymentRequestDocument pr = paymentRequestService.getPaymentRequestByDocumentNumber(documentNumber); if (pr != null) { if (disbursedPayment || primaryCancel) { paymentRequestService.cancelExtractedPaymentRequest(pr, preqCancelNote); } else { paymentRequestService.resetExtractedPaymentRequest(pr, preqResetNote); } } else { LOG.error("processPdpCancels() DOES NOT EXIST, CANNOT PROCESS - Payment Request with doc type of " + documentTypeCode + " with id " + documentNumber); } } else if (PurapConstants.PurapDocTypeCodes.CREDIT_MEMO_DOCUMENT.equals(documentTypeCode)) { VendorCreditMemoDocument cm = creditMemoService.getCreditMemoByDocumentNumber(documentNumber); if (cm != null) { if (disbursedPayment || primaryCancel) { creditMemoService.cancelExtractedCreditMemo(cm, cmCancelNote); } else { creditMemoService.resetExtractedCreditMemo(cm, cmResetNote); } } else { LOG.error("processPdpCancels() DOES NOT EXIST, CANNOT PROCESS - Credit Memo with doc type of " + documentTypeCode + " with id " + documentNumber); } } } /** * @see org.kuali.kfs.integration.service.PurchasingAccountsPayableModuleService#handlePurchasingBatchPaids(java.lang.String) */ @Override public void handlePurchasingBatchPaids(String documentNumber, String documentTypeCode, Date processDate) { ParameterService parameterService = SpringContext.getBean(ParameterService.class); PaymentRequestService paymentRequestService = SpringContext.getBean(PaymentRequestService.class); CreditMemoService creditMemoService = SpringContext.getBean(CreditMemoService.class); if (PurapConstants.PurapDocTypeCodes.PAYMENT_REQUEST_DOCUMENT.equals(documentTypeCode)) { PaymentRequestDocument pr = paymentRequestService.getPaymentRequestByDocumentNumber(documentNumber); if (pr != null) { paymentRequestService.markPaid(pr, processDate); } else { LOG.error("processPdpPaids() DOES NOT EXIST, CANNOT MARK - Payment Request with doc type of " + documentTypeCode + " with id " + documentNumber); } } else if (PurapConstants.PurapDocTypeCodes.CREDIT_MEMO_DOCUMENT.equals(documentTypeCode)) { VendorCreditMemoDocument cm = creditMemoService.getCreditMemoByDocumentNumber(documentNumber); if (cm != null) { creditMemoService.markPaid(cm, processDate); } else { LOG.error("processPdpPaids() DOES NOT EXIST, CANNOT PROCESS - Credit Memo with doc type of " + documentTypeCode + " with id " + documentNumber); } } } /** * Retrieves the Requisition documents, pulls the PaymentRequestDocuments from their related document * views, and then adds up the total paid amount * @see org.kuali.kfs.integration.purap.PurchasingAccountsPayableModuleService#getTotalPaidAmountToRequisitions(java.util.List) */ @Override public KualiDecimal getTotalPaidAmountToRequisitions(List<String> documentNumbers) { KualiDecimal totalPaidAmountToRequests = KualiDecimal.ZERO; Map<String, Object> fieldValues = new HashMap<String, Object>(); fieldValues.put(KFSPropertyConstants.DOCUMENT_NUMBER, documentNumbers); Collection<RequisitionDocument> reqses = businessObjectService.findMatching(RequisitionDocument.class, fieldValues); for (RequisitionDocument reqs : reqses) { try { PurApRelatedViews relatedviews = reqs.getRelatedViews(); if (relatedviews != null && relatedviews.getRelatedPaymentRequestViews() != null && relatedviews.getRelatedPaymentRequestViews().size() > 0) { List<PaymentRequestView> preqViews = relatedviews.getRelatedPaymentRequestViews(); for (PaymentRequestView preqView : preqViews) { PaymentRequestDocument preqDocument; preqDocument = (PaymentRequestDocument) documentService.getByDocumentHeaderId(preqView.getDocumentNumber()); if (preqDocument.getDocumentHeader().getWorkflowDocument().isFinal()) { totalPaidAmountToRequests = totalPaidAmountToRequests.add(preqDocument.getVendorInvoiceAmount()); } } } } catch (WorkflowException we) { throw new RuntimeException("Could not retrieve document to determine totals paid on Requisitions", we); } } return totalPaidAmountToRequests; } @Override public String getB2BUrlString() { return PurapConstants.B2B_URL_STRING; } public void setPurchaseOrderService(PurchaseOrderService purchaseOrderService) { this.purchaseOrderService = purchaseOrderService; } public void setDocumentService(DocumentService documentService) { this.documentService = documentService; } public void setPurapService(PurapService purapService) { this.purapService = purapService; } public void setBusinessObjectService(BusinessObjectService businessObjectService) { this.businessObjectService = businessObjectService; } }