/*
* 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.service.impl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.integration.cg.ContractsAndGrantsAgencyAddress;
import org.kuali.kfs.integration.cg.ContractsAndGrantsBillingAgency;
import org.kuali.kfs.module.ar.ArPropertyConstants;
import org.kuali.kfs.module.ar.businessobject.Customer;
import org.kuali.kfs.module.ar.businessobject.CustomerAddress;
import org.kuali.kfs.module.ar.document.service.CustomerService;
import org.kuali.kfs.module.ar.service.CustomerDocumentService;
import org.kuali.kfs.sys.KFSPropertyConstants;
import org.kuali.kfs.sys.service.NonTransactional;
import org.kuali.rice.kew.api.KewApiServiceLocator;
import org.kuali.rice.kew.api.document.attribute.DocumentAttributeIndexingQueue;
import org.kuali.rice.kew.api.exception.WorkflowException;
import org.kuali.rice.kns.document.MaintenanceDocument;
import org.kuali.rice.kns.service.DataDictionaryService;
import org.kuali.rice.kns.service.MaintenanceDocumentDictionaryService;
import org.kuali.rice.krad.bo.BusinessObject;
import org.kuali.rice.krad.bo.DocumentHeader;
import org.kuali.rice.krad.service.DocumentService;
import org.kuali.rice.krad.service.KualiModuleService;
import org.kuali.rice.krad.util.ObjectUtils;
import org.kuali.rice.krad.workflow.service.WorkflowDocumentService;
import org.springframework.transaction.annotation.Transactional;
/**
* Implementation of the Customer Document Service.
*/
@Transactional
public class CustomerDocumentServiceImpl implements CustomerDocumentService {
protected CustomerService customerService;
protected DocumentService documentService;
protected DataDictionaryService dataDictionaryService;
protected KualiModuleService kualiModuleService;
protected MaintenanceDocumentDictionaryService maintenanceDocumentDictionaryService;
protected WorkflowDocumentService workflowDocumentService;
@Override
public String createAndSaveCustomer(String description, ContractsAndGrantsBillingAgency agency) throws WorkflowException {
MaintenanceDocument doc = null;
doc = (MaintenanceDocument) documentService.getNewDocument(maintenanceDocumentDictionaryService.getDocumentTypeName(Customer.class));
// set a description to say that this application document has been created by the Agency Document
doc.getDocumentHeader().setDocumentDescription(truncateField(DocumentHeader.class, KFSPropertyConstants.DOCUMENT_DESCRIPTION, description));
// to set the explanation to reference the agency number
doc.getDocumentHeader().setExplanation(description + "(Agency Number - " + agency.getAgencyNumber() + " )");
// refresh nonupdatable references and save the Customer Document
doc.refreshNonUpdateableReferences();
// If the document gets created successfully, then we set values to the agency as well as the customer.
Customer customer = (Customer) doc.getNewMaintainableObject().getBusinessObject();
// this step is done before so that the customer name is
// in - should be uppercase for the Customer to be
// identified.
customer.setCustomerName(truncateField(agency.getClass(), ArPropertyConstants.CustomerFields.CUSTOMER_NAME, agency.getReportingName().toUpperCase()));
customer.setCustomerTypeCode(truncateField(agency.getClass(), ArPropertyConstants.CustomerTypeFields.CUSTOMER_TYPE_CODE, agency.getCustomerTypeCode()));
if (agency.isActive()) {
customer.setActive(true);
}
// To call the customer service to get the customer number and set it to the customer number
String customerNumber = customerService.getNextCustomerNumber(customer);
customer.setCustomerNumber(customerNumber);
List<? extends ContractsAndGrantsAgencyAddress> agencyAddresses = new ArrayList<ContractsAndGrantsAgencyAddress>();
if (agency.getAgencyAddresses() == null || agency.getAgencyAddresses().isEmpty()) {
Map<String, Object> map = new HashMap<String, Object>();
map.put(KFSPropertyConstants.AGENCY_NUMBER, agency.getAgencyNumber());
agencyAddresses = kualiModuleService.getResponsibleModuleService(ContractsAndGrantsAgencyAddress.class).getExternalizableBusinessObjectsList(ContractsAndGrantsAgencyAddress.class, map);
} else {
agencyAddresses = agency.getAgencyAddresses();
}
for (ContractsAndGrantsAgencyAddress agencyAddress : agencyAddresses) {
CustomerAddress customerAddress = new CustomerAddress();
customerAddress.setCustomerAddressName(truncateField(CustomerAddress.class, ArPropertyConstants.CustomerAddressFields.CUSTOMER_ADDRESS_NAME, agencyAddress.getAgencyAddressName()));
customerAddress.setCustomerAddressTypeCode(truncateField(CustomerAddress.class, ArPropertyConstants.CustomerAddressFields.CUSTOMER_ADDRESS_TYPE_CODE, agencyAddress.getCustomerAddressTypeCode()));
customerAddress.setCustomerLine1StreetAddress(truncateField(CustomerAddress.class, ArPropertyConstants.CustomerAddressFields.CUSTOMER_LINE1_STREET_ADDRESS, agencyAddress.getAgencyLine1StreetAddress()));
customerAddress.setCustomerLine2StreetAddress(truncateField(CustomerAddress.class, ArPropertyConstants.CustomerAddressFields.CUSTOMER_LINE2_STREET_ADDRESS, agencyAddress.getAgencyLine2StreetAddress()));
customerAddress.setCustomerCityName(truncateField(CustomerAddress.class, ArPropertyConstants.CustomerAddressFields.CUSTOMER_CITY_NAME, agencyAddress.getAgencyCityName()));
customerAddress.setCustomerCountryCode(truncateField(CustomerAddress.class, ArPropertyConstants.CustomerAddressFields.CUSTOMER_COUNTRY_CODE, agencyAddress.getAgencyCountryCode()));
customerAddress.setCustomerStateCode(truncateField(CustomerAddress.class, ArPropertyConstants.CustomerAddressFields.CUSTOMER_STATE_CODE, agencyAddress.getAgencyStateCode()));
customerAddress.setCustomerZipCode(truncateField(CustomerAddress.class, ArPropertyConstants.CustomerAddressFields.CUSTOMER_ZIP_CODE, agencyAddress.getAgencyZipCode()));
customerAddress.setCustomerAddressInternationalProvinceName(truncateField(CustomerAddress.class, ArPropertyConstants.CustomerAddressFields.CUSTOMER_ADDRESS_INTERNATIONAL_PROVINCE_NAME, agencyAddress.getAgencyAddressInternationalProvinceName()));
customerAddress.setCustomerInternationalMailCode(truncateField(CustomerAddress.class, ArPropertyConstants.CustomerAddressFields.CUSTOMER_INTERNATIONAL_MAIL_CODE, agencyAddress.getAgencyInternationalMailCode()));
customerAddress.setCustomerEmailAddress(truncateField(CustomerAddress.class, ArPropertyConstants.CustomerAddressFields.CUSTOMER_EMAIL_ADDRESS, agencyAddress.getAgencyContactEmailAddress()));
customer.getCustomerAddresses().add(customerAddress);
}
documentService.saveDocument(doc);
documentService.prepareWorkflowDocument(doc);
// the next step is to route the document through the workflow
workflowDocumentService.route(doc.getDocumentHeader().getWorkflowDocument(), "", null);
final DocumentAttributeIndexingQueue documentAttributeIndexingQueue = KewApiServiceLocator.getDocumentAttributeIndexingQueue();
documentAttributeIndexingQueue.indexDocument(doc.getDocumentNumber());
return customerNumber;
}
/**
* Truncates the given value to the length set in the data dictionary for the given business object class and property name
* @param boClass the business object class the value is being set on
* @param targetPropertyName the name of the property on an object of that class where we're setting the value
* @param value the value to set
* @return the truncated value
*/
protected String truncateField(Class<? extends BusinessObject> boClass, String targetPropertyName, String value) {
final Integer maxLength = getDataDictionaryService().getAttributeMaxLength(boClass, targetPropertyName);
if (StringUtils.isBlank(value) || ObjectUtils.isNull(maxLength) || maxLength.intValue() > value.length()) {
return value;
}
return value.substring(0, maxLength.intValue());
}
/**
* This method gets the document service
*
* @return the document service
*/
public DocumentService getDocumentService() {
return documentService;
}
/**
* This method sets the document service
*
* @param documentService
*/
public void setDocumentService(DocumentService documentService) {
this.documentService = documentService;
}
/**
* Gets the workflowDocumentService attribute.
*
* @return Returns the workflowDocumentService.
*/
public WorkflowDocumentService getWorkflowDocumentService() {
return workflowDocumentService;
}
/**
* Sets the workflowDocumentService attribute value.
*
* @param workflowDocumentService The workflowDocumentService to set.
*/
public void setWorkflowDocumentService(WorkflowDocumentService workflowDocumentService) {
this.workflowDocumentService = workflowDocumentService;
}
public CustomerService getCustomerService() {
return customerService;
}
public void setCustomerService(CustomerService customerService) {
this.customerService = customerService;
}
/**
* Sets the kualiModuleService attribute value.
*
* @param kualiModuleService The kualiModuleService to set.
*/
@NonTransactional
public void setKualiModuleService(KualiModuleService kualiModuleService) {
this.kualiModuleService = kualiModuleService;
}
public MaintenanceDocumentDictionaryService getMaintenanceDocumentDictionaryService() {
return maintenanceDocumentDictionaryService;
}
public void setMaintenanceDocumentDictionaryService(MaintenanceDocumentDictionaryService maintenanceDocumentDictionaryService) {
this.maintenanceDocumentDictionaryService = maintenanceDocumentDictionaryService;
}
public DataDictionaryService getDataDictionaryService() {
return dataDictionaryService;
}
public void setDataDictionaryService(DataDictionaryService dataDictionaryService) {
this.dataDictionaryService = dataDictionaryService;
}
}