Repository: moov-io/ach
Pull request #201 (2018-05-22 17:47:59)

Exported JSON ID
Adding JSON struct mappings to be used with JSON marshal and unmarshal 


Patch:
diff --git a/addenda05.go b/addenda05.go
index e70f6a63..aeb03bae 100644
--- a/addenda05.go
+++ b/addenda05.go
@@ -12,21 +12,23 @@ import (
 // Addenda05 is a Addendumer addenda which provides business transaction information for Addenda Type
 // Code 05 in a machine readable format. It is usually formatted according to ANSI, ASC, X12 Standard.
 type Addenda05 struct {
+	// ID is a client defined string used as a reference to this record.
+	ID string `json:"id"`
 	// RecordType defines the type of record in the block. entryAddenda05 Pos 7
 	recordType string
 	// TypeCode Addenda05 types code '05'
 	typeCode string
 	// PaymentRelatedInformation
-	PaymentRelatedInformation string
+	PaymentRelatedInformation string `json:"paymentRelatedInformation"`
 	// SequenceNumber is consecutively assigned to each Addenda05 Record following
 	// an Entry Detail Record. The first addenda05 sequence number must always
 	// be a "1".
-	SequenceNumber int
+	SequenceNumber int `json:"sequenceNumber,omitempty"`
 	// EntryDetailSequenceNumber contains the ascending sequence number section of the Entry
 	// Detail or Corporate Entry Detail Record's trace number This number is
 	// the same as the last seven digits of the trace number of the related
 	// Entry Detail Record or Corporate Entry Detail Record.
-	EntryDetailSequenceNumber int
+	EntryDetailSequenceNumber int `json:"entryDetailSequenceNumber,omitempty"`
 	// validator is composed for data validation
 	validator
 	// converters is composed for ACH to GoLang Converters
diff --git a/addenda98.go b/addenda98.go
index 81b8a861..6577e8ff 100644
--- a/addenda98.go
+++ b/addenda98.go
@@ -12,23 +12,25 @@ import (
 // Addenda98 is a Addendumer addenda record format for Notification OF Change(98)
 // The field contents for Notification of Change Entries must match the field contents of the original Entries
 type Addenda98 struct {
+	// ID is a client defined string used as a reference to this record.
+	ID string `json:"id"`
 	// RecordType defines the type of record in the block. entryAddendaPos 7
 	recordType string
 	// TypeCode Addenda types code '98'
 	typeCode string
 	// ChangeCode field contains a standard code used by an ACH Operator or RDFI to describe the reason for a change Entry.
 	// Must exist in changeCodeDict
-	ChangeCode string
+	ChangeCode string `json:"changeCode"`
 	// OriginalTrace This field contains the Trace Number as originally included on the forward Entry or Prenotification.
 	// The RDFI must include the Original Entry Trace Number in the Addenda Record of an Entry being returned to an ODFI,
 	// in the Addenda Record of an 98, within an Acknowledgment Entry, or with an RDFI request for a copy of an authorization.
-	OriginalTrace int
+	OriginalTrace int `json:"originalTrace"`
 	// OriginalDFI field contains the Receiving DFI Identification (addenda.RDFIIdentification) as originally included on the forward Entry or Prenotification that the RDFI is returning or correcting.
-	OriginalDFI string
+	OriginalDFI string `json:"originalDFI"`
 	// CorrectedData
-	CorrectedData string
+	CorrectedData string `json:"correctedData"`
 	// TraceNumber matches the Entry Detail Trace Number of the entry being returned.
-	TraceNumber int
+	TraceNumber int `json:"traceNumber,omitempty"`
 
 	// validator is composed for data validation
 	validator
diff --git a/addenda99.go b/addenda99.go
index 87db7acc..87e4b402 100644
--- a/addenda99.go
+++ b/addenda99.go
@@ -32,25 +32,27 @@ func init() {
 
 // Addenda99 utilized for Notification of Change Entry (COR) and Return types.
 type Addenda99 struct {
+	// ID is a client defined string used as a reference to this record.
+	ID string `json:"id"`
 	// RecordType defines the type of record in the block. entryAddendaPos 7
 	recordType string
 	// TypeCode Addenda types code '99'
 	typeCode string
 	// ReturnCode field contains a standard code used by an ACH Operator or RDFI to describe the reason for returning an Entry.
 	// Must exist in returnCodeDict
-	ReturnCode string
+	ReturnCode string `json:"returnCode"`
 	// OriginalTrace This field contains the Trace Number as originally included on the forward Entry or Prenotification.
 	// The RDFI must include the Original Entry Trace Number in the Addenda Record of an Entry being returned to an ODFI,
 	// in the Addenda Record of an 98, within an Acknowledgment Entry, or with an RDFI request for a copy of an authorization.
-	OriginalTrace int
+	OriginalTrace int `json:"originalTrace"`
 	// DateOfDeath The field date of death is to be supplied on Entries being returned for reason of death (return reason codes R14 and R15).
-	DateOfDeath time.Time
+	DateOfDeath time.Time `json:"dateOfDeath"`
 	// OriginalDFI field contains the Receiving DFI Identification (addenda.RDFIIdentification) as originally included on the forward Entry or Prenotification that the RDFI is returning or correcting.
-	OriginalDFI string
+	OriginalDFI string `json:"originalDFI"`
 	// AddendaInformation
-	AddendaInformation string
+	AddendaInformation string `json:"addendaInformation,omitempty"`
 	// TraceNumber matches the Entry Detail Trace Number of the entry being returned.
-	TraceNumber int
+	TraceNumber int `json:"traceNumber,omitempty"`
 
 	// validator is composed for data validation
 	validator
diff --git a/batch.go b/batch.go
index e97ef568..fdf23514 100644
--- a/batch.go
+++ b/batch.go
@@ -12,9 +12,11 @@ import (
 
 // Batch holds the Batch Header and Batch Control and all Entry Records for PPD Entries
 type batch struct {
-	header  *BatchHeader
-	entries []*EntryDetail
-	control *BatchControl
+	// ID is a client defined string used as a reference to this record.
+	ID      string         `json:"id"`
+	Header  *BatchHeader   `json:"batchHeader,omitempty"`
+	Entries []*EntryDetail `json:"entryDetails,omitempty"`
+	Control *BatchControl  `json:"batchControl,omitempty"`
 
 	// category defines if the entry is a Forward, Return, or NOC
 	category string
@@ -43,7 +45,7 @@ func NewBatch(bh *BatchHeader) (Batcher, error) {
 
 // verify checks basic valid NACHA batch rules. Assumes properly parsed records. This does not mean it is a valid batch as validity is tied to each batch type
 func (batch *batch) verify() error {
-	batchNumber := batch.header.BatchNumber
+	batchNumber := batch.Header.BatchNumber
 
 	// verify field inclusion in all the records of the batch.
 	if err := batch.isFieldInclusion(); err != nil {
@@ -54,23 +56,23 @@ func (batch *batch) verify() error {
 		return &BatchError{BatchNumber: batchNumber, FieldName: "FieldError", Msg: err.Error()}
 	}
 	// validate batch header and control codes are the same
-	if batch.header.ServiceClassCode != batch.control.ServiceClassCode {
-		msg := fmt.Sprintf(msgBatchHeaderControlEquality, batch.header.ServiceClassCode, batch.control.ServiceClassCode)
+	if batch.Header.ServiceClassCode != batch.Control.ServiceClassCode {
+		msg := fmt.Sprintf(msgBatchHeaderControlEquality, batch.Header.ServiceClassCode, batch.Control.ServiceClassCode)
 		return &BatchError{BatchNumber: batchNumber, FieldName: "ServiceClassCode", Msg: msg}
 	}
 	// Company Identification must match the Company ID from the batch header record
-	if batch.header.CompanyIdentification != batch.control.CompanyIdentification {
-		msg := fmt.Sprintf(msgBatchHeaderControlEquality, batch.header.CompanyIdentification, batch.control.CompanyIdentification)
+	if batch.Header.CompanyIdentification != batch.Control.CompanyIdentification {
+		msg := fmt.Sprintf(msgBatchHeaderControlEquality, batch.Header.CompanyIdentification, batch.Control.CompanyIdentification)
 		return &BatchError{BatchNumber: batchNumber, FieldName: "CompanyIdentification", Msg: msg}
 	}
 	// Control ODFI Identification must be the same as batch header
-	if batch.header.ODFIIdentification != batch.control.ODFIIdentification {
-		msg := fmt.Sprintf(msgBatchHeaderControlEquality, batch.header.ODFIIdentification, batch.control.ODFIIdentification)
+	if batch.Header.ODFIIdentification != batch.Control.ODFIIdentification {
+		msg := fmt.Sprintf(msgBatchHeaderControlEquality, batch.Header.ODFIIdentification, batch.Control.ODFIIdentification)
 		return &BatchError{BatchNumber: batchNumber, FieldName: "ODFIIdentification", Msg: msg}
 	}
 	// batch number header and control must match
-	if batch.header.BatchNumber != batch.control.BatchNumber {
-		msg := fmt.Sprintf(msgBatchHeaderControlEquality, batch.header.ODFIIdentification, batch.control.ODFIIdentification)
+	if batch.Header.BatchNumber != batch.Control.BatchNumber {
+		msg := fmt.Sprintf(msgBatchHeaderControlEquality, batch.Header.ODFIIdentification, batch.Control.ODFIIdentification)
 		return &BatchError{BatchNumber: batchNumber, FieldName: "BatchNumber", Msg: msg}
 	}
 
@@ -108,38 +110,38 @@ func (batch *batch) verify() error {
 // the batch being built has invalid records.
 func (batch *batch) build() error {
 	// Requires a valid BatchHeader
-	if err := batch.header.Validate(); err != nil {
+	if err := batch.Header.Validate(); err != nil {
 		return err
 	}
-	if len(batch.entries) <= 0 {
-		return &BatchError{BatchNumber: batch.header.BatchNumber, FieldName: "entries", Msg: msgBatchEntries}
+	if len(batch.Entries) <= 0 {
+		return &BatchError{BatchNumber: batch.Header.BatchNumber, FieldName: "entries", Msg: msgBatchEntries}
 	}
 	// Create record sequence numbers
 	entryCount := 0
 	seq := 1
-	for i, entry := range batch.entries {
+	for i, entry := range batch.Entries {
 		entryCount = entryCount + 1 + len(entry.Addendum)
 		currentTraceNumberODFI, err := strconv.Atoi(entry.TraceNumberField()[:8])
 		if err != nil {
 			return err
 		}
 
-		batchHeaderODFI, err := strconv.Atoi(batch.header.ODFIIdentificationField()[:8])
+		batchHeaderODFI, err := strconv.Atoi(batch.Header.ODFIIdentificationField()[:8])
 		if err != nil {
 			return err
 		}
 
 		// Add a sequenced TraceNumber if one is not already set. Have to keep original trance number Return and NOC entries
 		if currentTraceNumberODFI != batchHeaderODFI {
-			batch.entries[i].SetTraceNumber(batch.header.ODFIIdentification, seq)
+			batch.Entries[i].SetTraceNumber(batch.Header.ODFIIdentification, seq)
 		}
 		seq++
 		addendaSeq := 1
 		for x := range entry.Addendum {
 			// sequences don't exist in NOC or Return addenda
-			if a, ok := batch.entries[i].Addendum[x].(*Addenda05); ok {
+			if a, ok := batch.Entries[i].Addendum[x].(*Addenda05); ok {
 				a.SequenceNumber = addendaSeq
-				a.EntryDetailSequenceNumber = batch.parseNumField(batch.entries[i].TraceNumberField()[8:])
+				a.EntryDetailSequenceNumber = batch.parseNumField(batch.Entries[i].TraceNumberField()[8:])
 			}
 			addendaSeq++
 		}
@@ -147,47 +149,47 @@ func (batch *batch) build() error {
 
 	// build a BatchControl record
 	bc := NewBatchControl()
-	bc.ServiceClassCode = batch.header.ServiceClassCode
-	bc.CompanyIdentification = batch.header.CompanyIdentification
-	bc.ODFIIdentification = batch.header.ODFIIdentification
-	bc.BatchNumber = batch.header.BatchNumber
+	bc.ServiceClassCode = batch.Header.ServiceClassCode
+	bc.CompanyIdentification = batch.Header.CompanyIdentification
+	bc.ODFIIdentification = batch.Header.ODFIIdentification
+	bc.BatchNumber = batch.Header.BatchNumber
 	bc.EntryAddendaCount = entryCount
 	bc.EntryHash = batch.parseNumField(batch.calculateEntryHash())
 	bc.TotalCreditEntryDollarAmount, bc.TotalDebitEntryDollarAmount = batch.calculateBatchAmounts()
-	batch.control = bc
+	batch.Control = bc
 
 	return nil
 }
 
 // SetHeader appends an BatchHeader to the Batch
 func (batch *batch) SetHeader(batchHeader *BatchHeader) {
-	batch.header = batchHeader
+	batch.Header = batchHeader
 }
 
 // GetHeader returns the current Batch header
 func (batch *batch) GetHeader() *BatchHeader {
-	return batch.header
+	return batch.Header
 }
 
 // SetControl appends an BatchControl to the Batch
 func (batch *batch) SetControl(batchControl *BatchControl) {
-	batch.control = batchControl
+	batch.Control = batchControl
 }
 
 // GetControl returns the current Batch Control
 func (batch *batch) GetControl() *BatchControl {
-	return batch.control
+	return batch.Control
 }
 
 // GetEntries returns a slice of entry details for the batch
 func (batch *batch) GetEntries() []*EntryDetail {
-	return batch.entries
+	return batch.Entries
 }
 
 // AddEntry appends an EntryDetail to the Batch
 func (batch *batch) AddEntry(entry *EntryDetail) {
 	batch.category = entry.Category
-	batch.entries = append(batch.entries, entry)
+	batch.Entries = append(batch.Entries, entry)
 }
 
 // IsReturn is true if the batch contains an Entry Return
@@ -197,10 +199,10 @@ func (batch *batch) Category() string {
 
 // isFieldInclusion iterates through all the records in the batch and verifies against default fields
 func (batch *batch) isFieldInclusion() error {
-	if err := batch.header.Validate(); err != nil {
+	if err := batch.Header.Validate(); err != nil {
 		return err
 	}
-	for _, entry := range batch.entries {
+	for _, entry := range batch.Entries {
 		if err := entry.Validate(); err != nil {
 			return err
 		}
@@ -210,7 +212,7 @@ func (batch *batch) isFieldInclusion() error {
 			}
 		}
 	}
-	return batch.control.Validate()
+	return batch.Control.Validate()
 }
 
 // isBatchEntryCount validate Entry count is accurate
@@ -218,12 +220,12 @@ func (batch *batch) isFieldInclusion() error {
 // Record processed within the batch
 func (batch *batch) isBatchEntryCount() error {
 	entryCount := 0
-	for _, entry := range batch.entries {
+	for _, entry := range batch.Entries {
 		entryCount = entryCount + 1 + len(entry.Addendum)
 	}
-	if entryCount != batch.control.EntryAddendaCount {
-		msg := fmt.Sprintf(msgBatchCalculatedControlEquality, entryCount, batch.control.EntryAddendaCount)
-		return &BatchError{BatchNumber: batch.header.BatchNumber, FieldName: "EntryAddendaCount", Msg: msg}
+	if entryCount != batch.Control.EntryAddendaCount {
+		msg := fmt.Sprintf(msgBatchCalculatedControlEquality, entryCount, batch.Control.EntryAddendaCount)
+		return &BatchError{BatchNumber: batch.Header.BatchNumber, FieldName: "EntryAddendaCount", Msg: msg}
 	}
 	return nil
 }
@@ -233,20 +235,20 @@ func (batch *batch) isBatchEntryCount() error {
 // Entry Detail debit and credit totals within a given batch
 func (batch *batch) isBatchAmount() error {
 	credit, debit := batch.calculateBatchAmounts()
-	if debit != batch.control.TotalDebitEntryDollarAmount {
-		msg := fmt.Sprintf(msgBatchCalculatedControlEquality, debit, batch.control.TotalDebitEntryDollarAmount)
-		return &BatchError{BatchNumber: batch.header.BatchNumber, FieldName: "TotalDebitEntryDollarAmount", Msg: msg}
+	if debit != batch.Control.TotalDebitEntryDollarAmount {
+		msg := fmt.Sprintf(msgBatchCalculatedControlEquality, debit, batch.Control.TotalDebitEntryDollarAmount)
+		return &BatchError{BatchNumber: batch.Header.BatchNumber, FieldName: "TotalDebitEntryDollarAmount", Msg: msg}
 	}
 
-	if credit != batch.control.TotalCreditEntryDollarAmount {
-		msg := fmt.Sprintf(msgBatchCalculatedControlEquality, credit, batch.control.TotalCreditEntryDollarAmount)
-		return &BatchError{BatchNumber: batch.header.BatchNumber, FieldName: "TotalCreditEntryDollarAmount", Msg: msg}
+	if credit != batch.Control.TotalCreditEntryDollarAmount {
+		msg := fmt.Sprintf(msgBatchCalculatedControlEquality, credit, batch.Control.TotalCreditEntryDollarAmount)
+		return &BatchError{BatchNumber: batch.Header.BatchNumber, FieldName: "TotalCreditEntryDollarAmount", Msg: msg}
 	}
 	return nil
 }
 
 func (batch *batch) calculateBatchAmounts() (credit int, debit int) {
-	for _, entry := range batch.entries {
+	for _, entry := range batch.Entries {
 		if entry.TransactionCode == 21 || entry.TransactionCode == 22 || entry.TransactionCode == 23 || entry.TransactionCode == 32 || entry.TransactionCode == 33 {
 			credit = credit + entry.Amount
 		}
@@ -261,10 +263,10 @@ func (batch *batch) calculateBatchAmounts() (credit int, debit int) {
 // be in ascending Trace Number order (although Trace Numbers need not necessarily be consecutive).
 func (batch *batch) isSequenceAscending() error {
 	lastSeq := -1
-	for _, entry := range batch.entries {
+	for _, entry := range batch.Entries {
 		if entry.TraceNumber <= lastSeq {
 			msg := fmt.Sprintf(msgBatchAscending, entry.TraceNumber, lastSeq)
-			return &BatchError{BatchNumber: batch.header.BatchNumber, FieldName: "TraceNumber", Msg: msg}
+			return &BatchError{BatchNumber: batch.Header.BatchNumber, FieldName: "TraceNumber", Msg: msg}
 		}
 		lastSeq = entry.TraceNumber
 	}
@@ -274,9 +276,9 @@ func (batch *batch) isSequenceAscending() error {
 // isEntryHash validates the hash by recalculating the result
 func (batch *batch) isEntryHash() error {
 	hashField := batch.calculateEntryHash()
-	if hashField != batch.control.EntryHashField() {
-		msg := fmt.Sprintf(msgBatchCalculatedControlEquality, hashField, batch.control.EntryHashField())
-		return &BatchError{BatchNumber: batch.header.BatchNumber, FieldName: "EntryHash", Msg: msg}
+	if hashField != batch.Control.EntryHashField() {
+		msg := fmt.Sprintf(msgBatchCalculatedControlEquality, hashField, batch.Control.EntryHashField())
+		return &BatchError{BatchNumber: batch.Header.BatchNumber, FieldName: "EntryHash", Msg: msg}
 	}
 	return nil
 }
@@ -285,7 +287,7 @@ func (batch *batch) isEntryHash() error {
 // The Entry Hash provides a check against inadvertent alteration of data
 func (batch *batch) calculateEntryHash() string {
 	hash := 0
-	for _, entry := range batch.entries {
+	for _, entry := range batch.Entries {
 
 		entryRDFI, _ := strconv.Atoi(entry.RDFIIdentification)
 
@@ -296,11 +298,11 @@ func (batch *batch) calculateEntryHash() string {
 
 // The Originator Status Code is not equal to “2” for DNE if the Transaction Code is 23 or 33
 func (batch *batch) isOriginatorDNE() error {
-	if batch.header.OriginatorStatusCode != 2 {
-		for _, entry := range batch.entries {
+	if batch.Header.OriginatorStatusCode != 2 {
+		for _, entry := range batch.Entries {
 			if entry.TransactionCode == 23 || entry.TransactionCode == 33 {
-				msg := fmt.Sprintf(msgBatchOriginatorDNE, batch.header.OriginatorStatusCode)
-				return &BatchError{BatchNumber: batch.header.BatchNumber, FieldName: "OriginatorStatusCode", Msg: msg}
+				msg := fmt.Sprintf(msgBatchOriginatorDNE, batch.Header.OriginatorStatusCode)
+				return &BatchError{BatchNumber: batch.Header.BatchNumber, FieldName: "OriginatorStatusCode", Msg: msg}
 			}
 		}
 	}
@@ -310,10 +312,10 @@ func (batch *batch) isOriginatorDNE() error {
 // isTraceNumberODFI checks if the first 8 positions of the entry detail trace number
 // match the batch header odfi
 func (batch *batch) isTraceNumberODFI() error {
-	for _, entry := range batch.entries {
-		if batch.header.ODFIIdentificationField() != entry.TraceNumberField()[:8] {
-			msg := fmt.Sprintf(msgBatchTraceNumberNotODFI, batch.header.ODFIIdentificationField(), entry.TraceNumberField()[:8])
-			return &BatchError{BatchNumber: batch.header.BatchNumber, FieldName: "ODFIIdentificationField", Msg: msg}
+	for _, entry := range batch.Entries {
+		if batch.Header.ODFIIdentificationField() != entry.TraceNumberField()[:8] {
+			msg := fmt.Sprintf(msgBatchTraceNumberNotODFI, batch.Header.ODFIIdentificationField(), entry.TraceNumberField()[:8])
+			return &BatchError{BatchNumber: batch.Header.BatchNumber, FieldName: "ODFIIdentificationField", Msg: msg}
 		}
 	}
 
@@ -322,11 +324,11 @@ func (batch *batch) isTraceNumberODFI() error {
 
 // isAddendaSequence check multiple errors on addenda records in the batch entries
 func (batch *batch) isAddendaSequence() error {
-	for _, entry := range batch.entries {
+	for _, entry := range batch.Entries {
 		if len(entry.Addendum) > 0 {
 			// addenda without indicator flag of 1
 			if entry.AddendaRecordIndicator != 1 {
-				return &BatchError{BatchNumber: batch.header.BatchNumber, FieldName: "AddendaRecordIndicator", Msg: msgBatchAddendaIndicator}
+				return &BatchError{BatchNumber: batch.Header.BatchNumber, FieldName: "AddendaRecordIndicator", Msg: msgBatchAddendaIndicator}
 			}
 			lastSeq := -1
 			// check if sequence is assending
@@ -336,13 +338,13 @@ func (batch *batch) isAddendaSequence() error {
 
 					if a.SequenceNumber < lastSeq {
 						msg := fmt.Sprintf(msgBatchAscending, a.SequenceNumber, lastSeq)
-						return &BatchError{BatchNumber: batch.header.BatchNumber, FieldName: "SequenceNumber", Msg: msg}
+						return &BatchError{BatchNumber: batch.Header.BatchNumber, FieldName: "SequenceNumber", Msg: msg}
 					}
 					lastSeq = a.SequenceNumber
 					// check that we are in the correct Entry Detail
 					if !(a.EntryDetailSequenceNumberField() == entry.TraceNumberField()[8:]) {
 						msg := fmt.Sprintf(msgBatchAddendaTraceNumber, a.EntryDetailSequenceNumberField(), entry.TraceNumberField()[8:])
-						return &BatchError{BatchNumber: batch.header.BatchNumber, FieldName: "TraceNumber", Msg: msg}
+						return &BatchError{BatchNumber: batch.Header.BatchNumber, FieldName: "TraceNumber", Msg: msg}
 					}
 				}
 			}
@@ -355,10 +357,10 @@ func (batch *batch) isAddendaSequence() error {
 // Following SEC codes allow for none or one Addendum
 // "PPD", "WEB", "CCD", "CIE", "DNE", "MTE", "POS", "SHR"
 func (batch *batch) isAddendaCount(count int) error {
-	for _, entry := range batch.entries {
+	for _, entry := range batch.Entries {
 		if len(entry.Addendum) > count {
-			msg := fmt.Sprintf(msgBatchAddendaCount, len(entry.Addendum), count, batch.header.StandardEntryClassCode)
-			return &BatchError{BatchNumber: batch.header.BatchNumber, FieldName: "AddendaCount", Msg: msg}
+			msg := fmt.Sprintf(msgBatchAddendaCount, len(entry.Addendum), count, batch.Header.StandardEntryClassCode)
+			return &BatchError{BatchNumber: batch.Header.BatchNumber, FieldName: "AddendaCount", Msg: msg}
 		}
 
 	}
@@ -367,11 +369,11 @@ func (batch *batch) isAddendaCount(count int) error {
 
 // isTypeCode takes a typecode string and verifies addenda records match
 func (batch *batch) isTypeCode(typeCode string) error {
-	for _, entry := range batch.entries {
+	for _, entry := range batch.Entries {
 		for _, addenda := range entry.Addendum {
 			if addenda.TypeCode() != typeCode {
-				msg := fmt.Sprintf(msgBatchTypeCode, addenda.TypeCode(), typeCode, batch.header.StandardEntryClassCode)
-				return &BatchError{BatchNumber: batch.header.BatchNumber, FieldName: "TypeCode", Msg: msg}
+				msg := fmt.Sprintf(msgBatchTypeCode, addenda.TypeCode(), typeCode, batch.Header.StandardEntryClassCode)
+				return &BatchError{BatchNumber: batch.Header.BatchNumber, FieldName: "TypeCode", Msg: msg}
 			}
 		}
 	}
@@ -381,13 +383,13 @@ func (batch *batch) isTypeCode(typeCode string) error {
 // isCategory verifies that a Forward and Return Category are not in the same batch
 func (batch *batch) isCategory() error {
 	category := batch.GetEntries()[0].Category
-	if len(batch.entries) > 1 {
-		for i := 1; i < len(batch.entries); i++ {
-			if batch.entries[i].Category == CategoryNOC {
+	if len(batch.Entries) > 1 {
+		for i := 1; i < len(batch.Entries); i++ {
+			if batch.Entries[i].Category == CategoryNOC {
 				continue
 			}
-			if batch.entries[i].Category != category {
-				return &BatchError{BatchNumber: batch.header.BatchNumber, FieldName: "Category", Msg: msgBatchForwardReturn}
+			if batch.Entries[i].Category != category {
+				return &BatchError{BatchNumber: batch.Header.BatchNumber, FieldName: "Category", Msg: msgBatchForwardReturn}
 			}
 		}
 	}
@@ -398,11 +400,11 @@ func (batch *batch) isCategory() error {
 // "R" For a recurring WEB Entry
 // "S" For a Single-Entry WEB Entry
 func (batch *batch) isPaymentTypeCode() error {
-	for _, entry := range batch.entries {
+	for _, entry := range batch.Entries {
 		if !strings.Contains(strings.ToUpper(entry.PaymentTypeField()), "S") && !strings.Contains(strings.ToUpper(entry.PaymentTypeField()), "R") {
 			// TODO dead code because PaymentTypeField always returns S regardless of Discretionary Data value
 			msg := fmt.Sprintf(msgBatchWebPaymentType, entry.PaymentTypeField())
-			return &BatchError{BatchNumber: batch.header.BatchNumber, FieldName: "PaymentType", Msg: msg}
+			return &BatchError{BatchNumber: batch.Header.BatchNumber, FieldName: "PaymentType", Msg: msg}
 		}
 	}
 	return nil
diff --git a/batchCCD.go b/batchCCD.go
index 0ff08f3a..025857af 100644
--- a/batchCCD.go
+++ b/batchCCD.go
@@ -39,9 +39,9 @@ func (batch *BatchCCD) Validate() error {
 	}
 
 	// Add type specific validation.
-	if batch.header.StandardEntryClassCode != "CCD" {
-		msg := fmt.Sprintf(msgBatchSECType, batch.header.StandardEntryClassCode, "CCD")
-		return &BatchError{BatchNumber: batch.header.BatchNumber, FieldName: "StandardEntryClassCode", Msg: msg}
+	if batch.Header.StandardEntryClassCode != "CCD" {
+		msg := fmt.Sprintf(msgBatchSECType, batch.Header.StandardEntryClassCode, "CCD")
+		return &BatchError{BatchNumber: batch.Header.BatchNumber, FieldName: "StandardEntryClassCode", Msg: msg}
 	}
 
 	return nil
diff --git a/batchCOR.go b/batchCOR.go
index 97949eb6..e3be0db7 100644
--- a/batchCOR.go
+++ b/batchCOR.go
@@ -40,16 +40,16 @@ func (batch *BatchCOR) Validate() error {
 	}
 
 	// Add type specific validation.
-	if batch.header.StandardEntryClassCode != "COR" {
-		msg := fmt.Sprintf(msgBatchSECType, batch.header.StandardEntryClassCode, "COR")
-		return &BatchError{BatchNumber: batch.header.BatchNumber, FieldName: "StandardEntryClassCode", Msg: msg}
+	if batch.Header.StandardEntryClassCode != "COR" {
+		msg := fmt.Sprintf(msgBatchSECType, batch.Header.StandardEntryClassCode, "COR")
+		return &BatchError{BatchNumber: batch.Header.BatchNumber, FieldName: "StandardEntryClassCode", Msg: msg}
 	}
 
 	// The Amount field must be zero
 	// batch.verify calls batch.isBatchAmount which ensures the batch.Control values are accurate.
-	if batch.control.TotalCreditEntryDollarAmount != 0 || batch.control.TotalDebitEntryDollarAmount != 0 {
-		msg := fmt.Sprintf(msgBatchCORAmount, batch.control.TotalCreditEntryDollarAmount, batch.control.TotalDebitEntryDollarAmount)
-		return &BatchError{BatchNumber: batch.header.BatchNumber, FieldName: "Amount", Msg: msg}
+	if batch.Control.TotalCreditEntryDollarAmount != 0 || batch.Control.TotalDebitEntryDollarAmount != 0 {
+		msg := fmt.Sprintf(msgBatchCORAmount, batch.Control.TotalCreditEntryDollarAmount, batch.Control.TotalDebitEntryDollarAmount)
+		return &BatchError{BatchNumber: batch.Header.BatchNumber, FieldName: "Amount", Msg: msg}
 	}
 
 	return nil
@@ -67,22 +67,22 @@ func (batch *BatchCOR) Create() error {
 
 // isAddenda98 verifies that a Addenda98 exists for each EntryDetail and is Validated
 func (batch *BatchCOR) isAddenda98() error {
-	for _, entry := range batch.entries {
+	for _, entry := range batch.Entries {
 		// Addenda type must be equal to 1
 		if len(entry.Addendum) != 1 {
-			return &BatchError{BatchNumber: batch.header.BatchNumber, FieldName: "Addendum", Msg: msgBatchCORAddenda}
+			return &BatchError{BatchNumber: batch.Header.BatchNumber, FieldName: "Addendum", Msg: msgBatchCORAddenda}
 		}
 		// Addenda type assertion must be Addenda98
 		addenda98, ok := entry.Addendum[0].(*Addenda98)
 		if !ok {
 			msg := fmt.Sprintf(msgBatchCORAddendaType, entry.Addendum[0])
-			return &BatchError{BatchNumber: batch.header.BatchNumber, FieldName: "Addendum", Msg: msg}
+			return &BatchError{BatchNumber: batch.Header.BatchNumber, FieldName: "Addendum", Msg: msg}
 		}
 		// Addenda98 must be Validated
 		if err := addenda98.Validate(); err != nil {
 			// convert the field error in to a batch error for a consistent api
 			if e, ok := err.(*FieldError); ok {
-				return &BatchError{BatchNumber: batch.header.BatchNumber, FieldName: e.FieldName, Msg: e.Msg}
+				return &BatchError{BatchNumber: batch.Header.BatchNumber, FieldName: e.FieldName, Msg: e.Msg}
 			}
 		}
 	}
diff --git a/batchControl.go b/batchControl.go
index 916c7456..16e0ead0 100644
--- a/batchControl.go
+++ b/batchControl.go
@@ -13,55 +13,57 @@ import (
 // BatchControl contains entry counts, dollar total and has totals for all
 // entries contained in the preceding batch
 type BatchControl struct {
-	// RecordType defines the type of record in the block. batchControlPos 8
+	// ID is a client defined string used as a reference to this record.
+	ID string `json:"id"`
+	// RecordType defines the type of record in the block.
 	recordType string
 	// ServiceClassCode ACH Mixed Debits and Credits ‘200’
 	// ACH Credits Only ‘220’
 	// ACH Debits Only ‘225'
 	// Same as 'ServiceClassCode' in BatchHeaderRecord
-	ServiceClassCode int
+	ServiceClassCode int `json:"serviceClassCode"`
 	// EntryAddendaCount is a tally of each Entry Detail Record and each Addenda
 	// Record processed, within either the batch or file as appropriate.
-	EntryAddendaCount int
+	EntryAddendaCount int `json:"entryAddendaÇount"`
 	// validate the Receiving DFI Identification in each Entry Detail Record is hashed
 	// to provide a check against inadvertent alteration of data contents due
-	// to hardware failure or program erro
+	// to hardware failure or program error
 	//
 	// In this context the Entry Hash is the sum of the corresponding fields in the
 	// Entry Detail Records on the file.
-	EntryHash int
+	EntryHash int `json:"entryHash"`
 	// TotalDebitEntryDollarAmount Contains accumulated Entry debit totals within the batch.
-	TotalDebitEntryDollarAmount int
+	TotalDebitEntryDollarAmount int `json:"totalDebit"`
 	// TotalCreditEntryDollarAmount Contains accumulated Entry credit totals within the batch.
-	TotalCreditEntryDollarAmount int
-	// CompanyIdentification is an alphameric code used to identify an Originato
+	TotalCreditEntryDollarAmount int `json:"totalCredit"`
+	// CompanyIdentification is an alphameric code used to identify an Originator
 	// The Company Identification Field must be included on all
-	// prenotification records and on each entry initiated puruant to such
+	// prenotification records and on each entry initiated pursuant to such
 	// prenotification. The Company ID may begin with the ANSI one-digit
-	// Identification Code Designators (ICD), followed by the identification
-	// numbe The ANSI Identification Numbers and related Identification Code
-	// Designators (ICD) are:
+	// Identification Code Designator (ICD), followed by the identification
+	// number The ANSI Identification Numbers and related Identification Code
+	// Designator (ICD) are:
 	//
 	// IRS Employer Identification Number (EIN) "1"
 	// Data Universal Numbering Systems (DUNS) "3"
 	// User Assigned Number "9"
-	CompanyIdentification string
+	CompanyIdentification string `json:"companyIdentification"`
 	// MessageAuthenticationCode the MAC is an eight character code derived from a special key used in
 	// conjunction with the DES algorithm. The purpose of the MAC is to
 	// validate the authenticity of ACH entries. The DES algorithm and key
 	// message standards must be in accordance with standards adopted by the
 	// American National Standards Institute. The remaining eleven characters
 	// of this field are blank.
-	MessageAuthenticationCode string
+	MessageAuthenticationCode string `json:"messageAuthentication,omitempty"`
 	// Reserved for the future - Blank, 6 characters long
 	reserved string
-	// OdfiIdentification the routing number is used to identify the DFI originating entries within a given branch.
-	ODFIIdentification string
+	// ODFIIdentification the routing number is used to identify the DFI originating entries within a given branch.
+	ODFIIdentification string `json:"ODFIIdentification"`
 	// BatchNumber this number is assigned in ascending sequence to each batch by the ODFI
 	// or its Sending Point in a given file of entries. Since the batch number
 	// in the Batch Header Record and the Batch Control Record is the same,
 	// the ascending sequence number should be assigned by batch and not by record.
-	BatchNumber int
+	BatchNumber int `json:"batchNumber"`
 	// validator is composed for data validation
 	validator
 	// converters is composed for ACH to golang Converters
diff --git a/batchHeader.go b/batchHeader.go
index 033abd92..58d48330 100644
--- a/batchHeader.go
+++ b/batchHeader.go
@@ -19,27 +19,29 @@ import (
 // settlement date, for all entries contained in this batch. The settlement date
 // field is not entered as it is determined by the ACH operator
 type BatchHeader struct {
+	// ID is a client defined string used as a reference to this record.
+	ID string `json:"id"`
 	// RecordType defines the type of record in the block. 5
 	recordType string
 
 	// ServiceClassCode ACH Mixed Debits and Credits ‘200’
 	// ACH Credits Only ‘220’
 	// ACH Debits Only ‘225'
-	ServiceClassCode int
+	ServiceClassCode int `json:"serviceClassCode"`
 
 	// CompanyName the company originating the entries in the batch
-	CompanyName string
+	CompanyName string `json:"companyName"`
 
 	// CompanyDiscretionaryData allows Originators and/or ODFIs to include codes (one or more),
 	// of significance only to them, to enable specialized handling of all
 	// subsequent entries in that batch. There will be no standardized
 	// interpretation for the value of the field. This field must be returned
 	// intact on any return entry.
-	CompanyDiscretionaryData string
+	CompanyDiscretionaryData string `json:"companyDiscretionaryData,omitempty"`
 
 	// CompanyIdentification The 9 digit FEIN number (proceeded by a predetermined
 	// alpha or numeric character) of the entity in the company name field
-	CompanyIdentification string
+	CompanyIdentification string `json:"companyIdentification"`
 
 	// StandardEntryClassCode
 	// Identifies the payment type (product) found within an ACH batch-using a 3-character code.
@@ -48,7 +50,7 @@ type BatchHeader struct {
 	// Determines addenda records (required or optional PLUS one or up to 9,999 records).
 	// Determines rules to follow (return time frames).
 	// Some SEC codes require specific data in predetermined fields within the ACH record
-	StandardEntryClassCode string
+	StandardEntryClassCode string `json:"standardEntryClassCode,omitempty"`
 
 	// CompanyEntryDescription A description of the entries contained in the batch
 	//
@@ -65,7 +67,7 @@ type BatchHeader struct {
 	//
 	// This field must contain the word "NONSETTLED" (left justified) when the
 	// batch contains entries which could not settle.
-	CompanyEntryDescription string
+	CompanyEntryDescription string `json:"companyEntryDescription,omitempty"`
 
 	// CompanyDescriptiveDate except as otherwise noted below, the Originator establishes this field
 	// as the date it would like to see displayed to the receiver for
@@ -73,10 +75,10 @@ type BatchHeader struct {
 	// computer or manual operation. It is solely for descriptive purposes.
 	// The RDFI should not assume any specific format. Examples of possible
 	// entries in this field are "011392,", "01 92," "JAN 13," "JAN 92," etc.
-	CompanyDescriptiveDate string
+	CompanyDescriptiveDate string `json:"companyDescriptiveDate,omitempty"`
 
 	// EffectiveEntryDate the date on which the entries are to settle
-	EffectiveEntryDate time.Time
+	EffectiveEntryDate time.Time `json:"effectiveEntryDate,omitempty"`
 
 	// SettlementDate Leave blank, this field is inserted by the ACH operator
 	settlementDate string
@@ -85,17 +87,17 @@ type BatchHeader struct {
 	// 0 ADV File prepared by an ACH Operator.
 	// 1 This code identifies the Originator as a depository financial institution.
 	// 2 This code identifies the Originator as a Federal Government entity or agency.
-	OriginatorStatusCode int
+	OriginatorStatusCode int `json:"originatorStatusCode,omitempty"`
 
 	//ODFIIdentification First 8 digits of the originating DFI transit routing number
-	ODFIIdentification string
+	ODFIIdentification string `json:"ODFIIdentification"`
 
 	// BatchNumber is assigned in ascending sequence to each batch by the ODFI
 	// or its Sending Point in a given file of entries. Since the batch number
 	// in the Batch Header Record and the Batch Control Record is the same,
 	// the ascending sequence number should be assigned by batch and not by
 	// record.
-	BatchNumber int
+	BatchNumber int `json:"batchNumber,omitempty"`
 
 	// validator is composed for data validation
 	validator
diff --git a/batchTEL.go b/batchTEL.go
index d7c77e72..a95fcada 100644
--- a/batchTEL.go
+++ b/batchTEL.go
@@ -34,15 +34,15 @@ func (batch *BatchTEL) Validate() error {
 	}
 
 	// Add type specific validation.
-	if batch.header.StandardEntryClassCode != "TEL" {
-		msg := fmt.Sprintf(msgBatchSECType, batch.header.StandardEntryClassCode, "TEL")
-		return &BatchError{BatchNumber: batch.header.BatchNumber, FieldName: "StandardEntryClassCode", Msg: msg}
+	if batch.Header.StandardEntryClassCode != "TEL" {
+		msg := fmt.Sprintf(msgBatchSECType, batch.Header.StandardEntryClassCode, "TEL")
+		return &BatchError{BatchNumber: batch.Header.BatchNumber, FieldName: "StandardEntryClassCode", Msg: msg}
 	}
 	// can not have credits in TEL batches
-	for _, entry := range batch.entries {
+	for _, entry := range batch.Entries {
 		if entry.CreditOrDebit() != "D" {
 			msg := fmt.Sprintf(msgBatchTransactionCodeCredit, entry.IndividualName)
-			return &BatchError{BatchNumber: batch.header.BatchNumber, FieldName: "TransactionCode", Msg: msg}
+			return &BatchError{BatchNumber: batch.Header.BatchNumber, FieldName: "TransactionCode", Msg: msg}
 		}
 	}
 
diff --git a/batchWeb.go b/batchWeb.go
index c88c946c..00d987fb 100644
--- a/batchWeb.go
+++ b/batchWeb.go
@@ -39,9 +39,9 @@ func (batch *BatchWEB) Validate() error {
 	}
 
 	// Add type specific validation.
-	if batch.header.StandardEntryClassCode != "WEB" {
-		msg := fmt.Sprintf(msgBatchSECType, batch.header.StandardEntryClassCode, "WEB")
-		return &BatchError{BatchNumber: batch.header.BatchNumber, FieldName: "StandardEntryClassCode", Msg: msg}
+	if batch.Header.StandardEntryClassCode != "WEB" {
+		msg := fmt.Sprintf(msgBatchSECType, batch.Header.StandardEntryClassCode, "WEB")
+		return &BatchError{BatchNumber: batch.Header.BatchNumber, FieldName: "StandardEntryClassCode", Msg: msg}
 	}
 
 	return batch.isPaymentTypeCode()
diff --git a/coverage.out b/coverage.out
deleted file mode 100644
index 55316af2..00000000
--- a/coverage.out
+++ /dev/null
@@ -1,688 +0,0 @@
-mode: count
-github.com/wadearnold/ach/batchCOR.go:19.45,24.2 4 9
-github.com/wadearnold/ach/batchCOR.go:27.41,29.39 1 12
-github.com/wadearnold/ach/batchCOR.go:34.2,34.44 1 12
-github.com/wadearnold/ach/batchCOR.go:39.2,39.50 1 9
-github.com/wadearnold/ach/batchCOR.go:46.2,46.103 1 8
-github.com/wadearnold/ach/batchCOR.go:51.2,51.12 1 7
-github.com/wadearnold/ach/batchCOR.go:29.39,31.3 1 0
-github.com/wadearnold/ach/batchCOR.go:34.44,36.3 1 3
-github.com/wadearnold/ach/batchCOR.go:39.50,42.3 2 1
-github.com/wadearnold/ach/batchCOR.go:46.103,49.3 2 1
-github.com/wadearnold/ach/batchCOR.go:55.39,57.38 1 11
-github.com/wadearnold/ach/batchCOR.go:61.2,61.25 1 10
-github.com/wadearnold/ach/batchCOR.go:57.38,59.3 1 1
-github.com/wadearnold/ach/batchCOR.go:65.44,66.38 1 12
-github.com/wadearnold/ach/batchCOR.go:85.2,85.12 1 9
-github.com/wadearnold/ach/batchCOR.go:66.38,68.31 1 12
-github.com/wadearnold/ach/batchCOR.go:72.3,73.10 2 11
-github.com/wadearnold/ach/batchCOR.go:78.3,78.46 1 10
-github.com/wadearnold/ach/batchCOR.go:68.31,70.4 1 1
-github.com/wadearnold/ach/batchCOR.go:73.10,76.4 2 1
-github.com/wadearnold/ach/batchCOR.go:78.46,80.38 1 1
-github.com/wadearnold/ach/batchCOR.go:80.38,82.5 1 1
-github.com/wadearnold/ach/batchWeb.go:19.45,24.2 4 9
-github.com/wadearnold/ach/batchWeb.go:27.41,29.39 1 13
-github.com/wadearnold/ach/batchWeb.go:34.2,34.48 1 12
-github.com/wadearnold/ach/batchWeb.go:37.2,37.47 1 11
-github.com/wadearnold/ach/batchWeb.go:42.2,42.50 1 10
-github.com/wadearnold/ach/batchWeb.go:47.2,47.34 1 9
-github.com/wadearnold/ach/batchWeb.go:29.39,31.3 1 1
-github.com/wadearnold/ach/batchWeb.go:34.48,36.3 1 1
-github.com/wadearnold/ach/batchWeb.go:37.47,39.3 1 1
-github.com/wadearnold/ach/batchWeb.go:42.50,45.3 2 1
-github.com/wadearnold/ach/batchWeb.go:51.39,53.38 1 8
-github.com/wadearnold/ach/batchWeb.go:57.2,57.25 1 7
-github.com/wadearnold/ach/batchWeb.go:53.38,55.3 1 1
-github.com/wadearnold/ach/fileHeader.go:96.33,106.2 2 45
-github.com/wadearnold/ach/fileHeader.go:109.44,137.2 13 11
-github.com/wadearnold/ach/fileHeader.go:140.39,157.2 1 5
-github.com/wadearnold/ach/fileHeader.go:161.40,163.44 1 45
-github.com/wadearnold/ach/fileHeader.go:166.2,166.26 1 36
-github.com/wadearnold/ach/fileHeader.go:170.2,170.66 1 35
-github.com/wadearnold/ach/fileHeader.go:173.2,173.33 1 33
-github.com/wadearnold/ach/fileHeader.go:177.2,177.28 1 32
-github.com/wadearnold/ach/fileHeader.go:180.2,180.31 1 31
-github.com/wadearnold/ach/fileHeader.go:183.2,183.26 1 30
-github.com/wadearnold/ach/fileHeader.go:186.2,186.71 1 29
-github.com/wadearnold/ach/fileHeader.go:189.2,189.39 1 28
-github.com/wadearnold/ach/fileHeader.go:192.2,192.44 1 27
-github.com/wadearnold/ach/fileHeader.go:195.2,195.66 1 26
-github.com/wadearnold/ach/fileHeader.go:198.2,198.60 1 25
-github.com/wadearnold/ach/fileHeader.go:208.2,208.12 1 24
-github.com/wadearnold/ach/fileHeader.go:163.44,165.3 1 9
-github.com/wadearnold/ach/fileHeader.go:166.26,169.3 2 1
-github.com/wadearnold/ach/fileHeader.go:170.66,172.3 1 2
-github.com/wadearnold/ach/fileHeader.go:173.33,176.3 2 1
-github.com/wadearnold/ach/fileHeader.go:177.28,179.3 1 1
-github.com/wadearnold/ach/fileHeader.go:180.31,182.3 1 1
-github.com/wadearnold/ach/fileHeader.go:183.26,185.3 1 1
-github.com/wadearnold/ach/fileHeader.go:186.71,188.3 1 1
-github.com/wadearnold/ach/fileHeader.go:189.39,191.3 1 1
-github.com/wadearnold/ach/fileHeader.go:192.44,194.3 1 1
-github.com/wadearnold/ach/fileHeader.go:195.66,197.3 1 1
-github.com/wadearnold/ach/fileHeader.go:198.60,200.3 1 1
-github.com/wadearnold/ach/fileHeader.go:213.46,214.25 1 45
-github.com/wadearnold/ach/fileHeader.go:217.2,217.35 1 43
-github.com/wadearnold/ach/fileHeader.go:220.2,220.30 1 42
-github.com/wadearnold/ach/fileHeader.go:223.2,223.34 1 41
-github.com/wadearnold/ach/fileHeader.go:226.2,226.29 1 40
-github.com/wadearnold/ach/fileHeader.go:229.2,229.25 1 39
-github.com/wadearnold/ach/fileHeader.go:232.2,232.29 1 38
-github.com/wadearnold/ach/fileHeader.go:235.2,235.25 1 37
-github.com/wadearnold/ach/fileHeader.go:238.2,238.12 1 36
-github.com/wadearnold/ach/fileHeader.go:214.25,216.3 1 2
-github.com/wadearnold/ach/fileHeader.go:217.35,219.3 1 1
-github.com/wadearnold/ach/fileHeader.go:220.30,222.3 1 1
-github.com/wadearnold/ach/fileHeader.go:223.34,225.3 1 1
-github.com/wadearnold/ach/fileHeader.go:226.29,228.3 1 1
-github.com/wadearnold/ach/fileHeader.go:229.25,231.3 1 1
-github.com/wadearnold/ach/fileHeader.go:232.29,234.3 1 1
-github.com/wadearnold/ach/fileHeader.go:235.25,237.3 1 1
-github.com/wadearnold/ach/fileHeader.go:242.58,244.2 1 7
-github.com/wadearnold/ach/fileHeader.go:247.53,249.2 1 7
-github.com/wadearnold/ach/fileHeader.go:252.54,254.2 1 6
-github.com/wadearnold/ach/fileHeader.go:257.54,259.2 1 6
-github.com/wadearnold/ach/fileHeader.go:262.62,264.2 1 6
-github.com/wadearnold/ach/fileHeader.go:267.57,269.2 1 6
-github.com/wadearnold/ach/fileHeader.go:272.51,274.2 1 6
-github.com/wadearnold/ach/reader.go:22.37,23.20 1 2
-github.com/wadearnold/ach/reader.go:26.2,26.79 1 1
-github.com/wadearnold/ach/reader.go:23.20,25.3 1 1
-github.com/wadearnold/ach/reader.go:46.41,52.2 1 24
-github.com/wadearnold/ach/reader.go:56.49,58.2 1 24
-github.com/wadearnold/ach/reader.go:61.37,65.2 1 38
-github.com/wadearnold/ach/reader.go:70.39,73.23 2 27
-github.com/wadearnold/ach/reader.go:94.2,94.37 1 8
-github.com/wadearnold/ach/reader.go:99.2,99.39 1 5
-github.com/wadearnold/ach/reader.go:105.2,105.20 1 4
-github.com/wadearnold/ach/reader.go:73.23,78.10 4 73
-github.com/wadearnold/ach/reader.go:79.84,80.57 1 2
-github.com/wadearnold/ach/reader.go:83.35,86.31 3 3
-github.com/wadearnold/ach/reader.go:87.11,89.40 2 68
-github.com/wadearnold/ach/reader.go:80.57,82.5 1 1
-github.com/wadearnold/ach/reader.go:89.40,91.5 1 15
-github.com/wadearnold/ach/reader.go:94.37,98.3 2 3
-github.com/wadearnold/ach/reader.go:99.39,103.3 2 1
-github.com/wadearnold/ach/reader.go:108.60,111.26 2 2
-github.com/wadearnold/ach/reader.go:121.2,121.12 1 1
-github.com/wadearnold/ach/reader.go:111.26,113.39 2 658
-github.com/wadearnold/ach/reader.go:113.39,115.40 2 7
-github.com/wadearnold/ach/reader.go:118.4,118.15 1 6
-github.com/wadearnold/ach/reader.go:115.40,117.5 1 1
-github.com/wadearnold/ach/reader.go:124.36,125.20 1 75
-github.com/wadearnold/ach/reader.go:164.2,164.12 1 59
-github.com/wadearnold/ach/reader.go:126.21,127.45 1 9
-github.com/wadearnold/ach/reader.go:130.22,131.46 1 17
-github.com/wadearnold/ach/reader.go:134.22,135.46 1 16
-github.com/wadearnold/ach/reader.go:138.23,139.42 1 7
-github.com/wadearnold/ach/reader.go:142.23,143.47 1 9
-github.com/wadearnold/ach/reader.go:146.3,146.51 1 7
-github.com/wadearnold/ach/reader.go:150.3,151.23 2 6
-github.com/wadearnold/ach/reader.go:152.22,153.25 1 16
-github.com/wadearnold/ach/reader.go:157.3,157.46 1 6
-github.com/wadearnold/ach/reader.go:160.10,162.83 2 1
-github.com/wadearnold/ach/reader.go:127.45,129.4 1 2
-github.com/wadearnold/ach/reader.go:131.46,133.4 1 3
-github.com/wadearnold/ach/reader.go:135.46,137.4 1 1
-github.com/wadearnold/ach/reader.go:139.42,141.4 1 4
-github.com/wadearnold/ach/reader.go:143.47,145.4 1 2
-github.com/wadearnold/ach/reader.go:146.51,149.4 2 1
-github.com/wadearnold/ach/reader.go:153.25,155.9 1 10
-github.com/wadearnold/ach/reader.go:157.46,159.4 1 2
-github.com/wadearnold/ach/reader.go:168.42,170.37 2 11
-github.com/wadearnold/ach/reader.go:174.2,176.49 2 11
-github.com/wadearnold/ach/reader.go:179.2,179.12 1 9
-github.com/wadearnold/ach/reader.go:170.37,173.3 1 1
-github.com/wadearnold/ach/reader.go:176.49,178.3 1 2
-github.com/wadearnold/ach/reader.go:183.43,185.27 2 19
-github.com/wadearnold/ach/reader.go:191.2,193.38 3 18
-github.com/wadearnold/ach/reader.go:198.2,199.16 2 16
-github.com/wadearnold/ach/reader.go:203.2,204.12 2 16
-github.com/wadearnold/ach/reader.go:185.27,188.3 1 1
-github.com/wadearnold/ach/reader.go:193.38,195.3 1 2
-github.com/wadearnold/ach/reader.go:199.16,201.3 1 0
-github.com/wadearnold/ach/reader.go:208.43,210.27 2 18
-github.com/wadearnold/ach/reader.go:213.2,215.38 3 17
-github.com/wadearnold/ach/reader.go:218.2,219.12 2 17
-github.com/wadearnold/ach/reader.go:210.27,212.3 1 1
-github.com/wadearnold/ach/reader.go:215.38,217.3 1 0
-github.com/wadearnold/ach/reader.go:223.39,226.27 2 7
-github.com/wadearnold/ach/reader.go:230.2,230.43 1 6
-github.com/wadearnold/ach/reader.go:233.2,236.39 3 5
-github.com/wadearnold/ach/reader.go:265.2,265.12 1 3
-github.com/wadearnold/ach/reader.go:226.27,229.3 2 1
-github.com/wadearnold/ach/reader.go:230.43,232.3 1 1
-github.com/wadearnold/ach/reader.go:236.39,237.22 1 4
-github.com/wadearnold/ach/reader.go:238.13,241.47 3 2
-github.com/wadearnold/ach/reader.go:244.4,244.65 1 1
-github.com/wadearnold/ach/reader.go:245.13,248.47 3 1
-github.com/wadearnold/ach/reader.go:251.4,251.65 1 1
-github.com/wadearnold/ach/reader.go:252.13,255.47 3 1
-github.com/wadearnold/ach/reader.go:258.4,258.65 1 1
-github.com/wadearnold/ach/reader.go:241.47,243.5 1 1
-github.com/wadearnold/ach/reader.go:248.47,250.5 1 0
-github.com/wadearnold/ach/reader.go:255.47,257.5 1 0
-github.com/wadearnold/ach/reader.go:260.8,263.3 2 1
-github.com/wadearnold/ach/reader.go:269.44,271.27 2 11
-github.com/wadearnold/ach/reader.go:275.2,276.63 2 10
-github.com/wadearnold/ach/reader.go:279.2,279.12 1 9
-github.com/wadearnold/ach/reader.go:271.27,274.3 1 1
-github.com/wadearnold/ach/reader.go:276.63,278.3 1 1
-github.com/wadearnold/ach/reader.go:283.43,285.39 2 8
-github.com/wadearnold/ach/reader.go:289.2,290.50 2 7
-github.com/wadearnold/ach/reader.go:293.2,293.12 1 6
-github.com/wadearnold/ach/reader.go:285.39,288.3 1 1
-github.com/wadearnold/ach/reader.go:290.50,292.3 1 1
-github.com/wadearnold/ach/batchCCD.go:15.45,20.2 4 7
-github.com/wadearnold/ach/batchCCD.go:23.41,25.39 1 13
-github.com/wadearnold/ach/batchCCD.go:30.2,30.48 1 10
-github.com/wadearnold/ach/batchCCD.go:33.2,33.47 1 8
-github.com/wadearnold/ach/batchCCD.go:38.2,38.50 1 7
-github.com/wadearnold/ach/batchCCD.go:43.2,43.12 1 6
-github.com/wadearnold/ach/batchCCD.go:25.39,27.3 1 3
-github.com/wadearnold/ach/batchCCD.go:30.48,32.3 1 2
-github.com/wadearnold/ach/batchCCD.go:33.47,35.3 1 1
-github.com/wadearnold/ach/batchCCD.go:38.50,41.3 2 1
-github.com/wadearnold/ach/batchCCD.go:47.39,49.38 1 8
-github.com/wadearnold/ach/batchCCD.go:53.2,53.25 1 7
-github.com/wadearnold/ach/batchCCD.go:49.38,51.3 1 1
-github.com/wadearnold/ach/batchHeader.go:108.36,115.2 2 228
-github.com/wadearnold/ach/batchHeader.go:118.45,153.2 13 18
-github.com/wadearnold/ach/batchHeader.go:156.40,172.2 1 14
-github.com/wadearnold/ach/batchHeader.go:176.41,177.44 1 212
-github.com/wadearnold/ach/batchHeader.go:180.2,180.26 1 198
-github.com/wadearnold/ach/batchHeader.go:184.2,184.63 1 197
-github.com/wadearnold/ach/batchHeader.go:187.2,187.64 1 194
-github.com/wadearnold/ach/batchHeader.go:190.2,190.75 1 192
-github.com/wadearnold/ach/batchHeader.go:193.2,193.58 1 191
-github.com/wadearnold/ach/batchHeader.go:196.2,196.71 1 190
-github.com/wadearnold/ach/batchHeader.go:199.2,199.68 1 189
-github.com/wadearnold/ach/batchHeader.go:202.2,202.70 1 188
-github.com/wadearnold/ach/batchHeader.go:205.2,205.12 1 187
-github.com/wadearnold/ach/batchHeader.go:177.44,179.3 1 14
-github.com/wadearnold/ach/batchHeader.go:180.26,183.3 2 1
-github.com/wadearnold/ach/batchHeader.go:184.63,186.3 1 3
-github.com/wadearnold/ach/batchHeader.go:187.64,189.3 1 2
-github.com/wadearnold/ach/batchHeader.go:190.75,192.3 1 1
-github.com/wadearnold/ach/batchHeader.go:193.58,195.3 1 1
-github.com/wadearnold/ach/batchHeader.go:196.71,198.3 1 1
-github.com/wadearnold/ach/batchHeader.go:199.68,201.3 1 1
-github.com/wadearnold/ach/batchHeader.go:202.70,204.3 1 1
-github.com/wadearnold/ach/batchHeader.go:210.47,211.25 1 212
-github.com/wadearnold/ach/batchHeader.go:214.2,214.30 1 211
-github.com/wadearnold/ach/batchHeader.go:217.2,217.26 1 204
-github.com/wadearnold/ach/batchHeader.go:220.2,220.36 1 203
-github.com/wadearnold/ach/batchHeader.go:223.2,223.37 1 202
-github.com/wadearnold/ach/batchHeader.go:226.2,226.38 1 201
-github.com/wadearnold/ach/batchHeader.go:229.2,229.33 1 200
-github.com/wadearnold/ach/batchHeader.go:232.2,232.12 1 198
-github.com/wadearnold/ach/batchHeader.go:211.25,213.3 1 1
-github.com/wadearnold/ach/batchHeader.go:214.30,216.3 1 7
-github.com/wadearnold/ach/batchHeader.go:217.26,219.3 1 1
-github.com/wadearnold/ach/batchHeader.go:220.36,222.3 1 1
-github.com/wadearnold/ach/batchHeader.go:223.37,225.3 1 1
-github.com/wadearnold/ach/batchHeader.go:226.38,228.3 1 1
-github.com/wadearnold/ach/batchHeader.go:229.33,231.3 1 2
-github.com/wadearnold/ach/batchHeader.go:236.50,238.2 1 15
-github.com/wadearnold/ach/batchHeader.go:241.63,243.2 1 15
-github.com/wadearnold/ach/batchHeader.go:246.60,248.2 1 15
-github.com/wadearnold/ach/batchHeader.go:251.62,253.2 1 15
-github.com/wadearnold/ach/batchHeader.go:256.61,258.2 1 14
-github.com/wadearnold/ach/batchHeader.go:261.57,263.2 1 15
-github.com/wadearnold/ach/batchHeader.go:266.57,268.2 1 188
-github.com/wadearnold/ach/batchHeader.go:271.50,273.2 1 15
-github.com/wadearnold/ach/batchHeader.go:275.53,277.2 1 14
-github.com/wadearnold/ach/batchPPD.go:13.45,18.2 4 41
-github.com/wadearnold/ach/batchPPD.go:21.41,23.39 1 30
-github.com/wadearnold/ach/batchPPD.go:29.2,29.48 1 23
-github.com/wadearnold/ach/batchPPD.go:32.2,32.47 1 23
-github.com/wadearnold/ach/batchPPD.go:38.2,38.12 1 20
-github.com/wadearnold/ach/batchPPD.go:23.39,25.3 1 7
-github.com/wadearnold/ach/batchPPD.go:29.48,31.3 1 0
-github.com/wadearnold/ach/batchPPD.go:32.47,34.3 1 3
-github.com/wadearnold/ach/batchPPD.go:42.39,44.38 1 21
-github.com/wadearnold/ach/batchPPD.go:50.2,50.25 1 20
-github.com/wadearnold/ach/batchPPD.go:44.38,46.3 1 1
-github.com/wadearnold/ach/batcher.go:35.37,37.2 1 1
-github.com/wadearnold/ach/addenda05.go:36.32,41.2 4 45
-github.com/wadearnold/ach/addenda05.go:44.50,56.2 5 4
-github.com/wadearnold/ach/addenda05.go:59.45,66.2 1 7
-github.com/wadearnold/ach/addenda05.go:69.79,73.2 2 0
-github.com/wadearnold/ach/addenda05.go:77.46,78.51 1 51
-github.com/wadearnold/ach/addenda05.go:81.2,81.33 1 47
-github.com/wadearnold/ach/addenda05.go:85.2,85.65 1 46
-github.com/wadearnold/ach/addenda05.go:88.2,88.86 1 41
-github.com/wadearnold/ach/addenda05.go:92.2,92.12 1 40
-github.com/wadearnold/ach/addenda05.go:78.51,80.3 1 4
-github.com/wadearnold/ach/addenda05.go:81.33,84.3 2 1
-github.com/wadearnold/ach/addenda05.go:85.65,87.3 1 5
-github.com/wadearnold/ach/addenda05.go:88.86,90.3 1 1
-github.com/wadearnold/ach/addenda05.go:97.52,98.32 1 51
-github.com/wadearnold/ach/addenda05.go:101.2,101.30 1 50
-github.com/wadearnold/ach/addenda05.go:104.2,104.35 1 49
-github.com/wadearnold/ach/addenda05.go:107.2,107.46 1 48
-github.com/wadearnold/ach/addenda05.go:110.2,110.12 1 47
-github.com/wadearnold/ach/addenda05.go:98.32,100.3 1 1
-github.com/wadearnold/ach/addenda05.go:101.30,103.3 1 1
-github.com/wadearnold/ach/addenda05.go:104.35,106.3 1 1
-github.com/wadearnold/ach/addenda05.go:107.46,109.3 1 1
-github.com/wadearnold/ach/addenda05.go:114.69,116.2 1 8
-github.com/wadearnold/ach/addenda05.go:119.58,121.2 1 9
-github.com/wadearnold/ach/addenda05.go:124.69,126.2 1 44
-github.com/wadearnold/ach/addenda05.go:129.47,131.2 1 28
-github.com/wadearnold/ach/addenda98.go:43.13,46.2 1 1
-github.com/wadearnold/ach/addenda98.go:55.32,61.2 2 20
-github.com/wadearnold/ach/addenda98.go:64.50,79.2 7 3
-github.com/wadearnold/ach/addenda98.go:82.45,94.2 1 2
-github.com/wadearnold/ach/addenda98.go:97.46,98.33 1 26
-github.com/wadearnold/ach/addenda98.go:103.2,103.32 1 25
-github.com/wadearnold/ach/addenda98.go:108.2,109.9 2 22
-github.com/wadearnold/ach/addenda98.go:114.2,114.35 1 21
-github.com/wadearnold/ach/addenda98.go:118.2,118.12 1 20
-github.com/wadearnold/ach/addenda98.go:98.33,101.3 2 1
-github.com/wadearnold/ach/addenda98.go:103.32,105.3 1 3
-github.com/wadearnold/ach/addenda98.go:109.9,111.3 1 1
-github.com/wadearnold/ach/addenda98.go:114.35,116.3 1 1
-github.com/wadearnold/ach/addenda98.go:122.47,124.2 1 2
-github.com/wadearnold/ach/addenda98.go:127.57,129.2 1 3
-github.com/wadearnold/ach/addenda98.go:132.55,134.2 1 3
-github.com/wadearnold/ach/addenda98.go:137.57,139.2 1 3
-github.com/wadearnold/ach/addenda98.go:142.55,144.2 1 3
-github.com/wadearnold/ach/addenda98.go:146.50,163.29 3 1
-github.com/wadearnold/ach/addenda98.go:166.2,166.13 1 1
-github.com/wadearnold/ach/addenda98.go:163.29,165.3 1 11
-github.com/wadearnold/ach/batch.go:22.49,23.35 1 24
-github.com/wadearnold/ach/batch.go:36.2,37.71 2 1
-github.com/wadearnold/ach/batch.go:24.13,25.30 1 17
-github.com/wadearnold/ach/batch.go:26.13,27.30 1 3
-github.com/wadearnold/ach/batch.go:28.13,29.30 1 1
-github.com/wadearnold/ach/batch.go:30.13,31.30 1 1
-github.com/wadearnold/ach/batch.go:32.13,33.30 1 1
-github.com/wadearnold/ach/batch.go:34.10,34.10 0 1
-github.com/wadearnold/ach/batch.go:41.36,45.49 2 93
-github.com/wadearnold/ach/batch.go:53.2,53.69 1 87
-github.com/wadearnold/ach/batch.go:58.2,58.79 1 86
-github.com/wadearnold/ach/batch.go:63.2,63.73 1 85
-github.com/wadearnold/ach/batch.go:68.2,68.59 1 83
-github.com/wadearnold/ach/batch.go:73.2,73.50 1 82
-github.com/wadearnold/ach/batch.go:77.2,77.52 1 79
-github.com/wadearnold/ach/batch.go:81.2,81.46 1 76
-github.com/wadearnold/ach/batch.go:85.2,85.44 1 74
-github.com/wadearnold/ach/batch.go:89.2,89.48 1 73
-github.com/wadearnold/ach/batch.go:93.2,93.50 1 72
-github.com/wadearnold/ach/batch.go:97.2,97.50 1 71
-github.com/wadearnold/ach/batch.go:100.2,100.27 1 68
-github.com/wadearnold/ach/batch.go:45.49,47.37 1 6
-github.com/wadearnold/ach/batch.go:50.3,50.90 1 0
-github.com/wadearnold/ach/batch.go:47.37,49.4 1 6
-github.com/wadearnold/ach/batch.go:53.69,56.3 2 1
-github.com/wadearnold/ach/batch.go:58.79,61.3 2 1
-github.com/wadearnold/ach/batch.go:63.73,66.3 2 2
-github.com/wadearnold/ach/batch.go:68.59,71.3 2 1
-github.com/wadearnold/ach/batch.go:73.50,75.3 1 3
-github.com/wadearnold/ach/batch.go:77.52,79.3 1 3
-github.com/wadearnold/ach/batch.go:81.46,83.3 1 2
-github.com/wadearnold/ach/batch.go:85.44,87.3 1 1
-github.com/wadearnold/ach/batch.go:89.48,91.3 1 1
-github.com/wadearnold/ach/batch.go:93.50,95.3 1 1
-github.com/wadearnold/ach/batch.go:97.50,99.3 1 3
-github.com/wadearnold/ach/batch.go:105.35,107.48 1 83
-github.com/wadearnold/ach/batch.go:110.2,110.29 1 78
-github.com/wadearnold/ach/batch.go:114.2,116.38 3 77
-github.com/wadearnold/ach/batch.go:145.2,155.12 10 77
-github.com/wadearnold/ach/batch.go:107.48,109.3 1 5
-github.com/wadearnold/ach/batch.go:110.29,112.3 1 1
-github.com/wadearnold/ach/batch.go:116.38,119.17 3 94
-github.com/wadearnold/ach/batch.go:123.3,124.17 2 94
-github.com/wadearnold/ach/batch.go:129.3,129.48 1 94
-github.com/wadearnold/ach/batch.go:132.3,134.33 3 94
-github.com/wadearnold/ach/batch.go:119.17,121.4 1 0
-github.com/wadearnold/ach/batch.go:124.17,126.4 1 0
-github.com/wadearnold/ach/batch.go:129.48,131.4 1 1
-github.com/wadearnold/ach/batch.go:134.33,136.62 1 39
-github.com/wadearnold/ach/batch.go:140.4,140.16 1 39
-github.com/wadearnold/ach/batch.go:136.62,139.5 2 28
-github.com/wadearnold/ach/batch.go:159.57,161.2 1 98
-github.com/wadearnold/ach/batch.go:164.46,166.2 1 27
-github.com/wadearnold/ach/batch.go:169.60,171.2 1 73
-github.com/wadearnold/ach/batch.go:174.48,176.2 1 176
-github.com/wadearnold/ach/batch.go:179.49,181.2 1 140
-github.com/wadearnold/ach/batch.go:184.50,187.2 2 93
-github.com/wadearnold/ach/batch.go:190.39,192.2 1 22
-github.com/wadearnold/ach/batch.go:195.46,196.48 1 93
-github.com/wadearnold/ach/batch.go:199.2,199.38 1 89
-github.com/wadearnold/ach/batch.go:209.2,209.33 1 82
-github.com/wadearnold/ach/batch.go:196.48,198.3 1 4
-github.com/wadearnold/ach/batch.go:199.38,200.42 1 108
-github.com/wadearnold/ach/batch.go:203.3,203.42 1 106
-github.com/wadearnold/ach/batch.go:200.42,202.4 1 2
-github.com/wadearnold/ach/batch.go:203.42,204.45 1 53
-github.com/wadearnold/ach/batch.go:204.45,206.5 1 5
-github.com/wadearnold/ach/batch.go:215.47,217.38 2 82
-github.com/wadearnold/ach/batch.go:220.2,220.51 1 82
-github.com/wadearnold/ach/batch.go:224.2,224.12 1 79
-github.com/wadearnold/ach/batch.go:217.38,219.3 1 101
-github.com/wadearnold/ach/batch.go:220.51,223.3 2 3
-github.com/wadearnold/ach/batch.go:230.43,232.56 2 76
-github.com/wadearnold/ach/batch.go:237.2,237.58 1 75
-github.com/wadearnold/ach/batch.go:241.2,241.12 1 74
-github.com/wadearnold/ach/batch.go:232.56,235.3 2 1
-github.com/wadearnold/ach/batch.go:237.58,240.3 2 1
-github.com/wadearnold/ach/batch.go:244.69,245.38 1 153
-github.com/wadearnold/ach/batch.go:253.2,253.22 1 153
-github.com/wadearnold/ach/batch.go:245.38,246.158 1 176
-github.com/wadearnold/ach/batch.go:249.3,249.189 1 176
-github.com/wadearnold/ach/batch.go:246.158,248.4 1 117
-github.com/wadearnold/ach/batch.go:249.189,251.4 1 59
-github.com/wadearnold/ach/batch.go:258.49,260.38 2 79
-github.com/wadearnold/ach/batch.go:267.2,267.12 1 76
-github.com/wadearnold/ach/batch.go:260.38,261.35 1 88
-github.com/wadearnold/ach/batch.go:265.3,265.30 1 85
-github.com/wadearnold/ach/batch.go:261.35,264.4 2 3
-github.com/wadearnold/ach/batch.go:271.41,273.49 2 74
-github.com/wadearnold/ach/batch.go:277.2,277.12 1 73
-github.com/wadearnold/ach/batch.go:273.49,276.3 2 1
-github.com/wadearnold/ach/batch.go:282.49,284.38 2 151
-github.com/wadearnold/ach/batch.go:290.2,290.37 1 151
-github.com/wadearnold/ach/batch.go:284.38,289.3 2 172
-github.com/wadearnold/ach/batch.go:294.45,295.44 1 73
-github.com/wadearnold/ach/batch.go:303.2,303.12 1 72
-github.com/wadearnold/ach/batch.go:295.44,296.39 1 73
-github.com/wadearnold/ach/batch.go:296.39,297.66 1 77
-github.com/wadearnold/ach/batch.go:297.66,300.5 2 1
-github.com/wadearnold/ach/batch.go:308.47,309.38 1 72
-github.com/wadearnold/ach/batch.go:316.2,316.12 1 71
-github.com/wadearnold/ach/batch.go:309.38,310.77 1 76
-github.com/wadearnold/ach/batch.go:310.77,313.4 2 1
-github.com/wadearnold/ach/batch.go:320.47,321.38 1 71
-github.com/wadearnold/ach/batch.go:347.2,347.12 1 68
-github.com/wadearnold/ach/batch.go:321.38,322.30 1 75
-github.com/wadearnold/ach/batch.go:322.30,324.41 1 44
-github.com/wadearnold/ach/batch.go:327.4,329.43 2 43
-github.com/wadearnold/ach/batch.go:324.41,326.5 1 1
-github.com/wadearnold/ach/batch.go:329.43,331.42 1 47
-github.com/wadearnold/ach/batch.go:331.42,333.36 1 35
-github.com/wadearnold/ach/batch.go:337.6,339.79 2 34
-github.com/wadearnold/ach/batch.go:333.36,336.7 2 1
-github.com/wadearnold/ach/batch.go:339.79,342.7 2 1
-github.com/wadearnold/ach/batch.go:353.53,354.38 1 55
-github.com/wadearnold/ach/batch.go:361.2,361.12 1 50
-github.com/wadearnold/ach/batch.go:354.38,355.34 1 58
-github.com/wadearnold/ach/batch.go:355.34,358.4 2 5
-github.com/wadearnold/ach/batch.go:365.55,366.38 1 42
-github.com/wadearnold/ach/batch.go:374.2,374.12 1 37
-github.com/wadearnold/ach/batch.go:366.38,367.42 1 45
-github.com/wadearnold/ach/batch.go:367.42,368.38 1 24
-github.com/wadearnold/ach/batch.go:368.38,371.5 2 5
-github.com/wadearnold/ach/batch.go:378.40,380.28 2 68
-github.com/wadearnold/ach/batch.go:390.2,390.12 1 67
-github.com/wadearnold/ach/batch.go:380.28,381.43 1 2
-github.com/wadearnold/ach/batch.go:381.43,382.48 1 4
-github.com/wadearnold/ach/batch.go:385.4,385.45 1 4
-github.com/wadearnold/ach/batch.go:382.48,383.13 1 0
-github.com/wadearnold/ach/batch.go:385.45,387.5 1 1
-github.com/wadearnold/ach/batch.go:396.47,397.38 1 15
-github.com/wadearnold/ach/batch.go:404.2,404.12 1 15
-github.com/wadearnold/ach/batch.go:397.38,398.141 1 18
-github.com/wadearnold/ach/batch.go:398.141,402.4 2 0
-github.com/wadearnold/ach/converters.go:16.54,19.2 2 456
-github.com/wadearnold/ach/converters.go:21.60,24.2 2 301
-github.com/wadearnold/ach/converters.go:27.59,29.2 1 22
-github.com/wadearnold/ach/converters.go:32.58,35.2 2 32
-github.com/wadearnold/ach/converters.go:38.59,40.2 1 6
-github.com/wadearnold/ach/converters.go:43.58,46.2 2 11
-github.com/wadearnold/ach/converters.go:49.60,51.14 2 188
-github.com/wadearnold/ach/converters.go:54.2,55.10 2 184
-github.com/wadearnold/ach/converters.go:51.14,53.3 1 4
-github.com/wadearnold/ach/converters.go:59.59,62.14 3 774
-github.com/wadearnold/ach/converters.go:65.2,66.10 2 773
-github.com/wadearnold/ach/converters.go:62.14,64.3 1 1
-github.com/wadearnold/ach/converters.go:70.64,72.14 2 574
-github.com/wadearnold/ach/converters.go:75.2,76.10 2 513
-github.com/wadearnold/ach/converters.go:72.14,74.3 1 61
-github.com/wadearnold/ach/entryDetail.go:94.36,100.2 2 105
-github.com/wadearnold/ach/entryDetail.go:103.45,129.2 11 17
-github.com/wadearnold/ach/entryDetail.go:132.40,145.2 1 11
-github.com/wadearnold/ach/entryDetail.go:149.41,150.44 1 143
-github.com/wadearnold/ach/entryDetail.go:153.2,153.26 1 135
-github.com/wadearnold/ach/entryDetail.go:157.2,157.65 1 134
-github.com/wadearnold/ach/entryDetail.go:160.2,160.63 1 133
-github.com/wadearnold/ach/entryDetail.go:163.2,163.67 1 132
-github.com/wadearnold/ach/entryDetail.go:166.2,166.61 1 131
-github.com/wadearnold/ach/entryDetail.go:169.2,169.64 1 130
-github.com/wadearnold/ach/entryDetail.go:173.2,176.16 3 129
-github.com/wadearnold/ach/entryDetail.go:180.2,180.32 1 129
-github.com/wadearnold/ach/entryDetail.go:184.2,184.12 1 128
-github.com/wadearnold/ach/entryDetail.go:150.44,152.3 1 8
-github.com/wadearnold/ach/entryDetail.go:153.26,156.3 2 1
-github.com/wadearnold/ach/entryDetail.go:157.65,159.3 1 1
-github.com/wadearnold/ach/entryDetail.go:160.63,162.3 1 1
-github.com/wadearnold/ach/entryDetail.go:163.67,165.3 1 1
-github.com/wadearnold/ach/entryDetail.go:166.61,168.3 1 1
-github.com/wadearnold/ach/entryDetail.go:169.64,171.3 1 1
-github.com/wadearnold/ach/entryDetail.go:176.16,178.3 1 0
-github.com/wadearnold/ach/entryDetail.go:180.32,183.3 2 1
-github.com/wadearnold/ach/entryDetail.go:189.47,190.25 1 143
-github.com/wadearnold/ach/entryDetail.go:193.2,193.29 1 142
-github.com/wadearnold/ach/entryDetail.go:196.2,196.33 1 141
-github.com/wadearnold/ach/entryDetail.go:199.2,199.31 1 140
-github.com/wadearnold/ach/entryDetail.go:202.2,202.29 1 139
-github.com/wadearnold/ach/entryDetail.go:205.2,205.25 1 136
-github.com/wadearnold/ach/entryDetail.go:208.2,208.12 1 135
-github.com/wadearnold/ach/entryDetail.go:190.25,192.3 1 1
-github.com/wadearnold/ach/entryDetail.go:193.29,195.3 1 1
-github.com/wadearnold/ach/entryDetail.go:196.33,198.3 1 1
-github.com/wadearnold/ach/entryDetail.go:199.31,201.3 1 1
-github.com/wadearnold/ach/entryDetail.go:202.29,204.3 1 3
-github.com/wadearnold/ach/entryDetail.go:205.25,207.3 1 1
-github.com/wadearnold/ach/entryDetail.go:212.68,215.24 2 49
-github.com/wadearnold/ach/entryDetail.go:216.18,220.21 4 8
-github.com/wadearnold/ach/entryDetail.go:221.18,225.21 4 9
-github.com/wadearnold/ach/entryDetail.go:227.10,230.21 3 32
-github.com/wadearnold/ach/entryDetail.go:235.58,240.2 4 105
-github.com/wadearnold/ach/entryDetail.go:243.75,246.2 2 106
-github.com/wadearnold/ach/entryDetail.go:249.57,251.2 1 142
-github.com/wadearnold/ach/entryDetail.go:254.55,256.2 1 12
-github.com/wadearnold/ach/entryDetail.go:259.45,261.2 1 12
-github.com/wadearnold/ach/entryDetail.go:264.59,266.2 1 11
-github.com/wadearnold/ach/entryDetail.go:269.53,271.2 1 11
-github.com/wadearnold/ach/entryDetail.go:274.55,276.2 1 0
-github.com/wadearnold/ach/entryDetail.go:279.54,281.2 1 15
-github.com/wadearnold/ach/entryDetail.go:284.56,286.2 1 11
-github.com/wadearnold/ach/entryDetail.go:289.50,293.2 2 18
-github.com/wadearnold/ach/entryDetail.go:296.49,298.14 2 30
-github.com/wadearnold/ach/entryDetail.go:298.14,300.3 1 0
-github.com/wadearnold/ach/entryDetail.go:300.8,302.3 1 30
-github.com/wadearnold/ach/entryDetail.go:306.50,308.2 1 249
-github.com/wadearnold/ach/entryDetail.go:311.47,314.17 2 9
-github.com/wadearnold/ach/entryDetail.go:320.2,320.11 1 0
-github.com/wadearnold/ach/entryDetail.go:315.21,316.13 1 2
-github.com/wadearnold/ach/entryDetail.go:317.21,318.13 1 7
-github.com/wadearnold/ach/file.go:50.36,52.2 1 1
-github.com/wadearnold/ach/file.go:69.22,74.2 1 13
-github.com/wadearnold/ach/file.go:77.31,79.44 1 14
-github.com/wadearnold/ach/file.go:83.2,83.25 1 13
-github.com/wadearnold/ach/file.go:87.2,93.34 7 12
-github.com/wadearnold/ach/file.go:109.2,112.36 3 12
-github.com/wadearnold/ach/file.go:117.2,123.12 6 12
-github.com/wadearnold/ach/file.go:79.44,81.3 1 1
-github.com/wadearnold/ach/file.go:83.25,85.3 1 1
-github.com/wadearnold/ach/file.go:93.34,107.3 8 15
-github.com/wadearnold/ach/file.go:112.36,114.3 1 11
-github.com/wadearnold/ach/file.go:114.8,116.3 1 1
-github.com/wadearnold/ach/file.go:127.50,128.22 1 21
-github.com/wadearnold/ach/file.go:132.2,132.40 1 21
-github.com/wadearnold/ach/file.go:135.2,136.18 2 21
-github.com/wadearnold/ach/file.go:129.17,130.77 1 1
-github.com/wadearnold/ach/file.go:132.40,134.3 1 1
-github.com/wadearnold/ach/file.go:140.46,143.2 2 13
-github.com/wadearnold/ach/file.go:146.33,148.44 1 11
-github.com/wadearnold/ach/file.go:153.2,153.48 1 10
-github.com/wadearnold/ach/file.go:157.2,157.41 1 9
-github.com/wadearnold/ach/file.go:161.2,161.24 1 7
-github.com/wadearnold/ach/file.go:148.44,151.3 2 1
-github.com/wadearnold/ach/file.go:153.48,155.3 1 1
-github.com/wadearnold/ach/file.go:157.41,159.3 1 2
-github.com/wadearnold/ach/file.go:166.44,169.34 2 10
-github.com/wadearnold/ach/file.go:172.2,172.42 1 10
-github.com/wadearnold/ach/file.go:176.2,176.12 1 9
-github.com/wadearnold/ach/file.go:169.34,171.3 1 14
-github.com/wadearnold/ach/file.go:172.42,175.3 2 1
-github.com/wadearnold/ach/file.go:181.37,184.34 3 9
-github.com/wadearnold/ach/file.go:188.2,188.58 1 9
-github.com/wadearnold/ach/file.go:192.2,192.60 1 8
-github.com/wadearnold/ach/file.go:196.2,196.12 1 7
-github.com/wadearnold/ach/file.go:184.34,187.3 2 13
-github.com/wadearnold/ach/file.go:188.58,191.3 2 1
-github.com/wadearnold/ach/file.go:192.60,195.3 2 1
-github.com/wadearnold/ach/file.go:200.36,202.45 2 7
-github.com/wadearnold/ach/file.go:206.2,206.12 1 6
-github.com/wadearnold/ach/file.go:202.45,205.3 2 1
-github.com/wadearnold/ach/file.go:211.44,213.34 2 7
-github.com/wadearnold/ach/file.go:216.2,216.33 1 7
-github.com/wadearnold/ach/file.go:213.34,215.3 1 11
-github.com/wadearnold/ach/validators.go:34.37,36.2 1 2
-github.com/wadearnold/ach/validators.go:53.52,54.14 1 294
-github.com/wadearnold/ach/validators.go:66.2,66.36 1 4
-github.com/wadearnold/ach/validators.go:63.7,64.13 1 290
-github.com/wadearnold/ach/validators.go:70.50,71.14 1 194
-github.com/wadearnold/ach/validators.go:77.2,77.31 1 2
-github.com/wadearnold/ach/validators.go:74.86,75.13 1 192
-github.com/wadearnold/ach/validators.go:83.51,84.14 1 46
-github.com/wadearnold/ach/validators.go:100.2,100.39 1 5
-github.com/wadearnold/ach/validators.go:97.8,98.13 1 41
-github.com/wadearnold/ach/validators.go:121.55,122.14 1 134
-github.com/wadearnold/ach/validators.go:229.2,229.39 1 1
-github.com/wadearnold/ach/validators.go:226.6,227.13 1 133
-github.com/wadearnold/ach/validators.go:233.60,234.14 1 192
-github.com/wadearnold/ach/validators.go:244.2,244.38 1 1
-github.com/wadearnold/ach/validators.go:241.5,242.13 1 191
-github.com/wadearnold/ach/validators.go:248.57,249.43 1 35
-github.com/wadearnold/ach/validators.go:252.2,252.12 1 33
-github.com/wadearnold/ach/validators.go:249.43,251.3 1 2
-github.com/wadearnold/ach/validators.go:256.52,257.38 1 1595
-github.com/wadearnold/ach/validators.go:261.2,261.12 1 1580
-github.com/wadearnold/ach/validators.go:257.38,260.3 1 15
-github.com/wadearnold/ach/validators.go:271.67,273.25 2 129
-github.com/wadearnold/ach/validators.go:276.2,293.31 17 129
-github.com/wadearnold/ach/validators.go:273.25,275.3 1 1032
-github.com/wadearnold/ach/validators.go:297.42,299.2 1 129
-github.com/wadearnold/ach/writer.go:24.37,28.2 1 2
-github.com/wadearnold/ach/writer.go:31.42,32.40 1 2
-github.com/wadearnold/ach/writer.go:36.2,38.72 2 2
-github.com/wadearnold/ach/writer.go:41.2,43.37 2 2
-github.com/wadearnold/ach/writer.go:65.2,65.73 1 2
-github.com/wadearnold/ach/writer.go:68.2,71.64 2 2
-github.com/wadearnold/ach/writer.go:77.2,77.12 1 2
-github.com/wadearnold/ach/writer.go:32.40,34.3 1 0
-github.com/wadearnold/ach/writer.go:38.72,40.3 1 0
-github.com/wadearnold/ach/writer.go:43.37,44.79 1 3
-github.com/wadearnold/ach/writer.go:47.3,48.44 2 3
-github.com/wadearnold/ach/writer.go:60.3,60.80 1 3
-github.com/wadearnold/ach/writer.go:63.3,63.14 1 3
-github.com/wadearnold/ach/writer.go:44.79,46.4 1 0
-github.com/wadearnold/ach/writer.go:48.44,49.68 1 2
-github.com/wadearnold/ach/writer.go:52.4,53.43 2 2
-github.com/wadearnold/ach/writer.go:49.68,51.5 1 0
-github.com/wadearnold/ach/writer.go:53.43,54.71 1 2
-github.com/wadearnold/ach/writer.go:57.5,57.16 1 2
-github.com/wadearnold/ach/writer.go:54.71,56.6 1 0
-github.com/wadearnold/ach/writer.go:60.80,62.4 1 0
-github.com/wadearnold/ach/writer.go:65.73,67.3 1 0
-github.com/wadearnold/ach/writer.go:71.64,72.76 1 6
-github.com/wadearnold/ach/writer.go:72.76,74.4 1 0
-github.com/wadearnold/ach/writer.go:82.26,84.2 1 1
-github.com/wadearnold/ach/writer.go:87.32,90.2 2 0
-github.com/wadearnold/ach/writer.go:93.48,94.29 1 2
-github.com/wadearnold/ach/writer.go:102.2,102.20 1 2
-github.com/wadearnold/ach/writer.go:94.29,98.17 2 2
-github.com/wadearnold/ach/writer.go:98.17,100.4 1 0
-github.com/wadearnold/ach/addenda99.go:24.13,27.2 1 1
-github.com/wadearnold/ach/addenda99.go:65.32,71.2 2 17
-github.com/wadearnold/ach/addenda99.go:74.50,91.2 8 3
-github.com/wadearnold/ach/addenda99.go:94.45,105.2 1 2
-github.com/wadearnold/ach/addenda99.go:108.46,110.33 1 5
-github.com/wadearnold/ach/addenda99.go:116.2,117.9 2 5
-github.com/wadearnold/ach/addenda99.go:121.2,121.12 1 4
-github.com/wadearnold/ach/addenda99.go:110.33,113.3 2 0
-github.com/wadearnold/ach/addenda99.go:117.9,120.3 1 1
-github.com/wadearnold/ach/addenda99.go:125.47,127.2 1 4
-github.com/wadearnold/ach/addenda99.go:130.57,132.2 1 3
-github.com/wadearnold/ach/addenda99.go:135.55,137.36 1 4
-github.com/wadearnold/ach/addenda99.go:141.2,141.58 1 1
-github.com/wadearnold/ach/addenda99.go:137.36,139.3 1 3
-github.com/wadearnold/ach/addenda99.go:145.55,147.2 1 3
-github.com/wadearnold/ach/addenda99.go:150.62,152.2 1 3
-github.com/wadearnold/ach/addenda99.go:155.55,157.2 1 3
-github.com/wadearnold/ach/addenda99.go:159.50,202.29 3 2
-github.com/wadearnold/ach/addenda99.go:205.2,205.13 1 2
-github.com/wadearnold/ach/addenda99.go:202.29,204.3 1 70
-github.com/wadearnold/ach/batchControl.go:72.46,96.2 11 10
-github.com/wadearnold/ach/batchControl.go:99.38,106.2 1 162
-github.com/wadearnold/ach/batchControl.go:109.41,123.2 1 8
-github.com/wadearnold/ach/batchControl.go:127.42,128.44 1 101
-github.com/wadearnold/ach/batchControl.go:131.2,131.26 1 98
-github.com/wadearnold/ach/batchControl.go:135.2,135.63 1 97
-github.com/wadearnold/ach/batchControl.go:139.2,139.68 1 96
-github.com/wadearnold/ach/batchControl.go:143.2,143.72 1 94
-github.com/wadearnold/ach/batchControl.go:147.2,147.12 1 93
-github.com/wadearnold/ach/batchControl.go:128.44,130.3 1 3
-github.com/wadearnold/ach/batchControl.go:131.26,134.3 2 1
-github.com/wadearnold/ach/batchControl.go:135.63,137.3 1 1
-github.com/wadearnold/ach/batchControl.go:139.68,141.3 1 2
-github.com/wadearnold/ach/batchControl.go:143.72,145.3 1 1
-github.com/wadearnold/ach/batchControl.go:152.48,153.25 1 101
-github.com/wadearnold/ach/batchControl.go:156.2,156.30 1 100
-github.com/wadearnold/ach/batchControl.go:159.2,159.42 1 99
-github.com/wadearnold/ach/batchControl.go:162.2,162.12 1 98
-github.com/wadearnold/ach/batchControl.go:153.25,155.3 1 1
-github.com/wadearnold/ach/batchControl.go:156.30,158.3 1 1
-github.com/wadearnold/ach/batchControl.go:159.42,161.3 1 1
-github.com/wadearnold/ach/batchControl.go:166.57,168.2 1 9
-github.com/wadearnold/ach/batchControl.go:171.49,173.2 1 84
-github.com/wadearnold/ach/batchControl.go:176.67,178.2 1 9
-github.com/wadearnold/ach/batchControl.go:181.68,183.2 1 9
-github.com/wadearnold/ach/batchControl.go:186.61,188.2 1 9
-github.com/wadearnold/ach/batchControl.go:191.65,193.2 1 9
-github.com/wadearnold/ach/batchControl.go:196.58,198.2 1 10
-github.com/wadearnold/ach/batchControl.go:201.51,203.2 1 9
-github.com/wadearnold/ach/batchTEL.go:13.45,18.2 4 6
-github.com/wadearnold/ach/batchTEL.go:21.41,23.39 1 11
-github.com/wadearnold/ach/batchTEL.go:28.2,28.48 1 10
-github.com/wadearnold/ach/batchTEL.go:33.2,33.50 1 8
-github.com/wadearnold/ach/batchTEL.go:38.2,38.38 1 7
-github.com/wadearnold/ach/batchTEL.go:45.2,45.34 1 6
-github.com/wadearnold/ach/batchTEL.go:23.39,25.3 1 1
-github.com/wadearnold/ach/batchTEL.go:28.48,30.3 1 2
-github.com/wadearnold/ach/batchTEL.go:33.50,36.3 2 1
-github.com/wadearnold/ach/batchTEL.go:38.38,39.35 1 7
-github.com/wadearnold/ach/batchTEL.go:39.35,42.4 2 1
-github.com/wadearnold/ach/batchTEL.go:49.39,51.38 1 8
-github.com/wadearnold/ach/batchTEL.go:55.2,55.25 1 7
-github.com/wadearnold/ach/batchTEL.go:51.38,53.3 1 1
-github.com/wadearnold/ach/fileControl.go:42.45,60.2 8 7
-github.com/wadearnold/ach/fileControl.go:63.35,68.2 1 35
-github.com/wadearnold/ach/fileControl.go:71.40,82.2 1 4
-github.com/wadearnold/ach/fileControl.go:86.41,87.44 1 14
-github.com/wadearnold/ach/fileControl.go:90.2,90.26 1 8
-github.com/wadearnold/ach/fileControl.go:94.2,94.12 1 7
-github.com/wadearnold/ach/fileControl.go:87.44,89.3 1 6
-github.com/wadearnold/ach/fileControl.go:90.26,93.3 2 1
-github.com/wadearnold/ach/fileControl.go:99.47,100.25 1 14
-github.com/wadearnold/ach/fileControl.go:103.2,103.24 1 13
-github.com/wadearnold/ach/fileControl.go:106.2,106.24 1 11
-github.com/wadearnold/ach/fileControl.go:109.2,109.31 1 10
-github.com/wadearnold/ach/fileControl.go:112.2,112.23 1 9
-github.com/wadearnold/ach/fileControl.go:115.2,115.12 1 8
-github.com/wadearnold/ach/fileControl.go:100.25,102.3 1 1
-github.com/wadearnold/ach/fileControl.go:103.24,105.3 1 2
-github.com/wadearnold/ach/fileControl.go:106.24,108.3 1 1
-github.com/wadearnold/ach/fileControl.go:109.31,111.3 1 1
-github.com/wadearnold/ach/fileControl.go:112.23,114.3 1 1
-github.com/wadearnold/ach/fileControl.go:119.49,121.2 1 7
-github.com/wadearnold/ach/fileControl.go:124.49,126.2 1 6
-github.com/wadearnold/ach/fileControl.go:129.56,131.2 1 8
-github.com/wadearnold/ach/fileControl.go:134.48,136.2 1 14
-github.com/wadearnold/ach/fileControl.go:139.72,141.2 1 6
-github.com/wadearnold/ach/fileControl.go:144.73,146.2 1 6
diff --git a/entryDetail.go b/entryDetail.go
index c9a773e3..01e50555 100644
--- a/entryDetail.go
+++ b/entryDetail.go
@@ -15,6 +15,8 @@ import (
 // withdrawal (debit), the transit routing number for the entry recipient’s financial
 // institution, the account number (left justify,no zero fill), name, and dollar amount.
 type EntryDetail struct {
+	// ID is a client defined string used as a reference to this record.
+	ID string `json:"id"`
 	// RecordType defines the type of record in the block. 6
 	recordType string
 	// TransactionCode if the receivers account is:
@@ -26,28 +28,28 @@ type EntryDetail struct {
 	// Prenote for credit to savings account ‘33’
 	// Debit to savings account ‘37’
 	// Prenote for debit to savings account ‘38’
-	TransactionCode int
+	TransactionCode int `json:"transactionCode"`
 
 	// RDFIIdentification is the RDFI's routing number without the last digit.
 	// Receiving Depository Financial Institution
-	RDFIIdentification string
+	RDFIIdentification string `json:"RDFIIdentification"`
 
 	// CheckDigit the last digit of the RDFI's routing number
-	CheckDigit string
+	CheckDigit string `json:"checkDigit"`
 
 	// DFIAccountNumber is the receiver's bank account number you are crediting/debiting.
 	// It important to note that this is an alphanumeric field, so its space padded, no zero padded
-	DFIAccountNumber string
+	DFIAccountNumber string `json:"DFIAccountNumber"`
 
 	// Amount Number of cents you are debiting/crediting this account
-	Amount int
+	Amount int `json:"amount"`
 
-	// IdentificationNumber n internal identification (alphanumeric) that
+	// IdentificationNumber an internal identification (alphanumeric) that
 	// you use to uniquely identify this Entry Detail Record
-	IdentificationNumber string
+	IdentificationNumber string `json:"identificationNumber,omitempty"`
 
 	// IndividualName The name of the receiver, usually the name on the bank account
-	IndividualName string
+	IndividualName string `json:"individualName"`
 
 	// DiscretionaryData allows ODFIs to include codes, of significance only to them,
 	// to enable specialized handling of the entry. There will be no
@@ -57,12 +59,12 @@ type EntryDetail struct {
 	// field must be returned intact for any returned entry.
 	//
 	// WEB uses the Discretionary Data Field as the Payment Type Code
-	DiscretionaryData string
+	DiscretionaryData string `json:"discretionaryData,omitempty"`
 
 	// AddendaRecordIndicator indicates the existence of an Addenda Record.
 	// A value of "1" indicates that one ore more addenda records follow,
 	// and "0" means no such record is present.
-	AddendaRecordIndicator int
+	AddendaRecordIndicator int `json:"addendaRecordIndicator,omitempty"`
 
 	// TraceNumber assigned by the ODFI in ascending sequence, is included in each
 	// Entry Detail Record, Corporate Entry Detail Record, and addenda Record.
@@ -72,12 +74,12 @@ type EntryDetail struct {
 	// For addenda Records, the Trace Number will be identical to the Trace Number
 	// in the associated Entry Detail Record, since the Trace Number is associated
 	// with an entry or item rather than a physical record.
-	TraceNumber int
+	TraceNumber int `json:"traceNumber,omitempty"`
 
 	// Addendum a list of Addenda for the Entry Detail
-	Addendum []Addendumer
+	Addendum []Addendumer `json:"addendum,omitempty"`
 	// Category defines if the entry is a Forward, Return, or NOC
-	Category string
+	Category string `json:"category,omitempty"`
 	// validator is composed for data validation
 	validator
 	// converters is composed for ACH to golang Converters
diff --git a/file.go b/file.go
index e248372e..23c4ad30 100644
--- a/file.go
+++ b/file.go
@@ -53,9 +53,10 @@ func (e *FileError) Error() string {
 
 // File contains the structures of a parsed ACH File.
 type File struct {
-	Header  FileHeader
-	Batches []Batcher
-	Control FileControl
+	ID      string      `json:"id"`
+	Header  FileHeader  `json:"fileHeader"`
+	Batches []Batcher   `json:"batches"`
+	Control FileControl `json:"fileControl"`
 
 	// NotificationOfChange (Notification of change) is a slice of references to BatchCOR in file.Batches
 	NotificationOfChange []*BatchCOR
diff --git a/fileControl.go b/fileControl.go
index 2002b702..d63dd7f7 100644
--- a/fileControl.go
+++ b/fileControl.go
@@ -9,27 +9,29 @@ import "fmt"
 // FileControl record contains entry counts, dollar totals and hash
 // totals accumulated from each batch control record in the file.
 type FileControl struct {
+	// ID is a client defined string used as a reference to this record.
+	ID string `json:"id"`
 	// RecordType defines the type of record in the block. fileControlPos 9
 	recordType string
 
 	// BatchCount total number of batches (i.e., ‘5’ records) in the file
-	BatchCount int
+	BatchCount int `json:"batchCount"`
 
 	// BlockCount total number of records in the file (include all headers and trailer) divided
 	// by 10 (This number must be evenly divisible by 10. If not, additional records consisting of all 9’s are added to the file after the initial ‘9’ record to fill out the block 10.)
-	BlockCount int
+	BlockCount int `json:"blockCount,omitempty"`
 
 	// EntryAddendaCount total detail and addenda records in the file
-	EntryAddendaCount int
+	EntryAddendaCount int `json:"entryAddendaCount"`
 
 	// EntryHash calculated in the same manner as the batch has total but includes total from entire file
-	EntryHash int
+	EntryHash int `json:"entryHash"`
 
 	// TotalDebitEntryDollarAmountInFile contains accumulated Batch debit totals within the file.
-	TotalDebitEntryDollarAmountInFile int
+	TotalDebitEntryDollarAmountInFile int `json:"totalDebit"`
 
 	// TotalCreditEntryDollarAmountInFile contains accumulated Batch credit totals within the file.
-	TotalCreditEntryDollarAmountInFile int
+	TotalCreditEntryDollarAmountInFile int `json:"totalCredit"`
 	// Reserved should be blank.
 	reserved string
 	// validator is composed for data validation
diff --git a/fileHeader.go b/fileHeader.go
index 05a3d6db..cf01b2fd 100644
--- a/fileHeader.go
+++ b/fileHeader.go
@@ -23,19 +23,19 @@ var (
 // contained in the file. The file header also includes creation date and time
 // fields which can be used to uniquely identify a file.
 type FileHeader struct {
+	// ID is a client defined string used as a reference to this record.
+	ID string `json:"id"`
 	// RecordType defines the type of record in the block. headerPos
 	recordType string
-
 	// PriorityCode consists of the numerals 01
 	priorityCode string
-
 	// ImmediateDestination contains the Routing Number of the ACH Operator or receiving
 	// point to which the file is being sent.  The ach file format specifies a 10 character
 	// field  begins with a blank space in the first position, followed by the four digit
 	// Federal Reserve Routing Symbol, the four digit ABA Institution Identifier, and the Check
 	// Digit (bTTTTAAAAC).  ImmediateDestinationField() will append the blank space to the
 	// routing number.
-	ImmediateDestination string
+	ImmediateDestination string `json:"immediateDestination"`
 
 	// ImmediateOrigin contains the Routing Number of the ACH Operator or sending
 	// point that is sending the file. The ach file format specifies a 10 character field
@@ -43,23 +43,23 @@ type FileHeader struct {
 	// Federal Reserve Routing Symbol, the four digit ABA Institution Identifier, and the Check
 	// Digit (bTTTTAAAAC).  ImmediateOriginField() will append the blank space to the routing
 	// number.
-	ImmediateOrigin string
+	ImmediateOrigin string `json:"immediateOrigin"`
 
 	// FileCreationDate is expressed in a "YYMMDD" format. The File Creation
 	// Date is the date on which the file is prepared by an ODFI (ACH input files)
 	// or the date (exchange date) on which a file is transmitted from ACH Operator
 	// to ACH Operator, or from ACH Operator to RDFIs (ACH output files).
-	FileCreationDate time.Time
+	FileCreationDate time.Time `json:"fileCreationDate"`
 
 	// FileCreationTime is expressed ina n "HHMM" (24 hour clock) format.
 	// The system time when the ACH file was created
-	FileCreationTime time.Time
+	FileCreationTime time.Time `json:"fileCreationTime"`
 
 	// This field should start at zero and increment by 1 (up to 9) and then go to
 	// letters starting at A through Z for each subsequent file that is created for
 	// a single system date. (34-34) 1 numeric 0-9 or uppercase alpha A-Z.
 	// I have yet to see this ID not A
-	FileIDModifier string
+	FileIDModifier string `json:"fileIDModifier,omitempty"`
 
 	// RecordSize indicates the number of characters contained in each
 	// record. At this time, the value "094" must be used.
@@ -78,14 +78,14 @@ type FileHeader struct {
 
 	// ImmediateDestinationName us the name of the ACH or receiving point for which that
 	// file is destined. Name corresponding to the ImmediateDestination
-	ImmediateDestinationName string
+	ImmediateDestinationName string `json:"immediateDestinationName"`
 
 	// ImmediateOriginName is the name of the ACH operator or sending point that is
 	// sending the file. Name corresponding to the ImmediateOrigin
-	ImmediateOriginName string
+	ImmediateOriginName string `json:"immediateOriginName"`
 
 	// ReferenceCode is reserved for information pertinent to the Originator.
-	ReferenceCode string
+	ReferenceCode string `json:"referenceCode,omitempty"`
 	// validator is composed for data validation
 	validator
 	// converters is composed for ACH to GoLang Converters


Test patch:
diff --git a/batchCCD_test.go b/batchCCD_test.go
index e3d756e7..cd778aa2 100644
--- a/batchCCD_test.go
+++ b/batchCCD_test.go
@@ -156,7 +156,7 @@ func BenchmarkBatchCCDAddendaTypeCode(b *testing.B) {
 // testBatchCCDSEC validates that the standard entry class code is CCD for batchCCD
 func testBatchCCDSEC(t testing.TB) {
 	mockBatch := mockBatchCCD()
-	mockBatch.header.StandardEntryClassCode = "RCK"
+	mockBatch.Header.StandardEntryClassCode = "RCK"
 	if err := mockBatch.Validate(); err != nil {
 		if e, ok := err.(*BatchError); ok {
 			if e.FieldName != "StandardEntryClassCode" {
diff --git a/batchCOR_test.go b/batchCOR_test.go
index bfab389d..3ed5e68a 100644
--- a/batchCOR_test.go
+++ b/batchCOR_test.go
@@ -73,7 +73,7 @@ func BenchmarkBatchCORHeader(b *testing.B) {
 // testBatchCORSEC validates COR SEC code
 func testBatchCORSEC(t testing.TB) {
 	mockBatch := mockBatchCOR()
-	mockBatch.header.StandardEntryClassCode = "RCK"
+	mockBatch.Header.StandardEntryClassCode = "RCK"
 	if err := mockBatch.Validate(); err != nil {
 		if e, ok := err.(*BatchError); ok {
 			if e.FieldName != "StandardEntryClassCode" {
diff --git a/batchTEL_test.go b/batchTEL_test.go
index 2c9293c6..b556edbf 100644
--- a/batchTEL_test.go
+++ b/batchTEL_test.go
@@ -125,7 +125,7 @@ func BenchmarkBatchTELAddendaCount(b *testing.B) {
 // testBatchTELSEC validates SEC code for batch TEL
 func testBatchTELSEC(t testing.TB) {
 	mockBatch := mockBatchTEL()
-	mockBatch.header.StandardEntryClassCode = "RCK"
+	mockBatch.Header.StandardEntryClassCode = "RCK"
 	if err := mockBatch.Validate(); err != nil {
 		if e, ok := err.(*BatchError); ok {
 			if e.FieldName != "StandardEntryClassCode" {
diff --git a/batchWEB_test.go b/batchWEB_test.go
index ba716e24..1bb6c355 100644
--- a/batchWEB_test.go
+++ b/batchWEB_test.go
@@ -130,7 +130,7 @@ func BenchmarkBatchWEBAddendaTypeCode(b *testing.B) {
 // testBatchWebSEC validates that the standard entry class code is WEB for batch Web
 func testBatchWebSEC(t testing.TB) {
 	mockBatch := mockBatchWEB()
-	mockBatch.header.StandardEntryClassCode = "RCK"
+	mockBatch.Header.StandardEntryClassCode = "RCK"
 	if err := mockBatch.Validate(); err != nil {
 		if e, ok := err.(*BatchError); ok {
 			if e.FieldName != "StandardEntryClassCode" {
diff --git a/batch_test.go b/batch_test.go
index 254f3c09..18be510d 100644
--- a/batch_test.go
+++ b/batch_test.go
@@ -501,7 +501,7 @@ func BenchmarkBatchTraceNumberExists(b *testing.B) {
 
 func testBatchFieldInclusion(t testing.TB) {
 	mockBatch := mockBatch()
-	mockBatch.header.ODFIIdentification = ""
+	mockBatch.Header.ODFIIdentification = ""
 	if err := mockBatch.verify(); err != nil {
 		if e, ok := err.(*BatchError); ok {
 			if e.FieldName != "ODFIIdentification" {
@@ -568,7 +568,7 @@ func BenchmarkBatchNoEntry(b *testing.B) {
 
 func testBatchControl(t testing.TB) {
 	mockBatch := mockBatch()
-	mockBatch.control.ODFIIdentification = ""
+	mockBatch.Control.ODFIIdentification = ""
 	if err := mockBatch.verify(); err != nil {
 		if e, ok := err.(*BatchError); ok {
 			if e.FieldName != "ODFIIdentification" {
diff --git a/record_test.go b/record_test.go
index bdb7f98b..393a50f3 100644
--- a/record_test.go
+++ b/record_test.go
@@ -45,7 +45,7 @@ func testBatchRecord(t testing.TB) {
 		t.Errorf("%T: %s", err, err)
 	}
 	if bh.CompanyName != companyName {
-		t.Errorf("BatchParam value was not copied to batch.header.CompanyName")
+		t.Errorf("BatchParam value was not copied to batch.Header.CompanyName")
 	}
 }