{"version":3,"sources":["../src/index.ts","../src/utils/dates.ts","../src/utils/sumArray.ts","../src/types/Nacha/RecordTypes.ts","../src/fieldDefinitions/addenda.ts","../src/types/Nacha/SEC.ts","../src/validators.ts","../src/fieldDefinitions/batch.ts","../src/types/EntryHelpers.ts","../src/fieldDefinitions/entry.ts","../src/fieldDefinitions/file.ts","../src/fieldDefinitions/index.ts","../src/utils/formatNacha.ts","../src/utils/isBlank.ts","../src/utils/parse/parseLine.ts","../src/utils/parse/parseNacha.ts","../src/utils/tranCodeHelpers.ts","../src/api/Entry/BaseEntry.ts","../src/api/Entry/index.ts","../src/api/BatchWrapper.ts","../src/api/Nacha.ts"],"sourcesContent":["import Nacha from \"./api/Nacha.js\";\nimport { NachaData, SEC } from \"./types/Nacha/index.js\";\nimport { default as parse } from \"./utils/parse/parseNacha.js\";\nimport { default as format } from \"./utils/formatNacha.js\";\nimport {\n  AccountType,\n  Direction,\n  Purpose,\n  TransactionCode,\n  TRANSACTION_CODES,\n} from \"./types/EntryHelpers.js\";\nimport { SEC_CODES } from \"./types/Nacha/SEC.js\";\n\n// Export Class\nexport default Nacha;\n\n// Export Helper Funcs\nexport { parse, format };\n\n// Export Static Values\nexport { SEC_CODES, TRANSACTION_CODES };\n\n// Export Types\nexport type {\n  NachaData,\n  TransactionCode,\n  SEC,\n  AccountType,\n  Direction,\n  Purpose,\n};\n","export function toYYMMDD<T extends Date | undefined>(\n  date: T\n): T extends Date ? string : undefined;\nexport function toYYMMDD(date?: Date) {\n  if (date === undefined) return undefined;\n\n  const year = String(date.getFullYear() % 100).padStart(2, \"0\");\n  const month = String(date.getMonth() + 1).padStart(2, \"0\");\n  const day = String(date.getDate()).padStart(2, \"0\");\n  return `${year}${month}${day}`;\n}\n\nexport function parseYYMMDD<T extends string | undefined>(\n  dateStr: T,\n  timeStr?: string\n): T extends string ? Date : undefined;\nexport function parseYYMMDD(dateStr?: string, timeStr?: string) {\n  if (!dateStr) return undefined;\n  if (!/^\\d{6}$/.test(dateStr)) {\n    throw new Error(`Invalid date format. Expected YYMMDD. Received ${dateStr}`);\n  }\n\n  if (timeStr && !/^\\d{4}$/.test(timeStr)) {\n    throw new Error(\"Invalid time format. Expected HHMM.\");\n  }\n\n  const currentDate = new Date();\n  const currentCentury =\n    currentDate.getFullYear() - (currentDate.getFullYear() % 100);\n  const year = Number(dateStr.slice(0, 2));\n  const month = Number(dateStr.slice(2, 4)) - 1; // JS months are 0-based\n  const day = Number(dateStr.slice(4, 6));\n\n  let parsedDate = new Date(currentCentury + year, month, day);\n\n  if (timeStr) {\n    // timeStr is expected to be HHMM\n    if (!/^\\d{4}$/.test(timeStr)) {\n      throw new Error(\"Invalid time format. Expected HHMM.\");\n    }\n    const hour = Number(timeStr.slice(0, 2));\n    const minute = Number(timeStr.slice(2, 4));\n    if (hour < 0 || hour > 23 || minute < 0 || minute > 59) {\n      throw new Error(\"Invalid time values in timeStr\");\n    }\n\n    parsedDate.setHours(hour, minute, 0, 0);\n  } else {\n    parsedDate.setHours(0, 0, 0, 0); // Set to start of day if no time provided\n  }\n\n  return parsedDate;\n}\n\nexport function toHHMM<T extends Date | undefined>(\n  date: T\n): T extends Date ? string : undefined;\nexport function toHHMM(date?: Date): string | undefined {\n  if (!date) return undefined;\n\n  const hours = date.getHours().toString().padStart(2, \"0\");\n  const minutes = date.getMinutes().toString().padStart(2, \"0\");\n  return `${hours}${minutes}`;\n}\n\nexport function getTomorrowsDate(date?: Date): Date {\n  if (!date) date = new Date();\n  let tomorrow = new Date(date);\n\n  return new Date(tomorrow.setDate(tomorrow.getDate() + 1));\n}\n","export function sumArray(numArr: number[]): number {\n  return numArr.reduce((acc, curVal) => acc + curVal, 0);\n}\n","export const RecordTypes = {\n  FILE_HEADER: 1,\n  BATCH_HEADER: 5,\n  ENTRY: 6,\n  ADDENDA: 7,\n  BATCH_FOOTER: 8,\n  FILE_FOOTER: 9,\n} as const;\n\nexport const RecordTypeCodes  = Object.values(RecordTypes);\nexport type RecordTypeCode = typeof RecordTypeCodes[number]","import type { FieldDefs } from \"../types/FieldDef.js\";\nimport type { Addenda } from \"../types/Nacha/Addenda.js\";\n\nexport const addenda: FieldDefs<Addenda> = {\n  addendaTypeCode: {\n    position: [2, 3],\n    allow: [\"05\", \"98\", \"99\"],\n  },\n  paymentRelatedInfo: {\n    position: [4, 83],\n    optional: true,\n  },\n  addendaSequenceNum: {\n    position: [84, 87],\n    numeric: true,\n    validator: {\n      regex: /\\d{4}/,\n      message: \"addendaSequenceNum must be 4 digits\",\n    },\n  },\n  entryDetailSequenceNum: {\n    position: [88, 94],\n    validator: {\n      regex: /\\d{7}/,\n      message: \"entryDetailSequenceNum must be 7 digits\",\n    },\n  },\n} as const;\n","export const SEC_CODES = [\"WEB\", \"TEL\", \"PPD\", \"CCD\", \"CTX\"] as const;\n\n/** Stand Entry Class. Identifies the entries in a batch. */\nexport type SEC = (typeof SEC_CODES)[number];","// Unused currently but will be in the future\nimport type { Issue } from \"./types/Issue.js\";\n\nexport const date = (val: string) => false;\nexport const time = (val: string) => false;\n\nexport function aba(val: string | number): Issue[] {\n  const routNum = val.toString().trim();\n  const issues: Issue[] = [];\n\n  if (!/^[0-9]{9}$/.test(routNum)) {\n    issues.push({\n      message: \"should be 9 digits long and only digits\",\n      level: \"NACHA\",\n      value: val,\n    });\n    return issues;\n  }\n\n  if (!isRoutingInRange(routNum)) {\n    issues.push({\n      message: \"First 2 digits ABA routing not within valid ranges\",\n      level: \"NACHA\",\n      value: val,\n    });\n  }\n\n  if (!isCheckDigitValid(routNum)) {\n    issues.push({\n      message: \"check digit is invalid\",\n      level: \"NACHA\",\n      value: val,\n    });\n  }\n  return issues;\n}\n\nexport function dfi(val: string | number): Issue[] {\n  const dfiNum = val.toString().trim();\n  const issues: Issue[] = [];\n\n  if (!/^[0-9]{8}$/.test(dfiNum)) {\n    issues.push({\n      message: \"should be 8 digits long and only digits\",\n      level: \"NACHA\",\n      value: val,\n    });\n    return issues;\n  }\n\n  if (!isRoutingInRange(dfiNum)) {\n    issues.push({\n      message: \"First 2 digits ABA routing not within valid ranges\",\n      level: \"NACHA\",\n      value: val,\n    });\n  }\n  return issues;\n}\n\nfunction isCheckDigitValid(rtn: string): boolean {\n  const d = rtn.split(\"\").map(Number);\n  return (\n    (3 * (d[0] + d[3] + d[6]) +\n      7 * (d[1] + d[4] + d[7]) +\n      1 * (d[2] + d[5] + d[8])) %\n      10 ===\n    0\n  );\n}\n\nfunction isRoutingInRange(val: string): boolean {\n  const firstTwoDigits = Number(val.slice(0, 2));\n  return (\n    firstTwoDigits === 80 ||\n    isNumberInRanges(firstTwoDigits, [0, 12], [21, 32], [61, 72])\n  );\n}\n\nfunction isNumberInRanges(num: number, ...ranges: [number, number][]): boolean {\n  return ranges.some(([lo, hi]) => num >= lo && num <= hi);\n}\n","import type { FieldDefs } from \"../types/FieldDef.js\";\nimport {\n  type BatchFooter,\n  type BatchHeader,\n} from \"../types/Nacha/Batch.js\";\nimport { SEC_CODES } from \"../types/Nacha/SEC.js\";\nimport { dfi } from \"../validators.js\";\n\nexport const batchHeader: FieldDefs<BatchHeader> = {\n  serviceClassCode: {\n    position: [2, 4],\n    numeric: true,\n    allow: [200, 220, 225],\n  },\n  companyName: {\n    position: [5, 20],\n  },\n  companyDiscretionaryData: {\n    position: [21, 40],\n    optional: true,\n  },\n  companyId: {\n    position: [41, 50],\n    trim: false,\n  },\n  standardEntryClass: {\n    position: [51, 53],\n    allow: SEC_CODES as unknown as string[],\n  },\n  companyEntryDescription: {\n    position: [54, 63],\n  },\n  companyEntryDescriptiveDate: {\n    position: [64, 69],\n    optional: true,\n  },\n  effectiveDate: {\n    position: [70, 75],\n  },\n  settlementDate: {\n    position: [76, 78],\n    isBlank: true,\n    optional: true,\n  },\n  originatorStatusCode: {\n    numeric: true,\n    position: [79, 79],\n  },\n  originatingDFIIdentification: {\n    position: [80, 87],\n  },\n  batchNumber: {\n    position: [88, 94],\n    numeric: true,\n  },\n} as const;\n\nexport const batchFooter: FieldDefs<BatchFooter> = {\n  serviceClassCode: {\n    position: [2, 4],\n    numeric: true,\n    allow: [200, 220, 225],\n  },\n  entryAndAddendaCount: {\n    position: [5, 10],\n    numeric: true,\n  },\n  entryHash: {\n    position: [11, 20],\n    numeric: true,\n  },\n  totalDebits: {\n    position: [21, 32],\n    numeric: true,\n  },\n  totalCredits: {\n    position: [33, 44],\n    numeric: true,\n  },\n  companyId: {\n    position: [45, 54],\n    trim: false,\n  },\n  messageAuthCode: {\n    position: [55, 73],\n    trim: false,\n    optional: true,\n  },\n  reserved: {\n    position: [74, 79],\n    isBlank: true,\n    trim: false,\n  },\n  originatingDFIIdentification: {\n    position: [80, 87],\n    validator: dfi,\n  },\n  batchNumber: {\n    position: [88, 94],\n    numeric: true,\n  },\n} as const;\n","/** \n * @module EntryHelpers \n * These functions & Types are abstracts away the Transaction Codes\n * that NACHA Entries use to determine if a transaction is a credit/debit,\n * if its a normal transaction (live), pre-notification (prenote), or a \n * Zero-Dollar Remittance (remittance), and the type of the account.\n */\n\nexport const AccountTypeMap = {\n  Checking: 2,\n  Savings: 3,\n  GL: 4,\n  Loan: 5,\n} as const;\nexport type AccountType = keyof typeof AccountTypeMap;\n\nexport const AccountTypeCodes = Object.values(AccountTypeMap);\nexport type AccountCode = (typeof AccountTypeMap)[keyof typeof AccountTypeMap];\n\nexport const AccountCodeMap = Object.fromEntries(\n  Object.entries(AccountTypeMap).map(([k, v]) => [v, k])\n) as Record<AccountCode, AccountType>;\n\nexport const EntryTypeCodes = [2, 3, 4, 6, 7, 8, 9] as const;\nexport type EntryTypeCode = (typeof EntryTypeCodes)[number];\n\nexport type TransactionCode =\n  `${AccountCode}${EntryTypeCode}` extends `${infer N extends number}`\n    ? N\n    : never;\n\nexport const TRANSACTION_CODES = AccountTypeCodes.flatMap((a) =>\n  EntryTypeCodes.map((e) => a * 10 + e)\n) as TransactionCode[];\n\n\nexport type Direction = \"credit\" | \"debit\";\nexport type Purpose = \"live\" | \"prenote\" | \"remittance\";","import { TRANSACTION_CODES } from \"../types/EntryHelpers.js\";\nimport type { FieldDef, FieldDefs } from \"../types/FieldDef.js\";\nimport type {\n  CCDType as CCDType,\n  PPDType as PPDType,\n  TELType as TELType,\n  WEBType as WEBType,\n  CTXType as CTXType,\n} from \"../types/Nacha/Entry.js\";\nimport { aba } from \"../validators.js\";\n\ntype FieldDefBase = Omit<FieldDef, \"position\">;\n\nconst transactionCode: FieldDef = {\n  // length: 2,\n  numeric: true,\n  position: [2, 3],\n  allow: TRANSACTION_CODES,\n};\nconst routingNumber: FieldDef = {\n  // length: 9,\n  position: [4, 12],\n  validator: aba,\n};\nconst accountNumber: FieldDef = {\n  // length: 17,\n  position: [13, 29],\n};\nconst amount: FieldDef = {\n  // length: 10,\n  numeric: true,\n  position: [30, 39],\n};\nconst addendaRecordIndicator: FieldDefBase = {\n  // length: 1,\n  allow: [0, 1],\n  numeric: true,\n};\n\nconst idNumber: FieldDef = {\n  // length: 15,\n  position: [40, 54],\n  optional: true,\n};\nconst discretionaryData: FieldDefBase = {\n  // length: 2,\n  optional: true,\n  // position: 8,\n};\nconst name: FieldDefBase = {\n  // length: 22,\n  optional: true,\n  // position: 7,\n};\n\nexport const PPD: FieldDefs<PPDType> = {\n  transactionCode,\n  routingNumber,\n  accountNumber,\n  amount,\n  idNumber,\n  name: { position: [55, 76], ...name },\n  discretionaryData: { position: [77, 78], ...discretionaryData },\n  addendaRecordIndicator: { position: [79, 79], ...addendaRecordIndicator },\n  traceNumber: { position: [80, 94] },\n} as const;\n\nexport const CCD: FieldDefs<CCDType> = PPD;\nexport const TEL: FieldDefs<TELType> = PPD;\n\nexport const WEB: FieldDefs<WEBType> = {\n  // recordTypeCode,\n  transactionCode,\n  routingNumber,\n  accountNumber,\n  amount,\n  idNumber,\n  name: { position: [55, 76], ...name },\n  paymentTypeCode: {\n    // length: 2,\n    optional: true,\n    position: [77, 78],\n    allow: [\"R\", \"S\"],\n  },\n  addendaRecordIndicator: { position: [79, 79], ...addendaRecordIndicator },\n  traceNumber: { position: [80, 94] },\n} as const;\n\nexport const CTX: FieldDefs<CTXType> = {\n  transactionCode,\n  routingNumber,\n  accountNumber,\n  amount,\n  idNumber,\n  numberOfAddendas: {\n    // length: 4,\n    numeric: true,\n    position: [55, 58],\n  },\n  name: { ...name, position: [59, 74] },\n  reserved: {\n    position: [75, 76],\n    // length: 2,\n    isBlank: true,\n    trim: false,\n  },\n  discretionaryData: {\n    position: [77, 78],\n    ...discretionaryData,\n  },\n  addendaRecordIndicator: { position: [79, 79], ...addendaRecordIndicator },\n  traceNumber: { position: [80, 94] },\n};\n","import type { FieldDefs } from \"../types/FieldDef.js\";\nimport type { FileFooter, FileHeader } from \"../types/Nacha/index.js\";\nimport { aba } from \"../validators.js\";\n\nexport const fileHeader: FieldDefs<FileHeader> = {\n  priorityCode: {\n    numeric: true,\n    position: [2, 3],\n  },\n  destination: {\n    validator: aba,\n    // trim: false,\n    position: [4, 13],\n    justify: \"right\",\n  },\n  origin: {\n    validator: aba,\n    // trim: false,\n    position: [14, 23],\n    justify: \"right\",\n  },\n  fileCreationDate: {\n    position: [24, 29],\n    // type: \"date\",\n  },\n  fileCreationTime: {\n    position: [30, 33],\n  },\n  fileIdModifier: {\n    position: [34, 34],\n    validator: {\n      regex: /[A-Z0-9]/,\n      message: \"fileIdModifier must be alphanumeric\",\n    },\n  },\n  recordSize: {\n    position: [35, 37],\n    mustEqual: 94,\n    numeric: true,\n  },\n  blockingFactor: {\n    position: [38, 39],\n    mustEqual: 10,\n    numeric: true,\n  },\n  formatCode: {\n    position: [40, 40],\n    mustEqual: 1,\n    numeric: true,\n  },\n  destinationName: {\n    position: [41, 63],\n    optional: true,\n  },\n  originName: {\n    position: [64, 86],\n    optional: true,\n  },\n  referenceCode: {\n    position: [87, 94],\n    optional: true,\n  },\n} as const;\n\nexport const fileFooter: FieldDefs<FileFooter> = {\n  batchCount: {\n    numeric: true,\n    position: [2, 7],\n  },\n  blockCount: {\n    numeric: true,\n    position: [8, 13],\n  },\n  entryAndAddendaCount: {\n    numeric: true,\n    position: [14, 21],\n  },\n  entryHash: {\n    numeric: true,\n    position: [22, 31],\n  },\n  totalDebits: {\n    numeric: true,\n    position: [32, 43],\n  },\n  totalCredits: {\n    numeric: true,\n    position: [44, 55],\n  },\n  reserved: {\n    isBlank: true,\n    trim: false,\n    position: [56, 94],\n  },\n} as const;\n","import { SEC } from \"../types/Nacha/index.js\";\nimport { RecordTypeCode, RecordTypes } from \"../types/Nacha/RecordTypes.js\";\nimport { addenda } from \"./addenda.js\";\nimport { batchFooter, batchHeader } from \"./batch.js\";\nimport { CCD, CTX, PPD, TEL, WEB } from \"./entry.js\";\nimport { fileHeader, fileFooter } from \"./file.js\";\n\nconst fieldDefinitions = {\n  [RecordTypes.FILE_HEADER]: fileHeader,\n  [RecordTypes.BATCH_HEADER]: batchHeader,\n  [RecordTypes.ENTRY]: {\n    CCD,\n    PPD,\n    WEB,\n    TEL,\n    CTX,\n  },\n  [RecordTypes.ADDENDA]: addenda,\n  [RecordTypes.BATCH_FOOTER]: batchFooter,\n  [RecordTypes.FILE_FOOTER]: fileFooter,\n} as const\n\nexport default fieldDefinitions;\n\ntype NonEntries = Exclude<RecordTypeCode, 6>;\nexport function getNonEntryFieldDef(recordTypeCode: NonEntries) {\n  return fieldDefinitions[recordTypeCode];\n}\n\nexport function getEntryFieldDef<S extends SEC>(sec: S) {\n  return fieldDefinitions[6][sec];\n}\n\n","import fieldDefinitions from \"../fieldDefinitions/index.js\";\nimport { NachaData, NachaTypes } from \"../types/Nacha/index.js\";\n\n/** @param data JSON representation of a NACHA file */\nexport default function formatNacha(data: NachaData): string {\n  // Init record array\n  let records: NachaTypes[] = [data.header];\n\n  // Loop through batches, entries, and addenda\n  // and add them to field array\n  data.batches\n    .sort((a, b) => a.header.batchNumber - b.header.batchNumber)\n    .forEach((batch) => {\n      records.push(batch.header);\n\n      batch.entries.forEach(({ entry, addenda }) => {\n        records.push(entry);\n\n        (addenda ?? [])\n          .sort((a, b) => a.addendaSequenceNum - b.addendaSequenceNum)\n          .forEach((addenda) => records.push(addenda));\n      });\n\n      records.push(batch.footer);\n    });\n\n  records.push(data.footer);\n\n  let padding: string[] = Array(data.padding).fill(\"9\".repeat(94));\n\n  // Format all records\n  let fileContents = records.map(formatField);\n  fileContents.push(...padding);\n\n  // Format all fields put each record on its own line\n  return fileContents.join(\"\\n\");\n}\n\nfunction formatField(data: NachaTypes) {\n  let fieldDefs =\n    data.recordTypeCode === 6\n      ? fieldDefinitions[6][data.type]\n      : fieldDefinitions[data.recordTypeCode];\n\n  let charArray = [data.recordTypeCode.toString()];\n  charArray.push(...\" \".repeat(93).split(\"\"));\n\n  Object.keys(fieldDefs).forEach((key) => {\n    let { position, numeric, justify } = fieldDefs[key];\n    let [start, end] = position;\n    let val = data[key]?.toString() ?? \"\";\n    let length = end - start + 1;\n\n    let justifySide = justify ?? (numeric ? \"right\" : \"left\");\n    let padChar = numeric ? \"0\" : \" \";\n\n    val =\n      justifySide === \"right\"\n        ? val.padStart(length, padChar)\n        : val.padEnd(length, padChar);\n\n    charArray.splice(start - 1, end, ...val.split(\"\"));\n  });\n\n  return charArray.join(\"\");\n}\n","/** @returns true if string is blank else false */\nexport function isBlank(str: string): boolean {\n  for (const char of str) {\n    // NACHA fixed-width fields are space-padded; tabs rare but harmless to include\n    if (char !== \" \" && char !== \"\\t\" && char !== \"\\r\" && char !== \"\\n\")\n      return false;\n  }\n  return true;\n}\n","import { getEntryFieldDef, getNonEntryFieldDef } from \"../../fieldDefinitions/index.js\";\nimport { RecordMap, SEC } from \"../../types/Nacha/index.js\";\nimport { RecordTypeCode } from \"../../types/Nacha/RecordTypes.js\";\nimport { isBlank } from \"../isBlank.js\";\n\ntype NonEntries = Exclude<RecordTypeCode, 6>;\ntype ValueOf<T> = T[keyof T];\ntype EntryDetailUnion = ValueOf<RecordMap[6]>;\n\n// 1) Non-6\nexport default function parseLine<T extends NonEntries>(\n  recordTypeCode: T,\n  raw: string\n): RecordMap[T];\n\n// 2) 6 + specific SEC\nexport default function parseLine<S extends SEC>(\n  recordTypeCode: 6,\n  raw: string,\n  sec: S\n): RecordMap[6][S];\n\n// 3) Implementation\nexport default function parseLine(\n  recordTypeCode: RecordTypeCode,\n  raw: string,\n  sec?: SEC\n): RecordMap[NonEntries] | EntryDetailUnion {\n  if (raw.length !== 94) throw new Error(\"line must be 94 chars long\");\n\n  const fieldDefs =\n    recordTypeCode === 6\n      ? getEntryFieldDef(sec as SEC)\n      : getNonEntryFieldDef(recordTypeCode);\n\n  const record: any = { recordTypeCode };\n\n  // Loop over field defs without creating extra arrays/closures\n  for (const key in fieldDefs) {\n    const def = fieldDefs[key];\n    const [start, end] = def.position;\n\n    // Fixed-width slice (1-based positions)\n    let valStr = raw.slice(start - 1, end);\n\n    // If optional and the raw slice is all whitespace, skip it\n    if (def.optional && isBlank(valStr)) continue;\n\n    // Trim by default but allow opt-out\n    if (def.trim !== false) {\n      valStr = valStr.trim();\n    }\n\n    // Numeric conversion when needed\n    let value: string | number = valStr;\n    if (def.numeric) {\n      const num = Number(valStr);\n      if (!Number.isFinite(num)) {\n        throw new Error(`${String(key)} is not a valid number`);\n      }\n      value = num;\n    }\n\n    // Exact value constraint\n    if (def.mustEqual !== undefined && def.mustEqual !== value) {\n      throw new Error(\n        `${String(key)} must equal ${def.mustEqual}. Found \"${value}\"`\n      );\n    }\n\n    // Allowed set\n    if (def.allow && def.allow.length > 0) {\n      // Keep it simple and readable; Set conversion not worth it unless huge\n      if (!def.allow.includes(value as any)) {\n        const allowed = def.allow.join(\", \");\n        throw new Error(\n          `${String(key)} must be one of: ${allowed}. Found \"${value}\"`\n        );\n      }\n    }\n\n    record[key] = value;\n  }\n\n  // If Entry then add SEC for correct type inferencing\n  if (recordTypeCode === 6) record.type = sec;\n\n  return record;\n}\n","import {\n  Batch,\n  BatchHeader,\n  FileFooter,\n  FileHeader,\n  NachaData,\n  SEC,\n} from \"../../types/Nacha/index.js\";\nimport { EntryType } from \"../../types/Nacha/Entry.js\";\nimport { isBlank } from \"../isBlank.js\";\nimport parseLine from \"./parseLine.js\";\n\nconst RECORD_LEN = 94;\nconst PADDING = \"9\".repeat(RECORD_LEN);\n\nexport default function parseNacha(raw: string): NachaData {\n  // If files are large, prefer streaming (see streaming example below).\n  // Keeping split for compatibility, but avoid regex and extra allocations.\n  // Handles both \\n and \\r\\n safely:\n  const lines = raw.indexOf(\"\\r\") >= 0 ? raw.split(\"\\r\\n\") : raw.split(\"\\n\");\n\n  // Remove trailing blank lines\n  while (lines.length && isBlank(lines[lines.length - 1])) lines.pop();\n\n  let fileHeader: FileHeader | undefined;\n  let fileFooter: FileFooter | undefined;\n  let filePadding = 0;\n\n  let currentBatchHeader: BatchHeader | undefined;\n  let currentEntries: EntryType<SEC>[] = [];\n  const batches: NachaData[\"batches\"] = [];\n\n  for (let idx = 0; idx < lines.length; idx++) {\n    const line = lines[idx];\n    const lineNum = idx + 1;\n\n    // Fast path: possible padding\n    let isNines = /^9+$/\n    if (line.length === RECORD_LEN && isNines.test(line)) {\n      if (line === PADDING) {\n        if (!fileHeader || !fileFooter) {\n          throw new Error(\"File Padding found before end of file\");\n        }\n        filePadding++;\n        continue;\n      }\n    }\n\n    if (line.length === 0) continue; // silently skip accidental blank lines\n\n    const recordTypeCode = Number(line[0]); // '1','5','6','7','8','9'\n    switch (recordTypeCode) {\n      // File Header\n      case 1: { \n        if (fileHeader) throw new Error(\"More than one File Header found in file\");\n        fileHeader = parseLine(1, line) as FileHeader;\n        break;\n      }\n\n      // 5 Batch Header\n      case 5: { \n        if (currentBatchHeader) {\n          const batchNum = currentBatchHeader.batchNumber;\n          throw new Error(`Batch #${batchNum} missing footer`);\n        }\n        currentBatchHeader = parseLine(5, line) as BatchHeader;\n        break;\n      }\n\n      // Entry Detail\n      case 6: { \n        if (!currentBatchHeader) {\n          throw new Error(`Entry found outside of batch at ${lineNum}`);\n        }\n        const sec = currentBatchHeader.standardEntryClass as SEC;\n        const entry = parseLine(6, line, sec);\n        \n        currentEntries.push({ entry, addenda: [] });\n        break;\n      }\n\n      // Addenda\n      case 7: { \n        if (!currentBatchHeader) {\n          throw new Error(`Addenda found outside of batch at ${lineNum}`);\n        }\n        const current = currentEntries[currentEntries.length - 1];\n        if (!current) throw new Error(\"Addenda found before entry\");\n        current.addenda.push(parseLine(7, line));\n        break;\n      }\n\n      // Batch Control/Footer\n      case 8: { \n        if (!currentBatchHeader) {\n          throw new Error(`Batch footer without corresponding header found at ${lineNum}`);\n        }\n        const footer = parseLine(8, line);\n        batches.push({\n          header: currentBatchHeader,\n          entries: currentEntries,\n          footer,\n        } as Batch<SEC>);\n\n        // Reset batch state\n        currentBatchHeader = undefined;\n        currentEntries = [];\n        break;\n      }\n\n      // File Footer (non-padding)\n      case 9: { \n        if (!fileHeader) {\n          throw new Error(`File footer found before file header at ${lineNum}`);\n        }\n        fileFooter = parseLine(9, line) as FileFooter;\n        break;\n      }\n\n      default: {\n        // Invalid record type code\n        const recordTypeCode = line[0];\n        throw new Error(\n          `Line #:${lineNum} has an invalid record type code of ${recordTypeCode}`\n        );\n      }\n    }\n  }\n\n  if (!fileHeader) throw new Error(\"No file header found\");\n  if (!fileFooter) throw new Error(\"No file footer found\");\n\n  return {\n    header: fileHeader,\n    batches,\n    footer: fileFooter,\n    padding: filePadding,\n  };\n}\n","import {\n  AccountCode,\n  AccountCodeMap,\n  AccountType,\n  Direction,\n  EntryTypeCode,\n  Purpose,\n  TransactionCode,\n} from \"../types/EntryHelpers.js\";\n\nexport function getTranCodeDetails(tranCode: TransactionCode): {\n  accountType: AccountType;\n  direction: Direction;\n  purpose: Purpose;\n} {\n  const { entryTypeCode, accountTypeCode } = splitTranCode(tranCode);\n\n  return {\n    accountType: AccountCodeMap[accountTypeCode],\n    // Credit codes are 2/3/4; debit are 7/8/9\n    direction: entryTypeCode < 5 ? \"credit\" : \"debit\",\n    purpose: getPurpose(entryTypeCode),\n  };\n}\n\nexport function splitTranCode(tranCode: TransactionCode) {\n  const entryTypeCode = (tranCode % 10) as EntryTypeCode;\n  const accountTypeCode = Math.floor(tranCode / 10) as AccountCode;\n  return { entryTypeCode, accountTypeCode };\n}\n\nexport function getPurpose(entryTypeCode: EntryTypeCode): Purpose {\n  switch (entryTypeCode) {\n    case 3:\n    case 8:\n      return \"prenote\";\n    case 4:\n    case 9:\n      return \"remittance\";\n    default:\n      return \"live\";\n  }\n}\n","import { EntryCtxMap } from \"./index.js\";\nimport {\n  AccountCode,\n  AccountType,\n  AccountTypeMap,\n  Direction,\n  EntryTypeCode,\n  Purpose,\n  TransactionCode,\n} from \"../../types/EntryHelpers.js\";\nimport { Addenda, EntryType, SEC } from \"../../types/Nacha/index.js\";\nimport { getTranCodeDetails } from \"../../utils/index.js\";\nimport BatchWrapper from \"../BatchWrapper.js\";\n\nexport type AddendaOpts = {\n  typeCode: Addenda[\"addendaTypeCode\"];\n  paymentRelatedInfo: Addenda[\"paymentRelatedInfo\"];\n};\n\ntype EntryBaseCommon = {\n  amount: number; // dollars and cents (input); internally stored as CENTS\n  name: string;\n  accountNumber: string;\n  routingNumber: string;\n  idNumber?: string;\n  traceNumber?: string;\n};\n\n// These are all field deriver from/use to derive the NACHA tran code\ntype TranCodeFields = {\n  direction: Direction;\n  accountType: AccountType;\n  purpose?: Purpose; // Default to Live\n  transactionCode?: never; // can't be present in this branch\n};\n\ntype RawTranCode = {\n  transactionCode: TransactionCode;\n  direction?: never; // can't be present in this branch\n  accountType?: never;\n  purpose?: never;\n};\n\nexport type BaseEntryOpts = EntryBaseCommon & (TranCodeFields | RawTranCode);\n\n// ----------------------------------------------\n// Base class with common behavior & accessors\n// ----------------------------------------------\nexport default abstract class BaseEntryWrapper<S extends SEC> {\n  protected _batch: BatchWrapper<S>;\n\n  /** SEC for this entry */\n  public readonly type: S;\n\n  /** Two digit code identifying the account type & purpose at the\n   * receiving financial institution */\n  public transactionCode: TransactionCode;\n\n  public accountNumber: string;\n\n  public routingNumber: string;\n\n  /** amount of the transaction in dollars */\n  public amount: number;\n\n  /** determines the purpose of the entry. Non-live transactions should\n   * have an amount of 0.\n   */\n  // public purpose: Purpose;\n\n  /** Receiver's identification number. This number may\n   * be printed on the receiver's bank statement by the\n   * Receiving Financial Institution */\n  public idNumber?: string;\n\n  /** Name of receiver. */\n  public name: string;\n\n  /** This number will be unique to the transaction and will help\n   * identify the transaction in case of an inquiry */\n  public traceNumber: string;\n\n  constructor(batch: BatchWrapper<S>, opts: EntryCtxMap[S] | EntryType<S>) {\n    this._batch = batch;\n\n    // Construct from a raw EntryType (already in cents)\n    if (\"entry\" in opts) {\n      this.type = opts.entry.type as S;\n      this.transactionCode = opts.entry.transactionCode;\n      this.accountNumber = opts.entry.accountNumber;\n      this.routingNumber = opts.entry.routingNumber;\n      this.amount = opts.entry.amount; // already cents\n      this.idNumber = opts.entry.idNumber;\n      this.name = opts.entry.name;\n      this.traceNumber = opts.entry.traceNumber;\n      return;\n    }\n\n    let tranCode: TransactionCode;\n    if (opts.accountType && opts.direction) {\n      tranCode = this.getTranCode(\n        opts.accountType,\n        opts.direction,\n        opts.purpose ?? \"live\"\n      );\n    } else {\n      tranCode = opts.transactionCode!;\n    }\n\n    this.transactionCode = tranCode;\n    this.type = batch.sec;\n    this.accountNumber = opts.accountNumber;\n    this.routingNumber = opts.routingNumber;\n\n    this.amount = opts.amount;\n    this.idNumber = opts.idNumber;\n    this.name = opts.name;\n    this.traceNumber = opts.traceNumber ?? this.generateTraceNum();\n  }\n\n  abstract toJSON(): EntryType<S>;\n  abstract getAddendaCount(): number;\n\n  // --------------\n  // Helper methods\n  // --------------\n  protected getBaseEntry() {\n    return {\n      recordTypeCode: 6 as const,\n      transactionCode: this.transactionCode,\n      routingNumber: this.routingNumber,\n      accountNumber: this.accountNumber,\n      amount: Math.round(this.amount * 100),\n      name: this.name,\n      idNumber: this.idNumber,\n      addendaRecordIndicator: this.getAddendaCount() > 0 ? 1 : 0,\n      traceNumber: this.traceNumber,\n    };\n  }\n\n  protected toAddenda(\n    addenda: string | AddendaOpts,\n    addendaNumber = 1\n  ): Addenda {\n    const { paymentRelatedInfo, typeCode } =\n      typeof addenda === \"string\"\n        ? { paymentRelatedInfo: addenda, typeCode: \"05\" as const }\n        : addenda;\n\n    return {\n      recordTypeCode: 7,\n      addendaTypeCode: typeCode,\n      paymentRelatedInfo,\n      addendaSequenceNum: addendaNumber,\n      entryDetailSequenceNum: this.traceNumber.slice(-7),\n    };\n  }\n\n  protected toAddendaArray(addenda?: (string | AddendaOpts)[]) {\n    return addenda?.map((a, i) => this.toAddenda(a, i + 1)) ?? [];\n  }\n\n  protected getTranCode(\n    accountType: AccountCode | AccountType,\n    direction: Direction,\n    purpose: Purpose\n  ): TransactionCode {\n    const accountCode =\n      typeof accountType === \"number\"\n        ? accountType\n        : AccountTypeMap[accountType];\n\n    let entryTypeCode: EntryTypeCode;\n    const isCredit = direction === \"credit\";\n    switch (purpose) {\n      case \"live\":\n        entryTypeCode = isCredit ? 2 : 7;\n        break;\n      case \"prenote\":\n        entryTypeCode = isCredit ? 3 : 8;\n        break;\n      case \"remittance\":\n        entryTypeCode = isCredit ? 4 : 9;\n        break;\n      default:\n        entryTypeCode = 2;\n    }\n\n    return (accountCode * 10 + entryTypeCode) as TransactionCode;\n  }\n\n  protected generateTraceNum(): string {\n    const originDFI = this._batch.origin.slice(0, 7);\n    const seq = this._batch.entries.length + 1;\n    return originDFI + String(seq).padStart(7, \"0\");\n  }\n\n  // -----------------\n  // Common accessors\n  // -----------------\n\n  /** Credit/Debit */\n  get direction(): Direction {\n    let { direction } = getTranCodeDetails(this.transactionCode);\n    return direction;\n  }\n\n  get purpose(): Purpose {\n    let { purpose } = getTranCodeDetails(this.transactionCode);\n    return purpose;\n  }\n\n  get accountType(): AccountType {\n    let { accountType } = getTranCodeDetails(this.transactionCode);\n    return accountType;\n  }\n\n  /** Signed amount in dollars. Credit are positives & Debits are negative. */\n  get amountSigned(): number {\n    return this.direction === \"credit\" ? this.amount : -this.amount;\n  }\n\n  get cents(): number {\n    return Math.round(this.amount * 100);\n  }\n\n  set cents(val: number) {\n    this.amount = val / 100;\n  }\n\n  get centsSigned(): number {\n    return this.direction === \"credit\" ? this.cents : -this.cents;\n  }\n}\n","import { Addenda, SEC } from \"../../types/Nacha/index.js\";\nimport { EntryType } from \"../../types/Nacha/Entry.js\";\nimport BatchWrapper from \"../BatchWrapper.js\";\nimport BaseEntryWrapper, { AddendaOpts, BaseEntryOpts } from \"./BaseEntry.js\";\n\n// -----------------------\n// Constructor arg types\n// -----------------------\nexport type PPDEntryOpts = BaseEntryOpts & {\n  discretionaryData?: string;\n  addenda?: string | AddendaOpts;\n};\nexport type CCDEntryOpts = PPDEntryOpts;\n\nexport type WEBEntryOpts = Omit<PPDEntryOpts, \"discretionaryData\"> & {\n  paymentTypeCode: \"R\" | \"S\";\n};\n\nexport type TELEntryOpts = Omit<PPDEntryOpts, \"addenda\">; // TEL has no addenda\n\nexport type CTXEntryOpts = BaseEntryOpts & {\n  discretionaryData?: string;\n  addenda?: (string | AddendaOpts)[];\n};\n\nexport type EntryCtxMap = {\n  PPD: PPDEntryOpts;\n  CCD: CCDEntryOpts;\n  WEB: WEBEntryOpts;\n  TEL: TELEntryOpts;\n  CTX: CTXEntryOpts;\n};\nexport type GetEntryCtx<S extends SEC> = EntryCtxMap[S];\n\n// -----------------------\n// Small shared helpers\n// -----------------------\nconst hasEntry = <S extends SEC>(opts: unknown): opts is EntryType<S> =>\n  typeof opts === \"object\" && !!opts && \"entry\" in opts;\n\nfunction ensureArray<T>(val?: T | T[]): T[] {\n  if (val == null) return [];\n  return Array.isArray(val) ? val : [val];\n}\n\nfunction rawSingle<S extends SEC>(\n  wrapper: BaseEntryWrapper<S>,\n  type: S,\n  extra: Record<string, unknown>,\n  addenda?: Addenda | Addenda[]\n): EntryType<S> {\n  const base = (wrapper as any).getBaseEntry(); // protected on base; wrapper method is available on subclass\n  const addendaArr = ensureArray(addenda);\n  return {\n    entry: {\n      ...base,\n      type,\n      ...extra,\n    } as EntryType<S>[\"entry\"],\n    addenda: addendaArr,\n  };\n}\n\n// -------------------------------------------------\n// Concrete wrappers\n// -------------------------------------------------\n\nclass CCDPPDEntryWrapper<S extends \"CCD\" | \"PPD\"> extends BaseEntryWrapper<S> {\n  public discretionaryData?: string;\n  public addenda?: Addenda;\n\n  constructor(batch: BatchWrapper<S>, opts: PPDEntryOpts | EntryType<S>) {\n    super(batch, opts);\n    if (hasEntry<S>(opts)) {\n      this.discretionaryData = opts.entry.discretionaryData;\n      this.addenda = opts.addenda?.[0];\n    } else {\n      this.discretionaryData = opts.discretionaryData;\n      if (opts.addenda) this.addenda = this.toAddenda(opts.addenda);\n    }\n  }\n\n  getAddendaCount(): number {\n    return this.addenda ? 1 : 0;\n  }\n\n  toJSON(): EntryType<S> {\n    return rawSingle(\n      this,\n      this._batch.sec,\n      {\n        discretionaryData: this.discretionaryData,\n      },\n      this.addenda\n    );\n  }\n}\n\nexport class CCDEntryWrapper extends CCDPPDEntryWrapper<\"CCD\"> {}\nexport class PPDEntryWrapper extends CCDPPDEntryWrapper<\"PPD\"> {}\n\nexport class WEBEntryWrapper extends BaseEntryWrapper<\"WEB\"> {\n  public paymentTypeCode: \"R\" | \"S\";\n  public addenda?: Addenda;\n\n  constructor(\n    batch: BatchWrapper<\"WEB\">,\n    opts: WEBEntryOpts | EntryType<\"WEB\">\n  ) {\n    super(batch, opts);\n    if (hasEntry<\"WEB\">(opts)) {\n      this.paymentTypeCode = opts.entry.paymentTypeCode;\n      this.addenda = opts.addenda?.[0];\n    } else {\n      this.paymentTypeCode = opts.paymentTypeCode;\n      if (opts.addenda) this.addenda = this.toAddenda(opts.addenda);\n    }\n  }\n\n  getAddendaCount(): number {\n    return this.addenda ? 1 : 0;\n  }\n\n  toJSON(): EntryType<\"WEB\"> {\n    return rawSingle(\n      this,\n      \"WEB\",\n      { paymentTypeCode: this.paymentTypeCode },\n      this.addenda\n    );\n  }\n}\n\nexport class TELEntryWrapper extends BaseEntryWrapper<\"TEL\"> {\n  public discretionaryData?: string;\n\n  constructor(\n    batch: BatchWrapper<\"TEL\">,\n    opts: TELEntryOpts | EntryType<\"TEL\">\n  ) {\n    super(batch, opts);\n    this.discretionaryData = hasEntry<\"TEL\">(opts)\n      ? opts.entry.discretionaryData\n      : opts.discretionaryData;\n  }\n\n  getAddendaCount(): number {\n    return 0;\n  }\n\n  toJSON(): EntryType<\"TEL\"> {\n    return rawSingle(this, \"TEL\", {\n      discretionaryData: this.discretionaryData,\n    });\n  }\n}\n\nexport class CTXEntryWrapper extends BaseEntryWrapper<\"CTX\"> {\n  public discretionaryData?: string;\n  public addenda?: Addenda[];\n\n  constructor(\n    batch: BatchWrapper<\"CTX\">,\n    opts: CTXEntryOpts | EntryType<\"CTX\">\n  ) {\n    super(batch, opts);\n    if (hasEntry<\"CTX\">(opts)) {\n      this.discretionaryData = opts.entry.discretionaryData;\n      this.addenda = opts.addenda;\n    } else {\n      this.discretionaryData = opts.discretionaryData;\n      this.addenda = this.toAddendaArray(opts.addenda);\n    }\n  }\n\n  getAddendaCount() {\n    return this.addenda?.length ?? 0;\n  }\n\n  get numberOfAddendas() {\n    return this.getAddendaCount();\n  }\n\n  toJSON(): EntryType<\"CTX\"> {\n    const base = this.getBaseEntry();\n    return {\n      entry: {\n        ...base,\n        type: \"CTX\",\n        numberOfAddendas: this.numberOfAddendas,\n        reserved: \"  \",\n        discretionaryData: this.discretionaryData,\n      },\n      addenda: this.addenda ?? [],\n    };\n  }\n}\n\n// -----------------------\n// Factory\n// -----------------------\nconst EntryClassMap = {\n  PPD: PPDEntryWrapper,\n  CCD: CCDEntryWrapper,\n  WEB: WEBEntryWrapper,\n  TEL: TELEntryWrapper,\n  CTX: CTXEntryWrapper,\n} as const;\n\ntype EntryWrapperMap = {\n  PPD: PPDEntryWrapper;\n  CCD: CCDEntryWrapper;\n  WEB: WEBEntryWrapper;\n  TEL: TELEntryWrapper;\n  CTX: CTXEntryWrapper;\n};\nexport type EntryOf<S extends SEC> = EntryWrapperMap[S];\n\nexport function makeEntry<S extends SEC>(\n  sec: S,\n  batch: BatchWrapper<S>,\n  entryDetails: GetEntryCtx<S> | EntryType<S>\n) {\n  const EntryClass = EntryClassMap[sec] as new (\n    batch: BatchWrapper<S>,\n    opts: GetEntryCtx<S> | EntryType<S>\n  ) => EntryOf<S>;\n\n  return new EntryClass(batch, entryDetails);\n}\n","import { Batch, EntryType, SEC } from \"../types/Nacha/index.js\";\nimport { OneOrMany } from \"../types/OneOrMany.js\";\nimport { parseYYMMDD, sumArray, toYYMMDD } from \"../utils/index.js\";\nimport { EntryOf, EntryCtxMap, makeEntry } from \"./Entry/index.js\";\nimport Nacha from \"./Nacha.js\";\n\ntype Company = {\n  id: string;\n  name: string;\n  discretionaryData?: string;\n  descriptiveDate?: Date | string;\n};\n\nexport type BatchCtx = {\n  origin?: string;\n  entryDescription: string;\n  company: Company;\n  effectiveDate?: Date;\n  messageAuthCode?: string;\n};\n\nexport type AnyBatch = { [K in SEC]: BatchWrapper<K> }[SEC];\nexport default class BatchWrapper<S extends SEC> {\n  public readonly sec: S;\n  public company: Company;\n  public effectiveDate: Date;\n  public entryDescription: string;\n  public readonly originatorStatusCode = 1;\n  public origin: string;\n  public messageAuthCode?: string;\n\n  public entries: EntryOf<S>[];\n\n  constructor(private _parentFile: Nacha, sec: S, opts: BatchCtx | Batch<S>) {\n    this.sec = sec;\n\n    // Handle case where use gives raw data\n    if (\"header\" in opts && \"footer\" in opts && \"entries\" in opts) {\n      this.company = {\n        id: opts.header.companyId,\n        name: opts.header.companyName,\n        discretionaryData: opts.header.companyDiscretionaryData,\n        descriptiveDate: opts.header.companyEntryDescriptiveDate,\n      };\n      this.effectiveDate = parseYYMMDD(opts.header.effectiveDate);\n      this.entryDescription = opts.header.companyEntryDescription;\n      this.origin = opts.header.originatingDFIIdentification;\n      this.messageAuthCode = opts.footer.messageAuthCode;\n\n      this.entries = opts.entries.map((e) => makeEntry(sec, this, e));\n      return;\n    }\n\n    // Init properties\n    this.effectiveDate = opts.effectiveDate ?? this._parentFile.creationDate;\n    this.company = opts.company;\n    this.entryDescription = opts.entryDescription;\n    this.origin = opts.origin ?? this._parentFile.origin.routing;\n    this.messageAuthCode = opts.messageAuthCode;\n    this.entries = [];\n  }\n\n  // ---------- Builder-ish API when constructing new ----------\n  addEntry(opts: OneOrMany<EntryCtxMap[S]>): this {\n    let entryOpts = Array.isArray(opts) ? opts : [opts];\n    let entries = entryOpts.map((e) => makeEntry(this.sec, this, e));\n    this.entries.push(...entries);\n    return this;\n  }\n\n  credit(opts: OneOrMany<Omit<EntryCtxMap[S], \"direction\">>): this {\n    return this.addEntry({ direction: \"credit\", ...opts } as EntryCtxMap[S]);\n  }\n\n  debit(opts: OneOrMany<Omit<EntryCtxMap[S], \"direction\">>): this {\n    return this.addEntry({ direction: \"debit\", ...opts } as EntryCtxMap[S]);\n  }\n\n  /** Returns parent file */\n  done() {\n    return this._parentFile;\n  }\n\n  /** Alias of {@link done} */\n  end = this.done;\n\n  // Service Class Code (non-mutable)\n  get serviceClassCode(): 200 | 220 | 225 {\n    if (this.entries.length === 0) return 200;\n\n    const hasDebits = this.entries.some((e) => e.direction === \"debit\");\n    const hasCredits = this.entries.some((e) => e.direction === \"credit\");\n\n    if (hasCredits && hasDebits) return 200;\n\n    if (hasCredits) return 220;\n    if (hasDebits) return 225;\n\n    // Should never happen\n    return 200;\n  }\n\n  get standardEntryClass(): S {\n    return this.sec\n  }\n\n  get batchNumber() {\n    return this._parentFile.batches.indexOf(this) + 1;\n  }\n\n  get entryAndAddendaCount() {\n    return this.entries.reduce(\n      (acc, entry) => acc + entry.getAddendaCount() + 1,\n      0 // Default\n    );\n  }\n\n  get entryHash() {\n    let entryDFIs = this.entries\n      .map((e) => e.routingNumber)\n      .map((routing) => Number(routing.slice(0, 8)));\n\n    return sumArray(entryDFIs) % (1_000_000_000 * 10);\n  }\n\n  get totalDebits() {\n    let debits = this.entries\n      .filter((e) => e.direction === \"debit\")\n      .map((e) => e.cents);\n\n    return sumArray(debits);\n  }\n\n  get totalCredits() {\n    let credits = this.entries\n      .filter((e) => e.direction === \"credit\")\n      .map((e) => e.cents);\n\n    return sumArray(credits);\n  }\n\n  toJSON(): Batch<S> {\n    let { id, name, discretionaryData, descriptiveDate } = this.company;\n    return {\n      header: {\n        recordTypeCode: 5,\n        serviceClassCode: this.serviceClassCode,\n        companyName: name,\n        companyDiscretionaryData: discretionaryData,\n        companyId: id,\n        standardEntryClass: this.sec,\n        companyEntryDescription: this.entryDescription,\n        companyEntryDescriptiveDate:\n          typeof descriptiveDate === \"string\"\n            ? descriptiveDate\n            : toYYMMDD(descriptiveDate),\n        effectiveDate: toYYMMDD(this.effectiveDate),\n        settlementDate: \" \".repeat(3),\n        originatorStatusCode: 1,\n        originatingDFIIdentification: this.origin,\n        batchNumber: this.batchNumber,\n      },\n      entries: this.entries.map((entry) => entry.toJSON()) as EntryType<S>[],\n      footer: {\n        recordTypeCode: 8,\n        serviceClassCode: this.serviceClassCode,\n        entryAndAddendaCount: this.entryAndAddendaCount,\n        entryHash: this.entryHash,\n        totalDebits: this.totalDebits,\n        totalCredits: this.totalCredits,\n        companyId: id,\n        messageAuthCode: this.messageAuthCode,\n        reserved: \" \".repeat(6),\n        originatingDFIIdentification: this.origin,\n        batchNumber: this.batchNumber,\n      },\n    };\n  }\n}\n","import { NachaData, SEC } from \"../types/Nacha/index.js\";\nimport { parseYYMMDD, sumArray, toHHMM, toYYMMDD } from \"../utils/index.js\";\nimport BatchWrapper, { AnyBatch, BatchCtx } from \"./BatchWrapper.js\";\nimport parseNacha from \"../utils/parse/parseNacha.js\";\nimport { SEC_CODES } from \"../types/Nacha/SEC.js\";\nimport formatNacha from \"../utils/formatNacha.js\";\nimport { OneOrMany } from \"../types/OneOrMany.js\";\nimport { EntryCtxMap } from \"./Entry/index.js\";\n\ninterface DFI {\n  /** Name of the Financial Institution */\n  name: string;\n  /** Routing # of the Financial Institution */\n  routing: string;\n}\n\ninterface NachaCtx {\n  origin: DFI;\n  destination: DFI;\n  priorityCode?: number;\n  fileIdModifier?: string;\n  creationDate?: Date;\n  referenceCode?: string;\n}\n\n// type BatchFactory<S extends SEC> = (sec: S, opts: BatchCtx, entries?: OneOrMany<EntryCtxMap[S]>) => this |\n// Map out possible SEC code to helper method on NACHA\ntype SecMethodMap<Self> = {\n  [K in SEC as Lowercase<K>]: {\n    (opts: BatchCtx): BatchWrapper<K>;\n    (opts: BatchCtx, entries: OneOrMany<EntryCtxMap[K]>): Self;\n  };\n};\n\n// Add auto-generated functions to Nacha class type\nexport default interface Nacha extends SecMethodMap<Nacha> {}\nexport default class Nacha {\n  /** The lower the number, the higher processing priority. */\n  public priorityCode: number = 1;\n\n  /** RDFI Details */\n  public destination: DFI;\n  /** ODFI Details */\n  public origin: DFI;\n\n  /** Date file was created */\n  public creationDate: Date = new Date();\n\n  /** Code to distinguish among multiple input files. Label the first\n   * (or only) file \"A\", and continue in sequence (A-Z). If more than\n   * one file is delivered, they must have different modifiers.  */\n  public fileIdModifier = \"A\";\n\n  /** Number of bytes per record. Should only be \"094\".  */\n  public readonly recordSize = 94;\n\n  /** How many blocks the file is made up of. Should always be 10 */\n  public readonly blockingFactor = 10;\n\n  /** Currently there is only one code. Enter 1. */\n  public readonly formatCode = 1;\n\n  /** Optional field you may use to describe input\n   * file for internal accounting purposes.  */\n  public referenceCode?: string;\n\n  public batches: AnyBatch[] = [];\n\n  constructor(opts: NachaCtx | NachaData) {\n    // Init from Parsed Nacha Obj\n    if (\"header\" in opts && \"footer\" in opts && \"batches\" in opts) {\n      this.batches = opts.batches.map(\n        (batch) =>\n          new BatchWrapper(\n            this,\n            batch.header.standardEntryClass,\n            batch\n          ) as AnyBatch\n      );\n\n      this.priorityCode = opts.header.priorityCode;\n      this.destination = {\n        name: opts.header.destinationName,\n        routing: opts.header.destination,\n      };\n      this.origin = {\n        name: opts.header.originName,\n        routing: opts.header.origin,\n      };\n      this.creationDate = parseYYMMDD(\n        opts.header.fileCreationDate,\n        opts.header.fileCreationTime\n      );\n      this.fileIdModifier = opts.header.fileIdModifier;\n      this.referenceCode = opts.header.referenceCode;\n\n      return;\n    }\n\n    let {\n      priorityCode,\n      destination,\n      origin,\n      creationDate,\n      fileIdModifier,\n      referenceCode,\n    } = opts;\n    if (priorityCode) this.priorityCode = priorityCode;\n    this.destination = destination;\n    this.origin = origin;\n    if (creationDate) this.creationDate = creationDate;\n    if (fileIdModifier) this.fileIdModifier = fileIdModifier;\n    this.referenceCode = referenceCode;\n  }\n\n  // Batch Builder methods\n  addBatch<S extends SEC>(sec: S, opts: BatchCtx): BatchWrapper<S>;\n  addBatch<S extends SEC>(\n    sec: S,\n    opts: BatchCtx,\n    entries: OneOrMany<EntryCtxMap[S]>\n  ): this;\n  addBatch<S extends SEC>(\n    sec: S,\n    opts: BatchCtx,\n    entries?: OneOrMany<EntryCtxMap[S]>\n  ): BatchWrapper<S> | this {\n    const batch = new BatchWrapper(this, sec, opts);\n    this.batches.push(batch as AnyBatch);\n\n    if (entries) {\n      batch.addEntry(entries);\n      return this;\n    }\n\n    return batch;\n  }\n\n  // Add helper methods for each SEC code\n  static {\n    const define = <K extends SEC>(ctor: typeof Nacha, sec: K) => {\n      const key = sec.toLowerCase() as Lowercase<K>;\n      Object.defineProperty(ctor.prototype, key, {\n        value(\n          this: Nacha,\n          opts: BatchCtx,\n          entries?: OneOrMany<EntryCtxMap[K]>\n        ) {\n          // entries provided → return `this`, else return the created BatchWrapper<K>\n          return entries !== undefined\n            ? this.addBatch(sec, opts, entries)\n            : this.addBatch(sec, opts);\n        },\n        configurable: true,\n        writable: true,\n      });\n    };\n\n    SEC_CODES.forEach((sec) => define(this, sec));\n  }\n\n  /** The total number of batch header records in the file.  */\n  get batchCount() {\n    return this.batches.length;\n  }\n\n  /**\n   * The total number of physical blocks on the file,\n   * including the File Header and File Control records.\n   */\n  get blockCount() {\n    return Math.ceil(this.totalRecordCount / this.blockingFactor);\n  }\n\n  get totalRecordCount() {\n    return (\n      2 + // File Header & Footer\n      this.entryAndAddendaCount +\n      this.batchCount * 2\n    ); // Each batch has footer & header\n  }\n  /** Total number of entry detail and addenda records on the file. */\n  get entryAndAddendaCount() {\n    let entryAndAddendaCounts = this.batches.map((b) => b.entryAndAddendaCount);\n    return sumArray(entryAndAddendaCounts);\n  }\n\n  /**\n   * Total of all entries' DFI(Routing # excluding final check digit).\n   * Only use the final 10 positions in the entry.\n   */\n  get entryHash() {\n    let entryDFIs = this.batches\n      .flatMap((b) => b.entries.map((e) => e.routingNumber))\n      .map((routing) => Number(routing.slice(0, 8)));\n\n    return sumArray(entryDFIs) % (100_000_000 * 10);\n  }\n\n  /** Dollar totals of debit entries within the file. */\n  get totalDebits() {\n    let allDebits = this.batches.map((b) => b.totalDebits);\n    return sumArray(allDebits);\n  }\n\n  /** Dollar totals of credit entries within the file. */\n  get totalCredits() {\n    let allCredits = this.batches.map((b) => b.totalCredits);\n    return sumArray(allCredits);\n  }\n\n  /**\n   * Amount of file padding the file will have.\n   * File padding is a line of 94 '9's.\n   */\n  get padding() {\n    return 10 - (this.totalRecordCount % 10);\n  }\n\n  /** @returns A NACHA formatted file */\n  toString(): string {\n    return formatNacha(this.toJSON());\n  }\n\n  /** @returns a JSON representation of the file */\n  toJSON(): NachaData {\n    return {\n      header: {\n        recordTypeCode: 1,\n        priorityCode: this.priorityCode,\n        destination: this.destination.routing,\n        origin: this.origin.routing,\n        fileCreationDate: toYYMMDD(this.creationDate),\n        fileCreationTime: toHHMM(this.creationDate),\n        fileIdModifier: this.fileIdModifier,\n        recordSize: this.recordSize,\n        blockingFactor: this.blockingFactor,\n        formatCode: this.formatCode,\n        destinationName: this.destination.name,\n        originName: this.origin.name,\n        referenceCode: this.referenceCode,\n      },\n      batches: this.batches.map((b) => b.toJSON()),\n      footer: {\n        recordTypeCode: 9,\n        batchCount: this.batchCount,\n        blockCount: this.blockCount,\n        entryAndAddendaCount: this.entryAndAddendaCount,\n        entryHash: this.entryHash,\n        totalDebits: this.totalDebits,\n        totalCredits: this.totalCredits,\n        reserved: \" \".repeat(39),\n      },\n      padding: this.padding,\n    };\n  }\n\n  /** Factory: parses NACHA text and return an initialized Nacha file */\n  static fromNacha(raw: string): Nacha {\n    let data = parseNacha(raw);\n    return new Nacha(data);\n  }\n\n  /**\n   * Accepts a NACHA file in the form of a string & returns an object\n   * representation of the file. Any issues preventing the file from being\n   * parsed will cause the function to throw.\n   */\n  static parse = parseNacha;\n\n  /** Takes a NACHA object and returns NACHA formatted file as a string */\n  static format = formatNacha;\n}\n"],"mappings":"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","names":["addenda","fileHeader","fileFooter","recordTypeCode","addenda","addenda","name","discretionaryData"]}