diff --git a/batchHeader.go b/batchHeader.go index a53c17288..cd5f472e3 100644 --- a/batchHeader.go +++ b/batchHeader.go @@ -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 diff --git a/iatBatchHeader.go b/iatBatchHeader.go index ef6d21fbc..e225aa57c 100644 --- a/iatBatchHeader.go +++ b/iatBatchHeader.go @@ -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 diff --git a/validators.go b/validators.go index eb61a8843..faec2d0d7 100644 --- a/validators.go +++ b/validators.go @@ -496,3 +496,28 @@ 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 { + return s + } + + if 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 + +} diff --git a/validators_test.go b/validators_test.go index 4bdeb0787..5783302fe 100644 --- a/validators_test.go +++ b/validators_test.go @@ -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) + } + } +}