github.com/moov-io/imagecashletter@v0.10.1/returnDetailAddendumC.go (about)

     1  // Copyright 2020 The Moov Authors
     2  // Use of this source code is governed by an Apache License
     3  // license that can be found in the LICENSE file.
     4  
     5  package imagecashletter
     6  
     7  import (
     8  	"encoding/json"
     9  	"fmt"
    10  	"strings"
    11  	"unicode/utf8"
    12  )
    13  
    14  // Errors specific to a ReturnDetailAddendumC Record
    15  
    16  // ReturnDetailAddendumC Record
    17  type ReturnDetailAddendumC struct {
    18  	// ID is a client defined string used as a reference to this record.
    19  	ID string `json:"id"`
    20  	// RecordType defines the type of record.
    21  	recordType string
    22  	// validator is composed for imagecashletter data validation
    23  	// ImageReferenceKeyIndicator identifies whether ImageReferenceKeyLength contains a variable value within the
    24  	// allowable range, or contains a defined value and the content is ItemReferenceKey.
    25  	// Values:
    26  	// 0: ImageReferenceKeyIndicator has Defined Value of 0034 and ImageReferenceKey contains the Image Reference Key.
    27  	// 1: ImageReferenceKeyIndicator contains a value other than Value 0034;
    28  	// or ImageReferenceKeyIndicator contains Value 0034, which is not a Defined Value, and the content of
    29  	// ImageReferenceKey has no special significance with regards to an Image Reference Key;
    30  	// or ImageReferenceKeyIndicator is 0000, meaning the ImageReferenceKey is not present.
    31  	ImageReferenceKeyIndicator int `json:"imageReferenceKeyIndicator"`
    32  	// MicrofilmArchiveSequenceNumber A number that identifies the item in the microfilm archive system;
    33  	// it may be different than the Check Detail.ECEInstitutionItemSequenceNumber and from the ImageReferenceKey.
    34  	MicrofilmArchiveSequenceNumber string `json:"microfilmArchiveSequenceNumber"`
    35  	// ImageReferenceKeyLength is the number of characters in the ImageReferenceKey
    36  	// Values:
    37  	// 0034: ImageReferenceKey contains the ImageReferenceKey (ImageReferenceKeyIndicator is 0).
    38  	// 0000: ImageReferenceKey not present (ImageReferenceKeyIndicator is 1).
    39  	// 0001 - 9999: May include Value 0034, and ImageReferenceKey has no special significance to
    40  	// Image Reference Key (ImageReferenceKey is 1).
    41  	LengthImageReferenceKey string `json:"imageReferenceKeyLength"`
    42  	// ImageReferenceKey  is used to find the image of the item in the image data system.
    43  	ImageReferenceKey string `json:"imageReferenceKey"`
    44  	// Description describes the transaction
    45  	Description string `json:"description"`
    46  	// UserField identifies a field used at the discretion of users of the standard.
    47  	UserField string `json:"userField"`
    48  	// reserved is a field reserved for future use.  Reserved should be blank.
    49  	reserved string
    50  	// validator is composed for imagecashletter data validation
    51  	validator
    52  	// converters is composed for imagecashletter to golang Converters
    53  	converters
    54  }
    55  
    56  // NewReturnDetailAddendumC returns a new ReturnDetailAddendumC with default values for non exported fields
    57  func NewReturnDetailAddendumC() ReturnDetailAddendumC {
    58  	rdAddendumC := ReturnDetailAddendumC{}
    59  	rdAddendumC.setRecordType()
    60  	return rdAddendumC
    61  }
    62  
    63  func (rdAddendumC *ReturnDetailAddendumC) setRecordType() {
    64  	if rdAddendumC == nil {
    65  		return
    66  	}
    67  	rdAddendumC.recordType = "34"
    68  }
    69  
    70  // Parse takes the input record string and parses the ReturnDetailAddendumC values
    71  func (rdAddendumC *ReturnDetailAddendumC) Parse(record string) {
    72  	if utf8.RuneCountInString(record) < 22 {
    73  		return // line too short
    74  	}
    75  
    76  	// Character position 1-2, Always "34"
    77  	rdAddendumC.setRecordType()
    78  	// 03-03
    79  	rdAddendumC.ImageReferenceKeyIndicator = rdAddendumC.parseNumField(record[2:3])
    80  	// 04-18
    81  	rdAddendumC.MicrofilmArchiveSequenceNumber = rdAddendumC.parseStringField(record[3:18])
    82  	// 19-22
    83  	rdAddendumC.LengthImageReferenceKey = rdAddendumC.parseStringField(record[18:22])
    84  
    85  	imageRefKeyLength := rdAddendumC.parseNumField(rdAddendumC.LengthImageReferenceKey)
    86  	if imageRefKeyLength <= 0 || utf8.RuneCountInString(record) < 46+imageRefKeyLength {
    87  		return // line too short
    88  	}
    89  
    90  	// 23 (22+X)
    91  	rdAddendumC.ImageReferenceKey = rdAddendumC.parseStringField(record[22 : 22+imageRefKeyLength])
    92  	// 23+X - 37+X
    93  	rdAddendumC.Description = rdAddendumC.parseStringField(record[22+imageRefKeyLength : 37+imageRefKeyLength])
    94  	// 38+X - 41+X
    95  	rdAddendumC.UserField = rdAddendumC.parseStringField(record[37+imageRefKeyLength : 41+imageRefKeyLength])
    96  	// 42+X - 46+X
    97  	rdAddendumC.reserved = rdAddendumC.parseStringField(record[41+imageRefKeyLength : 46+imageRefKeyLength])
    98  
    99  }
   100  
   101  func (rdAddendumC *ReturnDetailAddendumC) UnmarshalJSON(data []byte) error {
   102  	type Alias ReturnDetailAddendumC
   103  	aux := struct {
   104  		*Alias
   105  	}{
   106  		(*Alias)(rdAddendumC),
   107  	}
   108  	if err := json.Unmarshal(data, &aux); err != nil {
   109  		return err
   110  	}
   111  	rdAddendumC.setRecordType()
   112  	return nil
   113  }
   114  
   115  // String writes the ReturnDetailAddendumC struct to a string.
   116  func (rdAddendumC *ReturnDetailAddendumC) String() string {
   117  	if rdAddendumC == nil {
   118  		return ""
   119  	}
   120  
   121  	var buf strings.Builder
   122  	buf.Grow(22)
   123  	buf.WriteString(rdAddendumC.recordType)
   124  	buf.WriteString(rdAddendumC.ImageReferenceKeyIndicatorField())
   125  	buf.WriteString(rdAddendumC.MicrofilmArchiveSequenceNumberField())
   126  	buf.WriteString(rdAddendumC.LengthImageReferenceKeyField())
   127  	if size := rdAddendumC.parseNumField(rdAddendumC.LengthImageReferenceKey); validSize(size) {
   128  		buf.Grow(size)
   129  	}
   130  	buf.WriteString(rdAddendumC.ImageReferenceKeyField())
   131  	buf.WriteString(rdAddendumC.DescriptionField())
   132  	buf.WriteString(rdAddendumC.UserFieldField())
   133  	buf.WriteString(rdAddendumC.reservedField())
   134  	return buf.String()
   135  }
   136  
   137  // Validate performs imagecashletter format rule checks on the record and returns an error if not Validated
   138  // The first error encountered is returned and stops the parsing.
   139  func (rdAddendumC *ReturnDetailAddendumC) Validate() error {
   140  	if err := rdAddendumC.fieldInclusion(); err != nil {
   141  		return err
   142  	}
   143  	if rdAddendumC.recordType != "34" {
   144  		msg := fmt.Sprintf(msgRecordType, 34)
   145  		return &FieldError{FieldName: "recordType", Value: rdAddendumC.recordType, Msg: msg}
   146  	}
   147  	// Mandatory
   148  	if err := rdAddendumC.isImageReferenceKeyIndicator(rdAddendumC.ImageReferenceKeyIndicator); err != nil {
   149  		return &FieldError{FieldName: "ImageReferenceKeyIndicator",
   150  			Value: rdAddendumC.ImageReferenceKeyIndicatorField(), Msg: err.Error()}
   151  	}
   152  	if err := rdAddendumC.isAlphanumericSpecial(rdAddendumC.ImageReferenceKey); err != nil {
   153  		return &FieldError{FieldName: "ImageReferenceKey", Value: rdAddendumC.ImageReferenceKey, Msg: err.Error()}
   154  	}
   155  	if err := rdAddendumC.isAlphanumericSpecial(rdAddendumC.Description); err != nil {
   156  		return &FieldError{FieldName: "Description", Value: rdAddendumC.Description, Msg: err.Error()}
   157  	}
   158  	if err := rdAddendumC.isAlphanumericSpecial(rdAddendumC.UserField); err != nil {
   159  		return &FieldError{FieldName: "UserField", Value: rdAddendumC.UserField, Msg: err.Error()}
   160  	}
   161  	return nil
   162  }
   163  
   164  // fieldInclusion validate mandatory fields are not default values. If fields are
   165  // invalid the Electronic Exchange will be returned.
   166  func (rdAddendumC *ReturnDetailAddendumC) fieldInclusion() error {
   167  	if rdAddendumC.recordType == "" {
   168  		return &FieldError{FieldName: "recordType",
   169  			Value: rdAddendumC.recordType,
   170  			Msg:   msgFieldInclusion + ", did you use ReturnDetailAddendumC()?"}
   171  	}
   172  	if rdAddendumC.MicrofilmArchiveSequenceNumberField() == "               " {
   173  		return &FieldError{FieldName: "MicrofilmArchiveSequenceNumber",
   174  			Value: rdAddendumC.MicrofilmArchiveSequenceNumber,
   175  			Msg:   msgFieldInclusion + ", did you use ReturnDetailAddendumC()?"}
   176  	}
   177  	return nil
   178  }
   179  
   180  // ImageReferenceKeyIndicatorField gets a string of the ImageReferenceKeyIndicator field
   181  func (rdAddendumC *ReturnDetailAddendumC) ImageReferenceKeyIndicatorField() string {
   182  	return rdAddendumC.numericField(rdAddendumC.ImageReferenceKeyIndicator, 1)
   183  }
   184  
   185  // MicrofilmArchiveSequenceNumberField gets the MicrofilmArchiveSequenceNumber field
   186  func (rdAddendumC *ReturnDetailAddendumC) MicrofilmArchiveSequenceNumberField() string {
   187  	return rdAddendumC.alphaField(rdAddendumC.MicrofilmArchiveSequenceNumber, 15)
   188  }
   189  
   190  // LengthImageReferenceKeyField gets the LengthImageReferenceKey field
   191  func (rdAddendumC *ReturnDetailAddendumC) LengthImageReferenceKeyField() string {
   192  	return rdAddendumC.stringField(rdAddendumC.LengthImageReferenceKey, 4)
   193  }
   194  
   195  // ImageReferenceKeyField gets the ImageReferenceKey field
   196  func (rdAddendumC *ReturnDetailAddendumC) ImageReferenceKeyField() string {
   197  	return rdAddendumC.alphaField(rdAddendumC.ImageReferenceKey, uint(rdAddendumC.parseNumField(rdAddendumC.LengthImageReferenceKey)))
   198  }
   199  
   200  // DescriptionField gets the Description field
   201  func (rdAddendumC *ReturnDetailAddendumC) DescriptionField() string {
   202  	return rdAddendumC.alphaField(rdAddendumC.Description, 15)
   203  }
   204  
   205  // UserFieldField gets the UserField field
   206  func (rdAddendumC *ReturnDetailAddendumC) UserFieldField() string {
   207  	return rdAddendumC.alphaField(rdAddendumC.UserField, 4)
   208  }
   209  
   210  // reservedField gets reserved - blank space
   211  func (rdAddendumC *ReturnDetailAddendumC) reservedField() string {
   212  	return rdAddendumC.alphaField(rdAddendumC.reserved, 5)
   213  }