use of org.kuali.kfs.module.purap.document.PaymentRequestDocument in project cu-kfs by CU-CommunityApps.
the class CuPurapAccountingServiceImplTest method testUpdateAccountAmounts_AccountingLinePercentChanged.
public void testUpdateAccountAmounts_AccountingLinePercentChanged() throws Exception {
changeCurrentUser(UserNameFixture.ccs1);
// Save the requisition with items, but without accounting lines and then add the accounting lines and save again
// This odd methodology is to workaround an NPE that occurs when access security is enabled and refreshNonUpdatableReferences
// is called on the account. For some reason the RequisitionItem cannot be found in ojb's cache and so when
// it is attempted to be instantiated and constructor methods called, an NPE is thrown. This little dance works around the exception.
// More analysis could probably be done to determine the root cause and address it, but for now this is good enough.
RequisitionDocument requisitionDocument = RequisitionFixture.REQ_NON_B2B_WITH_ITEMS.createRequisition(documentService);
requisitionDocument.getFinancialSystemDocumentHeader().setFinancialDocumentTotalAmount(new KualiDecimal(200));
RequisitionItem item = RequisitionItemFixture.REQ_ITEM3.createRequisitionItem(false);
requisitionDocument.addItem(item);
AccountingDocumentTestUtils.saveDocument(requisitionDocument, documentService);
requisitionDocument.refreshNonUpdateableReferences();
item.getSourceAccountingLines().add(PurapAccountingLineFixture.REQ_ITEM_ACCT_LINE3.createRequisitionAccount(item.getItemIdentifier()));
item.getSourceAccountingLines().add(PurapAccountingLineFixture.REQ_ITEM_ACCT_LINE3.createRequisitionAccount(item.getItemIdentifier()));
item.refreshNonUpdateableReferences();
AccountingDocumentTestUtils.saveDocument(requisitionDocument, documentService);
PurchaseOrderDocument purchaseOrderDocument = (PurchaseOrderDocument) documentService.getNewDocument(PurchaseOrderDocument.class);
purchaseOrderDocument.populatePurchaseOrderFromRequisition(requisitionDocument);
purchaseOrderDocument.setContractManagerCode(10);
purchaseOrderDocument.setPurchaseOrderCurrentIndicator(true);
purchaseOrderDocument.getDocumentHeader().setDocumentDescription("Description");
purchaseOrderDocument.setApplicationDocumentStatus(PurchaseOrderStatuses.APPDOC_OPEN);
purchaseOrderDocument.refreshNonUpdateableReferences();
purchaseOrderDocument.setVendorShippingPaymentTermsCode("AL");
purchaseOrderDocument.setVendorPaymentTermsCode("00N30");
purchaseOrderDocument.refreshNonUpdateableReferences();
AccountingDocumentTestUtils.saveDocument(purchaseOrderDocument, documentService);
changeCurrentUser(UserNameFixture.mo14);
PaymentRequestDocument paymentRequestDocument = PaymentRequestFixture.PAYMENT_REQ_DOC.createPaymentRequestDocument(purchaseOrderDocument.getPurapDocumentIdentifier());
paymentRequestDocument.initiateDocument();
paymentRequestDocument.populatePaymentRequestFromPurchaseOrder(purchaseOrderDocument);
paymentRequestDocument.setApplicationDocumentStatus(PurapConstants.PaymentRequestStatuses.APPDOC_AWAITING_FISCAL_REVIEW);
paymentRequestDocument.getItem(0).setExtendedPrice(new KualiDecimal(1));
paymentRequestDocument.getItem(1).setExtendedPrice(new KualiDecimal(4));
((PaymentRequestAccount) (((PaymentRequestItem) paymentRequestDocument.getItems().get(1)).getSourceAccountingLine(0))).setAmount(new KualiDecimal(3));
((PaymentRequestAccount) (((PaymentRequestItem) paymentRequestDocument.getItems().get(1)).getSourceAccountingLine(1))).setAmount(new KualiDecimal(1));
cuPurapAccountingServiceImpl.updateAccountAmounts(paymentRequestDocument);
assertEquals(new BigDecimal(75).setScale(2), ((PaymentRequestAccount) (((PaymentRequestItem) paymentRequestDocument.getItems().get(1)).getSourceAccountingLine(0))).getAccountLinePercent());
}
use of org.kuali.kfs.module.purap.document.PaymentRequestDocument in project cu-kfs by CU-CommunityApps.
the class CuPurapAccountingServiceImplTest method testUpdateAccountAmounts_AccountingLinePercentUnchanged.
public void testUpdateAccountAmounts_AccountingLinePercentUnchanged() throws Exception {
changeCurrentUser(UserNameFixture.ccs1);
// Save the requisition with items, but without accounting lines and then add the accounting lines and save again
// This odd methodology is to workaround an NPE that occurs when access security is enabled and refreshNonUpdatableReferences
// is called on the account. For some reason the RequisitionItem cannot be found in ojb's cache and so when
// it is attempted to be instantiated and constructor methods called, an NPE is thrown. This little dance works around the exception.
// More analysis could probably be done to determine the root cause and address it, but for now this is good enough.
RequisitionDocument requisitionDocument = RequisitionFixture.REQ_NON_B2B_WITH_ITEMS.createRequisition(documentService);
requisitionDocument.getFinancialSystemDocumentHeader().setFinancialDocumentTotalAmount(new KualiDecimal(200));
RequisitionItem item = RequisitionItemFixture.REQ_ITEM3.createRequisitionItem(false);
requisitionDocument.addItem(item);
AccountingDocumentTestUtils.saveDocument(requisitionDocument, documentService);
requisitionDocument.refreshNonUpdateableReferences();
item.getSourceAccountingLines().add(PurapAccountingLineFixture.REQ_ITEM_ACCT_LINE3.createRequisitionAccount(item.getItemIdentifier()));
item.getSourceAccountingLines().add(PurapAccountingLineFixture.REQ_ITEM_ACCT_LINE3.createRequisitionAccount(item.getItemIdentifier()));
item.refreshNonUpdateableReferences();
AccountingDocumentTestUtils.saveDocument(requisitionDocument, documentService);
PurchaseOrderDocument purchaseOrderDocument = (PurchaseOrderDocument) documentService.getNewDocument(PurchaseOrderDocument.class);
purchaseOrderDocument.populatePurchaseOrderFromRequisition(requisitionDocument);
purchaseOrderDocument.setContractManagerCode(10);
purchaseOrderDocument.setPurchaseOrderCurrentIndicator(true);
purchaseOrderDocument.getDocumentHeader().setDocumentDescription("Description");
purchaseOrderDocument.setApplicationDocumentStatus(PurchaseOrderStatuses.APPDOC_OPEN);
purchaseOrderDocument.refreshNonUpdateableReferences();
purchaseOrderDocument.setVendorShippingPaymentTermsCode("AL");
purchaseOrderDocument.setVendorPaymentTermsCode("00N30");
purchaseOrderDocument.refreshNonUpdateableReferences();
AccountingDocumentTestUtils.saveDocument(purchaseOrderDocument, documentService);
changeCurrentUser(UserNameFixture.mo14);
PaymentRequestDocument paymentRequestDocument = PaymentRequestFixture.PAYMENT_REQ_DOC.createPaymentRequestDocument(purchaseOrderDocument.getPurapDocumentIdentifier());
paymentRequestDocument.initiateDocument();
paymentRequestDocument.populatePaymentRequestFromPurchaseOrder(purchaseOrderDocument);
paymentRequestDocument.setApplicationDocumentStatus(PurapConstants.PaymentRequestStatuses.APPDOC_IN_PROCESS);
paymentRequestDocument.getItem(0).setExtendedPrice(new KualiDecimal(1));
paymentRequestDocument.getItem(1).setExtendedPrice(new KualiDecimal(4));
((PaymentRequestAccount) (((PaymentRequestItem) paymentRequestDocument.getItems().get(1)).getSourceAccountingLine(0))).setAmount(new KualiDecimal(3));
((PaymentRequestAccount) (((PaymentRequestItem) paymentRequestDocument.getItems().get(1)).getSourceAccountingLine(1))).setAmount(new KualiDecimal(1));
cuPurapAccountingServiceImpl.updateAccountAmounts(paymentRequestDocument);
assertEquals(new BigDecimal(50).setScale(2), ((PaymentRequestAccount) (((PaymentRequestItem) paymentRequestDocument.getItems().get(1)).getSourceAccountingLine(0))).getAccountLinePercent());
}
use of org.kuali.kfs.module.purap.document.PaymentRequestDocument in project cu-kfs by CU-CommunityApps.
the class SecAccountingLineGroupImpl method initialize.
/**
* Performs access security edit check and sets edit flag on container line to false if access is not allowed or removes
* container if view is not allowed
*
* @see org.kuali.kfs.sys.document.web.DefaultAccountingLineGroupImpl#initialize(org.kuali.kfs.sys.document.datadictionary.AccountingLineGroupDefinition,
* org.kuali.kfs.sys.document.AccountingDocument, java.util.List, java.lang.String, java.lang.String, java.util.Map,
* java.util.Map, java.util.Map, boolean)
*/
@Override
public void initialize(AccountingLineGroupDefinition groupDefinition, AccountingDocument accountingDocument, List<RenderableAccountingLineContainer> containers, String collectionPropertyName, String collectionItemPropertyName, Map<String, Object> displayedErrors, Map<String, Object> displayedWarnings, Map<String, Object> displayedInfo, boolean canEdit) {
AccessSecurityService accessSecurityService = SpringContext.getBean(AccessSecurityService.class);
Person currentUser = GlobalVariables.getUserSession().getPerson();
// check view and edit access
List<RenderableAccountingLineContainer> unviewableContainers = new ArrayList<RenderableAccountingLineContainer>();
for (RenderableAccountingLineContainer container : containers) {
boolean lineHasError = false;
for (Object errorKeyAsObject : GlobalVariables.getMessageMap().getErrorMessages().keySet()) {
if (((String) errorKeyAsObject).startsWith(collectionItemPropertyName)) {
// collectionItemPropertyName is like 'document.item[0].sourceAccountingLine', it does not specify which acctline
if (accountingDocument instanceof PaymentRequestDocument) {
if (((String) errorKeyAsObject).startsWith(container.getAccountingLinePropertyPath())) {
lineHasError = true;
}
} else {
lineHasError = true;
}
}
}
if (lineHasError || container.isNewLine()) {
container.setEditableLine(true);
continue;
}
boolean viewAllowed = accessSecurityService.canViewDocumentAccountingLine(accountingDocument, container.getAccountingLine(), currentUser);
if (!viewAllowed) {
unviewableContainers.add(container);
hasViewRestrictions = true;
} else {
boolean editAllowed = accessSecurityService.canEditDocumentAccountingLine(accountingDocument, container.getAccountingLine(), currentUser);
if (container.isEditableLine() && !editAllowed) {
container.setEditableLine(false);
hasEditRestrictions = true;
}
}
}
// remove containers that are not viewable
for (RenderableAccountingLineContainer container : unviewableContainers) {
containers.remove(container);
}
super.initialize(groupDefinition, accountingDocument, containers, collectionPropertyName, collectionItemPropertyName, displayedErrors, displayedWarnings, displayedInfo, canEdit);
}
use of org.kuali.kfs.module.purap.document.PaymentRequestDocument in project cu-kfs by CU-CommunityApps.
the class CuElectronicInvoiceHelperServiceImpl method createPaymentRequest.
@Override
@NonTransactional
public boolean createPaymentRequest(ElectronicInvoiceRejectDocument rejectDocument) {
if (rejectDocument.getInvoiceRejectReasons().size() > 0) {
throw new RuntimeException("Not possible to create payment request since the reject document contains " + rejectDocument.getInvoiceRejectReasons().size() + " rejects");
}
Map itemTypeMappings = getItemTypeMappings(rejectDocument.getVendorHeaderGeneratedIdentifier(), rejectDocument.getVendorDetailAssignedIdentifier());
Map kualiItemTypes = getKualiItemTypes();
CuElectronicInvoiceOrderHolder rejectDocHolder = new CuElectronicInvoiceOrderHolder(rejectDocument, itemTypeMappings, kualiItemTypes);
// KFSPTS-1719 : restore the nomatchingitems found during matching process. so, preq items can be created
rejectDocHolder.setNonMatchItems(((CuElectronicInvoiceRejectDocument) rejectDocument).getNonMatchItems());
/**
* First, create a new payment request document. Once this document is created, then update the reject document's PREQ_ID field
* with the payment request document identifier. This identifier is used to associate the reject document with the payment request.
*/
PaymentRequestDocument preqDocument = createPaymentRequest(rejectDocHolder);
if (ObjectUtils.isNotNull(preqDocument)) {
rejectDocument.setPaymentRequestIdentifier(preqDocument.getPurapDocumentIdentifier());
}
return !rejectDocHolder.isInvoiceRejected();
}
use of org.kuali.kfs.module.purap.document.PaymentRequestDocument in project cu-kfs by CU-CommunityApps.
the class CuElectronicInvoiceHelperServiceImpl method createPaymentRequest.
protected PaymentRequestDocument createPaymentRequest(ElectronicInvoiceOrderHolder orderHolder) {
LOG.info("Creating Payment Request document");
KNSGlobalVariables.getMessageList().clear();
validateInvoiceOrderValidForPREQCreation(orderHolder);
if (LOG.isInfoEnabled()) {
if (orderHolder.isInvoiceRejected()) {
LOG.info("Not possible to convert einvoice details into payment request");
} else {
LOG.info("Payment request document creation validation succeeded");
}
}
if (orderHolder.isInvoiceRejected()) {
return null;
}
PaymentRequestDocument preqDoc = null;
try {
preqDoc = (PaymentRequestDocument) SpringContext.getBean(DocumentService.class).getNewDocument("PREQ");
} catch (WorkflowException e) {
String extraDescription = "Error=" + e.getMessage();
ElectronicInvoiceRejectReason rejectReason = matchingService.createRejectReason(PurapConstants.ElectronicInvoice.PREQ_WORKLOW_EXCEPTION, extraDescription, orderHolder.getFileName());
orderHolder.addInvoiceOrderRejectReason(rejectReason);
LOG.error("Error creating Payment request document - " + e.getMessage());
return null;
}
PurchaseOrderDocument poDoc = orderHolder.getPurchaseOrderDocument();
if (poDoc == null) {
throw new RuntimeException("Purchase Order document (POId=" + poDoc.getPurapDocumentIdentifier() + ") does not exist in the system");
}
preqDoc.getDocumentHeader().setDocumentDescription(generatePREQDocumentDescription(poDoc));
try {
preqDoc.updateAndSaveAppDocStatus(PurapConstants.PaymentRequestStatuses.APPDOC_IN_PROCESS);
} catch (WorkflowException we) {
throw new RuntimeException("Unable to save route status data for document: " + preqDoc.getDocumentNumber(), we);
}
preqDoc.setInvoiceDate(orderHolder.getInvoiceDate());
preqDoc.setInvoiceNumber(orderHolder.getInvoiceNumber());
preqDoc.setVendorInvoiceAmount(new KualiDecimal(orderHolder.getInvoiceNetAmount()));
preqDoc.setAccountsPayableProcessorIdentifier("E-Invoice");
preqDoc.setVendorCustomerNumber(orderHolder.getCustomerNumber());
preqDoc.setPaymentRequestElectronicInvoiceIndicator(true);
if (orderHolder.getAccountsPayablePurchasingDocumentLinkIdentifier() != null) {
preqDoc.setAccountsPayablePurchasingDocumentLinkIdentifier(orderHolder.getAccountsPayablePurchasingDocumentLinkIdentifier());
}
// Copied from PaymentRequestServiceImpl.populatePaymentRequest()
// set bank code to default bank code in the system parameter
// KFSPTS-1891
boolean hasPaymentMethodCode = false;
if (preqDoc instanceof PaymentRequestDocument) {
String vendorPaymentMethodCode = ((VendorDetailExtension) poDoc.getVendorDetail().getExtension()).getDefaultB2BPaymentMethodCode();
if (StringUtils.isNotEmpty(vendorPaymentMethodCode)) {
((CuPaymentRequestDocument) preqDoc).setPaymentMethodCode(vendorPaymentMethodCode);
hasPaymentMethodCode = true;
} else {
((CuPaymentRequestDocument) preqDoc).setPaymentMethodCode(DEFAULT_EINVOICE_PAYMENT_METHOD_CODE);
}
}
Bank defaultBank = null;
if (hasPaymentMethodCode) {
defaultBank = SpringContext.getBean(CUPaymentMethodGeneralLedgerPendingEntryService.class).getBankForPaymentMethod(((CuPaymentRequestDocument) preqDoc).getPaymentMethodCode());
} else {
// default to baseline behavior - extended documents not in use
// Copied from PaymentRequestServiceImpl.populatePaymentRequest()
// set bank code to default bank code in the system parameter
defaultBank = SpringContext.getBean(BankService.class).getDefaultBankByDocType(PaymentRequestDocument.class);
}
if (defaultBank != null) {
preqDoc.setBankCode(defaultBank.getBankCode());
preqDoc.setBank(defaultBank);
}
RequisitionDocument reqDoc = SpringContext.getBean(RequisitionService.class).getRequisitionById(poDoc.getRequisitionIdentifier());
String reqDocInitiator = reqDoc.getDocumentHeader().getWorkflowDocument().getInitiatorPrincipalId();
try {
Person user = KimApiServiceLocator.getPersonService().getPerson(reqDocInitiator);
setProcessingCampus(preqDoc, user.getCampusCode());
} catch (Exception e) {
String extraDescription = "Error setting processing campus code - " + e.getMessage();
ElectronicInvoiceRejectReason rejectReason = matchingService.createRejectReason(PurapConstants.ElectronicInvoice.PREQ_ROUTING_VALIDATION_ERROR, extraDescription, orderHolder.getFileName());
orderHolder.addInvoiceOrderRejectReason(rejectReason);
return null;
}
HashMap<String, ExpiredOrClosedAccountEntry> expiredOrClosedAccountList = SpringContext.getBean(AccountsPayableService.class).expiredOrClosedAccountsList(poDoc);
if (expiredOrClosedAccountList == null) {
expiredOrClosedAccountList = new HashMap();
}
if (LOG.isInfoEnabled()) {
LOG.info(expiredOrClosedAccountList.size() + " accounts has been found as Expired or Closed");
}
preqDoc.populatePaymentRequestFromPurchaseOrder(orderHolder.getPurchaseOrderDocument(), expiredOrClosedAccountList);
// need to populate here for ext price. it become per item
// KFSPTS-1719. convert 1st matching inv item that is qty, but po is non-qty
checkQtyInvItemForNoQtyOrder(preqDoc, orderHolder);
populateItemDetails(preqDoc, orderHolder);
// KFSUPGRADE-485, KFSPTS-1719
if (CollectionUtils.isNotEmpty(((CuElectronicInvoiceOrderHolder) orderHolder).getNonMatchItems())) {
for (ElectronicInvoiceItemHolder invItem : ((CuElectronicInvoiceOrderHolder) orderHolder).getNonMatchItems()) {
PurchaseOrderItem item = (PurchaseOrderItem) ObjectUtils.deepCopy((Serializable) orderHolder.getPurchaseOrderDocument().getItems().get(invItem.getInvoiceItemLineNumber() - 1));
item.setItemLineNumber(invItem.getInvoiceItemLineNumber());
item.setItemDescription(((CuElectronicInvoiceItemHolder) invItem).getReferenceDescription());
// this will be populated to reqitem.poitemunitprice
item.setItemUnitPrice(invItem.getInvoiceItemUnitPrice());
PaymentRequestItem paymentRequestItem = new PaymentRequestItem(item, preqDoc, expiredOrClosedAccountList);
((CuPaymentRequestItemExtension) paymentRequestItem.getExtension()).setInvLineNumber(Integer.parseInt(((CuElectronicInvoiceItemHolder) invItem).getInvLineNumber()));
// need following in case inv item is qty item
paymentRequestItem.setItemQuantity(new KualiDecimal(invItem.getInvoiceItemQuantity()));
paymentRequestItem.setItemUnitOfMeasureCode(invItem.getInvoiceItemUnitOfMeasureCode());
paymentRequestItem.setPurchaseOrderItemUnitPrice(invItem.getInvoiceItemUnitPrice());
// if non qty don't need this unit price set, then this need to have a check
if (invItem.getInvoiceItemQuantity() != null && (new KualiDecimal(invItem.getInvoiceItemQuantity())).isPositive()) {
paymentRequestItem.setItemUnitPrice(invItem.getInvoiceItemUnitPrice());
}
paymentRequestItem.setItemCatalogNumber(invItem.getCatalogNumberStripped());
preqDoc.getItems().add(paymentRequestItem);
((CuElectronicInvoiceOrderHolder) orderHolder).setMisMatchItem((CuElectronicInvoiceItemHolder) invItem);
populateItemDetailsForNonMatching(preqDoc, orderHolder);
((CuElectronicInvoiceOrderHolder) orderHolder).setMisMatchItem(null);
}
}
/**
* Validate totals,paydate
*/
// PaymentRequestDocumentRule.processCalculateAccountsPayableBusinessRules
SpringContext.getBean(KualiRuleService.class).applyRules(new AttributedCalculateAccountsPayableEvent(preqDoc));
SpringContext.getBean(PaymentRequestService.class).calculatePaymentRequest(preqDoc, true);
processItemsForDiscount(preqDoc, orderHolder);
if (orderHolder.isInvoiceRejected()) {
return null;
}
SpringContext.getBean(PaymentRequestService.class).calculatePaymentRequest(preqDoc, false);
/**
* PaymentRequestReview
*/
// PaymentRequestDocumentRule.processRouteDocumentBusinessRules
SpringContext.getBean(KualiRuleService.class).applyRules(new AttributedPaymentRequestForEInvoiceEvent(preqDoc));
if (GlobalVariables.getMessageMap().hasErrors()) {
if (LOG.isInfoEnabled()) {
LOG.info("***************Error in rules processing - " + GlobalVariables.getMessageMap());
}
Map<String, AutoPopulatingList<ErrorMessage>> errorMessages = GlobalVariables.getMessageMap().getErrorMessages();
String errors = errorMessages.toString();
ElectronicInvoiceRejectReason rejectReason = matchingService.createRejectReason(PurapConstants.ElectronicInvoice.PREQ_ROUTING_VALIDATION_ERROR, errors, orderHolder.getFileName());
orderHolder.addInvoiceOrderRejectReason(rejectReason);
return null;
}
if (KNSGlobalVariables.getMessageList().size() > 0) {
if (LOG.isInfoEnabled()) {
LOG.info("Payment request contains " + KNSGlobalVariables.getMessageList().size() + " warning message(s)");
for (int i = 0; i < KNSGlobalVariables.getMessageList().size(); i++) {
LOG.info("Warning " + i + " - " + KNSGlobalVariables.getMessageList().get(i));
}
}
}
addShipToNotes(preqDoc, orderHolder);
try {
// KFSUPGRADE-490: Do save-only operations for just non-EIRT-generated PREQs.
if (orderHolder.isRejectDocumentHolder()) {
SpringContext.getBean(DocumentService.class).routeDocument(preqDoc, null, null);
} else {
SpringContext.getBean(DocumentService.class).saveDocument(preqDoc, DocumentSystemSaveEvent.class);
}
} catch (WorkflowException e) {
e.printStackTrace();
ElectronicInvoiceRejectReason rejectReason = matchingService.createRejectReason(PurapConstants.ElectronicInvoice.PREQ_ROUTING_FAILURE, e.getMessage(), orderHolder.getFileName());
orderHolder.addInvoiceOrderRejectReason(rejectReason);
return null;
} catch (ValidationException e) {
String extraDescription = GlobalVariables.getMessageMap().toString();
ElectronicInvoiceRejectReason rejectReason = matchingService.createRejectReason(PurapConstants.ElectronicInvoice.PREQ_ROUTING_VALIDATION_ERROR, extraDescription, orderHolder.getFileName());
orderHolder.addInvoiceOrderRejectReason(rejectReason);
return null;
}
return preqDoc;
}
Aggregations