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 }