/* * 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.purap.util; import static org.kuali.kfs.sys.fixture.UserNameFixture.parke; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import org.kuali.kfs.module.purap.businessobject.PurchaseOrderItem; import org.kuali.kfs.module.purap.document.PurchaseOrderDocument; import org.kuali.kfs.module.purap.fixture.PurchaseOrderDocumentFixture; import org.kuali.kfs.sys.ConfigureContext; import org.kuali.kfs.sys.context.KualiTestBase; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.kfs.sys.dataaccess.UnitTestSqlDao; import org.kuali.kfs.sys.document.AccountingDocumentTestUtils; import org.kuali.kfs.sys.document.workflow.WorkflowTestUtils; import org.kuali.rice.core.api.util.type.KualiDecimal; import org.kuali.rice.kew.api.document.DocumentStatus; import org.kuali.rice.krad.service.DocumentService; @ConfigureContext(session = parke, shouldCommitTransactions=false) public class ThresholdTest extends KualiTestBase { private static Logger LOG = Logger.getLogger(ThresholdTest.class); private UnitTestSqlDao unitTestSqlDao; public ThresholdTest() { super(); } @Override protected void setUp() throws Exception { super.setUp(); unitTestSqlDao = SpringContext.getBean(UnitTestSqlDao.class); } private void insertThresholdRecord(Map<ThresholdField,Object> field2Values, KualiDecimal thresholdAmount){ unitTestSqlDao.sqlCommand("delete from PUR_THRSHLD_T"); String objId = java.util.UUID.randomUUID().toString(); StringBuffer sqlPart1 = new StringBuffer(); StringBuffer sqlPart2 = new StringBuffer(); sqlPart1.append("insert into PUR_THRSHLD_T(PUR_THRSHLD_ID,OBJ_ID,VER_NBR,DOBJ_MAINT_CD_ACTV_IND,PUR_THRSHLD_AMT"); sqlPart2.append(" values(1,'" + objId + "',1,'Y'," + thresholdAmount.floatValue()); for (ThresholdField field : (List<ThresholdField>)ThresholdField.getEnumList()) { if (field2Values.get(field) != null){ sqlPart1.append("," + getDBColumnName(field)); if (field2Values.get(field) instanceof Number){ sqlPart2.append("," + ((Number)field2Values.get(field)).floatValue()); }else{ sqlPart2.append(",'" + field2Values.get(field) + "'"); } } } sqlPart1.append(")"); sqlPart2.append(")"); sqlPart1.append(sqlPart2); unitTestSqlDao.sqlCommand(sqlPart1.toString()); } public final void testReceivingRequiredFlagWithChart() throws Exception { PurchaseOrderDocument poDocument = buildSimplePODocument(); HashMap map = new HashMap(); map.put(ThresholdField.CHART_OF_ACCOUNTS_CODE,poDocument.getItem(0).getSourceAccountingLines().get(0).getAccount().getChartOfAccountsCode()); checkReceivingFlagInPO(poDocument,map,true,ThresholdHelper.CHART); } public final void testReceivingRequiredFlagWithChartNegTest() throws Exception { PurchaseOrderDocument poDocument = buildSimplePODocument(); HashMap map = new HashMap(); map.put(ThresholdField.CHART_OF_ACCOUNTS_CODE,poDocument.getItem(0).getSourceAccountingLines().get(0).getAccount().getChartOfAccountsCode()); checkReceivingFlagInPO(poDocument,map,false,ThresholdHelper.CHART); } public final void testReceivingRequiredFlagWithFund() throws Exception { PurchaseOrderDocument poDocument = buildSimplePODocument(); String accTypeCode = poDocument.getItem(0).getSourceAccountingLines().get(0).getAccount().getAccountTypeCode(); HashMap map = new HashMap(); map.put(ThresholdField.CHART_OF_ACCOUNTS_CODE,poDocument.getItem(0).getSourceAccountingLines().get(0).getAccount().getChartOfAccountsCode()); map.put(ThresholdField.ACCOUNT_TYPE_CODE,accTypeCode); checkReceivingFlagInPO(poDocument,map,true,ThresholdHelper.CHART_AND_ACCOUNTTYPE); } public final void testReceivingRequiredFlagWithFundNegativeTest() throws Exception { PurchaseOrderDocument poDocument = buildSimplePODocument(); String accTypeCode = poDocument.getItem(0).getSourceAccountingLines().get(0).getAccount().getAccountTypeCode(); HashMap map = new HashMap(); map.put(ThresholdField.CHART_OF_ACCOUNTS_CODE,poDocument.getItem(0).getSourceAccountingLines().get(0).getAccount().getChartOfAccountsCode()); map.put(ThresholdField.ACCOUNT_TYPE_CODE,accTypeCode); checkReceivingFlagInPO(poDocument,map,false,ThresholdHelper.CHART_AND_ACCOUNTTYPE); } public final void testReceivingRequiredFlagWithSubFund() throws Exception { PurchaseOrderDocument poDocument = buildSimplePODocument(); String subFundGroupCode = poDocument.getItem(0).getSourceAccountingLines().get(0).getAccount().getSubFundGroupCode(); HashMap map = new HashMap(); map.put(ThresholdField.CHART_OF_ACCOUNTS_CODE,poDocument.getItem(0).getSourceAccountingLines().get(0).getAccount().getChartOfAccountsCode()); map.put(ThresholdField.SUBFUND_GROUP_CODE,subFundGroupCode); checkReceivingFlagInPO(poDocument,map,true,ThresholdHelper.CHART_AND_SUBFUND); } public final void testReceivingRequiredFlagWithSubFundNegativeTest() throws Exception { PurchaseOrderDocument poDocument = buildSimplePODocument(); String subFundGroupCode = poDocument.getItem(0).getSourceAccountingLines().get(0).getAccount().getSubFundGroupCode(); HashMap map = new HashMap(); map.put(ThresholdField.CHART_OF_ACCOUNTS_CODE,poDocument.getItem(0).getSourceAccountingLines().get(0).getAccount().getChartOfAccountsCode()); map.put(ThresholdField.SUBFUND_GROUP_CODE,subFundGroupCode); checkReceivingFlagInPO(poDocument,map,false,ThresholdHelper.CHART_AND_SUBFUND); } public final void testReceivingRequiredFlagWithObjectCode() throws Exception { PurchaseOrderDocument poDocument = buildSimplePODocument(); String objectCode = poDocument.getItem(0).getSourceAccountingLines().get(0).getFinancialObjectCode(); HashMap map = new HashMap(); map.put(ThresholdField.CHART_OF_ACCOUNTS_CODE,poDocument.getItem(0).getSourceAccountingLines().get(0).getAccount().getChartOfAccountsCode()); map.put(ThresholdField.FINANCIAL_OBJECT_CODE,objectCode); checkReceivingFlagInPO(poDocument,map,true,ThresholdHelper.CHART_AND_OBJECTCODE); } public final void testReceivingRequiredFlagWithObjectCodeNegativeTest() throws Exception { PurchaseOrderDocument poDocument = buildSimplePODocument(); String objectCode = poDocument.getItem(0).getSourceAccountingLines().get(0).getFinancialObjectCode(); HashMap map = new HashMap(); map.put(ThresholdField.CHART_OF_ACCOUNTS_CODE,poDocument.getItem(0).getSourceAccountingLines().get(0).getAccount().getChartOfAccountsCode()); map.put(ThresholdField.FINANCIAL_OBJECT_CODE,objectCode); checkReceivingFlagInPO(poDocument,map,false,ThresholdHelper.CHART_AND_OBJECTCODE); } public final void testReceivingRequiredFlagWithOrgCode() throws Exception { PurchaseOrderDocument poDocument = buildSimplePODocument(); String orgCode = poDocument.getItem(0).getSourceAccountingLines().get(0).getAccount().getOrganizationCode(); HashMap map = new HashMap(); map.put(ThresholdField.CHART_OF_ACCOUNTS_CODE,poDocument.getItem(0).getSourceAccountingLines().get(0).getAccount().getChartOfAccountsCode()); map.put(ThresholdField.ORGANIZATION_CODE,orgCode); checkReceivingFlagInPO(poDocument,map,true,ThresholdHelper.CHART_AND_ORGANIZATIONCODE); } public final void testReceivingRequiredFlagWithOrgCodeNegativeTest() throws Exception { PurchaseOrderDocument poDocument = buildSimplePODocument(); String orgCode = poDocument.getItem(0).getSourceAccountingLines().get(0).getAccount().getOrganizationCode(); HashMap map = new HashMap(); map.put(ThresholdField.CHART_OF_ACCOUNTS_CODE,poDocument.getItem(0).getSourceAccountingLines().get(0).getAccount().getChartOfAccountsCode()); map.put(ThresholdField.ORGANIZATION_CODE,orgCode); checkReceivingFlagInPO(poDocument,map,false,ThresholdHelper.CHART_AND_ORGANIZATIONCODE); } public final void testReceivingRequiredFlagWithVendor() throws Exception { PurchaseOrderDocument poDocument = buildSimplePODocument(); Integer vendorGeneratedId = poDocument.getVendorHeaderGeneratedIdentifier(); Integer vendorAssignedId = poDocument.getVendorDetailAssignedIdentifier(); HashMap map = new HashMap(); map.put(ThresholdField.CHART_OF_ACCOUNTS_CODE,poDocument.getItem(0).getSourceAccountingLines().get(0).getAccount().getChartOfAccountsCode()); map.put(ThresholdField.VENDOR_HEADER_GENERATED_ID,vendorGeneratedId); map.put(ThresholdField.VENDOR_DETAIL_ASSIGNED_ID,vendorAssignedId); checkReceivingFlagInPO(poDocument,map,true,ThresholdHelper.CHART_AND_VENDOR); } public final void testReceivingRequiredFlagWithVendorNegativeTest() throws Exception { PurchaseOrderDocument poDocument = buildSimplePODocument(); Integer vendorGeneratedId = poDocument.getVendorHeaderGeneratedIdentifier(); Integer vendorAssignedId = poDocument.getVendorDetailAssignedIdentifier(); HashMap map = new HashMap(); map.put(ThresholdField.CHART_OF_ACCOUNTS_CODE,poDocument.getItem(0).getSourceAccountingLines().get(0).getAccount().getChartOfAccountsCode()); map.put(ThresholdField.VENDOR_HEADER_GENERATED_ID,vendorGeneratedId); map.put(ThresholdField.VENDOR_DETAIL_ASSIGNED_ID,vendorAssignedId); checkReceivingFlagInPO(poDocument,map,false,ThresholdHelper.CHART_AND_VENDOR); } public final void testReceivingRequiredFlagWithCommodityCode() throws Exception { PurchaseOrderDocument poDocument = buildSimplePODocument(); String commodityCode = ((PurchaseOrderItem)poDocument.getItem(0)).getPurchasingCommodityCode(); HashMap map = new HashMap(); map.put(ThresholdField.CHART_OF_ACCOUNTS_CODE,poDocument.getItem(0).getSourceAccountingLines().get(0).getAccount().getChartOfAccountsCode()); map.put(ThresholdField.COMMODITY_CODE,commodityCode); checkReceivingFlagInPO(poDocument,map,true,ThresholdHelper.CHART_AND_COMMODITYCODE); } public final void testReceivingRequiredFlagWithCommodityCodeNegativeTest() throws Exception { PurchaseOrderDocument poDocument = buildSimplePODocument(); String commodityCode = ((PurchaseOrderItem)poDocument.getItem(0)).getPurchasingCommodityCode(); HashMap map = new HashMap(); map.put(ThresholdField.CHART_OF_ACCOUNTS_CODE,poDocument.getItem(0).getSourceAccountingLines().get(0).getAccount().getChartOfAccountsCode()); map.put(ThresholdField.COMMODITY_CODE,commodityCode); checkReceivingFlagInPO(poDocument,map,false,ThresholdHelper.CHART_AND_COMMODITYCODE); } private void checkReceivingFlagInPO(PurchaseOrderDocument poDocument, Map thresholdCriteriaFieldValues, boolean isPositiveTest, ThresholdCriteria thresholdCriteria) throws Exception { // if (isPositiveTest){ // insertThresholdRecord(thresholdCriteriaFieldValues,poDocument.getItem(0).getExtendedPrice().subtract(new KualiDecimal(1))); // }else{ // insertThresholdRecord(thresholdCriteriaFieldValues,poDocument.getItem(0).getExtendedPrice().add(new KualiDecimal(1))); // } // // PurchaseOrderDocument result = routePO(poDocument); // assertEquals("Receiving Flag test[" + thresholdCriteriaFieldValues + ",isPositiveTest=" + isPositiveTest + "]", // isPositiveTest, // result.isReceivingDocumentRequiredIndicator()); // /** // * This check is needed here irrespective of checking the receiving required flag in PO. // * We should make sure that the flag has been set for the correct threshold criteria. // * For eg, consider the CHART_AND_COMMODITYCODE criteria, here it could be possible for the flag // * to set if the chart criteria is satisfied instead of chart and commoditycode one. // */ // ThresholdHelper thresholdHelper = new ThresholdHelper(poDocument); // assertEquals(isPositiveTest, // thresholdHelper.isReceivingDocumentRequired(thresholdCriteria)); } private PurchaseOrderDocument routePO(PurchaseOrderDocument poDocument) throws Exception { String docId = poDocument.getDocumentNumber(); DocumentService documentService = SpringContext.getBean(DocumentService.class); poDocument.prepareForSave(); assertFalse(DocumentStatus.ENROUTE.equals(poDocument.getDocumentHeader().getWorkflowDocument().getStatus())); AccountingDocumentTestUtils.routeDocument(poDocument, "saving copy source document", null, documentService); WorkflowTestUtils.waitForDocumentApproval(poDocument.getDocumentNumber()); PurchaseOrderDocument result = (PurchaseOrderDocument) documentService.getByDocumentHeaderId(docId); return result; } public PurchaseOrderDocument buildSimplePODocument() { PurchaseOrderDocument poDocument = PurchaseOrderDocumentFixture.PO_FOR_THRESHOLD_CHECK.createPurchaseOrderDocument(); assertEquals("PO should have only one item for Threshold test",1,poDocument.getItems().size()); assertEquals("PO Item should have only one account for Threshold test",1,poDocument.getItem(0).getSourceAccountingLines().size()); return poDocument; } private String getDBColumnName(ThresholdField field){ if (field == ThresholdField.CHART_OF_ACCOUNTS_CODE){ return "FIN_COA_CD"; }else if (field == ThresholdField.ACCOUNT_TYPE_CODE){ return "ACCT_TYP_CD"; }else if (field == ThresholdField.SUBFUND_GROUP_CODE){ return "SUB_FUND_GRP_CD"; }else if (field == ThresholdField.FINANCIAL_OBJECT_CODE){ return "FIN_OBJECT_CD"; }else if (field == ThresholdField.ORGANIZATION_CODE){ return "ORG_CD"; }else if (field == ThresholdField.VENDOR_DETAIL_ASSIGNED_ID){ return "VNDR_DTL_ASND_ID"; }else if (field == ThresholdField.VENDOR_HEADER_GENERATED_ID){ return "VNDR_HDR_GNRTD_ID"; }else if (field == ThresholdField.COMMODITY_CODE){ return "PUR_COMM_CD"; } return null; } }