/* * 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.fp.document.service.impl; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.kuali.kfs.fp.businessobject.DisbursementVoucherNonResidentAlienTax; import org.kuali.kfs.fp.businessobject.NonResidentAlienTaxPercent; import org.kuali.kfs.fp.document.DisbursementVoucherConstants; import org.kuali.kfs.fp.document.DisbursementVoucherDocument; import org.kuali.kfs.fp.document.service.DisbursementVoucherTaxService; import org.kuali.kfs.fp.document.validation.impl.DisbursementVoucherNonResidentAlienInformationValidation; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.KFSKeyConstants; import org.kuali.kfs.sys.KFSPropertyConstants; import org.kuali.kfs.sys.businessobject.AccountingLine; import org.kuali.kfs.sys.businessobject.SourceAccountingLine; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.kfs.vnd.businessobject.VendorDetail; import org.kuali.rice.core.api.util.type.KualiDecimal; import org.kuali.rice.coreservice.framework.parameter.ParameterService; import org.kuali.rice.kim.api.identity.Person; import org.kuali.rice.kim.api.identity.PersonService; import org.kuali.rice.krad.bo.PersistableBusinessObject; import org.kuali.rice.krad.exception.InfrastructureException; import org.kuali.rice.krad.service.BusinessObjectService; import org.kuali.rice.krad.service.MaintenanceDocumentService; import org.kuali.rice.krad.util.GlobalVariables; import org.kuali.rice.krad.util.MessageMap; /** * This is the default implementation of the PaymentSourceExtractionService interface. * This class handles queries and validation on tax id numbers. */ public class DisbursementVoucherTaxServiceImpl implements DisbursementVoucherTaxService, DisbursementVoucherConstants { private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(DisbursementVoucherTaxServiceImpl.class); private ParameterService parameterService; private BusinessObjectService businessObjectService; private MaintenanceDocumentService maintenanceDocumentService; /** * This method retrieves the universal id of the individual or business entity who matches the tax id number and type * code given. * * @param taxIDNumber The tax identification number of the user being retrieved. * @param taxPayerTypeCode The tax payer type code of the user being retrieved. See the TAX_TYPE_* constants defined in * DisbursementVoucherRuleConstants for examples of valid tax type codes. * @return The universal id of the individual who matches the tax id and type code given. Null if no matching user is found. * * @see org.kuali.kfs.fp.document.service.DisbursementVoucherTaxService#getEmployeeNumber(java.lang.String, java.lang.String) */ public String getUniversalId(String taxIDNumber, String taxPayerTypeCode) { if (TAX_TYPE_FEIN.equals(taxPayerTypeCode)) { return null; } Person person = (Person) SpringContext.getBean(PersonService.class).getPersonByExternalIdentifier(org.kuali.rice.kim.api.KimConstants.PersonExternalIdentifierTypes.TAX, taxIDNumber).get(0); String universalId = null; if (person != null) { universalId = person.getPrincipalId(); } return universalId; } /** * This method retrieves the vendor identification code for the vendor found who has a matching tax id and tax payer type * code. * * @param taxIDNumber The tax id number used to retrieve the associated vendor. * @param taxPayerTypeCode The tax payer type code used to retrieve the associated vendor. See the TAX_TYPE_* constants defined in * DisbursementVoucherRuleConstants for examples of valid tax type codes. * @return The id of the vendor found matching the tax id and type code provided. Null if no matching vendor is found. * * @see org.kuali.kfs.fp.document.service.DisbursementVoucherTaxService#getPayeeNumber(java.lang.String, java.lang.String) */ public String getVendorId(String taxIDNumber, String taxPayerTypeCode) { String vendorId = null; Map taxIDCrit = new HashMap(); taxIDCrit.put("taxIdNumber", taxIDNumber); taxIDCrit.put("taxpayerTypeCode", taxPayerTypeCode); Collection<VendorDetail> foundPayees = businessObjectService.findMatching(VendorDetail.class, taxIDCrit); if (!foundPayees.isEmpty()) { VendorDetail vendor = (VendorDetail) foundPayees.iterator().next(); vendorId = vendor.getVendorHeaderGeneratedIdentifier().toString(); } return vendorId; } /** * This method generates non-resident alien (NRA) tax lines for the given disbursement voucher. * * The NRA tax lines consist of three possible sets of tax lines: * - Gross up tax lines * - Federal tax lines * - State tax lines * * Gross up tax lines are generated if the income tax gross up code is set on the DisbursementVoucherNonResidentAlienTax * attribute of the disbursement voucher. * * Federal tax lines are generated if the federal tax rate in the DisbursementVoucherNonResidentAlienTax attribute is * other than zero. * * State tax lines are generated if the state tax rate in the DisbursementVoucherNonResidentAlienTax attribute is * other than zero. * * @param document The disbursement voucher the NRA tax lines will be added to. * * @see org.kuali.kfs.fp.document.service.DisbursementVoucherTaxService#generateNRATaxLines(org.kuali.kfs.fp.document.DisbursementVoucherDocument) */ protected void generateNRATaxLines(DisbursementVoucherDocument document) { // retrieve first accounting line for tax line attributes AccountingLine line1 = document.getSourceAccountingLine(0); List taxLineNumbers = new ArrayList(); // generate gross up if (document.getDvNonResidentAlienTax().isIncomeTaxGrossUpCode()) { AccountingLine grossLine = null; try { grossLine = (SourceAccountingLine) document.getSourceAccountingLineClass().newInstance(); } catch (IllegalAccessException e) { throw new InfrastructureException("unable to access sourceAccountingLineClass", e); } catch (InstantiationException e) { throw new InfrastructureException("unable to instantiate sourceAccountingLineClass", e); } grossLine.setDocumentNumber(document.getDocumentNumber()); grossLine.setSequenceNumber(document.getNextSourceLineNumber()); grossLine.setChartOfAccountsCode(line1.getChartOfAccountsCode()); grossLine.setAccountNumber(line1.getAccountNumber()); grossLine.setFinancialObjectCode(line1.getFinancialObjectCode()); // calculate gross up amount and set as line amount BigDecimal federalTaxPercent = document.getDvNonResidentAlienTax().getFederalIncomeTaxPercent().bigDecimalValue(); BigDecimal stateTaxPercent = document.getDvNonResidentAlienTax().getStateIncomeTaxPercent().bigDecimalValue(); BigDecimal documentAmount = document.getDisbVchrCheckTotalAmount().bigDecimalValue(); KualiDecimal grossAmount1 = new KualiDecimal((documentAmount.multiply(federalTaxPercent).divide(new BigDecimal(100).subtract(federalTaxPercent).subtract(stateTaxPercent), 5, BigDecimal.ROUND_HALF_UP))); KualiDecimal grossAmount2 = new KualiDecimal((documentAmount.multiply(stateTaxPercent).divide(new BigDecimal(100).subtract(federalTaxPercent).subtract(stateTaxPercent), 5, BigDecimal.ROUND_HALF_UP))); grossLine.setAmount(grossAmount1.add(grossAmount2)); // put line number in line number list, and update next line property in document taxLineNumbers.add(grossLine.getSequenceNumber()); document.setNextSourceLineNumber(new Integer(document.getNextSourceLineNumber().intValue() + 1)); // add to source accounting lines grossLine.refresh(); document.getSourceAccountingLines().add(grossLine); // update check total, is added because line amount is negative, so this will take check amount down document.setDisbVchrCheckTotalAmount(document.getDisbVchrCheckTotalAmount().add(grossLine.getAmount())); } KualiDecimal taxableAmount = document.getDisbVchrCheckTotalAmount(); // generate federal tax line if (!(KualiDecimal.ZERO.equals(document.getDvNonResidentAlienTax().getFederalIncomeTaxPercent()))) { String federalTaxChart = parameterService.getParameterValueAsString(DisbursementVoucherDocument.class, DisbursementVoucherConstants.FEDERAL_TAX_PARM_PREFIX + DisbursementVoucherConstants.TAX_PARM_CHART_SUFFIX); String federalTaxAccount = parameterService.getParameterValueAsString(DisbursementVoucherDocument.class, DisbursementVoucherConstants.FEDERAL_TAX_PARM_PREFIX + DisbursementVoucherConstants.TAX_PARM_ACCOUNT_SUFFIX); String federalTaxObjectCode = parameterService.getSubParameterValueAsString(DisbursementVoucherDocument.class, DisbursementVoucherConstants.FEDERAL_TAX_PARM_PREFIX + DisbursementVoucherConstants.TAX_PARM_OBJECT_BY_INCOME_CLASS_SUFFIX, document.getDvNonResidentAlienTax().getIncomeClassCode()); if (StringUtils.isBlank(federalTaxChart) || StringUtils.isBlank(federalTaxAccount) || StringUtils.isBlank(federalTaxObjectCode)) { LOG.error("Unable to retrieve federal tax parameters."); throw new RuntimeException("Unable to retrieve federal tax parameters."); } AccountingLine federalTaxLine = generateTaxAccountingLine(document, federalTaxChart, federalTaxAccount, federalTaxObjectCode, document.getDvNonResidentAlienTax().getFederalIncomeTaxPercent(), taxableAmount); // put line number in line number list, and update next line property in document taxLineNumbers.add(federalTaxLine.getSequenceNumber()); document.setNextSourceLineNumber(new Integer(document.getNextSourceLineNumber().intValue() + 1)); // add to source accounting lines federalTaxLine.refresh(); document.getSourceAccountingLines().add(federalTaxLine); // update check total, is added because line amount is negative, so this will take check amount down document.setDisbVchrCheckTotalAmount(document.getDisbVchrCheckTotalAmount().add(federalTaxLine.getAmount())); } // generate state tax line if (!(KualiDecimal.ZERO.equals(document.getDvNonResidentAlienTax().getStateIncomeTaxPercent()))) { String stateTaxChart = parameterService.getParameterValueAsString(DisbursementVoucherDocument.class, DisbursementVoucherConstants.STATE_TAX_PARM_PREFIX + DisbursementVoucherConstants.TAX_PARM_CHART_SUFFIX); String stateTaxAccount = parameterService.getParameterValueAsString(DisbursementVoucherDocument.class, DisbursementVoucherConstants.STATE_TAX_PARM_PREFIX + DisbursementVoucherConstants.TAX_PARM_ACCOUNT_SUFFIX); String stateTaxObjectCode = parameterService.getSubParameterValueAsString(DisbursementVoucherDocument.class, DisbursementVoucherConstants.STATE_TAX_PARM_PREFIX + DisbursementVoucherConstants.TAX_PARM_OBJECT_BY_INCOME_CLASS_SUFFIX, document.getDvNonResidentAlienTax().getIncomeClassCode()); if (StringUtils.isBlank(stateTaxChart) || StringUtils.isBlank(stateTaxAccount) || StringUtils.isBlank(stateTaxObjectCode)) { LOG.error("Unable to retrieve state tax parameters."); throw new RuntimeException("Unable to retrieve state tax parameters."); } AccountingLine stateTaxLine = generateTaxAccountingLine(document, stateTaxChart, stateTaxAccount, stateTaxObjectCode, document.getDvNonResidentAlienTax().getStateIncomeTaxPercent(), taxableAmount); // put line number in line number list, and update next line property in document taxLineNumbers.add(stateTaxLine.getSequenceNumber()); document.setNextSourceLineNumber(new Integer(document.getNextSourceLineNumber().intValue() + 1)); // add to source accounting lines stateTaxLine.refresh(); document.getSourceAccountingLines().add(stateTaxLine); // update check total, is added because line amount is negative, so this will take check amount down document.setDisbVchrCheckTotalAmount(document.getDisbVchrCheckTotalAmount().add(stateTaxLine.getAmount())); } // update line number field document.getDvNonResidentAlienTax().setFinancialDocumentAccountingLineText(StringUtils.join(taxLineNumbers.iterator(), ",")); } /** * Generates an accounting line for the chart, account, object code & tax percentage values given. * * @param document The disbursement voucher the tax will be applied to. * @param chart The chart code to be assigned to the accounting line generated. * @param account The account code to be assigned to the accounting line generated. * @param objectCode The object code used on the accounting line generated. * @param taxPercent The tax rate to be used to calculate the tax amount. * @param taxableAmount The total amount that is taxable. This amount is used in conjunction with the tax percent * to calculate the amount for the accounting lined being generated. * @return A fully populated AccountingLine instance representing the amount of tax that will be applied to the * disbursement voucher provided. */ protected AccountingLine generateTaxAccountingLine(DisbursementVoucherDocument document, String chart, String account, String objectCode, KualiDecimal taxPercent, KualiDecimal taxableAmount) { AccountingLine taxLine = null; try { taxLine = (SourceAccountingLine) document.getSourceAccountingLineClass().newInstance(); } catch (IllegalAccessException e) { throw new InfrastructureException("unable to access sourceAccountingLineClass", e); } catch (InstantiationException e) { throw new InfrastructureException("unable to instantiate sourceAccountingLineClass", e); } taxLine.setDocumentNumber(document.getDocumentNumber()); taxLine.setSequenceNumber(document.getNextSourceLineNumber()); taxLine.setChartOfAccountsCode(chart); taxLine.setAccountNumber(account); taxLine.setFinancialObjectCode(objectCode); // calculate tax amount and set as line amount BigDecimal amount = taxableAmount.bigDecimalValue(); BigDecimal tax = taxPercent.bigDecimalValue(); BigDecimal taxDecimal = tax.divide(new BigDecimal(100), 5, BigDecimal.ROUND_HALF_UP); KualiDecimal taxAmount = new KualiDecimal(amount.multiply(taxDecimal).setScale(KualiDecimal.SCALE, KualiDecimal.ROUND_BEHAVIOR)); taxLine.setAmount(taxAmount.negated()); return taxLine; } /** * This method validates the non-resident alien (NRA) tax information for the document and if the information validates, * the NRA tax lines are generated. * * @param document The disbursement voucher document the NRA tax information will be validated and the subsequent * tax lines generated for. * * @see org.kuali.kfs.fp.document.service.DisbursementVoucherTaxService#processNonResidentAlienTax(org.kuali.kfs.fp.document.DisbursementVoucherDocument, * java.util.List) */ public void processNonResidentAlienTax(DisbursementVoucherDocument document) { if (validateNRATaxInformation(document)) { generateNRATaxLines(document); } } /** * Removes non-resident alien (NRA) check boxes and sets information to empty values. * * @param document The disbursement voucher the NRA tax lines will be removed from. */ public void clearNRATaxInfo(DisbursementVoucherDocument document) { document.getDvNonResidentAlienTax().setIncomeClassCode(null); document.getDvNonResidentAlienTax().setFederalIncomeTaxPercent(null); document.getDvNonResidentAlienTax().setStateIncomeTaxPercent(null); document.getDvNonResidentAlienTax().setPostalCountryCode(null); document.getDvNonResidentAlienTax().setTaxNQIId(null); document.getDvNonResidentAlienTax().setReferenceFinancialDocumentNumber(null); document.getDvNonResidentAlienTax().setForeignSourceIncomeCode(false); document.getDvNonResidentAlienTax().setIncomeTaxTreatyExemptCode(false); document.getDvNonResidentAlienTax().setTaxOtherExemptIndicator(false); document.getDvNonResidentAlienTax().setIncomeTaxGrossUpCode(false); document.getDvNonResidentAlienTax().setTaxUSAIDPerDiemIndicator(false); document.getDvNonResidentAlienTax().setTaxSpecialW4Amount(null); clearNRATaxLines(document); } /** * Removes non-resident alien (NRA) tax lines from the document's accounting lines and updates the check total. * * @param document The disbursement voucher the NRA tax lines will be removed from. */ public void clearNRATaxLines(DisbursementVoucherDocument document) { ArrayList<SourceAccountingLine> taxLines = new ArrayList<SourceAccountingLine>(); KualiDecimal taxTotal = KualiDecimal.ZERO; DisbursementVoucherNonResidentAlienTax dvnrat = document.getDvNonResidentAlienTax(); if (dvnrat != null) { List<Integer> previousTaxLineNumbers = getNRATaxLineNumbers(dvnrat.getFinancialDocumentAccountingLineText()); // get tax lines out of source lines boolean previousGrossUp = false; List<SourceAccountingLine> srcLines = document.getSourceAccountingLines(); for (SourceAccountingLine line : srcLines) { if (previousTaxLineNumbers.contains(line.getSequenceNumber())) { taxLines.add(line); // check if tax line was a positive amount, in which case we had a gross up if ((KualiDecimal.ZERO).compareTo(line.getAmount()) < 0) { previousGrossUp = true; } else { taxTotal = taxTotal.add(line.getAmount().abs()); } } } // remove tax lines /* * NOTE: a custom remove method needed to be used here because the .equals() method for * AccountingLineBase does not take amount into account when determining equality. * This lead to the issues described in KULRNE-6201. */ Iterator<SourceAccountingLine> saLineIter = document.getSourceAccountingLines().iterator(); while(saLineIter.hasNext()) { SourceAccountingLine saLine = saLineIter.next(); for(SourceAccountingLine taxLine : taxLines) { if(saLine.equals(taxLine)) { if(saLine.getAmount().equals(taxLine.getAmount())) { saLineIter.remove(); } } } } // update check total if not grossed up if (!previousGrossUp) { document.setDisbVchrCheckTotalAmount(document.getDisbVchrCheckTotalAmount().add(taxTotal)); } // clear line string dvnrat.setFinancialDocumentAccountingLineText(""); } } /** * This method retrieves the non-resident alien (NRA) tax amount using the disbursement voucher given to calculate the * amount. If the vendor is not a non-resident alien or they are and there is no gross up code set, the amount returned * will be zero. If the vendor is a non-resident alien and gross up has been set, the amount is calculated by * retrieving all the source accounting lines for the disbursement voucher provided and summing the amounts of all the * lines that are NRA tax lines. * * @param document The disbursement voucher the NRA tax line amount will be calculated for. * @return The NRA tax amount applicable to the given disbursement voucher or zero if the voucher does not have any * NRA tax lines. * * @see org.kuali.kfs.fp.document.service.DisbursementVoucherTaxService#getNonResidentAlienTaxAmount(org.kuali.kfs.fp.document.DisbursementVoucherDocument) */ public KualiDecimal getNonResidentAlienTaxAmount(DisbursementVoucherDocument document) { KualiDecimal taxAmount = KualiDecimal.ZERO; // if not nra payment or gross has been done, no tax amount should have been taken out if (!document.getDvPayeeDetail().isDisbVchrAlienPaymentCode() || (document.getDvPayeeDetail().isDisbVchrAlienPaymentCode() && document.getDvNonResidentAlienTax().isIncomeTaxGrossUpCode())) { return taxAmount; } // get tax line numbers List taxLineNumbers = getNRATaxLineNumbers(document.getDvNonResidentAlienTax().getFinancialDocumentAccountingLineText()); for (Iterator iter = document.getSourceAccountingLines().iterator(); iter.hasNext();) { SourceAccountingLine line = (SourceAccountingLine) iter.next(); // check if line is nra tax line if (taxLineNumbers.contains(line.getSequenceNumber())) { taxAmount = taxAmount.add(line.getAmount().negated()); } } return taxAmount; } /** * This method performs a series of validation checks to ensure that the disbursement voucher given contains non-resident * alien specific information and non-resident alien tax lines are necessary. * * The following steps are taken to validate the disbursement voucher given: * - Set all percentages (ie. federal, state) to zero if their current value is null. * - Call DisbursementVoucherDocumentRule.validateNonResidentAlienInformation to perform more in-depth validation. * - The vendor for the disbursement voucher given is a non-resident alien. * - No reference document exists for the assigned DisbursementVoucherNonResidentAlienTax attribute of the voucher given. * - There is at least one source accounting line to generate the tax line from. * - Both the state and federal tax percentages are greater than zero. * - The total check amount is not negative. * - The total of the accounting lines is not negative. * - The total check amount is equal to the total of the accounting lines. * * * @param document The disbursement voucher document to validate the tax lines for. * @return True if the information associated with non-resident alien tax is correct and valid, false otherwise. * * @see org.kuali.kfs.fp.document.service.DisbursementVoucherTaxService#validateNRATaxInformation(org.kuali.kfs.fp.document.DisbursementVoucherDocument) * @see org.kuali.kfs.fp.document.validation.impl.DisbursementVoucherDocumentRule#validateNonResidentAlienInformation(DisbursementVoucherDocument) */ protected boolean validateNRATaxInformation(DisbursementVoucherDocument document) { MessageMap errors = GlobalVariables.getMessageMap(); DisbursementVoucherNonResidentAlienInformationValidation dvNRA = new DisbursementVoucherNonResidentAlienInformationValidation(); dvNRA.setAccountingDocumentForValidation(document); dvNRA.setValidationType("GENERATE"); if(!dvNRA.validate(null)) { return false; } if (GlobalVariables.getMessageMap().hasErrors()) { return false; } /* make sure vendor is nra */ if (!document.getDvPayeeDetail().isDisbVchrAlienPaymentCode()) { errors.putErrorWithoutFullErrorPath("DVNRATaxErrors", KFSKeyConstants.ERROR_DV_GENERATE_TAX_NOT_NRA); return false; } /* don't generate tax if reference doc is given */ if (StringUtils.isNotBlank(document.getDvNonResidentAlienTax().getReferenceFinancialDocumentNumber())) { errors.putErrorWithoutFullErrorPath("DVNRATaxErrors", KFSKeyConstants.ERROR_DV_GENERATE_TAX_DOC_REFERENCE); return false; } // check attributes needed to generate lines /* need at least 1 line */ if (!(document.getSourceAccountingLines().size() >= 1)) { errors.putErrorWithoutFullErrorPath("DVNRATaxErrors", KFSKeyConstants.ERROR_DV_GENERATE_TAX_NO_SOURCE); return false; } /* make sure both fed and state tax percents are not 0, in which case there is no need to generate lines */ if (KualiDecimal.ZERO.equals(document.getDvNonResidentAlienTax().getFederalIncomeTaxPercent()) && KualiDecimal.ZERO.equals(document.getDvNonResidentAlienTax().getStateIncomeTaxPercent())) { errors.putErrorWithoutFullErrorPath("DVNRATaxErrors", KFSKeyConstants.ERROR_DV_GENERATE_TAX_BOTH_0); return false; } /* check total cannot be negative */ if (KualiDecimal.ZERO.compareTo(document.getDisbVchrCheckTotalAmount()) == 1) { errors.putErrorWithoutFullErrorPath("document.disbVchrCheckTotalAmount", KFSKeyConstants.ERROR_NEGATIVE_OR_ZERO_CHECK_TOTAL); return false; } /* total accounting lines cannot be negative */ if (KualiDecimal.ZERO.compareTo(document.getSourceTotal()) == 1) { errors.putErrorWithoutFullErrorPath(KFSConstants.ACCOUNTING_LINE_ERRORS, KFSKeyConstants.ERROR_NEGATIVE_ACCOUNTING_TOTAL); return false; } /* total of accounting lines must match check total */ if (document.getDisbVchrCheckTotalAmount().compareTo(document.getSourceTotal()) != 0) { errors.putErrorWithoutFullErrorPath(KFSConstants.ACCOUNTING_LINE_ERRORS, KFSKeyConstants.ERROR_CHECK_ACCOUNTING_TOTAL); return false; } return true; } /** * Parses the tax line string given and returns a list of line numbers as Integers. * * @param taxLineString The string to be parsed. * @return A collection of line numbers represented as Integers. */ public List<Integer> getNRATaxLineNumbers(String taxLineString) { List<Integer> taxLineNumbers = new ArrayList(); if (StringUtils.isNotBlank(taxLineString)) { List<String> taxLineNumberStrings = Arrays.asList(StringUtils.split(taxLineString, ",")); for (String lineNumber : taxLineNumberStrings) { taxLineNumbers.add(Integer.valueOf(lineNumber)); } } return taxLineNumbers; } /** * This method sets the parameterService attribute to the value given. * @param parameterService The ParameterService to be set. */ public void setParameterService(ParameterService parameterService) { this.parameterService = parameterService; } /** * Gets the value of the businessObjectService instance. * @return Returns the businessObjectService. */ public BusinessObjectService getBusinessObjectService() { return businessObjectService; } /** * This method sets the businessObjectService attribute to the value given. * @param businessObjectService The businessObjectService to set. */ public void setBusinessObjectService(BusinessObjectService businessObjectService) { this.businessObjectService = businessObjectService; } /** * Gets the value of the maintenanceDocumentService instance. * @return Returns the maintenanceDocumentService. */ public MaintenanceDocumentService getMaintenanceDocumentService() { return maintenanceDocumentService; } /** * This method sets the maintenanceDocumentService attribute to the value given. * @param maintenanceDocumentService The maintenanceDocumentService to set. */ public void setMaintenanceDocumentService(MaintenanceDocumentService maintenanceDocumentService) { this.maintenanceDocumentService = maintenanceDocumentService; } }