You’ve hit a known limitation in ICS 2021’s Cash Management API that involves all three areas you mentioned:
Input Validation: The API has an undocumented whitelist of allowed characters in the description field. It was designed for ASCII-only environments and rejects Unicode characters outside the Basic Latin block (U+0000 to U+007F). Characters like €, £, é, ñ fail validation but the validation error is suppressed in the response. This was fixed in ICS 2022 where:
- The character whitelist was expanded to include Latin-1 Supplement (U+0080 to U+00FF)
- Validation errors are now returned in a
validationErrors array in the response
Character Encoding: Even with correct UTF-8 headers, ICS 2021 has a bug where the API gateway converts UTF-8 to ISO-8859-1 internally before validation. This mangles multi-byte UTF-8 characters. Your approach is correct, but the API doesn’t handle it properly.
Workaround for ICS 2021:
// Sanitize descriptions before API call
function sanitizeDescription(desc) {
return desc
.replace(/[€]/g, 'EUR')
.replace(/[£]/g, 'GBP')
.replace(/[é]/g, 'e')
.replace(/[ñ]/g, 'n')
.replace(/[^\x00-\x7F]/g, ''); // Remove non-ASCII
}
API Error Handling: The silent failure is the biggest issue. Implement these checks:
- Count transactions sent vs. transactions in the API response:
Response: {
"status": "success",
"transactionsProcessed": 45,
"transactionsReceived": 50
}
If these don’t match, some were skipped.
- Query Cash Management after import to verify:
GET /api/v1/cash/bank-statements/{statementId}/transactions
Compare the returned transaction count with what you sent.
-
Enable detailed API logging in Infor OS Gateway (Admin > API Gateway > Logging Level = DEBUG). This captures validation errors that aren’t returned in responses.
-
Implement a reconciliation check:
// After import, verify all transactions posted
const sentTransactions = originalData.transactions.length;
const postedTransactions = apiResponse.transactionsProcessed;
if (sentTransactions !== postedTransactions) {
// Query for missing transactions and log discrepancy
const missingTxns = findMissing(originalData, apiResponse);
logAlert('Transaction import incomplete', missingTxns);
}
For your immediate reconciliation problem, I recommend:
- Apply the sanitization function to all descriptions before import
- Keep a mapping of original vs. sanitized descriptions in your local database
- After each import, query the posted transactions and compare counts
- Generate a daily reconciliation report showing any discrepancies
Longer term, upgrade to ICS 2023-1 where this issue is fully resolved. The newer API properly handles UTF-8, returns detailed validation errors, and supports the full Unicode character set for transaction descriptions. We tested importing statements with descriptions in 15 different languages including Chinese and Arabic, and all processed correctly.
This draft is based on general Infor CloudSuite knowledge. It has not been verified against your specific version and environment. Practitioners: verify the steps and share your experience below.