UNPKG

@midlandsbank/node-nacha

Version:

NACHA ACH EFT File Parser/Formatter for CCD+ / PPD+ / CTX+

596 lines (589 loc) 13.1 kB
// Generated by CoffeeScript 1.11.1 var aba, abaFull, abaFullPlus, alphanumeric, date, field, formats, time, validator; validator = require('../api/validate'); aba = validator.aba, abaFull = validator.abaFull, abaFullPlus = validator.abaFullPlus, date = validator.date, time = validator.time, alphanumeric = validator.alphanumeric; module.exports = formats = { fileHeader: { type: '1', fields: [ { name: 'recordType', length: 1, pattern: /1/ }, { name: 'priority', length: 2, numeric: true }, { name: 'destination', length: 10, pattern: abaFullPlus, trim: false }, { name: 'origin', length: 10, pattern: abaFullPlus, trim: false }, { name: 'creationDate', length: 6, pattern: date }, { name: 'creationTime', length: 4, pattern: time, optional: true }, { name: 'idModifier', length: 1, pattern: /[A-Z0-9]/ }, { name: 'recordSize', length: 3, pattern: /094/ }, { name: 'blockingFactor', length: 2, pattern: /10/ }, { name: 'formatCode', length: 1, pattern: /1/ }, { name: 'destinationName', length: 23, pattern: alphanumeric, optional: true }, { name: 'originName', length: 23, pattern: alphanumeric, optional: true }, { name: 'referenceCode', length: 8, pattern: alphanumeric, optional: true } ] }, fileFooter: { type: '9', fields: [ { name: 'recordType', length: 1, pattern: /9/ }, { name: 'batchCount', length: 6, numeric: true }, { name: 'blockCount', length: 6, numeric: true }, { name: 'entryAndAddendaCount', length: 8, numeric: true }, { name: 'entryHash', length: 10, numeric: true }, { name: 'totalDebit', length: 12, numeric: true }, { name: 'totalCredit', length: 12, numeric: true }, { name: 'reserved', length: 39, pattern: /.+/, optional: true } ] }, batchHeader: { type: '5', fields: [ { name: 'recordType', length: 1, pattern: /5/ }, { name: 'serviceClassCode', length: 3, numeric: true }, { name: 'companyName', length: 16, pattern: alphanumeric }, { name: 'discretionaryData', length: 20, pattern: alphanumeric, optional: true }, { name: 'companyId', length: 10, pattern: alphanumeric, trim: false }, { name: 'entryClassCode', length: 3, pattern: alphanumeric }, { name: 'description', length: 10, pattern: alphanumeric }, { name: 'date', length: 6, pattern: alphanumeric, optional: true }, { name: 'effectiveDate', length: 6, validate: date }, { name: 'settlementDate', length: 3, pattern: /.{3}/, optional: true }, { name: 'originatorStatusCode', length: 1, pattern: alphanumeric }, { name: 'originatingDFIIdentification', length: 8, validate: aba }, { name: 'num', length: 7, numeric: true } ] }, batchFooter: { type: '8', fields: [ { name: 'recordType', length: 1, pattern: /8/ }, { name: 'serviceClassCode', length: 3, numeric: true }, { name: 'entryAndAddendaCount', length: 6, numeric: true }, { name: 'entryHash', length: 10, numeric: true }, { name: 'totalDebit', length: 12, numeric: true }, { name: 'totalCredit', length: 12, numeric: true }, { name: 'companyId', length: 10, pattern: alphanumeric, trim: false }, { name: 'messageAuthenticationCode', length: 19, pattern: alphanumeric, optional: true }, { name: 'reserved', length: 6, pattern: / / }, { name: 'originatingDFIIdentification', length: 8, validate: aba }, { name: 'num', length: 7, numeric: true } ] }, CCD: { entry: { type: '6', fields: [ { name: 'recordType', length: 1, pattern: /6/ }, { name: 'transactionCode', length: 2, pattern: /([2345])([2378])/ }, { name: 'receivingDFIIdentification', length: 8, numeric: true, validate: aba }, { name: 'checkDigit', length: 1, numeric: true }, { name: 'dfiAccount', length: 17, pattern: alphanumeric }, { name: 'amount', length: 10, numeric: true }, { name: 'identificationNumber', length: 15, pattern: alphanumeric, optional: true }, { name: 'receivingCompanyName', length: 22, pattern: alphanumeric }, { name: 'discretionaryData', length: 2, pattern: alphanumeric, optional: true }, { name: 'addendaIndicator', length: 1, pattern: /0|1/ }, { name: 'traceNumber', length: 15, numeric: true, pattern: /(\d{8})(\d{7})/ } ] }, addenda: { type: '7', fields: [ { name: 'recordType', length: 1, pattern: /7/ }, { name: 'type', length: 2, pattern: /05/ }, { name: 'info', length: 80, pattern: alphanumeric, optional: true }, { name: 'num', length: 4, numeric: true, pattern: /\d{4}/ }, { name: 'entryNum', length: 7, numeric: true, pattern: /\d{7}/ } ] } }, CTX: { entry: { type: '6', fields: [ { name: 'recordType', length: 1, pattern: /6/ }, { name: 'transactionCode', length: 2, pattern: /([2345])([2378])/ }, { name: 'receivingDFIIdentification', length: 8, validate: aba }, { name: 'checkDigit', length: 1, numeric: true }, { name: 'dfiAccount', length: 17, pattern: alphanumeric }, { name: 'amount', length: 10, numeric: true }, { name: 'identificationNumber', length: 15, pattern: alphanumeric }, { name: 'addendaCount', length: 4, numeric: true, pattern: /\d{4}/ }, { name: 'receivingCompanyName', length: 16, pattern: alphanumeric }, { name: 'reserved', length: 2, pattern: /../ }, { name: 'discretionaryData', length: 2, pattern: alphanumeric }, { name: 'addendaIndicator', length: 1, pattern: /0|1/ }, { name: 'traceNumber', length: 15, numeric: true, pattern: /(\d{8})(\d{7})/ } ] }, addenda: { type: '7', fields: [ { name: 'recordType', length: 1, pattern: /7/ }, { name: 'type', length: 2, pattern: /05/ }, { name: 'info', length: 80, pattern: alphanumeric }, { name: 'segmentName', length: 3, pattern: /ISA/ }, { name: 'separator', length: 1, pattern: /\*/ }, { name: 'authorizationInformationQualifier', length: 2 }, { name: 'separator', length: 1, pattern: /\*/ }, { name: 'authorizationInformation', length: 10 }, { name: 'separator', length: 1, pattern: /\*/ }, { name: 'securityInformationQualifier', length: 2, pattern: /\*/ }, { name: 'dataElementSeparator', length: 1, pattern: /\*/ }, { name: 'securityInformation', length: 10 }, { name: 'dataElementSeparator', length: 1, pattern: /\*/ }, { name: 'interchangeIDQualifier', length: 2 }, { name: 'dataElementSeparator', length: 1, pattern: /\*/ }, { name: 'interchangeSenderID', length: 15 }, { name: 'dataElementSeparator', length: 1, pattern: /\*/ }, { name: 'interchangeIDQualifier', length: 2 }, { name: 'dataElementSeparator', length: 1, pattern: /\*/ }, { name: 'interchangeReceiverID', length: 15 }, { name: 'dataElementSeparator', length: 1, pattern: /\*/ }, { name: 'interchangeDate', length: 6, pattern: date }, { name: 'dataElementSeparator', length: 1, pattern: /\*/ }, { name: 'interchangeTime', length: 4, pattern: time }, { name: 'dataElementSeparator', length: 1, pattern: /\*/ }, { name: 'interfaceControlStandardsIdentifier', length: 1 }, { name: 'dataElementSeparator', length: 1, pattern: /\*/ }, { name: 'interchangeControlNumber', length: 9 }, { name: 'dataElementSeparator', length: 1, pattern: /\*/ }, { name: 'acknowledgeRequested', length: 1 }, { name: 'dataElementSeparator', length: 1, pattern: /\*/ }, { name: 'testIndicator', length: 1 }, { name: 'dataElementSeparator', length: 1, pattern: /\*/ }, { name: 'subElementSeparator', length: 1 }, { name: 'segmentSeparator', length: 1, pattern: /\*/ }, { name: 'segmentName', length: 2, pattern: /ST/ }, { name: 'dataElementSeparator', length: 1, pattern: /\*/ }, { name: 'functionalIdentifierCode', length: 2 }, { name: 'dataElementSeparator', length: 1, pattern: /\*/ }, { name: 'applicationSendersCode', length: 15 }, { name: 'dataElementSeparator', length: 1, pattern: /\*/ }, { name: 'applicationReceiversCode', length: 15 }, { name: 'dataElementSeparator', length: 1, pattern: /\*/ }, { name: 'date', length: 6, pattern: date }, { name: 'dataElementSeparator', length: 1, pattern: /\*/ }, { name: 'time', length: 6, pattern: /\d{4}(\d|[ ]){2}/ }, { name: 'dataElementSeparator', length: 1, pattern: /\*/ }, { name: 'groupControlNumber', length: 9 }, { name: 'dataElementSeparator', length: 1, pattern: /\*/ }, { name: 'responsibleAgencyCode', length: 2 }, { name: 'dataElementSeparator', length: 1, pattern: /\*/ }, { name: 'sequenceNumber', length: 4, numeric: true, pattern: /\d{4}/ }, { name: 'entrySequenceNumber', length: 7, numeric: true, pattern: /\d{7}/ } ] } } }; formats.PPD = formats.CCD; formats.WEB = { entry: { type: '6', fields: formats.CCD.entry.fields.slice(0) }, addenda: { type: '7', fields: formats.CCD.addenda.fields.slice(0) } }; field = formats.WEB.entry.fields[8] = { name: 'paymentTypeCode', length: 2, pattern: /(R|S) / };