use of org.kuali.kfs.sys.document.validation.event.UpdateAccountingLineEvent in project cu-kfs by CU-CommunityApps.
the class AccountingLineAccessibleValidation method validate.
/**
* Validates that the given accounting line is accessible for editing by the current user.
* <strong>This method expects a document as the first parameter and an accounting line as the second</strong>
*
* @see org.kuali.kfs.sys.document.validation.Validation#validate(java.lang.Object[])
*/
@Override
public boolean validate(AttributedDocumentEvent event) {
final Person currentUser = GlobalVariables.getUserSession().getPerson();
if (accountingDocumentForValidation instanceof Correctable) {
final String errorDocumentNumber = ((FinancialSystemDocumentHeader) accountingDocumentForValidation.getDocumentHeader()).getFinancialDocumentInErrorNumber();
if (StringUtils.isNotBlank(errorDocumentNumber)) {
return true;
}
}
final AccountingLineAuthorizer accountingLineAuthorizer = lookupAccountingLineAuthorizer();
final Set<String> currentNodes = accountingDocumentForValidation.getDocumentHeader().getWorkflowDocument().getCurrentNodeNames();
final boolean lineIsAccessible = accountingLineAuthorizer.hasEditPermissionOnAccountingLine(accountingDocumentForValidation, accountingLineForValidation, getAccountingLineCollectionProperty(), currentUser, true, currentNodes);
final boolean isAccessible = accountingLineAuthorizer.hasEditPermissionOnField(accountingDocumentForValidation, accountingLineForValidation, getAccountingLineCollectionProperty(), KFSPropertyConstants.ACCOUNT_NUMBER, lineIsAccessible, true, currentUser, currentNodes);
boolean valid = true;
boolean isExceptionNode = isExceptionNode(event.getDocument());
if (!isAccessible) {
// if only object code changed and the user has edit permissions on object code, that's ok
if (event instanceof UpdateAccountingLineEvent) {
final boolean isObjectCodeAccessible = accountingLineAuthorizer.hasEditPermissionOnField(accountingDocumentForValidation, accountingLineForValidation, getAccountingLineCollectionProperty(), KFSPropertyConstants.FINANCIAL_OBJECT_CODE, lineIsAccessible, true, currentUser, currentNodes);
final boolean onlyObjectCodeChanged = onlyObjectCodeChanged(((UpdateAccountingLineEvent) event).getAccountingLine(), ((UpdateAccountingLineEvent) event).getUpdatedAccountingLine());
if (isObjectCodeAccessible && onlyObjectCodeChanged) {
return true;
}
}
if (isPreqDiscountRecreate(event)) {
return true;
}
// KFSPTS-2253
if (!isExceptionNode) {
final String principalName = currentUser.getPrincipalName();
final String[] chartErrorParams = new String[] { getDataDictionaryService().getAttributeLabel(accountingLineForValidation.getClass(), KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE), accountingLineForValidation.getChartOfAccountsCode(), principalName };
// KFSPTS-1273 : fixing an exisiting issue. Limit to REQ and POA. Broader solution need more work.
if (event instanceof UpdateAccountingLineEvent) {
// if (CollectionUtils.isEmpty(GlobalVariables.getMessageMap().getErrorPath()) && event instanceof UpdateAccountingLineEvent) {
GlobalVariables.getMessageMap().putErrorWithoutFullErrorPath(event.getErrorPathPrefix() + "." + KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, convertEventToMessage(event), chartErrorParams);
} else {
GlobalVariables.getMessageMap().putError(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, convertEventToMessage(event), chartErrorParams);
}
final String[] accountErrorParams = new String[] { getDataDictionaryService().getAttributeLabel(accountingLineForValidation.getClass(), KFSPropertyConstants.ACCOUNT_NUMBER), accountingLineForValidation.getAccountNumber(), principalName };
// KFSPTS-1273 : fixing an exisiting issue. Limit to REQ and POA. Broader solution need more work.
if (event instanceof UpdateAccountingLineEvent) {
GlobalVariables.getMessageMap().putErrorWithoutFullErrorPath(event.getErrorPathPrefix() + "." + KFSPropertyConstants.ACCOUNT_NUMBER, convertEventToMessage(event), accountErrorParams);
} else {
GlobalVariables.getMessageMap().putError(KFSPropertyConstants.ACCOUNT_NUMBER, convertEventToMessage(event), accountErrorParams);
}
}
// end KFSPTS-2253
} else if (event instanceof AddAccountingLineEvent && isAccountNode(event.getDocument()) && !isAccountingLineFo(event.getDocument()) && !isDiscountTradeInAccount()) {
final String principalName = currentUser.getPrincipalName();
final String[] chartErrorParams = new String[] { getDataDictionaryService().getAttributeLabel(accountingLineForValidation.getClass(), KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE), accountingLineForValidation.getChartOfAccountsCode(), principalName };
GlobalVariables.getMessageMap().putError(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, convertEventToMessage(event), chartErrorParams);
final String[] accountErrorParams = new String[] { getDataDictionaryService().getAttributeLabel(accountingLineForValidation.getClass(), KFSPropertyConstants.ACCOUNT_NUMBER), accountingLineForValidation.getAccountNumber(), principalName };
GlobalVariables.getMessageMap().putError(KFSPropertyConstants.ACCOUNT_NUMBER, convertEventToMessage(event), accountErrorParams);
valid = false;
}
return (isAccessible || isExceptionNode) && valid;
}
use of org.kuali.kfs.sys.document.validation.event.UpdateAccountingLineEvent in project cu-kfs by CU-CommunityApps.
the class PurchasingAccountsPayableDocumentBase method generateEvents.
// KFSUPGRADE-503 copied from AccountingDocumentBase and change
protected List generateEvents(List persistedLines, List currentLines, String errorPathPrefix, TransactionalDocument document) {
List addEvents = new ArrayList();
List updateEvents = new ArrayList();
List reviewEvents = new ArrayList();
List deleteEvents = new ArrayList();
errorPathPrefix = KFSConstants.DOCUMENT_PROPERTY_NAME + ".item[";
//
// generate events
Map persistedLineMap = buildAccountingLineMap(persistedLines);
// (iterate through current lines to detect additions and updates, removing affected lines from persistedLineMap as we go
// so deletions can be detected by looking at whatever remains in persistedLineMap)
int index = 0;
for (Iterator i = currentLines.iterator(); i.hasNext(); index++) {
// String indexedErrorPathPrefix = errorPathPrefix + "[" + index + "]";
AccountingLine currentLine = (AccountingLine) i.next();
Integer key = currentLine.getSequenceNumber();
String indexedErrorPathPrefix = getIndexedErrorPathPrefix(errorPathPrefix, currentLine);
AccountingLine persistedLine = (AccountingLine) persistedLineMap.get(key);
// if line is both current and persisted...
if (persistedLine != null) {
// ...check for updates
if (!currentLine.isLike(persistedLine)) {
UpdateAccountingLineEvent updateEvent = new UpdateAccountingLineEvent(indexedErrorPathPrefix, document, persistedLine, currentLine);
updateEvents.add(updateEvent);
} else {
ReviewAccountingLineEvent reviewEvent = new ReviewAccountingLineEvent(indexedErrorPathPrefix, document, currentLine);
reviewEvents.add(reviewEvent);
}
persistedLineMap.remove(key);
} else {
// it must be a new addition
AddAccountingLineEvent addEvent = new AddAccountingLineEvent(indexedErrorPathPrefix, document, currentLine);
addEvents.add(addEvent);
}
}
// detect deletions
for (Iterator i = persistedLineMap.entrySet().iterator(); i.hasNext(); ) {
// the deleted line is not displayed on the page, so associate the error with the whole group
String groupErrorPathPrefix = errorPathPrefix + KFSConstants.ACCOUNTING_LINE_GROUP_SUFFIX;
Map.Entry e = (Map.Entry) i.next();
AccountingLine persistedLine = (AccountingLine) e.getValue();
DeleteAccountingLineEvent deleteEvent = new DeleteAccountingLineEvent(groupErrorPathPrefix, document, persistedLine, true);
deleteEvents.add(deleteEvent);
}
//
// merge the lists
List lineEvents = new ArrayList();
lineEvents.addAll(reviewEvents);
lineEvents.addAll(updateEvents);
lineEvents.addAll(addEvents);
lineEvents.addAll(deleteEvents);
return lineEvents;
}
Aggregations