UNPKG

viam-projectv-scan

Version:

ViaCheck deposit application

750 lines (670 loc) 22.2 kB
const Utilities = require('./utilities'); const MircLineRules = require('./mircLineRules'); const CheckCommonRules = require('./checkCommonRules'); const MAKER_TREASURY = 'UNITED STATES TREASURY'; const ROUTING_TREASURY = '000000518'; const createScoreFields = () => { const score = { amount: 0, checkNumber: 0, checkType: 0, checkDate: 0, mircLine: 0, payee: 0, lar: 0, signature: 0, payerFullName: 0, payerAddressName: 0, payerAddressDestination: 0, payerAddressZipCode: 0 }; return score; }; export const getCheckScanOrder = checksArray => { const lengthArray = checksArray.length; if (lengthArray === 0) return lengthArray; return checksArray[lengthArray - 1].scanOrder; }; export const createCheckImages = (order, front, back) => ({ scanOrder: order, frontImage: front, backImage: back }); // Create new element in checks array when a check is scanned. export const createCheck = (order, mirc, agency, cashier) => { const routingFromScanner = MircLineRules.getRoutingFromScanner(mirc); const accountFromScanner = MircLineRules.getAcountFromScanner(mirc); const check = { scanOrder: order, userName: cashier, agencyName: agency, cashier: '', routing: routingFromScanner, account: accountFromScanner, bank: '', limitRoutingScore: 0, limitCheckNumberScore: 0, limitAmountScore: 0, limitDateScore: 0, accountScore: 0, returnedChecksMaker: 0, issuedChecksMaker: 0, checkStatus: '', checkNumber: '', checkDate: '', serial: '', tc: '', epc: '', cc: '', ct: '', returnChecks: 0, issueChecks: 0, endorsement: 'NO', payee: '', lar: '', amount: 0, signature: '', writeType: '', checkType: '', checkTypeDescription: '', payerFullName: '', mircLine: mirc, payerAddressName: '', payerAddressDestination: '', payerAddressZipCode: '', originalAmount: '', originalRouting: '', originalAccount: '', originalCheckNumber: '', modified: false, scoreFields: createScoreFields(), isEditing: false, maximumAmountPerCheck: 0, isOcr: false, isDeposited: false, isSentDeposit: false, isSentHold: false, isVisible: true, disableCell: true, mva: '', stateCode: '', ownLicense: '', selected: false, isVerify: false, colorVerify: '', isMakerCorrected:false, reprocess: false, isChangeValues: { checkDate: false, checkNumber: false, routing: false, account: false, amount: false }, isModifiedFields: { checkDate: false, checkNumber: false, routing: false, account: false, amount: false, payee: false, maker: false }, retry: 0, validFields: { account: Utilities.validateRequieredField(accountFromScanner), routing: Utilities.validateRequieredField(routingFromScanner) && routingFromScanner.length === 9, checkNumber: false, amount: false, checkType: false, blockList: false, signature: false, date: false, isNetworkError: false, duplicated: false } }; return check; }; // const getCheckFromArray = (checksArray, scanOrder) => // checksArray.filter(function getElement(check) { // return check.scanOrder === scanOrder; // }); export const updateNewChecksArray = (checksArray, receipt) => { const newcheckarray = []; let i = 1; checksArray.forEach(check => { const elementDeposited = receipt.filter(function getCheckReceipt( elementReceipt ) { return elementReceipt.scanOrder === check.scanOrder; }); if (elementDeposited.length === 0) { const newCheck = check; newCheck.scanOrder = i; newCheck.isSentDeposit = false; newCheck.isDeposited = false; newcheckarray.push(newCheck); i += 1; } }); return newcheckarray; }; export const validateAmount = field => { let isValidValue = true; if (parseInt(field, 10) === 0 || field === '') { isValidValue = false; } return isValidValue; }; export const validateChecks = checksArray => { let isValidCheck = true; checksArray.forEach(check => { const newCheck = check; if ( !newCheck.validFields.account || !newCheck.validFields.routing || !newCheck.validFields.checkNumber || !newCheck.validFields.amount || newCheck.validFields.duplicated ) { isValidCheck = false; } }); return isValidCheck; }; const getIsValidField = field => { let isValidField = false; if (field !== null && field !== undefined) { if (field.value !== null && field.value !== undefined) { if ( field.value !== '' && field.value !== null && field.value !== undefined ) { isValidField = true; } } } return isValidField; }; const getPayerAddressName = (ocrResponse, newElement, validateModified) => { let payerAddressName = ''; if (newElement.routing === ROUTING_TREASURY) { payerAddressName = MAKER_TREASURY; } else if ( ocrResponse.payerAddress !== null && ocrResponse.payerAddress !== undefined ) { if (getIsValidField(ocrResponse.payerAddress.name)) { if (validateModified) { payerAddressName = newElement.isModifiedFields.maker ? newElement.payerAddressName : ocrResponse.payerAddress.name.value; } else { payerAddressName = ocrResponse.payerAddress.name.value; } } } else { payerAddressName = ''; } return payerAddressName; }; const getCheckType = (routing, value) => { return routing === ROUTING_TREASURY ? 'IRS' : value; }; const returnChecksArrayModified = (ocrResponse, check) => { const newCheck = check; const account = getIsValidField(ocrResponse.mircLine) ? Utilities.replaceSpecialCharacter( MircLineRules.getAccountFromOcr(ocrResponse.mircLine.value) ) : check.account; const routing = getIsValidField(ocrResponse.mircLine) ? Utilities.replaceSpecialCharacter( MircLineRules.getRoutingFromOcr(ocrResponse.mircLine.value) ) : check.routing; let amount = 0; if (getIsValidField(ocrResponse.amount)) { amount = parseFloat(ocrResponse.amount.value.replace(',', '.')) / 100; } const checkNumber = getIsValidField(ocrResponse.checkNumber) ? Utilities.replaceSpecialCharacter(ocrResponse.checkNumber.value) : ''; const checkDate = getIsValidField(ocrResponse.checkDate) ? ocrResponse.checkDate.value : ''; newCheck.routing = newCheck.routing !== '' ? newCheck.routing : routing; newCheck.account = newCheck.account !== '' ? newCheck.account : account; newCheck.checkStatus = 0; newCheck.checkNumber = newCheck.checkNumber !== '' ? newCheck.checkNumber : checkNumber; newCheck.amount = newCheck.amount !== 0 ? newCheck.amount : amount; newCheck.checkDate = newCheck.checkDate !== '' ? newCheck.checkDate : checkDate; if (!newCheck.isModifiedFields.payee) { newCheck.payee = getIsValidField(ocrResponse.payee) ? ocrResponse.payee.value.replace(/ I»¿/g, '') : ''; } newCheck.lar = getIsValidField(ocrResponse.lar) ? ocrResponse.lar.value : ''; newCheck.signature = getIsValidField(ocrResponse.hasSignature) ? ocrResponse.hasSignature.value : ''; newCheck.checkType = getIsValidField(ocrResponse.checkType) ? getCheckType(newCheck.routing, ocrResponse.checkType.value) : ''; newCheck.checkTypeDescription = newCheck.routing === ROUTING_TREASURY ? 'IRS' : check.checkTypeDescription; newCheck.payerAddressName = getPayerAddressName(ocrResponse, newCheck, true); newCheck.writeType = getIsValidField(ocrResponse.writeType) ? ocrResponse.writeType.value : ''; if ( ocrResponse.payerAddress !== null && ocrResponse.payerAddress !== undefined ) { newCheck.payerAddressDestination = getIsValidField( ocrResponse.payerAddress.destination ) ? ocrResponse.payerAddress.destination.value : ''; newCheck.payerAddressZipCode = getIsValidField( ocrResponse.payerAddress.cityZip ) ? ocrResponse.payerAddress.cityZip.value : ''; } newCheck.originalAmount = amount; newCheck.originalRouting = routing; newCheck.originalAccount = account; newCheck.originalCheckNumber = checkNumber; newCheck.modified = false; newCheck.isDeposited = false; newCheck.isSentDeposit = false; newCheck.validFields.signature = getIsValidField(ocrResponse.hasSignature) ? ocrResponse.hasSignature.value === 'true' : 'false'; newCheck.selected = check.selected; return newCheck; }; const getAmountField = field => { let amount = 0; if (field.value !== '') { amount = parseFloat(field.value.replace(',', '.')) / 100; } else { amount = parseFloat(0); } return amount; }; const returnChecksArray = (ocrResponse, element) => { const newCheck = element; newCheck.routing = getIsValidField(ocrResponse.mircLine) ? Utilities.replaceSpecialCharacter( MircLineRules.getRoutingFromOcr(ocrResponse.mircLine.value) ) : element.routing; newCheck.account = getIsValidField(ocrResponse.mircLine) ? Utilities.replaceSpecialCharacter( MircLineRules.getAccountFromOcr(ocrResponse.mircLine.value) ) : element.account; newCheck.checkStatus = 0; newCheck.checkNumber = getIsValidField(ocrResponse.checkNumber) ? Utilities.replaceSpecialCharacter(ocrResponse.checkNumber.value) : ''; newCheck.amount = getIsValidField(ocrResponse.amount) ? getAmountField(ocrResponse.amount) : parseFloat(0, 100); newCheck.checkDate = getIsValidField(ocrResponse.checkDate) ? ocrResponse.checkDate.value : ''; newCheck.payee = getIsValidField(ocrResponse.payee) ? ocrResponse.payee.value.replace(/I»¿/g, '') : ''; newCheck.lar = getIsValidField(ocrResponse.lar) ? ocrResponse.lar.value : ''; newCheck.signature = getIsValidField(ocrResponse.hasSignature) ? ocrResponse.hasSignature.value : ''; newCheck.checkType = getIsValidField(ocrResponse.checkType) ? getCheckType(newCheck.routing, ocrResponse.checkType.value) : ''; newCheck.payerFullName = ''; newCheck.mircLine = getIsValidField(ocrResponse.mircLine) ? ocrResponse.mircLine.value : ''; newCheck.payerAddressName = getPayerAddressName(ocrResponse, newCheck, false); if ( ocrResponse.payerAddress !== null && ocrResponse.payerAddress !== undefined ) { newCheck.payerAddressDestination = getIsValidField( ocrResponse.payerAddress.destination ) ? ocrResponse.payerAddress.destination.value : ''; newCheck.payerAddressZipCode = getIsValidField( ocrResponse.payerAddress.cityZip ) ? ocrResponse.payerAddress.cityZip.value : ''; } newCheck.writeType = getIsValidField(ocrResponse.writeType) ? ocrResponse.writeType.value : ''; newCheck.modified = false; newCheck.isDeposited = false; newCheck.isSentDeposit = false; newCheck.validFields.signature = getIsValidField(ocrResponse.hasSignature) ? ocrResponse.hasSignature.value === 'true' : 'false'; return newCheck; }; const returnScoreFields = ocrResponse => { const scoreFields = { amount: 0, checkNumber: 0, checkType: 0, checkDate: 0, mircLine: 0, payee: 0, lar: 0, signature: 0, payerFullName: 0, payerAddressName: 0, payerAddressDestination: 0, payerAddressZipCode: 0 }; scoreFields.mircLine = getIsValidField(ocrResponse.mircLine) ? Number(ocrResponse.mircLine.score) : 0; scoreFields.amount = getIsValidField(ocrResponse.amount) ? Number(ocrResponse.amount.score) : 0; scoreFields.checkDate = getIsValidField(ocrResponse.checkDate) ? Number(ocrResponse.checkDate.score) : 0; scoreFields.payee = getIsValidField(ocrResponse.payee) ? Number(ocrResponse.payee.score) : 0; scoreFields.checkNumber = getIsValidField(ocrResponse.checkNumber) ? Number(ocrResponse.checkNumber.score) : 0; scoreFields.lar = getIsValidField(ocrResponse.lar) ? Number(ocrResponse.lar.score) : 0; scoreFields.signature = getIsValidField(ocrResponse.hasSignature) ? Number(ocrResponse.hasSignature.score) : 0; scoreFields.checkType = getIsValidField(ocrResponse.checkType) ? Number(ocrResponse.checkType.score) : 0; scoreFields.payerFullName = ocrResponse.payerAddress !== null && ocrResponse.payerAddress !== '' ? Number(ocrResponse.payerAddress.overallScore) : 0; if ( ocrResponse.payerAddress !== null && ocrResponse.payerAddress !== undefined ) { scoreFields.payerAddressName = getIsValidField( ocrResponse.payerAddress.name ) ? Number(ocrResponse.payerAddress.name.score) : 0; scoreFields.payerAddressDestination = getIsValidField( ocrResponse.payerAddress.destination ) ? Number(ocrResponse.payerAddress.destination.score) : 0; scoreFields.payerAddressZipCode = getIsValidField( ocrResponse.payerAddress.cityZip ) ? Number(ocrResponse.payerAddress.cityZip.score) : 0; } return scoreFields; }; export const isItemDuplicated = (checksArray, checkValidated) => { let isDuplicated = false; for (let i = 0; i < checksArray.length; i += 1) { if ( checksArray[i].scanOrder !== checkValidated.scanOrder && (checksArray[i].routing === checkValidated.routing && checksArray[i].account === checkValidated.account && checksArray[i].checkNumber === checkValidated.checkNumber && checksArray[i].amount === checkValidated.amount) ) isDuplicated = true; } return isDuplicated; }; const getCheckValidations = (checksArray, check) => { const validFields = { account: Utilities.validateRequieredField(check.account), routing: Utilities.validateRequieredField(check.routing) && check.routing.length === 9, checkNumber: Utilities.validateRequieredField(check.checkNumber), blockList: check.validFields.blockList, checkType: check.validFields.checkType, amount: check.validFields.amount, signature: check.validFields.signature, date: true, isNetworkError: false, duplicated: isItemDuplicated(checksArray, check) }; return validFields; }; export const updateNetworkStatus = checksArray => { checksArray.forEach(check => { const newCheck = check; newCheck.retry = 3; newCheck.status = false; newCheck.isOcr = true; newCheck.disableCell = false; }); return checksArray; }; export const validateShowNetowrokError = checksArray => { let i = 0; let sw = true; while (i < checksArray.length && !sw) { if (checksArray[i].isNetworkError && checksArray[i].retry >= 3) sw = false; i += 1; } return sw; }; export const validateRetry = checksArray => { let isRetry = false; const retryArray = checksArray.filter(function getCheck(check) { return check.retry < 3 && check.validFields.isNetworkError && !check.isOcr; }); if (retryArray.length > 0) isRetry = true; else isRetry = false; return isRetry; }; const validateIsCheckModify = check => { let isModifiedCheck = false; if ( check.modified || check.isModifiedFields.payee || check.isModifiedFields.maker ) isModifiedCheck = true; else isModifiedCheck = false; return isModifiedCheck; }; // Create check with the information read from OCR. export const createCheckOcr = ( ocrResponse, check, checksArray, agencySettingsData ) => { let newCheck = check; newCheck.maximumAmountPerCheck = agencySettingsData.maxAmountPerCheck; if (ocrResponse !== null && ocrResponse !== undefined) { newCheck = validateIsCheckModify(newCheck) ? returnChecksArrayModified(ocrResponse, newCheck) : returnChecksArray(ocrResponse, newCheck); if (newCheck !== null) { newCheck.scoreFields = returnScoreFields(ocrResponse); newCheck.validFields = getCheckValidations(checksArray, newCheck); } } return newCheck; }; export const createImagesOcr = (ocrResponse, images) => { const newImages = images; if (ocrResponse !== null && ocrResponse !== undefined) { newImages.frontImage = ocrResponse.frontImage; } return newImages; }; export const removeCheckFromCheckArray = (checksArray, checkSelected) => { const newcheckarray = []; checksArray.forEach(check => { if (check.scanOrder !== checkSelected.scanOrder) newcheckarray.push(check); }); return newcheckarray; }; export const removeCheckFromImageArray = (imagesArray, checkSelected) => { const newImageArray = []; imagesArray.forEach(check => { if (check.scanOrder !== checkSelected.scanOrder) newImageArray.push(check); }); return newImageArray; }; export const getTotalArray = checksArray => { return checksArray.reduce(function getTotalBatch(acc, currValue) { if ( currValue === null || currValue === undefined || checksArray.length === 0 || currValue.amount === '' || currValue.amount === '0' ) return 0; return Utilities.roundDecimal(acc + parseFloat(currValue.amount), 2); }, 0); }; export const getParametersCheckValidations = checkElement => { const argms = { account: checkElement.account !== null && checkElement.account !== '' ? checkElement.account : '0', routing: checkElement.routing !== null && checkElement.routing !== '' ? String(checkElement.routing) : '0', checkNumber: checkElement.checkNumber !== null && checkElement.checkNumber !== '' ? String(checkElement.checkNumber) : '0', checkDate: checkElement.checkDate !== null && checkElement.checkDate !== '' ? checkElement.checkDate : '', isCheckVerify: false, agencyName: checkElement.agencyName, amount: checkElement.amount !== null && checkElement.amount !== '' ? checkElement.amount.toString() : '0', checkType: checkElement.checkType, payee: checkElement.payee }; return argms; }; export const getResponseFromServiceCheckValidations = ( response, check, isCallingOCR, agencySettingsData ) => { const newCheck = check; if ( response.validateScannedCheck.status !== null && response.validateScannedCheck.status !== undefined ) { if (response.validateScannedCheck.status.code === '000') { if ( response.validateScannedCheck.checkInformation !== null && response.validateScannedCheck.checkInformation !== undefined ) { const validationResponse = response.validateScannedCheck.checkInformation; if (isCallingOCR) { if (!newCheck.validFields.duplicated) { newCheck.validFields.duplicated = validationResponse.checkId !== 0; } } else { newCheck.validFields.duplicated = validationResponse.checkId !== 0; } newCheck.maximumAmountPerCheck = agencySettingsData.maxAmountPerCheck; newCheck.validFields.amount = validateAmount(newCheck.amount) ? newCheck.amount <= agencySettingsData.maxAmountPerCheck : false; newCheck.validFields.checkType = validationResponse.isValidCheckType; newCheck.validFields.blockList = validationResponse.isBlockList; newCheck.mva = validationResponse.mva; newCheck.ownLicense = validationResponse.ownLicense; newCheck.reprocess = validationResponse.reprocess; newCheck.stateCode = validationResponse.stateCode; newCheck.bank = validationResponse.bank; newCheck.limitRoutingScore = validationResponse.routingScore; newCheck.limitCheckNumberScore = validationResponse.checkNumberScore; newCheck.limitAmountScore = validationResponse.amountScore; newCheck.limitDateScore = validationResponse.dateScore; newCheck.limitAccountScore = validationResponse.accountScore; newCheck.returnedChecksMaker = validationResponse.returnedChecksMaker; newCheck.issuedChecksMaker = validationResponse.issuedChecksMaker; newCheck.checkType = validationResponse.checkType; newCheck.checkTypeDescription = newCheck.routing === ROUTING_TREASURY ? 'IRS' : validationResponse.checkTypeDescription; if(validationResponse.makerName!=='' ) { newCheck.payerAddressName = validationResponse.makerName; newCheck.isMakerCorrected = true; } } } } return newCheck; }; export const getImagesFromArray = (imagesArray, scanOrder) => { const index = CheckCommonRules.getCheckIndex(imagesArray, scanOrder); let images = ''; if (index !== -1) { images = imagesArray[index]; } return images; }; export const isRuleRequiered = check => { let isRequiered = true; if ( check.amount === 0 || check.account === '' || check.routing === '' || check.checkNumber === '' ) { isRequiered = false; } return isRequiered; }; export const restartProperties = checksArray => { const newcheckarray = checksArray; newcheckarray.forEach(check => { const newCheck = check; newCheck.disableCell = false; }); return newcheckarray; }; export default getCheckScanOrder;