/* * 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.ar.document.service.impl; import java.sql.Date; import java.sql.Timestamp; import java.text.MessageFormat; import java.text.ParseException; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.time.DateUtils; import org.kuali.kfs.module.ar.ArConstants; import org.kuali.kfs.module.ar.ArKeyConstants; import org.kuali.kfs.module.ar.ArPropertyConstants; import org.kuali.kfs.module.ar.businessobject.AccountsReceivableDocumentHeader; import org.kuali.kfs.module.ar.businessobject.Customer; import org.kuali.kfs.module.ar.businessobject.CustomerAddress; import org.kuali.kfs.module.ar.businessobject.CustomerBillingStatement; import org.kuali.kfs.module.ar.businessobject.CustomerInvoiceDetail; import org.kuali.kfs.module.ar.businessobject.CustomerInvoiceRecurrenceDetails; import org.kuali.kfs.module.ar.businessobject.InvoicePaidApplied; import org.kuali.kfs.module.ar.businessobject.NonInvoicedDistribution; import org.kuali.kfs.module.ar.businessobject.OrganizationOptions; import org.kuali.kfs.module.ar.document.CustomerInvoiceDocument; import org.kuali.kfs.module.ar.document.dataaccess.CustomerInvoiceDocumentDao; import org.kuali.kfs.module.ar.document.service.AccountsReceivableDocumentHeaderService; import org.kuali.kfs.module.ar.document.service.CustomerAddressService; import org.kuali.kfs.module.ar.document.service.CustomerInvoiceDetailService; import org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService; import org.kuali.kfs.module.ar.document.service.InvoicePaidAppliedService; import org.kuali.kfs.module.ar.document.service.NonInvoicedDistributionService; import org.kuali.kfs.module.ar.report.util.CustomerStatementResultHolder; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.KFSPropertyConstants; import org.kuali.kfs.sys.businessobject.ChartOrgHolder; import org.kuali.kfs.sys.businessobject.FinancialSystemDocumentHeader; import org.kuali.kfs.sys.service.FinancialSystemUserService; import org.kuali.kfs.sys.service.UniversityDateService; import org.kuali.kfs.sys.util.KfsDateUtils; import org.kuali.rice.core.api.config.property.ConfigurationService; import org.kuali.rice.core.api.datetime.DateTimeService; import org.kuali.rice.core.api.util.type.KualiDecimal; import org.kuali.rice.kew.api.WorkflowDocument; import org.kuali.rice.kew.api.action.ActionTaken; import org.kuali.rice.kew.api.action.ActionType; import org.kuali.rice.kew.api.exception.WorkflowException; import org.kuali.rice.kim.api.identity.IdentityService; import org.kuali.rice.kim.api.identity.PersonService; import org.kuali.rice.kim.api.identity.principal.Principal; import org.kuali.rice.krad.bo.Note; import org.kuali.rice.krad.dao.DocumentDao; import org.kuali.rice.krad.document.Document; import org.kuali.rice.krad.exception.InfrastructureException; 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.GlobalVariables; import org.kuali.rice.krad.util.ObjectUtils; import org.springframework.transaction.annotation.Transactional; @Transactional public class CustomerInvoiceDocumentServiceImpl implements CustomerInvoiceDocumentService { protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(CustomerInvoiceDocumentServiceImpl.class); protected AccountsReceivableDocumentHeaderService accountsReceivableDocumentHeaderService; protected BusinessObjectService businessObjectService; protected CustomerAddressService customerAddressService; protected CustomerInvoiceDetailService customerInvoiceDetailService; protected CustomerInvoiceDocumentDao customerInvoiceDocumentDao; protected CustomerInvoiceRecurrenceDetails customerInvoiceRecurrenceDetails; protected ConfigurationService configurationService; protected DateTimeService dateTimeService; protected DocumentService documentService; protected DocumentDao documentDao; protected FinancialSystemUserService financialSystemUserService; protected InvoicePaidAppliedService<CustomerInvoiceDetail> invoicePaidAppliedService; protected NonInvoicedDistributionService nonInvoicedDistributionService; protected PersonService personService; protected UniversityDateService universityDateService; protected NoteService noteService; protected IdentityService identityService; /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#convertDiscountsToPaidApplieds(org.kuali.kfs.module.ar.document.CustomerInvoiceDocument) */ @Override public void convertDiscountsToPaidApplieds(CustomerInvoiceDocument invoice) { // this needs a little explanation. we have to calculate manually // whether we've written off the whole thing, because the regular // code uses the invoice paid applieds to discount, but since those // are added but not committed in this transaction, they're also not // visible in this transaction, so we do it manually. KualiDecimal openAmount = invoice.getOpenAmount(); String invoiceNumber = invoice.getDocumentNumber(); List<CustomerInvoiceDetail> discounts = invoice.getDiscounts(); // retrieve the number of current paid applieds, so we dont have item number overlap Integer paidAppliedItemNumber = 0; for (CustomerInvoiceDetail discount : discounts) { // if credit amount is zero, do nothing if (KualiDecimal.ZERO.equals(discount.getAmount())) { continue; } if (paidAppliedItemNumber == 0) { paidAppliedItemNumber = invoicePaidAppliedService.getNumberOfInvoicePaidAppliedsForInvoiceDetail(invoiceNumber, discount.getInvoiceItemNumber()); } // create and save the paidApplied InvoicePaidApplied invoicePaidApplied = new InvoicePaidApplied(); invoicePaidApplied.setDocumentNumber(invoiceNumber); invoicePaidApplied.setPaidAppliedItemNumber(paidAppliedItemNumber++); invoicePaidApplied.setFinancialDocumentReferenceInvoiceNumber(invoiceNumber); invoicePaidApplied.setInvoiceItemNumber(discount.getInvoiceItemNumber()); invoicePaidApplied.setUniversityFiscalYear(universityDateService.getCurrentFiscalYear()); invoicePaidApplied.setUniversityFiscalPeriodCode(universityDateService.getCurrentUniversityDate().getUniversityFiscalAccountingPeriod()); invoicePaidApplied.setInvoiceItemAppliedAmount(discount.getAmount().abs()); openAmount = openAmount.subtract(discount.getAmount().abs()); businessObjectService.save(invoicePaidApplied); } // if its open, but now with a zero openamount, then close it if (KualiDecimal.ZERO.equals(openAmount)) { invoice.setOpenInvoiceIndicator(false); invoice.setClosedDate(dateTimeService.getCurrentSqlDate()); documentService.updateDocument(invoice); } } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#getAllOpenCustomerInvoiceDocuments() */ @Override public Collection<CustomerInvoiceDocument> getAllOpenCustomerInvoiceDocuments() { return getAllOpenCustomerInvoiceDocuments(true); } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#getAllOpenCustomerInvoiceDocumentsWithoutWorkflow() */ @Override public Collection<CustomerInvoiceDocument> getAllOpenCustomerInvoiceDocumentsWithoutWorkflow() { return getAllOpenCustomerInvoiceDocuments(false); } /** * @param includeWorkflowHeaders * @return */ public Collection<CustomerInvoiceDocument> getAllOpenCustomerInvoiceDocuments(boolean includeWorkflowHeaders) { Collection<CustomerInvoiceDocument> invoices = new ArrayList<CustomerInvoiceDocument>(); // retrieve the set of documents without workflow headers invoices = customerInvoiceDocumentDao.getAllOpen(); // if we dont need workflow headers, then we're done if (!includeWorkflowHeaders) { return invoices; } // make a list of necessary workflow docs to retrieve List<String> documentHeaderIds = new ArrayList<String>(); for (CustomerInvoiceDocument invoice : invoices) { documentHeaderIds.add(invoice.getDocumentNumber()); } // get all of our docs with full workflow headers List<CustomerInvoiceDocument> docs = new ArrayList<CustomerInvoiceDocument>(); try { for ( Document doc : documentService.getDocumentsByListOfDocumentHeaderIds(CustomerInvoiceDocument.class, documentHeaderIds) ) { docs.add( (CustomerInvoiceDocument) doc ); } } catch (WorkflowException e) { throw new RuntimeException("Unable to retrieve Customer Invoice Documents", e); } return docs; } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#attachWorkflowHeadersToTheInvoices(java.util.Collection) */ @Override public Collection<CustomerInvoiceDocument> attachWorkflowHeadersToTheInvoices(Collection<CustomerInvoiceDocument> invoices) { List<CustomerInvoiceDocument> docs = new ArrayList<CustomerInvoiceDocument>(); if (invoices == null || invoices.isEmpty()) { return docs; } // make a list of necessary workflow docs to retrieve List<String> documentHeaderIds = new ArrayList<String>(); for (CustomerInvoiceDocument invoice : invoices) { documentHeaderIds.add(invoice.getDocumentNumber()); } // get all of our docs with full workflow headers try { for ( Document doc : documentService.getDocumentsByListOfDocumentHeaderIds(CustomerInvoiceDocument.class, documentHeaderIds) ) { docs.add( (CustomerInvoiceDocument) doc ); } } catch (WorkflowException e) { throw new RuntimeException("Unable to retrieve Customer Invoice Documents", e); } return docs; } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#getOpenInvoiceDocumentsByCustomerNumber(java.lang.String) */ @Override public Collection<CustomerInvoiceDocument> getOpenInvoiceDocumentsByCustomerNumber(String customerNumber) { Collection<CustomerInvoiceDocument> invoices = new ArrayList<CustomerInvoiceDocument>(); // customer number is not required to be populated, so we need to check that it's not null first if (StringUtils.isNotEmpty(customerNumber)) { // trim and force-caps the customer number customerNumber = customerNumber.trim().toUpperCase(); } invoices.addAll(customerInvoiceDocumentDao.getOpenByCustomerNumber(customerNumber)); return invoices; } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#getOpenInvoiceDocumentsByCustomerNameByCustomerType(java.lang.String, * java.lang.String) */ @Override public Collection<CustomerInvoiceDocument> getOpenInvoiceDocumentsByCustomerNameByCustomerType(String customerName, String customerTypeCode) { Collection<CustomerInvoiceDocument> invoices = new ArrayList<CustomerInvoiceDocument>(); // trim and force-caps the customer name customerName = StringUtils.replace(customerName, KFSConstants.WILDCARD_CHARACTER, KFSConstants.PERCENTAGE_SIGN); customerName = customerName.trim(); if (customerName.indexOf("%") < 0) { customerName += "%"; } // trim and force-caps customerTypeCode = customerTypeCode.trim().toUpperCase(); invoices.addAll(customerInvoiceDocumentDao.getOpenByCustomerNameByCustomerType(customerName, customerTypeCode)); return invoices; } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#getOpenInvoiceDocumentsByCustomerName(java.lang.String) */ @Override public Collection<CustomerInvoiceDocument> getOpenInvoiceDocumentsByCustomerName(String customerName) { Collection<CustomerInvoiceDocument> invoices = new ArrayList<CustomerInvoiceDocument>(); // trim and force-caps the customer name customerName = StringUtils.replace(customerName, KFSConstants.WILDCARD_CHARACTER, KFSConstants.PERCENTAGE_SIGN); customerName = customerName.trim(); if (customerName.indexOf("%") < 0) { customerName += "%"; } invoices.addAll(customerInvoiceDocumentDao.getOpenByCustomerName(customerName)); return invoices; } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#getOpenInvoiceDocumentsByCustomerType(java.lang.String) */ @Override public Collection<CustomerInvoiceDocument> getOpenInvoiceDocumentsByCustomerType(String customerTypeCode) { Collection<CustomerInvoiceDocument> invoices = new ArrayList<CustomerInvoiceDocument>(); // trim and force-caps customerTypeCode = customerTypeCode.trim().toUpperCase(); invoices.addAll(customerInvoiceDocumentDao.getOpenByCustomerType(customerTypeCode)); return invoices; } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#getCustomerInvoiceDetailsForCustomerInvoiceDocument(org.kuali.kfs.module.ar.document.CustomerInvoiceDocument) */ @Override public Collection<CustomerInvoiceDetail> getCustomerInvoiceDetailsForCustomerInvoiceDocument(CustomerInvoiceDocument customerInvoiceDocument) { return getCustomerInvoiceDetailsForCustomerInvoiceDocument(customerInvoiceDocument.getDocumentNumber()); } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#getCustomerInvoiceDetailsForCustomerInvoiceDocumentWithCaching(org.kuali.kfs.module.ar.document.CustomerInvoiceDocument) */ @Override public Collection<CustomerInvoiceDetail> getCustomerInvoiceDetailsForCustomerInvoiceDocumentWithCaching(CustomerInvoiceDocument customerInvoiceDocument) { return customerInvoiceDetailService.getCustomerInvoiceDetailsForInvoiceWithCaching(customerInvoiceDocument.getDocumentNumber()); } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#getCustomerInvoiceDetailsForCustomerInvoiceDocument(java.lang.String) */ @Override public Collection<CustomerInvoiceDetail> getCustomerInvoiceDetailsForCustomerInvoiceDocument(String customerInvoiceDocumentNumber) { return customerInvoiceDetailService.getCustomerInvoiceDetailsForInvoice(customerInvoiceDocumentNumber); } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#getOpenAmountForCustomerInvoiceDocument(java.lang.String) */ @Override public KualiDecimal getOpenAmountForCustomerInvoiceDocument(String customerInvoiceDocumentNumber) { if (null == customerInvoiceDocumentNumber) { return null; } return getOpenAmountForCustomerInvoiceDocument(getInvoiceByInvoiceDocumentNumber(customerInvoiceDocumentNumber)); } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#getOpenAmountForCustomerInvoiceDocument(org.kuali.kfs.module.ar.document.CustomerInvoiceDocument) */ @Override public KualiDecimal getOpenAmountForCustomerInvoiceDocument(CustomerInvoiceDocument customerInvoiceDocument) { KualiDecimal total = new KualiDecimal(0); if (customerInvoiceDocument.isOpenInvoiceIndicator()) { Collection<CustomerInvoiceDetail> customerInvoiceDetails = customerInvoiceDocument.getCustomerInvoiceDetailsWithoutDiscounts(); for (CustomerInvoiceDetail detail : customerInvoiceDetails) { // note that we're now dealing with conditionally applying discounts // depending on whether the doc is saved or approved one level down, // in the CustomerInvoiceDetail.getAmountOpen() detail.setCustomerInvoiceDocument(customerInvoiceDocument); total = total.add(detail.getAmountOpen()); } } return total; } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#getOriginalTotalAmountForCustomerInvoiceDocument(org.kuali.kfs.module.ar.document.CustomerInvoiceDocument) */ @Override public KualiDecimal getOriginalTotalAmountForCustomerInvoiceDocument(CustomerInvoiceDocument customerInvoiceDocument) { LOG.info("\n\n\n\t\t invoice: " + customerInvoiceDocument.getDocumentNumber() + "\n\t\t 111111111 HEADER TOTAL AMOUNT (should be null): " + customerInvoiceDocument.getFinancialSystemDocumentHeader().getFinancialDocumentTotalAmount() + "\n\n"); customerInvoiceDocument.getDocumentNumber(); HashMap criteria = new HashMap(); criteria.put(KFSPropertyConstants.DOCUMENT_NUMBER, customerInvoiceDocument.getDocumentHeader().getDocumentTemplateNumber()); FinancialSystemDocumentHeader financialSystemDocumentHeader = businessObjectService.findByPrimaryKey(FinancialSystemDocumentHeader.class, criteria); KualiDecimal originalTotalAmount = KualiDecimal.ZERO; originalTotalAmount = financialSystemDocumentHeader.getFinancialDocumentTotalAmount(); LOG.info("\n\n\n\t\t invoice: " + customerInvoiceDocument.getDocumentNumber() + "\n\t\t 333333333333 HEADER TOTAL AMOUNT (should be set now): " + customerInvoiceDocument.getFinancialSystemDocumentHeader().getFinancialDocumentTotalAmount() + "\n\n"); return originalTotalAmount; } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#getInvoicesByCustomerNumber(java.lang.String) */ @Override public Collection<CustomerInvoiceDocument> getCustomerInvoiceDocumentsByCustomerNumber(String customerNumber) { Collection<CustomerInvoiceDocument> invoices = new ArrayList<CustomerInvoiceDocument>(); Map<String, String> fieldValues = new HashMap<String, String>(); fieldValues.put("customerNumber", customerNumber); Collection<AccountsReceivableDocumentHeader> documentHeaders = businessObjectService.findMatching(AccountsReceivableDocumentHeader.class, fieldValues); List<String> documentHeaderIds = new ArrayList<String>(); for (AccountsReceivableDocumentHeader header : documentHeaders) { documentHeaderIds.add(header.getDocumentHeader().getDocumentNumber()); } if (0 < documentHeaderIds.size()) { try { for ( Document doc : documentService.getDocumentsByListOfDocumentHeaderIds(CustomerInvoiceDocument.class, documentHeaderIds) ) { invoices.add( (CustomerInvoiceDocument) doc ); } } catch (WorkflowException e) { LOG.error("getCustomerInvoiceDocumentsByCustomerNumber " + customerNumber + " failed", e); } } return invoices; } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#getCustomerByOrganizationInvoiceNumber(java.lang.String) */ @Override public Customer getCustomerByOrganizationInvoiceNumber(String organizationInvoiceNumber) { CustomerInvoiceDocument invoice = getInvoiceByOrganizationInvoiceNumber(organizationInvoiceNumber); return invoice.getAccountsReceivableDocumentHeader().getCustomer(); } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#getInvoiceByOrganizationInvoiceNumber(java.lang.String) */ @Override public CustomerInvoiceDocument getInvoiceByOrganizationInvoiceNumber(String organizationInvoiceNumber) { return customerInvoiceDocumentDao.getInvoiceByOrganizationInvoiceNumber(organizationInvoiceNumber); } /** * @param invoiceDocumentNumber * @return */ @Override public Customer getCustomerByInvoiceDocumentNumber(String invoiceDocumentNumber) { CustomerInvoiceDocument invoice = getInvoiceByInvoiceDocumentNumber(invoiceDocumentNumber); return invoice.getAccountsReceivableDocumentHeader().getCustomer(); } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#getInvoiceByInvoiceDocumentNumber(java.lang.String) */ @Override public CustomerInvoiceDocument getInvoiceByInvoiceDocumentNumber(String invoiceDocumentNumber) { return customerInvoiceDocumentDao.getInvoiceByInvoiceDocumentNumber(invoiceDocumentNumber); } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#getPrintableCustomerInvoiceDocumentsByInitiatorPrincipalName(java.lang.String) */ @Override public List<CustomerInvoiceDocument> getPrintableCustomerInvoiceDocumentsByInitiatorPrincipalName(String initiatorPrincipalName) { if (StringUtils.isBlank(initiatorPrincipalName)) { throw new IllegalArgumentException("The parameter [initiatorPrincipalName] passed in was null or blank."); } // IMPORTANT NOTES ABOUT THIS METHOD // // This method behaves differently than the other invoice printing methods. This is // because there's no way from within KFS to do a direct DB call to get all the invoices // you want. This is because workflow holds the document initiator, and you cant guarantee // that in a given implementation that you have access to that other db. It could be on // another box in another network, and you only have web-services access to the Rice box. // // Given that, we try to minimize the resource hit of this call as much as possible. First // we retrieve all invoices that havent been printed (ie, dont have a print date) and that // are marked for the USER print queue. At any given time that should be a manageable number of // documents. // // Then we walk through them, retrieve the full workflow-populated version of it, and only // return the ones that match the initiator. // // This isnt as performant a solution as the other getPrintableCustomerInvoiceBy... // methods, but its the best we can do in this release, and it should be manageable. // // attempt to retrieve the initiator person specified, and puke if not found Principal initiator = getIdentityService().getPrincipalByPrincipalName(initiatorPrincipalName); if (initiator == null) { throw new IllegalArgumentException("The parameter value for initiatorPrincipalName [" + initiatorPrincipalName + "] passed in doesnt map to a person."); } // retrieve all the ready-to-print docs in the user-queue for all users List<String> printableUserQueueDocNumbers = customerInvoiceDocumentDao.getPrintableCustomerInvoiceDocumentNumbersFromUserQueue(); // get all the documents that might be right, but this set includes documents generated // by the wrong user List<CustomerInvoiceDocument> customerInvoiceDocumentsSuperSet = new ArrayList<CustomerInvoiceDocument>(); if (printableUserQueueDocNumbers.size() > 0) { try { for ( Document doc : documentService.getDocumentsByListOfDocumentHeaderIds(CustomerInvoiceDocument.class, printableUserQueueDocNumbers) ) { customerInvoiceDocumentsSuperSet.add( (CustomerInvoiceDocument) doc ); } } catch (WorkflowException e) { throw new RuntimeException("Unable to retrieve Customer Invoice Documents", e); } } else { customerInvoiceDocumentsSuperSet = new ArrayList<CustomerInvoiceDocument>(); } // filter only the ones initiated by the correct user List<CustomerInvoiceDocument> customerInvoiceDocuments = new ArrayList<CustomerInvoiceDocument>(); for (CustomerInvoiceDocument superSetDocument : customerInvoiceDocumentsSuperSet) { if ( StringUtils.equalsIgnoreCase(superSetDocument.getDocumentHeader().getWorkflowDocument().getInitiatorPrincipalId(), initiator.getPrincipalId())) { customerInvoiceDocuments.add(superSetDocument); } } return customerInvoiceDocuments; } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#getPrintableCustomerInvoiceDocumentsByBillingChartAndOrg(java.lang.String, * java.lang.String) */ @Override public List<CustomerInvoiceDocument> getPrintableCustomerInvoiceDocumentsByBillingChartAndOrg(String chartOfAccountsCode, String organizationCode) { List<String> documentHeaderIds = customerInvoiceDocumentDao.getPrintableCustomerInvoiceDocumentNumbersByBillingChartAndOrg(chartOfAccountsCode, organizationCode); return getCustomerInvoiceDocumentsByDocumentNumbers(documentHeaderIds); } protected List<CustomerInvoiceDocument> getCustomerInvoiceDocumentsByDocumentNumbers( List<String> documentHeaderIds ) { List<CustomerInvoiceDocument> customerInvoiceDocuments = new ArrayList<CustomerInvoiceDocument>(documentHeaderIds.size()); if (documentHeaderIds != null && !documentHeaderIds.isEmpty()) { try { for ( Document doc : documentService.getDocumentsByListOfDocumentHeaderIds(CustomerInvoiceDocument.class, documentHeaderIds) ) { customerInvoiceDocuments.add( (CustomerInvoiceDocument) doc ); } } catch (WorkflowException e) { throw new RuntimeException("Unable to retrieve Customer Invoice Documents", e); } } return customerInvoiceDocuments; } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#getPrintableCustomerInvoiceDocumentsForBillingStatementByBillingChartAndOrg(java.lang.String, * java.lang.String) */ @Override public List<CustomerInvoiceDocument> getPrintableCustomerInvoiceDocumentsForBillingStatementByBillingChartAndOrg(String chartOfAccountsCode, String organizationCode) { List<String> documentHeaderIds = customerInvoiceDocumentDao.getPrintableCustomerInvoiceDocumentNumbersForBillingStatementByBillingChartAndOrg(chartOfAccountsCode, organizationCode); List<CustomerInvoiceDocument> customerInvoiceDocuments = new ArrayList<CustomerInvoiceDocument>(); if (documentHeaderIds != null && !documentHeaderIds.isEmpty()) { try { for (Document doc : documentService.getDocumentsByListOfDocumentHeaderIds(CustomerInvoiceDocument.class, documentHeaderIds)) { customerInvoiceDocuments.add((CustomerInvoiceDocument) doc); } } catch (WorkflowException e) { throw new InfrastructureException("Unable to retrieve Customer Invoice Documents", e); } } return customerInvoiceDocuments; } /** * @see org.kuali.module.ar.service.CustomerInvoiceDocumentService#getCustomerInvoiceDocumentsByCustomerNumber(java.lang.String) */ @Override public List<CustomerInvoiceDocument> getPrintableCustomerInvoiceDocumentsByProcessingChartAndOrg(String chartOfAccountsCode, String organizationCode) { List<String> documentHeaderIds = customerInvoiceDocumentDao.getPrintableCustomerInvoiceDocumentNumbersByProcessingChartAndOrg(chartOfAccountsCode, organizationCode); return getCustomerInvoiceDocumentsByDocumentNumbers(documentHeaderIds); } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#getCustomerInvoiceDocumentsByAccountNumber(java.lang.String) */ @Override public Collection<CustomerInvoiceDocument> getCustomerInvoiceDocumentsByAccountNumber(String accountNumber) { List<String> documentHeaderIds = customerInvoiceDetailService.getCustomerInvoiceDocumentNumbersByAccountNumber(accountNumber); return getCustomerInvoiceDocumentsByDocumentNumbers(documentHeaderIds); } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#getCustomerInvoiceDocumentsByBillingChartAndOrg(java.lang.String, * java.lang.String) */ @Override public List<CustomerInvoiceDocument> getCustomerInvoiceDocumentsByBillingChartAndOrg(String chartOfAccountsCode, String organizationCode) { List<String> documentHeaderIds = customerInvoiceDocumentDao.getCustomerInvoiceDocumentNumbersByBillingChartAndOrg(chartOfAccountsCode, organizationCode); return getCustomerInvoiceDocumentsByDocumentNumbers(documentHeaderIds); } /** * @see org.kuali.module.ar.service.CustomerInvoiceDocumentService#getCustomerInvoiceDocumentsByCustomerNumber(java.lang.String) */ @Override public List<CustomerInvoiceDocument> getCustomerInvoiceDocumentsByProcessingChartAndOrg(String chartOfAccountsCode, String organizationCode) { List<String> documentHeaderIds = customerInvoiceDocumentDao.getCustomerInvoiceDocumentNumbersByProcessingChartAndOrg(chartOfAccountsCode, organizationCode); return getCustomerInvoiceDocumentsByDocumentNumbers(documentHeaderIds); } /** * Refactor to have all the setters in here. * * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#setupDefaultValuesForNewCustomerInvoiceDocument(org.kuali.kfs.module.ar.document.CustomerInvoiceDocument) */ @Override public void setupDefaultValuesForNewCustomerInvoiceDocument(CustomerInvoiceDocument document) { setupBasicDefaultValuesForCustomerInvoiceDocument(document); // set up the default values for the AR DOC Header AccountsReceivableDocumentHeader accountsReceivableDocumentHeader = accountsReceivableDocumentHeaderService.getNewAccountsReceivableDocumentHeaderForCurrentUser(); accountsReceivableDocumentHeader.setDocumentNumber(document.getDocumentNumber()); document.setAccountsReceivableDocumentHeader(accountsReceivableDocumentHeader); // set up the primary key for AR_INV_RCURRNC_DTL_T CustomerInvoiceRecurrenceDetails recurrenceDetails = new CustomerInvoiceRecurrenceDetails(); recurrenceDetails.setInvoiceNumber(document.getDocumentNumber()); // recurrenceDetails.setCustomerNumber(document.getCustomer().getCustomerNumber()); document.setCustomerInvoiceRecurrenceDetails(recurrenceDetails); Map<String, String> criteria = new HashMap<String, String>(); criteria.put(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, document.getBillByChartOfAccountCode()); criteria.put(KFSPropertyConstants.ORGANIZATION_CODE, document.getBilledByOrganizationCode()); OrganizationOptions organizationOptions = businessObjectService.findByPrimaryKey(OrganizationOptions.class, criteria); if (ObjectUtils.isNotNull(organizationOptions)) { document.setPrintInvoiceIndicator(organizationOptions.getPrintInvoiceIndicator()); document.setInvoiceTermsText(organizationOptions.getOrganizationPaymentTermsText()); } } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#loadCustomerAddressesForCustomerInvoiceDocument(org.kuali.kfs.module.ar.document.CustomerInvoiceDocument) */ @Override public void loadCustomerAddressesForCustomerInvoiceDocument(CustomerInvoiceDocument customerInvoiceDocument) { // if address identifier is provided, try to refresh customer address data if (ObjectUtils.isNotNull(customerInvoiceDocument.getAccountsReceivableDocumentHeader())) { CustomerAddress customerShipToAddress = customerAddressService.getByPrimaryKey(customerInvoiceDocument.getAccountsReceivableDocumentHeader().getCustomerNumber(), customerInvoiceDocument.getCustomerShipToAddressIdentifier()); CustomerAddress customerBillToAddress = customerAddressService.getByPrimaryKey(customerInvoiceDocument.getAccountsReceivableDocumentHeader().getCustomerNumber(), customerInvoiceDocument.getCustomerBillToAddressIdentifier()); if (ObjectUtils.isNotNull(customerShipToAddress)) { customerInvoiceDocument.setCustomerShipToAddress(customerShipToAddress); customerInvoiceDocument.setCustomerShipToAddressOnInvoice(customerShipToAddress); } if (ObjectUtils.isNotNull(customerBillToAddress)) { customerInvoiceDocument.setCustomerBillToAddress(customerBillToAddress); customerInvoiceDocument.setCustomerBillToAddressOnInvoice(customerBillToAddress); } } } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#setupDefaultValuesForCopiedCustomerInvoiceDocument(org.kuali.kfs.module.ar.document.CustomerInvoiceDocument) */ @Override public void setupDefaultValuesForCopiedCustomerInvoiceDocument(CustomerInvoiceDocument document) { setupBasicDefaultValuesForCustomerInvoiceDocument(document); // Save customer number since it will get overwritten when we retrieve the accounts receivable document header from service String customerNumber = document.getAccountsReceivableDocumentHeader().getCustomerNumber(); // Set up the default values for the AR DOC Header AccountsReceivableDocumentHeader accountsReceivableDocumentHeader = accountsReceivableDocumentHeaderService.getNewAccountsReceivableDocumentHeaderForCurrentUser(); accountsReceivableDocumentHeader.setDocumentNumber(document.getDocumentNumber()); accountsReceivableDocumentHeader.setCustomerNumber(customerNumber); document.setAccountsReceivableDocumentHeader(accountsReceivableDocumentHeader); // set up the primary key for AR_INV_RCURRNC_DTL_T CustomerInvoiceRecurrenceDetails recurrenceDetails = new CustomerInvoiceRecurrenceDetails(); recurrenceDetails.setInvoiceNumber(document.getDocumentNumber()); // recurrenceDetails.setCustomerNumber(document.getAccountsReceivableDocumentHeader().getCustomerNumber()); document.setCustomerInvoiceRecurrenceDetails(recurrenceDetails); // make open invoice indicator to true document.setOpenInvoiceIndicator(true); document.setPrintDate(null); document.setBillingDate(dateTimeService.getCurrentSqlDateMidnight()); } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#getNonInvoicedDistributionsForInvoice(java.lang.String) */ @Override public Collection<NonInvoicedDistribution> getNonInvoicedDistributionsForInvoice(String documentNumber) { return nonInvoicedDistributionService.getNonInvoicedDistributionsForInvoice(documentNumber); } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#getNonInvoicedTotalForInvoice(org.kuali.kfs.module.ar.document.CustomerInvoiceDocument) */ @Override public KualiDecimal getNonInvoicedTotalForInvoice(CustomerInvoiceDocument invoice) { Collection<NonInvoicedDistribution> payments = this.nonInvoicedDistributionService.getNonInvoicedDistributionsForInvoice(invoice); KualiDecimal total = new KualiDecimal(0); for (NonInvoicedDistribution payment : payments) { total = total.add(payment.getFinancialDocumentLineAmount()); } return total; } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#getNonInvoicedTotalForInvoice(java.lang.String) */ @Override public KualiDecimal getNonInvoicedTotalForInvoice(String documentNumber) { return getNonInvoicedTotalForInvoice(getInvoiceByInvoiceDocumentNumber(documentNumber)); } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#getPaidAppliedTotalForInvoice(org.kuali.kfs.module.ar.document.CustomerInvoiceDocument) */ @Override public KualiDecimal getPaidAppliedTotalForInvoice(CustomerInvoiceDocument invoice) { Collection<InvoicePaidApplied> payments = invoicePaidAppliedService.getInvoicePaidAppliedsForInvoice(invoice); KualiDecimal total = new KualiDecimal(0); for (InvoicePaidApplied payment : payments) { total = total.add(payment.getInvoiceItemAppliedAmount()); } return total; } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#getPaidAppliedTotalForInvoice(java.lang.String) */ @Override public KualiDecimal getPaidAppliedTotalForInvoice(String documentNumber) { return getPaidAppliedTotalForInvoice(getInvoiceByInvoiceDocumentNumber(documentNumber)); } /** * @param document */ protected void setupBasicDefaultValuesForCustomerInvoiceDocument(CustomerInvoiceDocument document) { ChartOrgHolder currentUser = financialSystemUserService.getPrimaryOrganization(GlobalVariables.getUserSession().getPerson(), ArConstants.AR_NAMESPACE_CODE); if (currentUser != null) { document.setBillByChartOfAccountCode(currentUser.getChartOfAccountsCode()); document.setBilledByOrganizationCode(currentUser.getOrganizationCode()); } document.setInvoiceDueDate(getDefaultInvoiceDueDate()); document.setOpenInvoiceIndicator(true); } /** * This method sets due date equal to todays date +30 days by default * * @param dateTimeService */ protected Date getDefaultInvoiceDueDate() { Calendar cal = dateTimeService.getCurrentCalendar(); cal.add(Calendar.DATE, 30); Date sqlDueDate = null; try { sqlDueDate = dateTimeService.convertToSqlDate(new Timestamp(cal.getTime().getTime())); } catch (ParseException e) { // TODO: throw an error here, but don't die } return sqlDueDate; } @Override public void closeCustomerInvoiceDocument(CustomerInvoiceDocument customerInvoiceDocument) { customerInvoiceDocument.setOpenInvoiceIndicator(false); customerInvoiceDocument.setClosedDate(dateTimeService.getCurrentSqlDate()); businessObjectService.save(customerInvoiceDocument); } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#updateReportedDate(String) */ @Override public void updateReportedDate(String docNumber) { HashMap<String, String> criteria = new HashMap<String, String>(); criteria.put("documentNumber", docNumber); CustomerInvoiceDocument customerInvoiceDocument = businessObjectService.findByPrimaryKey(CustomerInvoiceDocument.class, criteria); Date reportedDate = dateTimeService.getCurrentSqlDate(); if (ObjectUtils.isNotNull(customerInvoiceDocument)) { customerInvoiceDocument.setReportedDate(reportedDate); businessObjectService.save(customerInvoiceDocument); } } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#updateReportedInvoiceInfo(CustomerStatementResultHolder) */ @Override public void updateReportedInvoiceInfo(CustomerStatementResultHolder data) { HashMap<String, String> criteria = new HashMap<String, String>(); criteria.put("customerNumber", data.getCustomerNumber()); CustomerBillingStatement customerBillingStatement = businessObjectService.findByPrimaryKey(CustomerBillingStatement.class, criteria); if (ObjectUtils.isNotNull(customerBillingStatement)) { customerBillingStatement.setPreviouslyBilledAmount(data.getCurrentBilledAmount()); customerBillingStatement.setReportedDate(dateTimeService.getCurrentSqlDate()); } else { customerBillingStatement = new CustomerBillingStatement(); customerBillingStatement.setCustomerNumber(data.getCustomerNumber()); customerBillingStatement.setPreviouslyBilledAmount(data.getCurrentBilledAmount()); customerBillingStatement.setReportedDate(dateTimeService.getCurrentSqlDate()); } businessObjectService.save(customerBillingStatement); } public CustomerInvoiceDocumentDao getCustomerInvoiceDocumentDao() { return customerInvoiceDocumentDao; } public void setCustomerInvoiceDocumentDao(CustomerInvoiceDocumentDao customerInvoiceDocumentDao) { this.customerInvoiceDocumentDao = customerInvoiceDocumentDao; } public DocumentService getDocumentService() { return documentService; } public void setDocumentService(DocumentService documentService) { this.documentService = documentService; } public BusinessObjectService getBusinessObjectService() { return businessObjectService; } public void setBusinessObjectService(BusinessObjectService businessObjectService) { this.businessObjectService = businessObjectService; } public DateTimeService getDateTimeService() { return dateTimeService; } public void setDateTimeService(DateTimeService dateTimeService) { this.dateTimeService = dateTimeService; } public AccountsReceivableDocumentHeaderService getAccountsReceivableDocumentHeaderService() { return accountsReceivableDocumentHeaderService; } public void setAccountsReceivableDocumentHeaderService(AccountsReceivableDocumentHeaderService accountsReceivableDocumentHeaderService) { this.accountsReceivableDocumentHeaderService = accountsReceivableDocumentHeaderService; } public CustomerAddressService getCustomerAddressService() { return customerAddressService; } public void setCustomerAddressService(CustomerAddressService customerAddressService) { this.customerAddressService = customerAddressService; } public void setDocumentDao(DocumentDao documentDao) { this.documentDao = documentDao; } public void setInvoicePaidAppliedService(InvoicePaidAppliedService invoicePaidAppliedService) { this.invoicePaidAppliedService = invoicePaidAppliedService; } public void setNonInvoicedDistributionService(NonInvoicedDistributionService nonInvoicedDistributionService) { this.nonInvoicedDistributionService = nonInvoicedDistributionService; } public void setCustomerInvoiceDetailService(CustomerInvoiceDetailService customerInvoiceDetailService) { this.customerInvoiceDetailService = customerInvoiceDetailService; } public void setUniversityDateService(UniversityDateService universityDateService) { this.universityDateService = universityDateService; } public UniversityDateService getUniversityDateService() { return universityDateService; } public void setNoteService(NoteService noteService) { this.noteService = noteService; } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#checkIfInvoiceNumberIsFinal(java.lang.String) */ @Override public boolean checkIfInvoiceNumberIsFinal(String invDocumentNumber) { boolean isSuccess = true; if (StringUtils.isBlank(invDocumentNumber)) { isSuccess &= false; } else { CustomerInvoiceDocument customerInvoiceDocument = getInvoiceByInvoiceDocumentNumber(invDocumentNumber); if (ObjectUtils.isNull(customerInvoiceDocument)) { isSuccess &= false; } else { Document doc = null; try { doc = documentService.getByDocumentHeaderId(invDocumentNumber); } catch (WorkflowException e) { isSuccess &= false; } if (ObjectUtils.isNull(doc) || ObjectUtils.isNull(doc.getDocumentHeader()) || doc.getDocumentHeader().getWorkflowDocument() == null || !(doc.getDocumentHeader().getWorkflowDocument().isApproved() || doc.getDocumentHeader().getWorkflowDocument().isProcessed())) { isSuccess &= false; } } } return isSuccess; } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#getAllAgingInvoiceDocumentsByBilling(java.util.List, java.util.List, java.lang.Integer) */ @Override public Collection<CustomerInvoiceDocument> getAllAgingInvoiceDocumentsByBilling(List<String> charts, List<String> organizations, Integer invoiceAge) { Date invoiceBillingDateFrom = null; Date invoiceBillingDateTo = this.getPastDate(invoiceAge - 1) ; return customerInvoiceDocumentDao.getAllAgingInvoiceDocumentsByBilling(charts, organizations, invoiceBillingDateFrom, invoiceBillingDateTo); } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#getAllAgingInvoiceDocumentsByAccounts(java.util.List, java.util.List, java.lang.Integer) */ @Override public Collection<CustomerInvoiceDocument> getAllAgingInvoiceDocumentsByAccounts(List<String> charts, List<String> accounts, Integer invoiceAge) { Date invoiceBillingDateFrom = null; Date invoiceBillingDateTo = this.getPastDate(invoiceAge - 1) ; return customerInvoiceDocumentDao.getAllAgingInvoiceDocumentsByAccounts(charts, accounts, invoiceBillingDateFrom, invoiceBillingDateTo); } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#getAllAgingInvoiceDocumentsByProcessing(java.util.List, java.util.List, java.lang.Integer) */ @Override public Collection<CustomerInvoiceDocument> getAllAgingInvoiceDocumentsByProcessing(List<String> charts, List<String> organizations, Integer invoiceAge) { Date invoiceBillingDateFrom = null; Date invoiceBillingDateTo = this.getPastDate(invoiceAge - 1) ; return customerInvoiceDocumentDao.getAllAgingInvoiceDocumentsByProcessing(charts, organizations, invoiceBillingDateFrom, invoiceBillingDateTo); } /** * get the date before the given amount of days */ protected Date getPastDate(Integer amount){ Integer pastDateAmount = -1 * amount; java.util.Date today = this.getDateTimeService().getCurrentDate(); java.util.Date pastDate = DateUtils.addDays(today, pastDateAmount); return KfsDateUtils.convertToSqlDate(pastDate); } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#getAllAgingInvoiceDocumentsByCustomerTypes(java.util.List, java.lang.Integer, java.sql.Date) */ @Override public Collection<CustomerInvoiceDocument> getAllAgingInvoiceDocumentsByCustomerTypes(List<String> customerTypes, Integer invoiceAge, Date invoiceDueDateFrom) { Date pastDate = this.getPastDate(invoiceAge - 1) ; Date invoiceDueDateTo = KfsDateUtils.convertToSqlDate(DateUtils.addDays(pastDate, 1)); LOG.info("invoiceDueDateTo" + invoiceDueDateTo); return customerInvoiceDocumentDao.getAllAgingInvoiceDocumentsByCustomerTypes(customerTypes, invoiceDueDateFrom, invoiceDueDateTo); } /** * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#addCloseNote */ @Override public void addCloseNote(CustomerInvoiceDocument documentToClose, WorkflowDocument closingDocument) { if (!documentToClose.isOpenInvoiceIndicator()) { // If it already is closed, no need to add a note return; } String principalName = "Unknown"; List<ActionTaken> actionsTaken = closingDocument.getActionsTaken(); if(ObjectUtils.isNotNull(actionsTaken)){ for(ActionTaken action : actionsTaken){ // we're looking for the person who completed the closing document, so we want the COMPLETE action if(isActionClose(action.getActionTaken())){ principalName = getPersonService().getPerson(action.getPrincipalId()).getName(); break; } } } final String noteTextPattern = getConfigurationService().getPropertyValueAsString(ArKeyConstants.INVOICE_CLOSE_NOTE_TEXT); Object[] arguments = { principalName, closingDocument.getDocumentTypeName(), closingDocument.getDocumentId() }; String noteText = MessageFormat.format(noteTextPattern, arguments); Note note = getDocumentService().createNoteFromDocument(documentToClose, noteText); note.setAuthorUniversalIdentifier(getIdentityService().getPrincipalByPrincipalName(KFSConstants.SYSTEM_USER).getPrincipalId()); documentToClose.addNote(noteService.save(note)); } /** * Looks up all invoice paid applieds applied to this invoice owned by payment applications or customer credit memos, and sums the invoice item applied amount * @see org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService#calculateAppliedPaymentAmount(org.kuali.kfs.module.ar.document.CustomerInvoiceDocument) */ @Override public KualiDecimal calculateAppliedPaymentAmount(CustomerInvoiceDocument invoice) { Map<String, Object> criteria = new HashMap<>(); KualiDecimal totalPayments = KualiDecimal.ZERO; criteria.put(ArPropertyConstants.CustomerInvoiceDocumentFields.FINANCIAL_DOCUMENT_REF_INVOICE_NUMBER, invoice.getDocumentNumber()); List<String> allowedOwningDocumentTypes = new ArrayList<>(); allowedOwningDocumentTypes.add(ArConstants.PAYMENT_APPLICATION_DOCUMENT_TYPE_CODE); allowedOwningDocumentTypes.add(ArConstants.CUSTOMER_CREDIT_MEMO_DOCUMENT_TYPE_CODE); criteria.put(KFSPropertyConstants.DOCUMENT_HEADER+"."+KFSPropertyConstants.WORKFLOW_DOCUMENT_TYPE_NAME, allowedOwningDocumentTypes); Collection<InvoicePaidApplied> invoicePaidApplieds = businessObjectService.findMatching(InvoicePaidApplied.class, criteria); for (InvoicePaidApplied invoicePapidApplied : invoicePaidApplieds) { totalPayments = totalPayments.add(invoicePapidApplied.getInvoiceItemAppliedAmount()); } return totalPayments; } public void setPersonService(PersonService personService){ this.personService = personService; } public PersonService getPersonService(){ return personService; } public IdentityService getIdentityService() { return identityService; } public void setIdentityService(IdentityService identityService) { this.identityService = identityService; } public ConfigurationService getConfigurationService() { return configurationService; } public void setConfigurationService(ConfigurationService configurationService) { this.configurationService = configurationService; } private boolean isActionClose(ActionType actionTypeToCheck){ return ( (actionTypeToCheck.compareTo(ActionType.COMPLETE) == 0) || (actionTypeToCheck.compareTo(ActionType.SU_BLANKET_APPROVE) == 0) || (actionTypeToCheck.compareTo(ActionType.BLANKET_APPROVE) == 0) || (actionTypeToCheck.compareTo(ActionType.SU_COMPLETE) == 0) ); } public FinancialSystemUserService getFinancialSystemUserService() { return financialSystemUserService; } public void setFinancialSystemUserService(FinancialSystemUserService financialSystemUserService) { this.financialSystemUserService = financialSystemUserService; } }