/*
* 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.batch.service;
import static org.kuali.kfs.sys.fixture.UserNameFixture.khuntley;
import static org.kuali.kfs.sys.fixture.UserNameFixture.wklykins;
import java.io.File;
import java.sql.Date;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.integration.cg.ContractsAndGrantsBillingAgency;
import org.kuali.kfs.integration.cg.ContractsAndGrantsBillingAward;
import org.kuali.kfs.integration.cg.ContractsAndGrantsBillingAwardAccount;
import org.kuali.kfs.module.ar.ArConstants;
import org.kuali.kfs.module.ar.ArKeyConstants;
import org.kuali.kfs.module.ar.businessobject.AccountsReceivableDocumentHeader;
import org.kuali.kfs.module.ar.businessobject.ContractsGrantsInvoiceDocumentErrorLog;
import org.kuali.kfs.module.ar.businessobject.InvoiceAccountDetail;
import org.kuali.kfs.module.ar.document.ContractsGrantsInvoiceDocument;
import org.kuali.kfs.module.ar.document.service.ContractsGrantsInvoiceDocumentService;
import org.kuali.kfs.module.ar.fixture.ARAgencyFixture;
import org.kuali.kfs.module.ar.fixture.ARAwardAccountFixture;
import org.kuali.kfs.module.ar.fixture.ARAwardFixture;
import org.kuali.kfs.module.ar.fixture.ContractsGrantsInvoiceDocumentFixture;
import org.kuali.kfs.module.ar.fixture.InvoiceAccountDetailFixture;
import org.kuali.kfs.module.ar.service.ContractsGrantsInvoiceCreateDocumentService;
import org.kuali.kfs.module.ar.service.ContractsGrantsInvoiceCreateTestBase;
import org.kuali.kfs.module.cg.businessobject.Award;
import org.kuali.kfs.module.cg.businessobject.AwardAccount;
import org.kuali.kfs.module.cg.businessobject.AwardOrganization;
import org.kuali.kfs.sys.ConfigureContext;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.rice.kew.api.exception.WorkflowException;
import org.kuali.rice.krad.util.ErrorMessage;
@ConfigureContext(session = khuntley)
public class ContractsGrantsInvoiceCreateDocumentServiceTest extends ContractsGrantsInvoiceCreateTestBase {
protected ContractsGrantsInvoiceCreateDocumentService contractsGrantsInvoiceCreateDocumentService;
protected ContractsGrantsInvoiceDocumentService contractsGrantsInvoiceDocumentService;
@Override
public void setUp() throws Exception {
super.setUp();
contractsGrantsInvoiceCreateDocumentService = SpringContext.getBean(ContractsGrantsInvoiceCreateDocumentService.class);
contractsGrantsInvoiceDocumentService = SpringContext.getBean(ContractsGrantsInvoiceDocumentService.class);
}
public void testValidateManualAwardsOneValidAward() {
List<ContractsAndGrantsBillingAward> awards = setupAwards();
Collection<ContractsGrantsInvoiceDocumentErrorLog> contractsGrantsInvoiceDocumentErrorLogs = new ArrayList<ContractsGrantsInvoiceDocumentErrorLog>();
Collection<ContractsAndGrantsBillingAward> validAwards = contractsGrantsInvoiceCreateDocumentService.validateAwards(awards, contractsGrantsInvoiceDocumentErrorLogs, null, ArConstants.ContractsAndGrantsInvoiceDocumentCreationProcessType.MANUAL.getCode());
assertTrue("contractsGrantsInvoiceDocumentErrorLogs should be empty.", contractsGrantsInvoiceDocumentErrorLogs.size() == 0);
assertTrue("validAwards should contain one award.", validAwards.size() == 1);
assertTrue("validAwards should contain our initial award.", validAwards.contains(awards.get(0)));
Collection<ContractsGrantsInvoiceDocumentErrorLog> persistedErrors = businessObjectService.findAll(ContractsGrantsInvoiceDocumentErrorLog.class);
assertTrue("no errors should be persisted", persistedErrors.size() == 0);
}
public void testValidateManualAwardsOneInvalidAward() {
List<ContractsAndGrantsBillingAward> awards = setupAwards();
((Award)awards.get(0)).setExcludedFromInvoicing(true);
List<ContractsGrantsInvoiceDocumentErrorLog> contractsGrantsInvoiceDocumentErrorLogs = new ArrayList<ContractsGrantsInvoiceDocumentErrorLog>();
Collection<ContractsAndGrantsBillingAward> validAwards = contractsGrantsInvoiceCreateDocumentService.validateAwards(awards, contractsGrantsInvoiceDocumentErrorLogs, null, ArConstants.ContractsAndGrantsInvoiceDocumentCreationProcessType.MANUAL.getCode());
assertTrue("contractsGrantsInvoiceDocumentErrorLogs should contain one award.", contractsGrantsInvoiceDocumentErrorLogs.size() == 1);
assertTrue("validAwards should be empty.", validAwards.size() == 0);
assertTrue("contractsGrantsInvoiceDocumentErrorLogs should contain our initial award.", errorLogContainsAward(contractsGrantsInvoiceDocumentErrorLogs, awards.get(0)));
Collection<ContractsGrantsInvoiceDocumentErrorLog> persistedErrors = businessObjectService.findAll(ContractsGrantsInvoiceDocumentErrorLog.class);
assertTrue("one error should be persisted", persistedErrors.size() == 1);
for (ContractsGrantsInvoiceDocumentErrorLog persistedError: persistedErrors) {
assertTrue("process type should be manual", persistedError.getCreationProcessTypeCode().equals(ArConstants.ContractsAndGrantsInvoiceDocumentCreationProcessType.MANUAL.getCode()));
}
}
public void testValidateManualAwardsTwoValidAwards() {
List<ContractsAndGrantsBillingAward> awards = setupAwards();
List<ContractsAndGrantsBillingAward> awards2 = setupAwards();
((Award)awards2.get(0)).setProposalNumber(new Long(11));
awards.addAll(awards2);
Collection<ContractsGrantsInvoiceDocumentErrorLog> contractsGrantsInvoiceDocumentErrorLogs = new ArrayList<ContractsGrantsInvoiceDocumentErrorLog>();
Collection<ContractsAndGrantsBillingAward> validAwards = contractsGrantsInvoiceCreateDocumentService.validateAwards(awards, contractsGrantsInvoiceDocumentErrorLogs, null, ArConstants.ContractsAndGrantsInvoiceDocumentCreationProcessType.MANUAL.getCode());
assertTrue("contractsGrantsInvoiceDocumentErrorLogs should be empty.", contractsGrantsInvoiceDocumentErrorLogs.size() == 0);
assertTrue("validAwards should contain one award.", validAwards.size() == 2);
assertTrue("validAwards should contain our first award.", validAwards.contains(awards.get(0)));
assertTrue("validAwards should contain our second award.", validAwards.contains(awards.get(1)));
Collection<ContractsGrantsInvoiceDocumentErrorLog> persistedErrors = businessObjectService.findAll(ContractsGrantsInvoiceDocumentErrorLog.class);
assertTrue("no errors should be persisted", persistedErrors.size() == 0);
}
public void testValidateManualAwardsTwoInvalidAwards() {
List<ContractsAndGrantsBillingAward> awards = setupAwards();
((Award)awards.get(0)).setExcludedFromInvoicing(true);
List<ContractsAndGrantsBillingAward> awards2 = setupAwards();
((Award)awards2.get(0)).setExcludedFromInvoicing(true);
((Award)awards2.get(0)).setProposalNumber(new Long(11));
awards.addAll(awards2);
List<ContractsGrantsInvoiceDocumentErrorLog> contractsGrantsInvoiceDocumentErrorLogs = new ArrayList<ContractsGrantsInvoiceDocumentErrorLog>();
Collection<ContractsAndGrantsBillingAward> validAwards = contractsGrantsInvoiceCreateDocumentService.validateAwards(awards, contractsGrantsInvoiceDocumentErrorLogs, null, ArConstants.ContractsAndGrantsInvoiceDocumentCreationProcessType.MANUAL.getCode());
assertTrue("contractsGrantsInvoiceDocumentErrorLogs should contain two awards.", contractsGrantsInvoiceDocumentErrorLogs.size() == 2);
assertTrue("validAwards should be empty.", validAwards.size() == 0);
assertTrue("contractsGrantsInvoiceDocumentErrorLogs should contain our first award.", errorLogContainsAward(contractsGrantsInvoiceDocumentErrorLogs, awards.get(0)));
assertTrue("contractsGrantsInvoiceDocumentErrorLogs should contain our second award.", errorLogContainsAward(contractsGrantsInvoiceDocumentErrorLogs, awards.get(1)));
Collection<ContractsGrantsInvoiceDocumentErrorLog> persistedErrors = businessObjectService.findAll(ContractsGrantsInvoiceDocumentErrorLog.class);
assertTrue("two errors should be persisted", persistedErrors.size() == 2);
for (ContractsGrantsInvoiceDocumentErrorLog persistedError: persistedErrors) {
assertTrue("process type should be manual", persistedError.getCreationProcessTypeCode().equals(ArConstants.ContractsAndGrantsInvoiceDocumentCreationProcessType.MANUAL.getCode()));
}
}
public void testValidateManualAwardsOneValidOneInvalidAwards() {
List<ContractsAndGrantsBillingAward> awards = setupAwards();
List<ContractsAndGrantsBillingAward> awards2 = setupAwards();
((Award)awards2.get(0)).setExcludedFromInvoicing(true);
((Award)awards2.get(0)).setProposalNumber(new Long(11));
awards.addAll(awards2);
List<ContractsGrantsInvoiceDocumentErrorLog> contractsGrantsInvoiceDocumentErrorLogs = new ArrayList<ContractsGrantsInvoiceDocumentErrorLog>();
Collection<ContractsAndGrantsBillingAward> validAwards = contractsGrantsInvoiceCreateDocumentService.validateAwards(awards, contractsGrantsInvoiceDocumentErrorLogs, null, ArConstants.ContractsAndGrantsInvoiceDocumentCreationProcessType.MANUAL.getCode());
assertTrue("contractsGrantsInvoiceDocumentErrorLogs should contain one award.", contractsGrantsInvoiceDocumentErrorLogs.size() == 1);
assertTrue("validAwards should contain one award.", validAwards.size() == 1);
assertTrue("validAwards should contain our first award.", validAwards.contains(awards.get(0)));
assertTrue("contractsGrantsInvoiceDocumentErrorLogs should contain our second award.", errorLogContainsAward(contractsGrantsInvoiceDocumentErrorLogs, awards.get(1)));
Collection<ContractsGrantsInvoiceDocumentErrorLog> persistedErrors = businessObjectService.findAll(ContractsGrantsInvoiceDocumentErrorLog.class);
assertTrue("one error should be persisted", persistedErrors.size() == 1);
for (ContractsGrantsInvoiceDocumentErrorLog persistedError: persistedErrors) {
assertTrue("process type should be manual", persistedError.getCreationProcessTypeCode().equals(ArConstants.ContractsAndGrantsInvoiceDocumentCreationProcessType.MANUAL.getCode()));
}
}
public void testValidateBatchAwardsOneValidAward() {
List<ContractsAndGrantsBillingAward> awards = setupAwards();
Collection<ContractsAndGrantsBillingAward> validAwards = contractsGrantsInvoiceCreateDocumentService.validateAwards(awards, null, errorOutputFile, ArConstants.ContractsAndGrantsInvoiceDocumentCreationProcessType.BATCH.getCode());
assertTrue("validAwards should contain one award.", validAwards.size() == 1);
assertTrue("validAwards should contain our initial award.", validAwards.contains(awards.get(0)));
Collection<ContractsGrantsInvoiceDocumentErrorLog> persistedErrors = businessObjectService.findAll(ContractsGrantsInvoiceDocumentErrorLog.class);
assertTrue("no errors should be persisted", persistedErrors.size() == 0);
File errors = new File(errorOutputFile);
assertFalse("no errors should be written", errors.exists());
}
public void testValidateBatchAwardsOneInvalidAward() {
List<ContractsAndGrantsBillingAward> awards = setupAwards();
((Award)awards.get(0)).setExcludedFromInvoicing(true);
Collection<ContractsAndGrantsBillingAward> validAwards = contractsGrantsInvoiceCreateDocumentService.validateAwards(awards, null, errorOutputFile, ArConstants.ContractsAndGrantsInvoiceDocumentCreationProcessType.BATCH.getCode());
assertTrue("validAwards should be empty.", validAwards.size() == 0);
Collection<ContractsGrantsInvoiceDocumentErrorLog> persistedErrors = businessObjectService.findAll(ContractsGrantsInvoiceDocumentErrorLog.class);
assertTrue("one error should be persisted", persistedErrors.size() == 1);
for (ContractsGrantsInvoiceDocumentErrorLog persistedError: persistedErrors) {
assertTrue("process type should be batch", persistedError.getCreationProcessTypeCode().equals(ArConstants.ContractsAndGrantsInvoiceDocumentCreationProcessType.BATCH.getCode()));
}
File errors = new File(errorOutputFile);
assertTrue("errors should be written", errors.exists());
assertTrue("errorOutputFile should not be empty", errors.length() > 0);
}
public void testValidateBatchAwardsTwoValidAwards() {
List<ContractsAndGrantsBillingAward> awards = setupAwards();
List<ContractsAndGrantsBillingAward> awards2 = setupAwards();
((Award)awards2.get(0)).setProposalNumber(new Long(11));
awards.addAll(awards2);
Collection<ContractsAndGrantsBillingAward> validAwards = contractsGrantsInvoiceCreateDocumentService.validateAwards(awards, null, errorOutputFile, ArConstants.ContractsAndGrantsInvoiceDocumentCreationProcessType.BATCH.getCode());
assertTrue("validAwards should contain one award.", validAwards.size() == 2);
assertTrue("validAwards should contain our first award.", validAwards.contains(awards.get(0)));
assertTrue("validAwards should contain our second award.", validAwards.contains(awards.get(1)));
Collection<ContractsGrantsInvoiceDocumentErrorLog> persistedErrors = businessObjectService.findAll(ContractsGrantsInvoiceDocumentErrorLog.class);
assertTrue("no errors should be persisted", persistedErrors.size() == 0);
File errors = new File(errorOutputFile);
assertFalse("no errors should be written", errors.exists());
}
public void testValidateBatchAwardsTwoInvalidAwards() {
List<ContractsAndGrantsBillingAward> awards = setupAwards();
((Award)awards.get(0)).setExcludedFromInvoicing(true);
List<ContractsAndGrantsBillingAward> awards2 = setupAwards();
((Award)awards2.get(0)).setExcludedFromInvoicing(true);
((Award)awards2.get(0)).setProposalNumber(new Long(11));
awards.addAll(awards2);
Collection<ContractsAndGrantsBillingAward> validAwards = contractsGrantsInvoiceCreateDocumentService.validateAwards(awards, null, errorOutputFile, ArConstants.ContractsAndGrantsInvoiceDocumentCreationProcessType.BATCH.getCode());
assertTrue("validAwards should be empty.", validAwards.size() == 0);
Collection<ContractsGrantsInvoiceDocumentErrorLog> persistedErrors = businessObjectService.findAll(ContractsGrantsInvoiceDocumentErrorLog.class);
assertTrue("two errors should be persisted", persistedErrors.size() == 2);
for (ContractsGrantsInvoiceDocumentErrorLog persistedError: persistedErrors) {
assertTrue("process type should be batch", persistedError.getCreationProcessTypeCode().equals(ArConstants.ContractsAndGrantsInvoiceDocumentCreationProcessType.BATCH.getCode()));
}
File errors = new File(errorOutputFile);
assertTrue("errors should be written", errors.exists());
assertTrue("errorOutputFile should not be empty", errors.length() > 0);
}
public void testValidateBatchAwardsOneValidOneInvalidAwards() {
List<ContractsAndGrantsBillingAward> awards = setupAwards();
List<ContractsAndGrantsBillingAward> awards2 = setupAwards();
((Award)awards2.get(0)).setExcludedFromInvoicing(true);
((Award)awards2.get(0)).setProposalNumber(new Long(11));
awards.addAll(awards2);
Collection<ContractsAndGrantsBillingAward> validAwards = contractsGrantsInvoiceCreateDocumentService.validateAwards(awards, null, errorOutputFile, ArConstants.ContractsAndGrantsInvoiceDocumentCreationProcessType.BATCH.getCode());
assertTrue("validAwards should contain one award.", validAwards.size() == 1);
assertTrue("validAwards should contain our first award.", validAwards.contains(awards.get(0)));
Collection<ContractsGrantsInvoiceDocumentErrorLog> persistedErrors = businessObjectService.findAll(ContractsGrantsInvoiceDocumentErrorLog.class);
assertTrue("one error should be persisted", persistedErrors.size() == 1);
for (ContractsGrantsInvoiceDocumentErrorLog persistedError: persistedErrors) {
assertTrue("process type should be batch", persistedError.getCreationProcessTypeCode().equals(ArConstants.ContractsAndGrantsInvoiceDocumentCreationProcessType.BATCH.getCode()));
}
File errors = new File(errorOutputFile);
assertTrue("errors should be written", errors.exists());
assertTrue("errorOutputFile should not be empty", errors.length() > 0);
}
@ConfigureContext(session = wklykins)
public void testCreateCGInvoiceDocumentByAwardInfo() {
String coaCode = "BL";
String orgCode = "UGCS";
ContractsGrantsInvoiceDocument contractsGrantsInvoiceDocument_1 = ContractsGrantsInvoiceDocumentFixture.CG_INV_DOC1.createContractsGrantsInvoiceDocument(documentService);
contractsGrantsInvoiceDocument_1.setBillByChartOfAccountCode(coaCode);
contractsGrantsInvoiceDocument_1.setBilledByOrganizationCode(orgCode);
AccountsReceivableDocumentHeader accountsReceivableDocumentHeader = new AccountsReceivableDocumentHeader();
accountsReceivableDocumentHeader.setDocumentNumber(contractsGrantsInvoiceDocument_1.getDocumentNumber());
List<String> procCodes = contractsGrantsInvoiceDocumentService.getProcessingFromBillingCodes(coaCode, orgCode);
accountsReceivableDocumentHeader.setProcessingChartOfAccountCode(procCodes.get(0));
accountsReceivableDocumentHeader.setProcessingOrganizationCode(procCodes.get(1));
contractsGrantsInvoiceDocument_1.setAccountsReceivableDocumentHeader(accountsReceivableDocumentHeader);
ContractsAndGrantsBillingAward award = ARAwardFixture.CG_AWARD_MONTHLY_BILLED_DATE_NULL.createAward();
ContractsAndGrantsBillingAgency agency = ARAgencyFixture.CG_AGENCY1.createAgency();
ContractsAndGrantsBillingAwardAccount awardAccount_1 = ARAwardAccountFixture.AWD_ACCT_1.createAwardAccount();
List<ContractsAndGrantsBillingAwardAccount> awardAccounts = new ArrayList<ContractsAndGrantsBillingAwardAccount>();
awardAccounts.add(awardAccount_1);
award.getActiveAwardAccounts().clear();
award.getActiveAwardAccounts().add(awardAccount_1);
award = ARAwardFixture.CG_AWARD_MONTHLY_BILLED_DATE_NULL.setAgencyFromFixture((Award) award);
contractsGrantsInvoiceDocument_1.getInvoiceGeneralDetail().setAward(award);
InvoiceAccountDetail invoiceAccountDetail_1 = InvoiceAccountDetailFixture.INV_ACCT_DTL3.createInvoiceAccountDetail();
List<InvoiceAccountDetail> accountDetails = new ArrayList<InvoiceAccountDetail>();
accountDetails.add(invoiceAccountDetail_1);
contractsGrantsInvoiceDocument_1.setAccountDetails(accountDetails);
ContractsGrantsInvoiceDocument contractsGrantsInvoiceDocument_2;
List<ErrorMessage> errorMessages = new ArrayList<ErrorMessage>();
contractsGrantsInvoiceDocument_2 = contractsGrantsInvoiceCreateDocumentService.createCGInvoiceDocumentByAwardInfo(award, awardAccounts, coaCode, orgCode, errorMessages, null, null);
assertEquals(contractsGrantsInvoiceDocument_1.getInvoiceGeneralDetail().getProposalNumber(), contractsGrantsInvoiceDocument_2.getInvoiceGeneralDetail().getProposalNumber());
assertEquals(contractsGrantsInvoiceDocument_1.getAccountDetails().get(0).getAccountNumber(), contractsGrantsInvoiceDocument_2.getAccountDetails().get(0).getAccountNumber());
assertEquals(contractsGrantsInvoiceDocument_1.getAccountDetails().get(0).getChartOfAccountsCode(), contractsGrantsInvoiceDocument_2.getAccountDetails().get(0).getChartOfAccountsCode());
assertEquals(contractsGrantsInvoiceDocument_1.getAccountsReceivableDocumentHeader().getProcessingChartOfAccountCode(), contractsGrantsInvoiceDocument_2.getAccountsReceivableDocumentHeader().getProcessingChartOfAccountCode());
assertEquals(contractsGrantsInvoiceDocument_1.getAccountsReceivableDocumentHeader().getProcessingOrganizationCode(), contractsGrantsInvoiceDocument_2.getAccountsReceivableDocumentHeader().getProcessingOrganizationCode());
assertEquals(contractsGrantsInvoiceDocument_1.getBillByChartOfAccountCode(), contractsGrantsInvoiceDocument_2.getBillByChartOfAccountCode());
assertEquals(contractsGrantsInvoiceDocument_1.getBilledByOrganizationCode(), contractsGrantsInvoiceDocument_2.getBilledByOrganizationCode());
}
@ConfigureContext(session = wklykins)
public void testManualCreateCGInvoiceDocumentsByAwardsOneValid() {
List<ContractsAndGrantsBillingAward> awards = setupBillableAwards();
List<ErrorMessage> errorMessages = contractsGrantsInvoiceCreateDocumentService.createCGInvoiceDocumentsByAwards(awards, ArConstants.ContractsAndGrantsInvoiceDocumentCreationProcessType.MANUAL);
assertTrue("errorMessages should be empty.", errorMessages.size() == 0);
Collection<ContractsGrantsInvoiceDocumentErrorLog> persistedErrors = businessObjectService.findAll(ContractsGrantsInvoiceDocumentErrorLog.class);
assertTrue("no errors should be persisted", persistedErrors.size() == 0);
}
public void testManualCreateCGInvoiceDocumentsByAwardsEmptyAwardsList() {
List<ContractsAndGrantsBillingAward> awards = new ArrayList<ContractsAndGrantsBillingAward>();
List<ContractsGrantsInvoiceDocumentErrorLog> contractsGrantsInvoiceDocumentErrorLogs = new ArrayList<ContractsGrantsInvoiceDocumentErrorLog>();
contractsGrantsInvoiceCreateDocumentService.validateAwards(awards, contractsGrantsInvoiceDocumentErrorLogs, null, ArConstants.ContractsAndGrantsInvoiceDocumentCreationProcessType.MANUAL.getCode());
assertTrue(contractsGrantsInvoiceDocumentErrorLogs.size() == 0);
List<ErrorMessage> errorMessages = contractsGrantsInvoiceCreateDocumentService.createCGInvoiceDocumentsByAwards(awards, ArConstants.ContractsAndGrantsInvoiceDocumentCreationProcessType.MANUAL);
String errorMessage = configurationService.getPropertyValueAsString(ArKeyConstants.ContractsGrantsInvoiceCreateDocumentConstants.NO_AWARD);
assertTrue("errorMessages should not be empty.", errorMessages.size() == 1);
assertTrue("errorMessages should contain the error we're expecting.", messagesContainsExpectedError(errorMessages, errorMessage));
Collection<ContractsGrantsInvoiceDocumentErrorLog> persistedErrors = businessObjectService.findAll(ContractsGrantsInvoiceDocumentErrorLog.class);
assertTrue("one error should be persisted", persistedErrors.size() == 1);
for (ContractsGrantsInvoiceDocumentErrorLog persistedError: persistedErrors) {
assertTrue("process type should be manual", persistedError.getCreationProcessTypeCode().equals(ArConstants.ContractsAndGrantsInvoiceDocumentCreationProcessType.MANUAL.getCode()));
assertTrue("error message text should match", persistedError.getErrorMessages().get(0).getErrorMessageText().equals(errorMessage));
}
}
public void testManualCreateCGInvoiceDocumentsByAwardsNullAwardsList() {
List<ContractsAndGrantsBillingAward> awards = null;
List<ErrorMessage> errorMessages = contractsGrantsInvoiceCreateDocumentService.createCGInvoiceDocumentsByAwards(awards, ArConstants.ContractsAndGrantsInvoiceDocumentCreationProcessType.MANUAL);
String errorMessage = configurationService.getPropertyValueAsString(ArKeyConstants.ContractsGrantsInvoiceCreateDocumentConstants.NO_AWARD);
assertTrue("errorMessages should not be empty.", errorMessages.size() == 1);
assertTrue("errorMessages should contain the error we're expecting.", messagesContainsExpectedError(errorMessages, errorMessage));
Collection<ContractsGrantsInvoiceDocumentErrorLog> persistedErrors = businessObjectService.findAll(ContractsGrantsInvoiceDocumentErrorLog.class);
assertTrue("one error should be persisted", persistedErrors.size() == 1);
for (ContractsGrantsInvoiceDocumentErrorLog persistedError: persistedErrors) {
assertTrue("process type should be manual", persistedError.getCreationProcessTypeCode().equals(ArConstants.ContractsAndGrantsInvoiceDocumentCreationProcessType.MANUAL.getCode()));
assertTrue("error message text should match", persistedError.getErrorMessages().get(0).getErrorMessageText().equals(errorMessage));
}
}
public void testManualCreateCGInvoiceDocumentsByAwardsNoOrg() {
List<ContractsAndGrantsBillingAward> awards = setupAwards();
Award award = (Award)awards.get(0);
award.setAwardOrganizations(new ArrayList<AwardOrganization>());
List<ErrorMessage> errorMessages = contractsGrantsInvoiceCreateDocumentService.createCGInvoiceDocumentsByAwards(awards, ArConstants.ContractsAndGrantsInvoiceDocumentCreationProcessType.MANUAL);
String errorMessage = configurationService.getPropertyValueAsString(ArKeyConstants.ContractsGrantsInvoiceCreateDocumentConstants.NO_ORGANIZATION_ON_AWARD);
errorMessage = MessageFormat.format(errorMessage, award.getProposalNumber().toString());
assertTrue("errorMessages should not be empty.", errorMessages.size() == 1);
assertTrue("errorMessages should contain the error we're expecting.", messagesContainsExpectedError(errorMessages, errorMessage));
Collection<ContractsGrantsInvoiceDocumentErrorLog> persistedErrors = businessObjectService.findAll(ContractsGrantsInvoiceDocumentErrorLog.class);
assertTrue("one error should be persisted", persistedErrors.size() == 1);
for (ContractsGrantsInvoiceDocumentErrorLog persistedError: persistedErrors) {
assertTrue("process type should be manual", persistedError.getCreationProcessTypeCode().equals(ArConstants.ContractsAndGrantsInvoiceDocumentCreationProcessType.MANUAL.getCode()));
assertTrue("error message text should match", persistedError.getErrorMessages().get(0).getErrorMessageText().equals(errorMessage));
}
}
@ConfigureContext(session = wklykins)
public void testManualCreateCGInvoiceDocumentsByAccountNonBillable() throws WorkflowException {
List<ContractsAndGrantsBillingAward> awards = setupAwards();
Award award = ((Award)awards.get(0));
award.setBillingFrequencyCode(ArConstants.PREDETERMINED_BILLING_SCHEDULE_CODE);
List<ErrorMessage> errorMessages = new ArrayList<ErrorMessage>();
ContractsGrantsInvoiceDocument cgInvoice = SpringContext.getBean(ContractsGrantsInvoiceCreateDocumentService.class).createCGInvoiceDocumentByAwardInfo(award, award.getActiveAwardAccounts(), "BL", "PSY", errorMessages, null, null);
documentService.saveDocument(cgInvoice);
setupBills(cgInvoice);
documentService.saveDocument(cgInvoice);
List<ContractsAndGrantsBillingAward> awards2 = setupAwards();
Award award2 = (Award)awards2.get(0);
award2.setInvoicingOptionCode(ArConstants.INV_ACCOUNT);
errorMessages = contractsGrantsInvoiceCreateDocumentService.createCGInvoiceDocumentsByAwards(awards2, ArConstants.ContractsAndGrantsInvoiceDocumentCreationProcessType.MANUAL);
String errorMessage = configurationService.getPropertyValueAsString(ArKeyConstants.ContractsGrantsInvoiceCreateDocumentConstants.NON_BILLABLE);
errorMessage = MessageFormat.format(errorMessage, award2.getActiveAwardAccounts().get(0).getAccountNumber(), award.getProposalNumber().toString());
assertTrue("errorMessages should not be empty.", errorMessages.size() == 1);
assertTrue("errorMessages should contain the error we're expecting.", messagesContainsExpectedError(errorMessages, errorMessage));
Collection<ContractsGrantsInvoiceDocumentErrorLog> persistedErrors = businessObjectService.findAll(ContractsGrantsInvoiceDocumentErrorLog.class);
assertTrue("one error should be persisted", persistedErrors.size() == 1);
for (ContractsGrantsInvoiceDocumentErrorLog persistedError: persistedErrors) {
assertTrue("process type should be manual", persistedError.getCreationProcessTypeCode().equals(ArConstants.ContractsAndGrantsInvoiceDocumentCreationProcessType.MANUAL.getCode()));
assertTrue("error message text should match", persistedError.getErrorMessages().get(0).getErrorMessageText().equals(errorMessage));
}
}
@ConfigureContext(session = wklykins)
public void testManualCreateCGInvoiceDocumentsByAccountOneBillableOneNonBillable() {
List<ContractsAndGrantsBillingAward> awards = setupBillableAwards();
List<ErrorMessage> errorMessages = new ArrayList<ErrorMessage>();
Award award = ((Award)awards.get(0));
award.setInvoicingOptionCode(ArConstants.INV_ACCOUNT);
AwardAccount awardAccount_2 = ARAwardAccountFixture.AWD_ACCT_WITH_CCA_2.createAwardAccount();
awardAccount_2.setCurrentLastBilledDate(new Date(System.currentTimeMillis()));
awardAccount_2.refreshReferenceObject("account");
award.getAwardAccounts().add(awardAccount_2);
errorMessages = contractsGrantsInvoiceCreateDocumentService.createCGInvoiceDocumentsByAwards(awards, ArConstants.ContractsAndGrantsInvoiceDocumentCreationProcessType.MANUAL);
String errorMessage = configurationService.getPropertyValueAsString(ArKeyConstants.ContractsGrantsInvoiceCreateDocumentConstants.NON_BILLABLE);
errorMessage = MessageFormat.format(errorMessage, awardAccount_2.getAccountNumber(), award.getProposalNumber().toString());
assertTrue("errorMessages should not be empty.", errorMessages.size() == 1);
assertTrue("errorMessages should contain the error we're expecting.", messagesContainsExpectedError(errorMessages, errorMessage));
Collection<ContractsGrantsInvoiceDocumentErrorLog> persistedErrors = businessObjectService.findAll(ContractsGrantsInvoiceDocumentErrorLog.class);
assertTrue("one error should be persisted", persistedErrors.size() == 1);
for (ContractsGrantsInvoiceDocumentErrorLog persistedError: persistedErrors) {
assertTrue("process type should be manual", persistedError.getCreationProcessTypeCode().equals(ArConstants.ContractsAndGrantsInvoiceDocumentCreationProcessType.MANUAL.getCode()));
assertTrue("error message text should match", persistedError.getErrorMessages().get(0).getErrorMessageText().equals(errorMessage));
}
}
@ConfigureContext(session = wklykins)
public void testManualCreateCGInvoiceDocumentsByCCAContractAccountNotBillable() throws WorkflowException {
List<ContractsAndGrantsBillingAward> awards = setupAwards();
Award award = ((Award)awards.get(0));
award.setBillingFrequencyCode(ArConstants.PREDETERMINED_BILLING_SCHEDULE_CODE);
List<ErrorMessage> errorMessages = new ArrayList<ErrorMessage>();
ContractsGrantsInvoiceDocument cgInvoice = SpringContext.getBean(ContractsGrantsInvoiceCreateDocumentService.class).createCGInvoiceDocumentByAwardInfo(award, award.getActiveAwardAccounts(), "BL", "PSY", errorMessages, null, null);
documentService.saveDocument(cgInvoice);
setupBills(cgInvoice);
documentService.saveDocument(cgInvoice);
List<ContractsAndGrantsBillingAward> awards2 = setupAwards();
Award award2 = (Award)awards2.get(0);
award2.setInvoicingOptionCode(ArConstants.INV_CONTRACT_CONTROL_ACCOUNT);
errorMessages = contractsGrantsInvoiceCreateDocumentService.createCGInvoiceDocumentsByAwards(awards2, ArConstants.ContractsAndGrantsInvoiceDocumentCreationProcessType.MANUAL);
String errorMessage = configurationService.getPropertyValueAsString(ArKeyConstants.ContractsGrantsInvoiceCreateDocumentConstants.CONTROL_ACCOUNT_NON_BILLABLE);
errorMessage = MessageFormat.format(errorMessage, award2.getActiveAwardAccounts().get(0).getAccount().getContractControlAccount().getAccountNumber(), award.getProposalNumber().toString());
assertTrue("errorMessages should not be empty.", errorMessages.size() == 1);
assertTrue("errorMessages should contain the error we're expecting.", messagesContainsExpectedError(errorMessages, errorMessage));
Collection<ContractsGrantsInvoiceDocumentErrorLog> persistedErrors = businessObjectService.findAll(ContractsGrantsInvoiceDocumentErrorLog.class);
assertTrue("one error should be persisted", persistedErrors.size() == 1);
for (ContractsGrantsInvoiceDocumentErrorLog persistedError: persistedErrors) {
assertTrue("process type should be manual", persistedError.getCreationProcessTypeCode().equals(ArConstants.ContractsAndGrantsInvoiceDocumentCreationProcessType.MANUAL.getCode()));
assertTrue("error message text should match", persistedError.getErrorMessages().get(0).getErrorMessageText().equals(errorMessage));
}
}
@ConfigureContext(session = wklykins)
public void testManualCreateCGInvoiceDocumentsByAwardNotAllBillableAccounts() throws WorkflowException {
List<ContractsAndGrantsBillingAward> awards = setupAwards();
Award award = ((Award)awards.get(0));
award.setBillingFrequencyCode(ArConstants.PREDETERMINED_BILLING_SCHEDULE_CODE);
List<ErrorMessage> errorMessages = new ArrayList<ErrorMessage>();
ContractsGrantsInvoiceDocument cgInvoice = SpringContext.getBean(ContractsGrantsInvoiceCreateDocumentService.class).createCGInvoiceDocumentByAwardInfo(award, award.getActiveAwardAccounts(), "BL", "PSY", errorMessages, null, null);
documentService.saveDocument(cgInvoice);
setupBills(cgInvoice);
documentService.saveDocument(cgInvoice);
List<ContractsAndGrantsBillingAward> awards2 = setupAwards();
Award award2 = (Award)awards2.get(0);
award2.setInvoicingOptionCode(ArConstants.INV_AWARD);
errorMessages = contractsGrantsInvoiceCreateDocumentService.createCGInvoiceDocumentsByAwards(awards2, ArConstants.ContractsAndGrantsInvoiceDocumentCreationProcessType.MANUAL);
String errorMessage = configurationService.getPropertyValueAsString(ArKeyConstants.ContractsGrantsInvoiceCreateDocumentConstants.NOT_ALL_BILLABLE_ACCOUNTS);
errorMessage = MessageFormat.format(errorMessage, award2.getProposalNumber().toString());
assertTrue("errorMessages should not be empty.", errorMessages.size() == 1);
assertTrue("errorMessages should contain the error we're expecting.", messagesContainsExpectedError(errorMessages, errorMessage));
Collection<ContractsGrantsInvoiceDocumentErrorLog> persistedErrors = businessObjectService.findAll(ContractsGrantsInvoiceDocumentErrorLog.class);
assertTrue("one error should be persisted", persistedErrors.size() == 1);
for (ContractsGrantsInvoiceDocumentErrorLog persistedError: persistedErrors) {
assertTrue("process type should be manual", persistedError.getCreationProcessTypeCode().equals(ArConstants.ContractsAndGrantsInvoiceDocumentCreationProcessType.MANUAL.getCode()));
assertTrue("error message text should match", persistedError.getErrorMessages().get(0).getErrorMessageText().equals(errorMessage));
}
}
private boolean messagesContainsExpectedError(List<ErrorMessage> errorMessages, String expectedErrorMessage) {
ErrorMessage errorMessage = errorMessages.get(0);
String errorMessageString = MessageFormat.format(configurationService.getPropertyValueAsString(errorMessage.getErrorKey()), (Object[])errorMessage.getMessageParameters());
return StringUtils.equals(errorMessageString, expectedErrorMessage);
}
private boolean errorLogContainsAward(Collection<ContractsGrantsInvoiceDocumentErrorLog> contractsGrantsInvoiceDocumentErrorLogs, ContractsAndGrantsBillingAward award) {
for (ContractsGrantsInvoiceDocumentErrorLog contractsGrantsInvoiceDocumentErrorLog: contractsGrantsInvoiceDocumentErrorLogs) {
if (contractsGrantsInvoiceDocumentErrorLog.getProposalNumber().equals(award.getProposalNumber())) {
return true;
}
}
return false;
}
}