/*
* 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.web.struts;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.nio.file.Files;
import java.util.Properties;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.kuali.kfs.module.ar.ArConstants;
import org.kuali.kfs.module.ar.ArPropertyConstants;
import org.kuali.kfs.module.ar.businessobject.CustomerAddress;
import org.kuali.kfs.module.ar.businessobject.CustomerInvoiceDetail;
import org.kuali.kfs.module.ar.document.CustomerInvoiceDocument;
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.validation.event.DiscountCustomerInvoiceDetailEvent;
import org.kuali.kfs.module.ar.document.validation.event.RecalculateCustomerInvoiceDetailEvent;
import org.kuali.kfs.module.ar.report.service.AccountsReceivableReportService;
import org.kuali.kfs.module.ar.service.AccountsReceivablePdfHelperService;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.businessobject.FinancialSystemDocumentHeader;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.sys.document.validation.event.AddAccountingLineEvent;
import org.kuali.kfs.sys.util.KfsWebUtils;
import org.kuali.kfs.sys.web.struts.KualiAccountingDocumentActionBase;
import org.kuali.kfs.sys.web.struts.KualiAccountingDocumentFormBase;
import org.kuali.rice.kew.api.KewApiConstants;
import org.kuali.rice.kew.api.exception.WorkflowException;
import org.kuali.rice.kns.question.ConfirmationQuestion;
import org.kuali.rice.kns.service.DataDictionaryService;
import org.kuali.rice.kns.web.struts.form.KualiDocumentFormBase;
import org.kuali.rice.krad.service.DocumentService;
import org.kuali.rice.krad.service.KualiRuleService;
import org.kuali.rice.krad.util.ObjectUtils;
import org.kuali.rice.krad.util.UrlFactory;
public class CustomerInvoiceDocumentAction extends KualiAccountingDocumentActionBase {
private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(CustomerInvoiceDocumentAction.class);
/**
* Overriding to make it easier to distinguish discount lines and lines that are associated to discounts
*
* @see org.kuali.kfs.sys.web.struts.KualiAccountingDocumentActionBase#execute(org.apache.struts.action.ActionMapping,
* org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
CustomerInvoiceDocumentForm customerInvoiceDocumentForm = (CustomerInvoiceDocumentForm) form;
CustomerInvoiceDocument customerInvoiceDocument = customerInvoiceDocumentForm.getCustomerInvoiceDocument();
if(StringUtils.isBlank(customerInvoiceDocument.getDocumentNumber())) {
String docId = request.getParameter(KFSConstants.PARAMETER_DOC_ID);
customerInvoiceDocument.setDocumentNumber(docId);
customerInvoiceDocument.refresh();
}
customerInvoiceDocument.updateAccountReceivableObjectCodes();
try {
// proceed as usual
customerInvoiceDocumentForm.getCustomerInvoiceDocument().updateDiscountAndParentLineReferences();
ActionForward result = super.execute(mapping, form, request, response);
return result;
}
finally {
// update it again for display purposes
customerInvoiceDocumentForm.getCustomerInvoiceDocument().updateDiscountAndParentLineReferences();
}
}
/**
* Called when customer invoice document is initiated.
*
* Makes a call to parent's createDocument method, but also defaults values for customer invoice document. Line which inserts
* Customer Invoice Detail (i.e. insertSourceLine) has its values defaulted by
* CustomerInvoiceDocumentForm.createNewSourceAccountingLine()
*
* @see org.kuali.kfs.sys.web.struts.KualiAccountingDocumentActionBase#createDocument(org.kuali.rice.kns.web.struts.form.KualiDocumentFormBase)
*/
@Override
protected void createDocument(KualiDocumentFormBase kualiDocumentFormBase) throws WorkflowException {
super.createDocument(kualiDocumentFormBase);
// set up the default values for customer invoice document
CustomerInvoiceDocumentForm customerInvoiceDocumentForm = (CustomerInvoiceDocumentForm) kualiDocumentFormBase;
CustomerInvoiceDocument customerInvoiceDocument = customerInvoiceDocumentForm.getCustomerInvoiceDocument();
SpringContext.getBean(CustomerInvoiceDocumentService.class).setupDefaultValuesForNewCustomerInvoiceDocument(customerInvoiceDocument);
}
/**
* All document-load operations get routed through here
*
* @see org.kuali.rice.kns.web.struts.action.KualiDocumentActionBase#loadDocument(org.kuali.rice.kns.web.struts.form.KualiDocumentFormBase)
*/
@Override
protected void loadDocument(KualiDocumentFormBase kualiDocumentFormBase) throws WorkflowException {
super.loadDocument(kualiDocumentFormBase);
CustomerInvoiceDocumentForm form = (CustomerInvoiceDocumentForm) kualiDocumentFormBase;
form.getCustomerInvoiceDocument().updateDiscountAndParentLineReferences();
}
/**
* Method that will take the current document, copy it, replace all references to doc header id with a new one, clear pending
* entries, clear notes, and reset version numbers
*
* @param mapping
* @param form
* @param request
* @param response
* @return
* @throws Exception
*/
@Override
public ActionForward copy(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
CustomerInvoiceDocumentForm customerInvoiceDocumentForm = (CustomerInvoiceDocumentForm) form;
CustomerInvoiceDocument customerInvoiceDocument = customerInvoiceDocumentForm.getCustomerInvoiceDocument();
// perform discount check
ActionForward forward = performInvoiceWithDiscountsCheck(mapping, form, request, response, customerInvoiceDocument);
if (forward != null) {
return forward;
}
forward = super.copy(mapping, form, request, response);
// KFSCNTRB-1737- We don't want to copy the closed date if the (copied) invoice isn't closed.
if (customerInvoiceDocument.isOpenInvoiceIndicator()) {
customerInvoiceDocument.setClosedDate(null);
}
return forward;
}
/**
* This method checks if the user wants to copy a document that contains a discount line. If yes, this method returns null. If no,
* this method returns the "basic" forward.
*
* @param mapping
* @param form
* @param request
* @param response
* @param customerInvoiceDocument
* @return
* @throws Exception
*/
protected ActionForward performInvoiceWithDiscountsCheck(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response, CustomerInvoiceDocument customerInvoiceDocument) throws Exception {
ActionForward forward = null;
if( customerInvoiceDocument.hasAtLeastOneDiscount() ){
Object question = request.getParameter(KFSConstants.QUESTION_INST_ATTRIBUTE_NAME);
if (question == null) {
return this.performQuestionWithoutInput(mapping, form, request, response, ArConstants.COPY_CUSTOMER_INVOICE_DOCUMENT_WITH_DISCOUNTS_QUESTION,
"This document contains a discount line. Are you sure you want to copy this document?", KFSConstants.CONFIRMATION_QUESTION,
KFSConstants.ROUTE_METHOD, "");
}
Object buttonClicked = request.getParameter(KFSConstants.QUESTION_CLICKED_BUTTON);
if (ArConstants.COPY_CUSTOMER_INVOICE_DOCUMENT_WITH_DISCOUNTS_QUESTION.equals(question) && ConfirmationQuestion.NO.equals(buttonClicked)) {
forward = mapping.findForward(KFSConstants.MAPPING_BASIC);
}
}
return forward;
}
/**
* This method is the action for refreshing the added source line (or customer invoice detail) based off a provided invoice item
* code.
*
* @param mapping
* @param form
* @param request
* @param response
* @return
* @throws Exception
*/
public ActionForward refreshNewSourceLine(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
CustomerInvoiceDocumentForm customerInvoiceDocumentForm = (CustomerInvoiceDocumentForm) form;
CustomerInvoiceDocument customerInvoiceDocument = customerInvoiceDocumentForm.getCustomerInvoiceDocument();
CustomerInvoiceDetail newCustomerInvoiceDetail = (CustomerInvoiceDetail) customerInvoiceDocumentForm.getNewSourceLine();
CustomerInvoiceDetailService customerInvoiceDetailService = SpringContext.getBean(CustomerInvoiceDetailService.class);
CustomerInvoiceDetail loadedCustomerInvoiceDetail = customerInvoiceDetailService.getCustomerInvoiceDetailFromCustomerInvoiceItemCode(newCustomerInvoiceDetail.getInvoiceItemCode(), customerInvoiceDocument.getBillByChartOfAccountCode(), customerInvoiceDocument.getBilledByOrganizationCode());
if (loadedCustomerInvoiceDetail == null) {
loadedCustomerInvoiceDetail = (CustomerInvoiceDetail) customerInvoiceDocumentForm.getNewSourceLine();
}
customerInvoiceDocumentForm.setNewSourceLine(loadedCustomerInvoiceDetail);
return mapping.findForward(KFSConstants.MAPPING_BASIC);
}
/**
* This method is the action for recalculating the amount added line assuming that the unit price or quantity has changed
*
* @param mapping
* @param form
* @param request
* @param response
* @return
* @throws Exception
*/
public ActionForward recalculateSourceLine(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
CustomerInvoiceDocumentForm customerInvoiceDocumentForm = (CustomerInvoiceDocumentForm) form;
CustomerInvoiceDocument customerInvoiceDocument = customerInvoiceDocumentForm.getCustomerInvoiceDocument();
int index = getSelectedLine(request);
CustomerInvoiceDetail customerInvoiceDetail = (CustomerInvoiceDetail) customerInvoiceDocument.getSourceAccountingLine(index);
String errorPath = KFSConstants.DOCUMENT_PROPERTY_NAME + "." + KFSConstants.EXISTING_SOURCE_ACCT_LINE_PROPERTY_NAME + "[" + index + "]";
boolean rulePassed = true;
rulePassed &= SpringContext.getBean(KualiRuleService.class).applyRules(new RecalculateCustomerInvoiceDetailEvent(errorPath, customerInvoiceDocumentForm.getDocument(), customerInvoiceDetail));
if (rulePassed) {
CustomerInvoiceDetailService customerInvoiceDetailService = SpringContext.getBean(CustomerInvoiceDetailService.class);
customerInvoiceDetailService.recalculateCustomerInvoiceDetail(customerInvoiceDocument, customerInvoiceDetail);
customerInvoiceDetailService.updateAccountsForCorrespondingDiscount(customerInvoiceDetail);
}
// Update the doc total
((FinancialSystemDocumentHeader) customerInvoiceDocumentForm.getDocument().getDocumentHeader()).setFinancialDocumentTotalAmount(customerInvoiceDocument.getTotalDollarAmount());
return mapping.findForward(KFSConstants.MAPPING_BASIC);
}
/**
* This method is used for inserting a discount line based on a selected source line.
*
* @param mapping
* @param form
* @param request
* @param response
* @return
* @throws Exception
*/
public ActionForward discountSourceLine(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
CustomerInvoiceDocumentForm customerInvoiceDocumentForm = (CustomerInvoiceDocumentForm) form;
CustomerInvoiceDocument customerInvoiceDocument = customerInvoiceDocumentForm.getCustomerInvoiceDocument();
int index = getSelectedLine(request);
CustomerInvoiceDetail parentCustomerInvoiceDetail = (CustomerInvoiceDetail) customerInvoiceDocument.getSourceAccountingLine(index);
// document.sourceAccountingLine[0].invoiceItemUnitPrice
String errorPath = KFSConstants.DOCUMENT_PROPERTY_NAME + "." + KFSConstants.EXISTING_SOURCE_ACCT_LINE_PROPERTY_NAME + "[" + index + "]";
boolean rulePassed = true;
rulePassed &= SpringContext.getBean(KualiRuleService.class).applyRules(new DiscountCustomerInvoiceDetailEvent(errorPath, customerInvoiceDocumentForm.getDocument(), parentCustomerInvoiceDetail));
if (rulePassed) {
CustomerInvoiceDetail discountCustomerInvoiceDetail = SpringContext.getBean(CustomerInvoiceDetailService.class).getDiscountCustomerInvoiceDetailForCurrentYear(parentCustomerInvoiceDetail, customerInvoiceDocument);
discountCustomerInvoiceDetail.refreshNonUpdateableReferences();
insertAccountingLine(true, customerInvoiceDocumentForm, discountCustomerInvoiceDetail);
// also set parent customer invoice detail line to have discount line seq number
parentCustomerInvoiceDetail.setInvoiceItemDiscountLineNumber(discountCustomerInvoiceDetail.getSequenceNumber());
}
return mapping.findForward(KFSConstants.MAPPING_BASIC);
}
/**
* Removed salesTax checking. Need to verify if this check has be moved out later of the KualiAccountingDocumentActionBase
* class. If so just use the parent class' insertSourceLine method.
*
* @see org.kuali.kfs.sys.web.struts.KualiAccountingDocumentActionBase#insertSourceLine(org.apache.struts.action.ActionMapping,
* org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
@Override
public ActionForward insertSourceLine(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
CustomerInvoiceDocumentForm customerInvoiceDocumentForm = (CustomerInvoiceDocumentForm) form;
CustomerInvoiceDocument customerInvoiceDocument = customerInvoiceDocumentForm.getCustomerInvoiceDocument();
CustomerInvoiceDetail customerInvoiceDetail = (CustomerInvoiceDetail) customerInvoiceDocumentForm.getNewSourceLine();
// populate chartOfAccountsCode from account number if accounts cant cross chart and Javascript is turned off
//SpringContext.getBean(AccountService.class).populateAccountingLineChartIfNeeded(customerInvoiceDetail);
// make sure amount is up to date before rules
CustomerInvoiceDetailService service = SpringContext.getBean(CustomerInvoiceDetailService.class);
service.recalculateCustomerInvoiceDetail(customerInvoiceDocument, customerInvoiceDetail);
boolean rulePassed = true;
// check any business rules
rulePassed &= SpringContext.getBean(KualiRuleService.class).applyRules(new AddAccountingLineEvent(KFSConstants.NEW_SOURCE_ACCT_LINE_PROPERTY_NAME, customerInvoiceDocumentForm.getDocument(), customerInvoiceDetail));
if (rulePassed) {
// add accountingLine
customerInvoiceDetail.refreshNonUpdateableReferences();
service.prepareCustomerInvoiceDetailForAdd(customerInvoiceDetail, customerInvoiceDocument);
insertAccountingLine(true, customerInvoiceDocumentForm, customerInvoiceDetail);
// clear the used newTargetLine
customerInvoiceDocumentForm.setNewSourceLine(null);
}
return mapping.findForward(KFSConstants.MAPPING_BASIC);
}
/**
* Overrides method to delete accounting line. If line to be deleted has a corresponding discount line, the corresponding
* discount line is also deleted. If the line to be delete is a discount line, set the reference for the parent to null
*
* @param isSource
* @param financialDocumentForm
* @param deleteIndex
*/
@Override
protected void deleteAccountingLine(boolean isSource, KualiAccountingDocumentFormBase financialDocumentForm, int deleteIndex) {
CustomerInvoiceDocument customerInvoiceDocument = ((CustomerInvoiceDocumentForm) financialDocumentForm).getCustomerInvoiceDocument();
// if line to delete is a discount parent discountLine, remove discount line too
CustomerInvoiceDetail customerInvoiceDetail = (CustomerInvoiceDetail) customerInvoiceDocument.getSourceAccountingLine(deleteIndex);
if (customerInvoiceDetail.isDiscountLineParent()) {
customerInvoiceDocument.removeDiscountLineBasedOnParentLineIndex(deleteIndex);
}
else if (customerInvoiceDocument.isDiscountLineBasedOnSequenceNumber(customerInvoiceDetail.getSequenceNumber())) {
// if line to delete is a discount line, set discount line reference for parent to null
CustomerInvoiceDetail parentCustomerInvoiceDetail = customerInvoiceDetail.getParentDiscountCustomerInvoiceDetail();
if (ObjectUtils.isNotNull(parentCustomerInvoiceDetail)) {
parentCustomerInvoiceDetail.setInvoiceItemDiscountLineNumber(null);
}
}
// delete line like normal
super.deleteAccountingLine(isSource, financialDocumentForm, deleteIndex);
}
@Override
public ActionForward refresh(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
super.refresh(mapping, form, request, response);
refreshBillToAddress(mapping, form, request, response);
refreshShipToAddress(mapping, form, request, response);
return mapping.findForward(KFSConstants.MAPPING_BASIC);
}
/**
* This method refresh the ShipToAddress CustomerAddress object
* @param mapping
* @param form
* @param request
* @param response
* @return
* @throws Exception
*/
public ActionForward refreshBillToAddress(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
CustomerInvoiceDocument customerInvoiceDocument = ((CustomerInvoiceDocumentForm) form).getCustomerInvoiceDocument();
CustomerAddress customerBillToAddress = null;
if (ObjectUtils.isNotNull(customerInvoiceDocument.getCustomerBillToAddressIdentifier())) {
int customerBillToAddressIdentifier = customerInvoiceDocument.getCustomerBillToAddressIdentifier();
customerBillToAddress = SpringContext.getBean(CustomerAddressService.class).getByPrimaryKey(customerInvoiceDocument.getAccountsReceivableDocumentHeader().getCustomerNumber(), customerBillToAddressIdentifier);
if (ObjectUtils.isNotNull(customerBillToAddress)) {
customerInvoiceDocument.setCustomerBillToAddress(customerBillToAddress);
customerInvoiceDocument.setCustomerBillToAddressOnInvoice(customerBillToAddress);
customerInvoiceDocument.setCustomerBillToAddressIdentifier(customerBillToAddressIdentifier);
} else {
customerBillToAddress = SpringContext.getBean(CustomerAddressService.class).getPrimaryAddress(customerInvoiceDocument.getAccountsReceivableDocumentHeader().getCustomerNumber());
if (ObjectUtils.isNotNull(customerBillToAddress)) {
customerInvoiceDocument.setCustomerBillToAddress(customerBillToAddress);
customerInvoiceDocument.setCustomerBillToAddressOnInvoice(customerBillToAddress);
customerInvoiceDocument.setCustomerBillToAddressIdentifier(customerBillToAddress.getCustomerAddressIdentifier());
} else {
customerInvoiceDocument.setCustomerBillToAddress(null);
customerInvoiceDocument.setCustomerBillToAddressOnInvoice(null);
customerInvoiceDocument.setCustomerBillToAddressIdentifier(null);
}
}
} else {
customerBillToAddress = SpringContext.getBean(CustomerAddressService.class).getPrimaryAddress(customerInvoiceDocument.getAccountsReceivableDocumentHeader().getCustomerNumber());
if (ObjectUtils.isNotNull(customerBillToAddress)) {
customerInvoiceDocument.setCustomerBillToAddress(customerBillToAddress);
customerInvoiceDocument.setCustomerBillToAddressOnInvoice(customerBillToAddress);
customerInvoiceDocument.setCustomerBillToAddressIdentifier(customerBillToAddress.getCustomerAddressIdentifier());
} else {
customerInvoiceDocument.setCustomerBillToAddress(null);
customerInvoiceDocument.setCustomerBillToAddressOnInvoice(null);
customerInvoiceDocument.setCustomerBillToAddressIdentifier(null);
}
}
return mapping.findForward(KFSConstants.MAPPING_BASIC);
}
/**
* This method refresh the ShipToAddress CustomerAddress object
* @param mapping
* @param form
* @param request
* @param response
* @return
* @throws Exception
*/
public ActionForward refreshShipToAddress(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
CustomerInvoiceDocument customerInvoiceDocument = ((CustomerInvoiceDocumentForm) form).getCustomerInvoiceDocument();
CustomerAddress customerShipToAddress = null;
if (ObjectUtils.isNotNull(customerInvoiceDocument.getCustomerShipToAddressIdentifier())) {
int customerShipToAddressIdentifier = customerInvoiceDocument.getCustomerShipToAddressIdentifier();
customerShipToAddress = SpringContext.getBean(CustomerAddressService.class).getByPrimaryKey(customerInvoiceDocument.getAccountsReceivableDocumentHeader().getCustomerNumber(), customerShipToAddressIdentifier);
if (ObjectUtils.isNotNull(customerShipToAddress)) {
customerInvoiceDocument.setCustomerShipToAddress(customerShipToAddress);
customerInvoiceDocument.setCustomerShipToAddressOnInvoice(customerShipToAddress);
customerInvoiceDocument.setCustomerShipToAddressIdentifier(customerShipToAddressIdentifier);
}
}
if (ObjectUtils.isNull(customerInvoiceDocument.getCustomerShipToAddressIdentifier()) | ObjectUtils.isNull(customerShipToAddress)) {
customerInvoiceDocument.setCustomerShipToAddress(null);
customerInvoiceDocument.setCustomerShipToAddressOnInvoice(null);
customerInvoiceDocument.setCustomerShipToAddressIdentifier(null);
}
return mapping.findForward(KFSConstants.MAPPING_BASIC);
}
/**
*
* This method...
* @param mapping
* @param form
* @param request
* @param response
* @return
* @throws Exception
*/
public ActionForward print(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
String basePath = getApplicationBaseUrl();
String docId = ((CustomerInvoiceDocumentForm) form).getCustomerInvoiceDocument().getDocumentNumber();
String printInvoicePDFUrl = getUrlForPrintInvoice(basePath, docId, ArConstants.PRINT_INVOICE_PDF_METHOD);
String displayInvoiceTabbedPageUrl = getUrlForPrintInvoice(basePath, docId, KFSConstants.DOC_HANDLER_METHOD);
request.setAttribute(ArPropertyConstants.PRINT_PDF_URL, printInvoicePDFUrl);
request.setAttribute(ArPropertyConstants.DISPLAY_TABBED_PAGE_URL, displayInvoiceTabbedPageUrl);
request.setAttribute(KFSConstants.PARAMETER_DOC_ID, docId);
String label = SpringContext.getBean(DataDictionaryService.class).getDocumentLabelByTypeName(KFSConstants.FinancialDocumentTypeCodes.CUSTOMER_CREDIT_MEMO);
request.setAttribute(ArPropertyConstants.PRINT_LABEL, label);
return mapping.findForward(ArConstants.MAPPING_PRINT_PDF);
}
/**
*
* This method...
* @param mapping
* @param form
* @param request
* @param response
* @return
* @throws Exception
*/
public ActionForward printInvoicePDF(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
String invoiceDocId = request.getParameter(KFSConstants.PARAMETER_DOC_ID);
CustomerInvoiceDocument customerInvoiceDocument = (CustomerInvoiceDocument) SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(invoiceDocId);
AccountsReceivableReportService reportService = SpringContext.getBean(AccountsReceivableReportService.class);
File report = reportService.generateInvoice(customerInvoiceDocument);
if (report.length() == 0) {
return mapping.findForward(KFSConstants.MAPPING_BASIC);
}
byte[] content = Files.readAllBytes(report.toPath());
ByteArrayOutputStream baos = SpringContext.getBean(AccountsReceivablePdfHelperService.class).buildPdfOutputStream(content);
StringBuilder fileName = new StringBuilder();
fileName.append(customerInvoiceDocument.getOrganizationInvoiceNumber());
fileName.append(KFSConstants.DASH);
fileName.append(customerInvoiceDocument.getDocumentNumber());
fileName.append(KFSConstants.ReportGeneration.PDF_FILE_EXTENSION);
KfsWebUtils.saveMimeOutputStreamAsFile(response, KFSConstants.ReportGeneration.PDF_MIME_TYPE, baos, fileName.toString(), Boolean.parseBoolean(request.getParameter(KFSConstants.ReportGeneration.USE_JAVASCRIPT)));
return null;
}
/**
* Creates a URL to be used in printing the customer invoice document.
*
* @param basePath String: The base path of the current URL
* @param docId String: The document ID of the document to be printed
* @param methodToCall String: The name of the method that will be invoked to do this particular print
* @return The URL
*/
protected String getUrlForPrintInvoice(String basePath, String docId, String methodToCall) {
String baseUrl = basePath + "/" + ArConstants.UrlActions.CUSTOMER_INVOICE_DOCUMENT;
Properties parameters = new Properties();
parameters.put(KFSConstants.DISPATCH_REQUEST_PARAMETER, methodToCall);
parameters.put(KFSConstants.PARAMETER_DOC_ID, docId);
parameters.put(KFSConstants.PARAMETER_COMMAND, KewApiConstants.ACTIONLIST_COMMAND);
return UrlFactory.parameterizeUrl(baseUrl, parameters);
}
}