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.ar.document.service.impl; 017 018 import java.util.List; 019 020 import org.kuali.kfs.module.ar.ArConstants; 021 import org.kuali.kfs.module.ar.ArKeyConstants; 022 import org.kuali.kfs.module.ar.businessobject.AccountsReceivableDocumentHeader; 023 import org.kuali.kfs.module.ar.businessobject.CashControlDetail; 024 import org.kuali.kfs.module.ar.document.CashControlDocument; 025 import org.kuali.kfs.module.ar.document.service.AccountsReceivableDocumentHeaderService; 026 import org.kuali.kfs.module.ar.document.service.CashControlDocumentService; 027 import org.kuali.kfs.sys.KFSConstants; 028 import org.kuali.kfs.sys.businessobject.ChartOrgHolder; 029 import org.kuali.kfs.sys.businessobject.ElectronicPaymentClaim; 030 import org.kuali.kfs.sys.context.SpringContext; 031 import org.kuali.kfs.sys.service.ElectronicPaymentClaimingDocumentGenerationStrategy; 032 import org.kuali.kfs.sys.service.ElectronicPaymentClaimingService; 033 import org.kuali.kfs.sys.service.FinancialSystemUserService; 034 import org.kuali.rice.kew.exception.WorkflowException; 035 import org.kuali.rice.kew.util.KEWConstants; 036 import org.kuali.rice.kim.bo.Person; 037 import org.kuali.rice.kns.bo.Note; 038 import org.kuali.rice.kns.service.DataDictionaryService; 039 import org.kuali.rice.kns.service.DocumentService; 040 import org.kuali.rice.kns.service.KNSServiceLocator; 041 import org.kuali.rice.kns.service.KualiConfigurationService; 042 import org.kuali.rice.kns.util.GlobalVariables; 043 import org.kuali.rice.kns.workflow.service.KualiWorkflowInfo; 044 import org.kuali.rice.kns.workflow.service.WorkflowInfoService; 045 046 public class CashControlElectronicPaymentClaimingHelperImpl implements ElectronicPaymentClaimingDocumentGenerationStrategy { 047 private org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(CashControlElectronicPaymentClaimingHelperImpl.class); 048 049 private DataDictionaryService dataDictionaryService; 050 private DocumentService documentService; 051 private ElectronicPaymentClaimingService electronicPaymentClaimingService; 052 private CashControlDocumentService cashControlDocumentService; 053 private KualiConfigurationService kualiConfigurationService; 054 055 protected final static String CC_WORKFLOW_DOCUMENT_TYPE = "CTRL"; 056 protected final static String URL_PREFIX = "ar"; 057 protected final static String URL_MIDDLE = "Document.do?methodToCall=docHandler&command="; 058 protected final static String URL_SUFFIX = "&docId="; 059 protected final static String URL_DOC_TYPE = "CashControl"; 060 061 /** 062 * @see org.kuali.kfs.sys.service.ElectronicPaymentClaimingDocumentGenerationStrategy#createDocumentFromElectronicPayments(java.util.List, 063 * org.kuali.rice.kim.bo.Person) 064 */ 065 public String createDocumentFromElectronicPayments(List<ElectronicPaymentClaim> electronicPayments, Person user) { 066 CashControlDocument document = null; 067 try { 068 document = (CashControlDocument) documentService.getNewDocument(getClaimingDocumentWorkflowDocumentType()); 069 document.setCustomerPaymentMediumCode(ArConstants.PaymentMediumCode.WIRE_TRANSFER); 070 071 //create and set AccountsReceivableDocumentHeader 072 ChartOrgHolder currentUser = SpringContext.getBean(FinancialSystemUserService.class).getPrimaryOrganization(GlobalVariables.getUserSession().getPerson(), ArConstants.AR_NAMESPACE_CODE); 073 AccountsReceivableDocumentHeaderService accountsReceivableDocumentHeaderService = SpringContext.getBean(AccountsReceivableDocumentHeaderService.class); 074 AccountsReceivableDocumentHeader accountsReceivableDocumentHeader = accountsReceivableDocumentHeaderService.getNewAccountsReceivableDocumentHeaderForCurrentUser(); 075 accountsReceivableDocumentHeader.setDocumentNumber(document.getDocumentNumber()); 076 document.setAccountsReceivableDocumentHeader(accountsReceivableDocumentHeader); 077 078 addDescriptionToDocument(document); 079 addNotesToDocument(document, electronicPayments, user); 080 addCashControlDetailsToDocument(document, electronicPayments); 081 documentService.saveDocument(document); 082 electronicPaymentClaimingService.claimElectronicPayments(electronicPayments, document.getDocumentNumber()); 083 } 084 catch (WorkflowException we) { 085 throw new RuntimeException("WorkflowException while creating a CashControlDocument to claim ElectronicPaymentClaim records.", we); 086 } 087 088 return getURLForDocument(document); 089 } 090 091 /** 092 * This method add a description to the cash control document 093 * 094 * @param document the cash control document 095 */ 096 protected void addDescriptionToDocument(CashControlDocument document) { 097 document.getDocumentHeader().setDocumentDescription(kualiConfigurationService.getPropertyString(ArKeyConstants.ELECTRONIC_PAYMENT_CLAIM)); 098 } 099 100 /** 101 * This method adds notes to the cash control document 102 * 103 * @param claimingDoc the cash control document 104 * @param claims the list of electronic payments being claimed 105 * @param user the current user 106 */ 107 protected void addNotesToDocument(CashControlDocument claimingDoc, List<ElectronicPaymentClaim> claims, Person user) { 108 for (String noteText : electronicPaymentClaimingService.constructNoteTextsForClaims(claims)) { 109 try { 110 Note note = documentService.createNoteFromDocument(claimingDoc, noteText); 111 documentService.addNoteToDocument(claimingDoc, note); 112 } 113 catch (Exception e) { 114 LOG.error("Exception while attempting to create or add note: " + e); 115 } 116 } 117 } 118 119 /** 120 * This method adds new cash control details to the cash control document based on the list of electronic payments. 121 * 122 * @param document cash control document 123 * @param electronicPayments the electronic payments to be claimed 124 * @throws WorkflowException workflow exception 125 */ 126 protected void addCashControlDetailsToDocument(CashControlDocument document, List<ElectronicPaymentClaim> electronicPayments) throws WorkflowException { 127 for (ElectronicPaymentClaim electronicPaymentClaim : electronicPayments) { 128 CashControlDetail newCashControlDetail = new CashControlDetail(); 129 newCashControlDetail.setCashControlDocument(document); 130 newCashControlDetail.setDocumentNumber(document.getDocumentNumber()); 131 newCashControlDetail.setFinancialDocumentLineAmount(electronicPaymentClaim.getGeneratingAccountingLine().getAmount()); 132 newCashControlDetail.setCustomerPaymentDescription(electronicPaymentClaim.getGeneratingAccountingLine().getFinancialDocumentLineDescription()); 133 cashControlDocumentService.addNewCashControlDetail(kualiConfigurationService.getPropertyString(ArKeyConstants.CREATED_BY_CASH_CTRL_DOC), document, newCashControlDetail); 134 } 135 136 } 137 138 /** 139 * Builds the URL that can be used to redirect to the correct document 140 * 141 * @param doc the document to build the URL for 142 * @return the relative URL to redirect to 143 */ 144 protected String getURLForDocument(CashControlDocument doc) { 145 StringBuilder url = new StringBuilder(); 146 url.append(URL_PREFIX); 147 url.append(URL_DOC_TYPE); 148 url.append(URL_MIDDLE); 149 url.append(KEWConstants.ACTIONLIST_COMMAND); 150 url.append(URL_SUFFIX); 151 url.append(doc.getDocumentNumber()); 152 return url.toString(); 153 } 154 155 /** 156 * @see org.kuali.kfs.sys.service.ElectronicPaymentClaimingDocumentGenerationStrategy#getClaimingDocumentWorkflowDocumentType() 157 * 158 * @return the name CashControlDocument workflow document type 159 */ 160 public String getClaimingDocumentWorkflowDocumentType() { 161 return CashControlElectronicPaymentClaimingHelperImpl.CC_WORKFLOW_DOCUMENT_TYPE; 162 } 163 164 /** 165 * @see org.kuali.kfs.sys.service.ElectronicPaymentClaimingDocumentGenerationStrategy#getDocumentLabel() 166 */ 167 public String getDocumentLabel() { 168 try { 169 KualiWorkflowInfo workflowInfo = KNSServiceLocator.getWorkflowInfoService();; 170 171 return workflowInfo.getDocType(getClaimingDocumentWorkflowDocumentType()).getDocTypeLabel(); 172 } 173 catch (WorkflowException e) { 174 throw new RuntimeException("Caught Exception trying to get Workflow Document Type", e); 175 } 176 } 177 178 /** 179 * @see org.kuali.kfs.sys.service.ElectronicPaymentClaimingDocumentGenerationStrategy#isDocumentReferenceValid(java.lang.String) 180 */ 181 public boolean isDocumentReferenceValid(String referenceDocumentNumber) { 182 boolean valid = false; 183 try { 184 long docNumberAsLong = Long.parseLong(referenceDocumentNumber); 185 if (docNumberAsLong > 0L) { 186 valid = documentService.documentExists(referenceDocumentNumber); 187 } 188 } 189 catch (NumberFormatException nfe) { 190 valid = false; 191 } 192 return valid; 193 } 194 195 /** 196 * @see org.kuali.kfs.sys.service.ElectronicPaymentClaimingDocumentGenerationStrategy#userMayUseToClaim(org.kuali.rice.kim.bo.Person) 197 */ 198 public boolean userMayUseToClaim(Person claimingUser) { 199 final String documentTypeName = this.getClaimingDocumentWorkflowDocumentType(); 200 201 final boolean canClaim = electronicPaymentClaimingService.isAuthorizedForClaimingElectronicPayment(claimingUser, documentTypeName) || electronicPaymentClaimingService.isAuthorizedForClaimingElectronicPayment(claimingUser, null); 202 203 return canClaim; 204 } 205 206 /** 207 * This method sets cashControlDocumentService value 208 * 209 * @param cashControlDocumentService 210 */ 211 public void setCashControlDocumentService(CashControlDocumentService cashControlDocumentService) { 212 this.cashControlDocumentService = cashControlDocumentService; 213 } 214 215 /** 216 * This method sets document service value 217 * 218 * @param documentService 219 */ 220 public void setDocumentService(DocumentService documentService) { 221 this.documentService = documentService; 222 } 223 224 /** 225 * This method sets electronicPaymentClaimingService value 226 * 227 * @param electronicPaymentClaimingService 228 */ 229 public void setElectronicPaymentClaimingService(ElectronicPaymentClaimingService electronicPaymentClaimingService) { 230 this.electronicPaymentClaimingService = electronicPaymentClaimingService; 231 } 232 233 /** 234 * This method sets dataDictionaryService value 235 * 236 * @param dataDictionaryService 237 */ 238 public void setDataDictionaryService(DataDictionaryService dataDictionaryService) { 239 this.dataDictionaryService = dataDictionaryService; 240 } 241 242 /** 243 * This method sets kualiConfigurationService 244 * @param kualiConfigurationService 245 */ 246 public void setKualiConfigurationService(KualiConfigurationService kualiConfigurationService) { 247 this.kualiConfigurationService = kualiConfigurationService; 248 } 249 } 250