Skip to content

Commit

Permalink
Keep settlement date when parsing files. (#960)
Browse files Browse the repository at this point in the history
* Keep settlement date when parsing files.

* Update validators.go

Co-authored-by: Vincent Xiao <vincentx72@gmail.com>

* Update validators.go

Co-authored-by: Vincent Xiao <vincentx72@gmail.com>

Co-authored-by: Vincent Xiao <vincentx72@gmail.com>
  • Loading branch information
eweise and vxio committed Jul 20, 2021
1 parent 1aa1a9e commit a2ae6d6
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 8 deletions.
9 changes: 5 additions & 4 deletions batchHeader.go
Expand Up @@ -179,8 +179,9 @@ func (bh *BatchHeader) Parse(record string) {
// 70-75 Date transactions are to be posted to the receivers' account.
// You almost always want the transaction to post as soon as possible, so put tomorrow's date in YYMMDD format
bh.EffectiveEntryDate = bh.validateSimpleDate(record[69:75])
// 76-79 Always blank (just fill with spaces)
bh.settlementDate = " "
// 76-78 Always blank if creating batches (just fill with spaces).
// Set to file value when parsing. Julian day format.
bh.settlementDate = bh.validateSettlementDate(record[75:78])
// 79-79 Always 1
bh.OriginatorStatusCode = bh.parseNumField(record[78:79])
// 80-87 Your ODFI's routing number without the last digit. The last digit is simply a
Expand All @@ -204,7 +205,7 @@ func (bh *BatchHeader) String() string {
buf.WriteString(bh.CompanyEntryDescriptionField())
buf.WriteString(bh.CompanyDescriptiveDateField())
buf.WriteString(bh.EffectiveEntryDateField())
buf.WriteString(bh.settlementDateField())
buf.WriteString(bh.SettlementDateField())
buf.WriteString(fmt.Sprintf("%v", bh.OriginatorStatusCode))
buf.WriteString(bh.ODFIIdentificationField())
buf.WriteString(bh.BatchNumberField())
Expand Down Expand Up @@ -358,7 +359,7 @@ func (bh *BatchHeader) BatchNumberField() string {
return bh.numericField(bh.BatchNumber, 7)
}

func (bh *BatchHeader) settlementDateField() string {
func (bh *BatchHeader) SettlementDateField() string {
return bh.alphaField(bh.settlementDate, 3)
}

Expand Down
4 changes: 2 additions & 2 deletions batchHeader_test.go
Expand Up @@ -112,8 +112,8 @@ func testParseBatchHeader(t testing.TB) {
if record.EffectiveEntryDateField() != "190730" {
t.Errorf("EffectiveEntryDate Expected '190730' got: %v", record.EffectiveEntryDateField())
}
if record.settlementDate != " " {
t.Errorf("SettlementDate Expected ' ' got: %v", record.settlementDate)
if record.SettlementDateField() != " " {
t.Errorf("SettlementDate Expected ' ' got: %v", record.SettlementDateField())
}
if record.OriginatorStatusCode != 1 {
t.Errorf("OriginatorStatusCode Expected 1 got: %v", record.OriginatorStatusCode)
Expand Down
4 changes: 2 additions & 2 deletions iatBatchHeader.go
Expand Up @@ -235,8 +235,8 @@ func (iatBh *IATBatchHeader) Parse(record string) {
// 70-75 Date transactions are to be posted to the receivers' account.
// You almost always want the transaction to post as soon as possible, so put tomorrow's date in YYMMDD format
iatBh.EffectiveEntryDate = iatBh.validateSimpleDate(record[69:75])
// 76-79 Always blank (just fill with spaces)
iatBh.settlementDate = " "
// 76-78 Always blank (just fill with spaces)
iatBh.settlementDate = iatBh.validateSettlementDate(record[75:78])
// 79-79 Always 1
iatBh.OriginatorStatusCode = iatBh.parseNumField(record[78:79])
// 80-87 Your ODFI's routing number without the last digit. The last digit is simply a
Expand Down
20 changes: 20 additions & 0 deletions validators.go
Expand Up @@ -496,3 +496,23 @@ func CheckRoutingNumber(routingNumber string) error {
func (v *validator) roundUp10(n int) int {
return int(math.Ceil(float64(n)/10.0)) * 10
}

func (v *validator) validateSettlementDate(s string) string {
emptyField := " "

if s == emptyField || len(s) != len(emptyField) {
return emptyField
}

day, err := strconv.Atoi(s)
if err != nil {
return emptyField
}

if day < 1 || day > 366 {
return emptyField
}

return s

}
24 changes: 24 additions & 0 deletions validators_test.go
Expand Up @@ -162,3 +162,27 @@ func TestValidators__isAlphanumeric(t *testing.T) {
})
}
}

func TestValidators__validateJulianDay(t *testing.T) {
empty := " "
cases := map[string]string{
// invalid
"": empty,
" ": empty,
"01": empty,
"01234": empty,
"XXX": empty,
"000": empty,
"367": empty,
// valid
"001": "001",
"020": "020",
"366": "366",
}
v := validator{}
for input, valid := range cases {
if v.validateSettlementDate(input) != valid {
t.Errorf("julian day=%s failed", input)
}
}
}

0 comments on commit a2ae6d6

Please sign in to comment.