stupidedi 1.1.0 → 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (714) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +217 -90
  3. data/Rakefile +13 -7
  4. data/bin/edi-ed +8 -31
  5. data/bin/edi-pp +25 -50
  6. data/doc/Navigating.md +4 -0
  7. data/doc/{Defining.md → unwritten/Defining.md} +0 -0
  8. data/doc/{Parsing.md → unwritten/Parsing.md} +0 -0
  9. data/doc/{Tokenizing.md → unwritten/Tokenizing.md} +0 -0
  10. data/doc/{Validating.md → unwritten/Validating.md} +0 -0
  11. data/lib/ruby/array.rb +17 -0
  12. data/lib/ruby/blank.rb +4 -2
  13. data/lib/ruby/enumerable.rb +2 -2
  14. data/lib/ruby/module.rb +0 -28
  15. data/lib/ruby/to_d.rb +5 -5
  16. data/lib/ruby/try.rb +4 -2
  17. data/lib/stupidedi.rb +3 -0
  18. data/lib/stupidedi/builder.rb +1 -0
  19. data/lib/stupidedi/builder/builder_dsl.rb +2 -2
  20. data/lib/stupidedi/builder/constraint_table.rb +42 -14
  21. data/lib/stupidedi/builder/identifier_stack.rb +167 -0
  22. data/lib/stupidedi/builder/navigation.rb +95 -33
  23. data/lib/stupidedi/config.rb +53 -5
  24. data/lib/stupidedi/config/editor_config.rb +1 -2
  25. data/lib/stupidedi/config/functional_group_config.rb +2 -1
  26. data/lib/stupidedi/config/interchange_config.rb +3 -1
  27. data/lib/stupidedi/contrib.rb +9 -0
  28. data/lib/stupidedi/contrib/002001.rb +13 -0
  29. data/lib/stupidedi/contrib/002001/guides.rb +20 -0
  30. data/lib/stupidedi/contrib/002001/guides/FA997.rb +80 -0
  31. data/lib/stupidedi/contrib/002001/guides/PO830.rb +182 -0
  32. data/lib/stupidedi/contrib/002001/guides/SH856.rb +215 -0
  33. data/lib/stupidedi/contrib/002001/transaction_set_defs.rb +23 -0
  34. data/lib/stupidedi/contrib/002001/transaction_set_defs/FA997.rb +30 -0
  35. data/lib/stupidedi/contrib/002001/transaction_set_defs/PO830.rb +45 -0
  36. data/lib/stupidedi/contrib/002001/transaction_set_defs/SH856.rb +37 -0
  37. data/lib/stupidedi/contrib/003010.rb +13 -0
  38. data/lib/stupidedi/contrib/003010/guides.rb +21 -0
  39. data/lib/stupidedi/contrib/003010/guides/PC860.rb +170 -0
  40. data/lib/stupidedi/contrib/003010/guides/PO850.rb +168 -0
  41. data/lib/stupidedi/contrib/003010/guides/RA820.rb +169 -0
  42. data/lib/stupidedi/contrib/003010/transaction_set_defs.rb +21 -0
  43. data/lib/stupidedi/contrib/003010/transaction_set_defs/PC860.rb +47 -0
  44. data/lib/stupidedi/contrib/003010/transaction_set_defs/PO850.rb +48 -0
  45. data/lib/stupidedi/contrib/003010/transaction_set_defs/RA820.rb +38 -0
  46. data/lib/stupidedi/contrib/003040.rb +13 -0
  47. data/lib/stupidedi/contrib/003040/guides.rb +19 -0
  48. data/lib/stupidedi/contrib/003040/guides/WA142.rb +184 -0
  49. data/lib/stupidedi/contrib/003040/transaction_set_defs.rb +15 -0
  50. data/lib/stupidedi/contrib/003040/transaction_set_defs/WA142.rb +52 -0
  51. data/lib/stupidedi/contrib/003050.rb +13 -0
  52. data/lib/stupidedi/contrib/003050/guides.rb +15 -0
  53. data/lib/stupidedi/contrib/003050/guides/PO850.rb +95 -0
  54. data/lib/stupidedi/contrib/003050/transaction_set_defs.rb +14 -0
  55. data/lib/stupidedi/contrib/003050/transaction_set_defs/PO850.rb +42 -0
  56. data/lib/stupidedi/contrib/004010.rb +13 -0
  57. data/lib/stupidedi/contrib/004010/guides.rb +26 -0
  58. data/lib/stupidedi/contrib/004010/guides/AR943.rb +87 -0
  59. data/lib/stupidedi/contrib/004010/guides/FA997.rb +80 -0
  60. data/lib/stupidedi/contrib/004010/guides/GF990.rb +48 -0
  61. data/lib/stupidedi/contrib/004010/guides/OW940.rb +120 -0
  62. data/lib/stupidedi/contrib/004010/guides/PO850.rb +105 -0
  63. data/lib/stupidedi/contrib/004010/guides/PS830.rb +163 -0
  64. data/lib/stupidedi/contrib/004010/guides/QM214.rb +127 -0
  65. data/lib/stupidedi/contrib/004010/guides/RE944.rb +73 -0
  66. data/lib/stupidedi/contrib/004010/guides/SH856.rb +185 -0
  67. data/lib/stupidedi/contrib/004010/guides/SM204.rb +283 -0
  68. data/lib/stupidedi/contrib/004010/guides/SQ866.rb +119 -0
  69. data/lib/stupidedi/contrib/004010/guides/SS862.rb +177 -0
  70. data/lib/stupidedi/contrib/004010/guides/SW945.rb +119 -0
  71. data/lib/stupidedi/contrib/004010/transaction_set_defs.rb +51 -0
  72. data/lib/stupidedi/contrib/004010/transaction_set_defs/AR943.rb +34 -0
  73. data/lib/stupidedi/contrib/004010/transaction_set_defs/FA997.rb +30 -0
  74. data/lib/stupidedi/contrib/004010/transaction_set_defs/GF990.rb +21 -0
  75. data/lib/stupidedi/contrib/004010/transaction_set_defs/OW940.rb +43 -0
  76. data/lib/stupidedi/contrib/004010/transaction_set_defs/PO850.rb +42 -0
  77. data/lib/stupidedi/contrib/004010/transaction_set_defs/PS830.rb +44 -0
  78. data/lib/stupidedi/contrib/004010/transaction_set_defs/QM214.rb +40 -0
  79. data/lib/stupidedi/contrib/004010/transaction_set_defs/RE944.rb +34 -0
  80. data/lib/stupidedi/contrib/004010/transaction_set_defs/SH856.rb +35 -0
  81. data/lib/stupidedi/contrib/004010/transaction_set_defs/SM204.rb +66 -0
  82. data/lib/stupidedi/contrib/004010/transaction_set_defs/SQ866.rb +32 -0
  83. data/lib/stupidedi/contrib/004010/transaction_set_defs/SS862.rb +40 -0
  84. data/lib/stupidedi/contrib/004010/transaction_set_defs/SW945.rb +43 -0
  85. data/lib/stupidedi/editor.rb +4 -1
  86. data/lib/stupidedi/editor/00401.rb +341 -0
  87. data/lib/stupidedi/editor/004010.rb +452 -0
  88. data/{doc/LICENSE.md → lib/stupidedi/editor/004010/N2.rb} +0 -0
  89. data/lib/stupidedi/editor/004010/N3.rb +0 -0
  90. data/lib/stupidedi/editor/004010/N4.rb +63 -0
  91. data/lib/stupidedi/editor/004010/NM1.rb +0 -0
  92. data/lib/stupidedi/editor/X12.rb +157 -0
  93. data/lib/stupidedi/editor/transaction_set_ed.rb +1 -1
  94. data/lib/stupidedi/either.rb +2 -2
  95. data/lib/stupidedi/guides.rb +1 -0
  96. data/lib/stupidedi/guides/004010.rb +19 -0
  97. data/lib/stupidedi/guides/004010/X091A1-HP835.rb +530 -0
  98. data/lib/stupidedi/guides/004010/element_reqs.rb +38 -0
  99. data/lib/stupidedi/guides/004010/guide_builder.rb +180 -0
  100. data/lib/stupidedi/guides/004010/segment_reqs.rb +32 -0
  101. data/lib/stupidedi/guides/005010.rb +0 -1
  102. data/lib/stupidedi/guides/005010/X222-HC837P.rb +3 -3
  103. data/lib/stupidedi/guides/005010/X222A1-HC837P.rb +3 -3
  104. data/lib/stupidedi/guides/005010/guide_builder.rb +21 -1
  105. data/lib/stupidedi/reader/input/abstract_input.rb +10 -6
  106. data/lib/stupidedi/reader/input/delegated_input.rb +11 -7
  107. data/lib/stupidedi/reader/tokens/repeated_element_tok.rb +3 -2
  108. data/lib/stupidedi/schema.rb +12 -12
  109. data/lib/stupidedi/schema/code_list.rb +3 -2
  110. data/lib/stupidedi/schema/element_use.rb +4 -3
  111. data/lib/stupidedi/schema/loop_def.rb +4 -3
  112. data/lib/stupidedi/schema/repeat_count.rb +3 -2
  113. data/lib/stupidedi/schema/segment_use.rb +5 -4
  114. data/lib/stupidedi/schema/syntax_note.rb +2 -2
  115. data/lib/stupidedi/schema/table_def.rb +4 -0
  116. data/lib/stupidedi/sets.rb +12 -27
  117. data/lib/stupidedi/values/composite_element_val.rb +5 -3
  118. data/lib/stupidedi/values/functional_group_val.rb +3 -2
  119. data/lib/stupidedi/values/interchange_val.rb +15 -1
  120. data/lib/stupidedi/values/invalid_envelope_val.rb +3 -2
  121. data/lib/stupidedi/values/invalid_segment_val.rb +2 -1
  122. data/lib/stupidedi/values/loop_val.rb +3 -2
  123. data/lib/stupidedi/values/repeated_element_val.rb +10 -3
  124. data/lib/stupidedi/values/segment_val.rb +3 -1
  125. data/lib/stupidedi/values/simple_element_val.rb +4 -2
  126. data/lib/stupidedi/values/table_val.rb +3 -2
  127. data/lib/stupidedi/values/transaction_set_val.rb +3 -2
  128. data/lib/stupidedi/version.rb +1 -1
  129. data/lib/stupidedi/versions/functional_groups.rb +6 -2
  130. data/lib/stupidedi/versions/functional_groups/002001.rb +38 -0
  131. data/lib/stupidedi/versions/functional_groups/002001/element_defs.rb +10696 -0
  132. data/lib/stupidedi/versions/functional_groups/002001/element_reqs.rb +18 -0
  133. data/lib/stupidedi/versions/functional_groups/002001/element_types.rb +127 -0
  134. data/lib/stupidedi/versions/functional_groups/002001/element_types/date_val.rb +579 -0
  135. data/lib/stupidedi/versions/functional_groups/002001/element_types/fixnum_val.rb +324 -0
  136. data/lib/stupidedi/versions/functional_groups/002001/element_types/float_val.rb +356 -0
  137. data/lib/stupidedi/versions/functional_groups/002001/element_types/identifier_val.rb +373 -0
  138. data/lib/stupidedi/versions/functional_groups/002001/element_types/operators.rb +117 -0
  139. data/lib/stupidedi/versions/functional_groups/002001/element_types/string_val.rb +403 -0
  140. data/lib/stupidedi/versions/functional_groups/002001/element_types/time_val.rb +327 -0
  141. data/lib/stupidedi/versions/functional_groups/002001/functional_group_def.rb +30 -0
  142. data/lib/stupidedi/versions/functional_groups/002001/segment_defs.rb +249 -0
  143. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/AK1.rb +20 -0
  144. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/AK2.rb +21 -0
  145. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/AK3.rb +20 -0
  146. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/AK4.rb +22 -0
  147. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/AK5.rb +24 -0
  148. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/AK9.rb +24 -0
  149. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/AT7.rb +31 -0
  150. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/AT8.rb +28 -0
  151. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/ATH.rb +23 -0
  152. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/B1.rb +22 -0
  153. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/B10.rb +29 -0
  154. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/B2.rb +30 -0
  155. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/B2A.rb +20 -0
  156. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/BEG.rb +30 -0
  157. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/BFR.rb +31 -0
  158. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/BSN.rb +26 -0
  159. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/CTT.rb +28 -0
  160. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/CUR.rb +57 -0
  161. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/DTM.rb +29 -0
  162. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/FST.rb +31 -0
  163. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/G61.rb +25 -0
  164. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/G62.rb +26 -0
  165. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/G69.rb +20 -0
  166. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/GE.rb +20 -0
  167. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/GS.rb +26 -0
  168. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/HL.rb +22 -0
  169. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/J2X.rb +22 -0
  170. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/K1.rb +20 -0
  171. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/L11.rb +24 -0
  172. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/L3.rb +39 -0
  173. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/L5.rb +32 -0
  174. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/LFH.rb +28 -0
  175. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/LH1.rb +32 -0
  176. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/LH2.rb +36 -0
  177. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/LH3.rb +24 -0
  178. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/LIN.rb +50 -0
  179. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/LX.rb +19 -0
  180. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/M7.rb +23 -0
  181. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/MAN.rb +20 -0
  182. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/MEA.rb +33 -0
  183. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/MS1.rb +35 -0
  184. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/MS2.rb +25 -0
  185. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/MS3.rb +25 -0
  186. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/N1.rb +22 -0
  187. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/N2.rb +20 -0
  188. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/N3.rb +20 -0
  189. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/N4.rb +29 -0
  190. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/N7.rb +45 -0
  191. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/N9.rb +28 -0
  192. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/NTE.rb +20 -0
  193. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/PER.rb +31 -0
  194. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/PID.rb +33 -0
  195. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/PLD.rb +24 -0
  196. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/PO1.rb +59 -0
  197. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/PO4.rb +22 -0
  198. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/REF.rb +24 -0
  199. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/S5.rb +33 -0
  200. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/SDP.rb +20 -0
  201. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/SE.rb +20 -0
  202. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/SN1.rb +27 -0
  203. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/ST.rb +20 -0
  204. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/TD1.rb +29 -0
  205. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/TD3.rb +22 -0
  206. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/TD5.rb +22 -0
  207. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/UNT.rb +19 -0
  208. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/W01.rb +43 -0
  209. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/W03.rb +29 -0
  210. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/W04.rb +39 -0
  211. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/W05.rb +28 -0
  212. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/W06.rb +32 -0
  213. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/W07.rb +35 -0
  214. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/W08.rb +31 -0
  215. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/W12.rb +50 -0
  216. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/W14.rb +24 -0
  217. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/W17.rb +30 -0
  218. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/W20.rb +32 -0
  219. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/W27.rb +30 -0
  220. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/W66.rb +30 -0
  221. data/lib/stupidedi/versions/functional_groups/002001/segment_defs/W76.rb +29 -0
  222. data/lib/stupidedi/versions/functional_groups/002001/segment_reqs.rb +18 -0
  223. data/lib/stupidedi/versions/functional_groups/002001/syntax_notes.rb +174 -0
  224. data/lib/stupidedi/versions/functional_groups/002001/transaction_set_defs.rb +11 -0
  225. data/lib/stupidedi/versions/functional_groups/003010.rb +38 -0
  226. data/lib/stupidedi/versions/functional_groups/003010/element_defs.rb +9266 -0
  227. data/lib/stupidedi/versions/functional_groups/003010/element_reqs.rb +18 -0
  228. data/lib/stupidedi/versions/functional_groups/003010/element_types.rb +127 -0
  229. data/lib/stupidedi/versions/functional_groups/003010/element_types/date_val.rb +579 -0
  230. data/lib/stupidedi/versions/functional_groups/003010/element_types/fixnum_val.rb +324 -0
  231. data/lib/stupidedi/versions/functional_groups/003010/element_types/float_val.rb +355 -0
  232. data/lib/stupidedi/versions/functional_groups/003010/element_types/identifier_val.rb +372 -0
  233. data/lib/stupidedi/versions/functional_groups/003010/element_types/operators.rb +117 -0
  234. data/lib/stupidedi/versions/functional_groups/003010/element_types/string_val.rb +400 -0
  235. data/lib/stupidedi/versions/functional_groups/003010/element_types/time_val.rb +327 -0
  236. data/lib/stupidedi/versions/functional_groups/003010/functional_group_def.rb +30 -0
  237. data/lib/stupidedi/versions/functional_groups/003010/segment_defs.rb +252 -0
  238. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/AK1.rb +20 -0
  239. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/AK2.rb +21 -0
  240. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/AK3.rb +20 -0
  241. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/AK9.rb +24 -0
  242. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/AT7.rb +31 -0
  243. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/AT8.rb +28 -0
  244. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/B1.rb +22 -0
  245. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/B10.rb +29 -0
  246. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/B2.rb +30 -0
  247. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/B2A.rb +20 -0
  248. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/BCH.rb +31 -0
  249. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/BEG.rb +30 -0
  250. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/BPS.rb +26 -0
  251. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/BSN.rb +26 -0
  252. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/CTT.rb +28 -0
  253. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/CUR.rb +58 -0
  254. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/DTM.rb +30 -0
  255. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/FOB.rb +23 -0
  256. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/G61.rb +25 -0
  257. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/G62.rb +26 -0
  258. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/G69.rb +20 -0
  259. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/GE.rb +20 -0
  260. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/GS.rb +26 -0
  261. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/HL.rb +22 -0
  262. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/ITD.rb +30 -0
  263. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/K1.rb +20 -0
  264. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/L11.rb +24 -0
  265. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/L3.rb +39 -0
  266. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/L5.rb +32 -0
  267. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/LE.rb +19 -0
  268. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/LFH.rb +28 -0
  269. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/LH1.rb +32 -0
  270. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/LH2.rb +36 -0
  271. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/LH3.rb +24 -0
  272. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/LIN.rb +50 -0
  273. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/LS.rb +19 -0
  274. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/LX.rb +19 -0
  275. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/M7.rb +23 -0
  276. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/MAN.rb +27 -0
  277. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/MEA.rb +33 -0
  278. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/MS1.rb +35 -0
  279. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/MS2.rb +25 -0
  280. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/MS3.rb +25 -0
  281. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/MSG.rb +19 -0
  282. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/N1.rb +27 -0
  283. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/N2.rb +20 -0
  284. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/N3.rb +20 -0
  285. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/N4.rb +29 -0
  286. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/N7.rb +45 -0
  287. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/N9.rb +28 -0
  288. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/NTE.rb +20 -0
  289. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/PER.rb +31 -0
  290. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/PID.rb +33 -0
  291. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/PLD.rb +24 -0
  292. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/PO1.rb +59 -0
  293. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/PO4.rb +22 -0
  294. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/POC.rb +31 -0
  295. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/REF.rb +21 -0
  296. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/RMT.rb +35 -0
  297. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/S5.rb +33 -0
  298. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/SE.rb +20 -0
  299. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/SN1.rb +27 -0
  300. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/ST.rb +20 -0
  301. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/TD1.rb +29 -0
  302. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/TD3.rb +22 -0
  303. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/TD5.rb +19 -0
  304. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/W01.rb +43 -0
  305. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/W03.rb +29 -0
  306. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/W04.rb +39 -0
  307. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/W05.rb +28 -0
  308. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/W06.rb +32 -0
  309. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/W07.rb +35 -0
  310. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/W08.rb +31 -0
  311. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/W12.rb +50 -0
  312. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/W14.rb +24 -0
  313. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/W17.rb +30 -0
  314. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/W20.rb +32 -0
  315. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/W27.rb +30 -0
  316. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/W66.rb +30 -0
  317. data/lib/stupidedi/versions/functional_groups/003010/segment_defs/W76.rb +29 -0
  318. data/lib/stupidedi/versions/functional_groups/003010/segment_reqs.rb +18 -0
  319. data/lib/stupidedi/versions/functional_groups/003010/syntax_notes.rb +174 -0
  320. data/lib/stupidedi/versions/functional_groups/003010/transaction_set_defs.rb +11 -0
  321. data/lib/stupidedi/versions/functional_groups/003040.rb +38 -0
  322. data/lib/stupidedi/versions/functional_groups/003040/element_defs.rb +10777 -0
  323. data/lib/stupidedi/versions/functional_groups/003040/element_reqs.rb +18 -0
  324. data/lib/stupidedi/versions/functional_groups/003040/element_types.rb +127 -0
  325. data/lib/stupidedi/versions/functional_groups/003040/element_types/date_val.rb +578 -0
  326. data/lib/stupidedi/versions/functional_groups/003040/element_types/fixnum_val.rb +323 -0
  327. data/lib/stupidedi/versions/functional_groups/003040/element_types/float_val.rb +356 -0
  328. data/lib/stupidedi/versions/functional_groups/003040/element_types/identifier_val.rb +370 -0
  329. data/lib/stupidedi/versions/functional_groups/003040/element_types/operators.rb +117 -0
  330. data/lib/stupidedi/versions/functional_groups/003040/element_types/string_val.rb +401 -0
  331. data/lib/stupidedi/versions/functional_groups/003040/element_types/time_val.rb +327 -0
  332. data/lib/stupidedi/versions/functional_groups/003040/functional_group_def.rb +30 -0
  333. data/lib/stupidedi/versions/functional_groups/003040/segment_defs.rb +271 -0
  334. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/AK1.rb +20 -0
  335. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/AK2.rb +21 -0
  336. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/AK3.rb +20 -0
  337. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/AK9.rb +24 -0
  338. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/AMT.rb +19 -0
  339. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/AT7.rb +31 -0
  340. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/AT8.rb +28 -0
  341. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/B1.rb +22 -0
  342. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/B10.rb +29 -0
  343. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/B2.rb +30 -0
  344. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/B2A.rb +20 -0
  345. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/BEG.rb +30 -0
  346. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/BGN.rb +22 -0
  347. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/BPS.rb +26 -0
  348. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/BSN.rb +26 -0
  349. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/CTT.rb +28 -0
  350. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/CUR.rb +58 -0
  351. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/DTM.rb +30 -0
  352. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/FOB.rb +23 -0
  353. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/G61.rb +25 -0
  354. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/G62.rb +26 -0
  355. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/G69.rb +20 -0
  356. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/GE.rb +20 -0
  357. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/GS.rb +26 -0
  358. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/HL.rb +22 -0
  359. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/IT1.rb +22 -0
  360. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/ITD.rb +30 -0
  361. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/K1.rb +20 -0
  362. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/L11.rb +24 -0
  363. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/L3.rb +39 -0
  364. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/L5.rb +32 -0
  365. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/LE.rb +19 -0
  366. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/LFH.rb +28 -0
  367. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/LH1.rb +32 -0
  368. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/LH2.rb +36 -0
  369. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/LH3.rb +24 -0
  370. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/LIN.rb +50 -0
  371. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/LS.rb +19 -0
  372. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/LX.rb +19 -0
  373. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/M7.rb +23 -0
  374. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/MAN.rb +27 -0
  375. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/MEA.rb +33 -0
  376. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/MS1.rb +35 -0
  377. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/MS2.rb +25 -0
  378. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/MS3.rb +25 -0
  379. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/MSG.rb +19 -0
  380. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/N1.rb +27 -0
  381. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/N2.rb +20 -0
  382. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/N3.rb +20 -0
  383. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/N4.rb +29 -0
  384. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/N7.rb +45 -0
  385. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/N9.rb +28 -0
  386. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/NTE.rb +20 -0
  387. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/PER.rb +31 -0
  388. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/PID.rb +33 -0
  389. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/PLD.rb +24 -0
  390. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/PO1.rb +59 -0
  391. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/PO4.rb +22 -0
  392. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/PRR.rb +21 -0
  393. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/QTY.rb +20 -0
  394. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/REF.rb +21 -0
  395. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/REP.rb +21 -0
  396. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/RMT.rb +36 -0
  397. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/S5.rb +33 -0
  398. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/SE.rb +20 -0
  399. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/SN1.rb +27 -0
  400. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/SSS.rb +24 -0
  401. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/ST.rb +20 -0
  402. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/TD1.rb +29 -0
  403. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/TD3.rb +22 -0
  404. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/TD5.rb +19 -0
  405. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/TDS.rb +18 -0
  406. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/W01.rb +43 -0
  407. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/W03.rb +29 -0
  408. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/W04.rb +39 -0
  409. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/W05.rb +28 -0
  410. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/W06.rb +32 -0
  411. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/W07.rb +35 -0
  412. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/W08.rb +31 -0
  413. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/W12.rb +50 -0
  414. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/W14.rb +24 -0
  415. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/W17.rb +30 -0
  416. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/W20.rb +32 -0
  417. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/W27.rb +30 -0
  418. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/W66.rb +30 -0
  419. data/lib/stupidedi/versions/functional_groups/003040/segment_defs/W76.rb +29 -0
  420. data/lib/stupidedi/versions/functional_groups/003040/segment_reqs.rb +18 -0
  421. data/lib/stupidedi/versions/functional_groups/003040/syntax_notes.rb +174 -0
  422. data/lib/stupidedi/versions/functional_groups/003040/transaction_set_defs.rb +11 -0
  423. data/lib/stupidedi/versions/functional_groups/003050.rb +38 -0
  424. data/lib/stupidedi/versions/functional_groups/003050/element_defs.rb +10780 -0
  425. data/lib/stupidedi/versions/functional_groups/003050/element_reqs.rb +18 -0
  426. data/lib/stupidedi/versions/functional_groups/003050/element_types.rb +127 -0
  427. data/lib/stupidedi/versions/functional_groups/003050/element_types/date_val.rb +579 -0
  428. data/lib/stupidedi/versions/functional_groups/003050/element_types/fixnum_val.rb +324 -0
  429. data/lib/stupidedi/versions/functional_groups/003050/element_types/float_val.rb +357 -0
  430. data/lib/stupidedi/versions/functional_groups/003050/element_types/identifier_val.rb +371 -0
  431. data/lib/stupidedi/versions/functional_groups/003050/element_types/operators.rb +117 -0
  432. data/lib/stupidedi/versions/functional_groups/003050/element_types/string_val.rb +402 -0
  433. data/lib/stupidedi/versions/functional_groups/003050/element_types/time_val.rb +327 -0
  434. data/lib/stupidedi/versions/functional_groups/003050/functional_group_def.rb +30 -0
  435. data/lib/stupidedi/versions/functional_groups/003050/segment_defs.rb +271 -0
  436. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/AK1.rb +20 -0
  437. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/AK2.rb +21 -0
  438. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/AK3.rb +20 -0
  439. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/AK9.rb +24 -0
  440. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/AMT.rb +19 -0
  441. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/AT7.rb +31 -0
  442. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/AT8.rb +28 -0
  443. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/B1.rb +22 -0
  444. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/B10.rb +29 -0
  445. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/B2.rb +30 -0
  446. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/B2A.rb +20 -0
  447. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/BEG.rb +30 -0
  448. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/BGN.rb +22 -0
  449. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/BPS.rb +26 -0
  450. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/BSN.rb +26 -0
  451. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/CTT.rb +28 -0
  452. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/CUR.rb +58 -0
  453. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/DTM.rb +29 -0
  454. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/FOB.rb +23 -0
  455. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/G61.rb +25 -0
  456. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/G62.rb +26 -0
  457. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/G69.rb +20 -0
  458. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/GE.rb +20 -0
  459. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/GS.rb +26 -0
  460. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/HL.rb +22 -0
  461. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/IT1.rb +22 -0
  462. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/ITD.rb +30 -0
  463. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/K1.rb +20 -0
  464. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/L11.rb +24 -0
  465. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/L3.rb +39 -0
  466. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/L5.rb +32 -0
  467. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/LE.rb +19 -0
  468. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/LFH.rb +28 -0
  469. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/LH1.rb +32 -0
  470. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/LH2.rb +36 -0
  471. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/LH3.rb +24 -0
  472. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/LIN.rb +50 -0
  473. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/LS.rb +19 -0
  474. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/LX.rb +19 -0
  475. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/M7.rb +23 -0
  476. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/MAN.rb +27 -0
  477. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/MEA.rb +33 -0
  478. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/MS1.rb +35 -0
  479. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/MS2.rb +25 -0
  480. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/MS3.rb +25 -0
  481. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/MSG.rb +19 -0
  482. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/N1.rb +27 -0
  483. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/N2.rb +20 -0
  484. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/N3.rb +20 -0
  485. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/N4.rb +29 -0
  486. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/N7.rb +45 -0
  487. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/N9.rb +28 -0
  488. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/NTE.rb +20 -0
  489. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/PER.rb +31 -0
  490. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/PID.rb +33 -0
  491. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/PLD.rb +24 -0
  492. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/PO1.rb +59 -0
  493. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/PO4.rb +22 -0
  494. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/PRR.rb +21 -0
  495. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/QTY.rb +20 -0
  496. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/REF.rb +21 -0
  497. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/REP.rb +21 -0
  498. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/RMT.rb +35 -0
  499. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/S5.rb +33 -0
  500. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/SE.rb +20 -0
  501. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/SN1.rb +27 -0
  502. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/SSS.rb +24 -0
  503. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/ST.rb +20 -0
  504. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/TD1.rb +30 -0
  505. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/TD3.rb +23 -0
  506. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/TD5.rb +19 -0
  507. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/TDS.rb +18 -0
  508. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/W01.rb +43 -0
  509. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/W03.rb +29 -0
  510. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/W04.rb +39 -0
  511. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/W05.rb +28 -0
  512. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/W06.rb +32 -0
  513. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/W07.rb +35 -0
  514. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/W08.rb +31 -0
  515. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/W12.rb +50 -0
  516. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/W14.rb +24 -0
  517. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/W17.rb +30 -0
  518. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/W20.rb +32 -0
  519. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/W27.rb +30 -0
  520. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/W66.rb +30 -0
  521. data/lib/stupidedi/versions/functional_groups/003050/segment_defs/W76.rb +29 -0
  522. data/lib/stupidedi/versions/functional_groups/003050/segment_reqs.rb +18 -0
  523. data/lib/stupidedi/versions/functional_groups/003050/syntax_notes.rb +174 -0
  524. data/lib/stupidedi/versions/functional_groups/003050/transaction_set_defs.rb +11 -0
  525. data/lib/stupidedi/versions/functional_groups/004010.rb +2 -2
  526. data/lib/stupidedi/versions/functional_groups/004010/element_defs.rb +9461 -13
  527. data/lib/stupidedi/versions/functional_groups/004010/element_types.rb +3 -0
  528. data/lib/stupidedi/versions/functional_groups/004010/element_types/date_val.rb +132 -79
  529. data/lib/stupidedi/versions/functional_groups/004010/element_types/fixnum_val.rb +73 -84
  530. data/lib/stupidedi/versions/functional_groups/004010/element_types/float_val.rb +129 -72
  531. data/lib/stupidedi/versions/functional_groups/004010/element_types/identifier_val.rb +128 -43
  532. data/lib/stupidedi/versions/functional_groups/004010/element_types/operators.rb +117 -0
  533. data/lib/stupidedi/versions/functional_groups/004010/element_types/string_val.rb +116 -52
  534. data/lib/stupidedi/versions/functional_groups/004010/element_types/time_val.rb +48 -30
  535. data/lib/stupidedi/versions/functional_groups/004010/segment_defs.rb +274 -0
  536. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/AK1.rb +20 -0
  537. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/AK2.rb +21 -0
  538. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/AK3.rb +22 -0
  539. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/AK4.rb +22 -0
  540. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/AK5.rb +24 -0
  541. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/AK9.rb +28 -0
  542. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/AMT.rb +21 -0
  543. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/AT7.rb +31 -0
  544. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/AT8.rb +28 -0
  545. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/B1.rb +22 -0
  546. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/B10.rb +29 -0
  547. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/B2.rb +30 -0
  548. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/B2A.rb +20 -0
  549. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/BEG.rb +30 -0
  550. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/BFR.rb +31 -0
  551. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/BPR.rb +49 -0
  552. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/BSN.rb +23 -0
  553. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/BSS.rb +35 -0
  554. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/CAS.rb +56 -0
  555. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/CLP.rb +33 -0
  556. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/CTT.rb +28 -0
  557. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/CUR.rb +57 -0
  558. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/DTM.rb +27 -0
  559. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/FST.rb +31 -0
  560. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/G61.rb +25 -0
  561. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/G62.rb +26 -0
  562. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/G69.rb +20 -0
  563. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/HL.rb +22 -0
  564. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/JIT.rb +20 -0
  565. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/K1.rb +20 -0
  566. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/L11.rb +24 -0
  567. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/L3.rb +39 -0
  568. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/L5.rb +32 -0
  569. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/LFH.rb +28 -0
  570. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/LH1.rb +32 -0
  571. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/LH2.rb +36 -0
  572. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/LH3.rb +24 -0
  573. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/LIN.rb +53 -0
  574. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/LQ.rb +21 -0
  575. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/LX.rb +19 -0
  576. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/M7.rb +23 -0
  577. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/MAN.rb +27 -0
  578. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/MEA.rb +39 -0
  579. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/MIA.rb +45 -0
  580. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/MOA.rb +28 -0
  581. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/MS1.rb +35 -0
  582. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/MS2.rb +25 -0
  583. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/MS3.rb +25 -0
  584. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/N1.rb +27 -0
  585. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/N2.rb +20 -0
  586. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/N3.rb +20 -0
  587. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/N4.rb +25 -0
  588. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/N7.rb +45 -0
  589. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/N9.rb +28 -0
  590. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/NM1.rb +32 -0
  591. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/NTE.rb +20 -0
  592. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/PER.rb +31 -0
  593. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/PID.rb +33 -0
  594. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/PLB.rb +40 -0
  595. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/PLD.rb +24 -0
  596. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/PO1.rb +59 -0
  597. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/PO4.rb +23 -0
  598. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/QTY.rb +24 -0
  599. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/REF.rb +24 -0
  600. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/S5.rb +33 -0
  601. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/SDP.rb +20 -0
  602. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/SHP.rb +22 -0
  603. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/SN1.rb +28 -0
  604. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/ST.rb +1 -1
  605. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/SVC.rb +26 -0
  606. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/TD1.rb +23 -0
  607. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/TD3.rb +26 -0
  608. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/TD5.rb +22 -0
  609. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/TRN.rb +22 -0
  610. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/TS2.rb +40 -0
  611. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/TS3.rb +45 -0
  612. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/UIT.rb +20 -0
  613. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/W01.rb +43 -0
  614. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/W03.rb +29 -0
  615. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/W04.rb +39 -0
  616. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/W05.rb +28 -0
  617. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/W06.rb +32 -0
  618. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/W07.rb +35 -0
  619. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/W08.rb +31 -0
  620. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/W12.rb +50 -0
  621. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/W14.rb +24 -0
  622. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/W17.rb +30 -0
  623. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/W20.rb +32 -0
  624. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/W27.rb +30 -0
  625. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/W66.rb +30 -0
  626. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/W76.rb +29 -0
  627. data/lib/stupidedi/versions/functional_groups/004010/transaction_set_defs.rb +13 -0
  628. data/lib/stupidedi/versions/functional_groups/004010/transaction_set_defs/HP835.rb +78 -0
  629. data/lib/stupidedi/versions/functional_groups/005010/element_defs.rb +3 -3
  630. data/lib/stupidedi/versions/functional_groups/005010/element_types/date_val.rb +4 -3
  631. data/lib/stupidedi/versions/functional_groups/005010/element_types/fixnum_val.rb +4 -1
  632. data/lib/stupidedi/versions/functional_groups/005010/element_types/float_val.rb +4 -1
  633. data/lib/stupidedi/versions/functional_groups/005010/element_types/identifier_val.rb +10 -6
  634. data/lib/stupidedi/versions/functional_groups/005010/element_types/operators.rb +1 -1
  635. data/lib/stupidedi/versions/functional_groups/005010/element_types/string_val.rb +10 -6
  636. data/lib/stupidedi/versions/functional_groups/005010/segment_defs.rb +6 -6
  637. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CUR.rb +2 -1
  638. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/N1.rb +4 -1
  639. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/N4.rb +0 -1
  640. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/REF.rb +1 -0
  641. data/lib/stupidedi/versions/functional_groups/005010/syntax_notes.rb +1 -1
  642. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs.rb +4 -4
  643. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/HI278.rb +42 -39
  644. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/RA820.rb +201 -199
  645. data/lib/stupidedi/versions/interchanges.rb +3 -0
  646. data/lib/stupidedi/versions/interchanges/00200.rb +23 -0
  647. data/lib/stupidedi/versions/interchanges/00200/element_defs.rb +275 -0
  648. data/lib/stupidedi/versions/interchanges/00200/interchange_def.rb +68 -0
  649. data/lib/stupidedi/versions/interchanges/00200/segment_defs.rb +28 -0
  650. data/lib/stupidedi/versions/interchanges/00200/segment_defs/IEA.rb +20 -0
  651. data/lib/stupidedi/versions/interchanges/00200/segment_defs/ISA.rb +34 -0
  652. data/lib/stupidedi/versions/interchanges/00200/segment_defs/TA1.rb +23 -0
  653. data/lib/stupidedi/versions/interchanges/00300.rb +23 -0
  654. data/lib/stupidedi/versions/interchanges/00300/element_defs.rb +276 -0
  655. data/lib/stupidedi/versions/interchanges/00300/interchange_def.rb +68 -0
  656. data/lib/stupidedi/versions/interchanges/00300/segment_defs.rb +28 -0
  657. data/lib/stupidedi/versions/interchanges/00300/segment_defs/IEA.rb +20 -0
  658. data/lib/stupidedi/versions/interchanges/00300/segment_defs/ISA.rb +34 -0
  659. data/lib/stupidedi/versions/interchanges/00300/segment_defs/TA1.rb +23 -0
  660. data/lib/stupidedi/versions/interchanges/00400.rb +23 -0
  661. data/lib/stupidedi/versions/interchanges/00400/element_defs.rb +268 -0
  662. data/lib/stupidedi/versions/interchanges/00400/interchange_def.rb +68 -0
  663. data/lib/stupidedi/versions/interchanges/00400/segment_defs.rb +28 -0
  664. data/lib/stupidedi/versions/interchanges/00400/segment_defs/IEA.rb +20 -0
  665. data/lib/stupidedi/versions/interchanges/00400/segment_defs/ISA.rb +34 -0
  666. data/lib/stupidedi/versions/interchanges/00400/segment_defs/TA1.rb +23 -0
  667. data/lib/stupidedi/versions/interchanges/00401/element_defs.rb +53 -8
  668. data/lib/stupidedi/versions/interchanges/00401/interchange_def.rb +23 -0
  669. data/lib/stupidedi/versions/interchanges/00401/segment_defs/ISA.rb +2 -2
  670. data/lib/stupidedi/versions/interchanges/00501/element_defs.rb +3 -2
  671. data/lib/stupidedi/versions/interchanges/00501/interchange_def.rb +23 -0
  672. data/lib/stupidedi/writer/default.rb +4 -3
  673. data/spec/examples/integration/generating.example +89 -90
  674. data/spec/examples/integration/navigating.example +69 -69
  675. data/spec/examples/integration/parsing.example +250 -22
  676. data/spec/examples/ruby/array.example +76 -76
  677. data/spec/examples/ruby/object.example +3 -3
  678. data/spec/examples/ruby/symbol.example +6 -6
  679. data/spec/examples/ruby/to_d.example +1 -1
  680. data/spec/examples/ruby/try.example +6 -6
  681. data/spec/examples/stupidedi/reader.example +45 -45
  682. data/spec/examples/stupidedi/reader/failure.example +1 -1
  683. data/spec/examples/stupidedi/reader/input/delegated_input.example +3 -3
  684. data/spec/examples/stupidedi/reader/token_reader.example +35 -35
  685. data/spec/fixtures/FA997/1-good.txt +10 -0
  686. data/spec/fixtures/PC860/1-good.txt +21 -0
  687. data/spec/fixtures/PO830/1-good.txt +29 -0
  688. data/spec/fixtures/PO850/1-good-v3010.txt +31 -0
  689. data/spec/fixtures/PO850/1-good-v3050.txt +16 -0
  690. data/spec/fixtures/PS830/1-good.txt +29 -0
  691. data/spec/fixtures/RA820/1-good.txt +52 -0
  692. data/spec/fixtures/SH856/1-good.txt +70 -0
  693. data/spec/fixtures/SQ866/1-good.txt +29 -0
  694. data/spec/fixtures/SS862/1-good.txt +33 -0
  695. data/spec/fixtures/WA142/1-good.txt +307 -0
  696. data/spec/fixtures/X091A1-HP835/1-good.txt +1 -0
  697. data/spec/spec_helper.rb +11 -0
  698. data/spec/support/fixtures.rb +1 -1
  699. data/spec/support/matchers/either_matchers.rb +29 -2
  700. data/spec/support/matchers/navigation_matchers.rb +1 -1
  701. data/spec/support/quickcheck/characters.rb +5 -0
  702. data/spec/support/quickcheck/property.rb +1 -1
  703. data/spec/support/rcov.rb +3 -1
  704. metadata +674 -71
  705. data/lib/stupidedi/sets/absolute_set.rb +0 -297
  706. data/lib/stupidedi/sets/abstract_set.rb +0 -174
  707. data/lib/stupidedi/sets/null_set.rb +0 -125
  708. data/lib/stupidedi/sets/relative_complement.rb +0 -137
  709. data/lib/stupidedi/sets/relative_set.rb +0 -269
  710. data/lib/stupidedi/sets/universal_set.rb +0 -104
  711. data/spec/examples/stupidedi/sets/absolute_set.example +0 -1577
  712. data/spec/examples/stupidedi/sets/null_set.example +0 -2
  713. data/spec/examples/stupidedi/sets/relative_set.example +0 -2
  714. data/spec/examples/stupidedi/sets/universal_set.example +0 -1
@@ -0,0 +1,43 @@
1
+ module Stupidedi
2
+ module Contrib
3
+ module FortyTen
4
+ module TransactionSetDefs
5
+ d = Schema
6
+ r = SegmentReqs
7
+ s = SegmentDefs
8
+
9
+ SW945 = d::TransactionSetDef.build("SW", "945",
10
+ "Warehouse Shipping Advice",
11
+
12
+ d::TableDef.header("Table 1 - Header",
13
+ s:: ST.use( 10, r::Mandatory, d::RepeatCount.bounded(1)),
14
+ s::W06.use( 20, r::Mandatory, d::RepeatCount.bounded(1)),
15
+
16
+ d::LoopDef.build("N1", d::RepeatCount.bounded(10),
17
+ s:: N1.use( 40, r::Mandatory, d::RepeatCount.bounded(1)),
18
+ s:: N3.use( 60, r::Optional, d::RepeatCount.bounded(1)),
19
+ s:: N4.use( 70, r::Optional, d::RepeatCount.bounded(1))),
20
+
21
+ s:: N9.use( 90, r::Optional, d::RepeatCount.bounded(10)),
22
+ s::G62.use(110, r::Optional, d::RepeatCount.bounded(5)),
23
+ s::NTE.use(120, r::Optional, d::RepeatCount.bounded(20)),
24
+ s::W27.use(130, r::Optional, d::RepeatCount.bounded(1))),
25
+
26
+ d::TableDef.header("Table 2 - Detail",
27
+ d::LoopDef.build("LX", d::RepeatCount.bounded(9999),
28
+ s:: LX.use( 5, r::Mandatory, d::RepeatCount.bounded(1)),
29
+ s::MAN.use( 10, r::Mandatory, d::RepeatCount.bounded(1))),
30
+
31
+ d::LoopDef.build("W12", d::RepeatCount.bounded(9999),
32
+ s::W12.use( 20, r::Mandatory, d::RepeatCount.bounded(1)),
33
+ s::G69.use( 30, r::Optional, d::RepeatCount.bounded(5)),
34
+ s:: N9.use( 40, r::Optional, d::RepeatCount.bounded(200)))),
35
+
36
+ d::TableDef.header("Table 3 - Summary",
37
+ s::W03.use( 10, r::Mandatory, d::RepeatCount.bounded(1)),
38
+ s:: SE.use( 30, r::Mandatory, d::RepeatCount.bounded(1))))
39
+
40
+ end
41
+ end
42
+ end
43
+ end
@@ -13,12 +13,15 @@ module Stupidedi
13
13
  autoload :ResultSet, "stupidedi/editor/result_set"
14
14
 
15
15
  autoload :AbstractEd, "stupidedi/editor/abstract_ed"
16
+ autoload :FourOhOneEd, "stupidedi/editor/00401"
17
+ autoload :FortyTenEd, "stupidedi/editor/004010"
16
18
  autoload :FiveOhOneEd, "stupidedi/editor/00501"
17
19
  autoload :FiftyTenEd, "stupidedi/editor/005010"
18
20
  autoload :TransactionSetEd, "stupidedi/editor/transaction_set_ed"
19
21
  autoload :TransmissionEd, "stupidedi/editor/transmission_ed"
20
22
 
21
- autoload :X221, "stupidedi/editor/X221-HP835"
23
+ autoload :X12, "stupidedi/editor/X12"
24
+ # autoload :X221, "stupidedi/editor/X221-HP835"
22
25
  autoload :X222, "stupidedi/editor/X222-HC837"
23
26
 
24
27
  # TA1
@@ -0,0 +1,341 @@
1
+ module Stupidedi
2
+ module Editor
3
+
4
+ #
5
+ # Critiques (edits) interchanges (ISA/IEA) with version "00401", then
6
+ # selects the appropriate editor, according to the config, and edits
7
+ # each functional group (GS/GE)
8
+ #
9
+ class FourOhOneEd < AbstractEd
10
+
11
+ # @return [Config]
12
+ attr_reader :config
13
+
14
+ # @return [Time]
15
+ attr_reader :received
16
+
17
+ def initialize(config, received)
18
+ @config, @received =
19
+ config, received
20
+ end
21
+
22
+ # @return [ResultSet]
23
+ def critique(isa, acc)
24
+ # 000: No error
25
+
26
+ # 002: This Standard as Noted in the Control Standards Identifier is Not Supported
27
+ # Check for InvalidEnvelope
28
+
29
+ # 003: This Version of the Controls is Not Supported
30
+ # Check for InvalidEnvelope
31
+
32
+ # 004: The Segment Terminator is Invalid
33
+ # We couldn't have produced a parse tree, StreamReader#next_segment
34
+ # would have returned an Either.failure<Result.failure>
35
+
36
+ # 009: Unknown Interchange Receiver ID
37
+ # This isn't for Stupidedi to decide
38
+
39
+ # 016: Invalid Interchange Standards Identifier Value
40
+ # Check for InvalidEnvelope
41
+
42
+ # 022: Invalid Control Characters
43
+ # What does this mean? TokenReader ignores control characters anyway,
44
+ # so there will be no evidence of this in the parse tree
45
+
46
+ # 025: Duplicate Interchange Control Numbers
47
+ # Need to critique the parent, TransmissionVal
48
+
49
+ # 028: Invalid Date in Deferred Delivery Request
50
+ # 029: Invalid Time in Deferred Delivery Request
51
+ # 030: Invalid Delivery Time Code in Deferred Delivery Request
52
+ # 031: Invalid Grade of Service
53
+ # It seems these elements should not be sent to a trading partner,
54
+ # they are used internally to schedule a delivery. Not sure what to do
55
+ # about validating them in a general way...
56
+
57
+ acc.tap { critique_isa(isa, received, acc) }
58
+ end
59
+
60
+ private
61
+
62
+ def critique_isa(isa, received, acc)
63
+ # Authorization Information Qualifier
64
+ edit(:ISA01) do
65
+ isa.element(1).tap do |e|
66
+ if e.node.blank?
67
+ acc.ta105(e, "R", "010", "must be present")
68
+ elsif not e.node.allowed?
69
+ acc.ta105(e, "R", "010", "is not an allowed value")
70
+ end
71
+ end
72
+ end
73
+
74
+ # Authorization Information
75
+ edit(:ISA02) do
76
+ isa.element(2).tap do |e|
77
+ if e.node.blank?
78
+ acc.ta105(e, "R", "011", "must be present")
79
+ elsif e.node.invalid? or not config.editor.an?(e.node)
80
+ acc.ta105(e, "R", "011", "is not a valid string")
81
+ end
82
+ end
83
+ end
84
+
85
+ # Security Information Qualifier
86
+ edit(:ISA03) do
87
+ isa.element(3).tap do |e|
88
+ if e.node.blank?
89
+ acc.ta105(e, "R", "012", "must be present")
90
+ elsif not e.node.allowed?
91
+ acc.ta105(e, "R", "012", "is not an allowed value")
92
+ end
93
+ end
94
+ end
95
+
96
+ # Security Information
97
+ edit(:ISA04) do
98
+ isa.element(4).tap do |e|
99
+ if e.node.blank?
100
+ acc.ta105(e, "R", "013", "must be present")
101
+ elsif e.node.invalid? or not config.editor.an?(e.node)
102
+ acc.ta105(e, "R", "013", "is not a valid string")
103
+ end
104
+ end
105
+ end
106
+
107
+ # Interchange ID Qualifier
108
+ edit(:ISA05) do
109
+ isa.element(5).tap do |e|
110
+ if e.node.blank?
111
+ acc.ta105(e, "R", "005", "must be present")
112
+ elsif not e.node.allowed?
113
+ acc.ta105(e, "R", "005", "is not an allowed value")
114
+ end
115
+ end
116
+ end
117
+
118
+ # Interchange Sender ID
119
+ edit(:ISA06) do
120
+ isa.element(6).tap do |e|
121
+ if e.node.blank?
122
+ acc.ta105(e, "R", "006", "must be present")
123
+ elsif e.node.invalid? or not config.editor.an?(e.node)
124
+ acc.ta105(e, "R", "006", "is not a valid string")
125
+ end
126
+ end
127
+ end
128
+
129
+ # Interchange ID Qualifier
130
+ edit(:ISA07) do
131
+ isa.element(7).tap do |e|
132
+ if e.node.blank?
133
+ acc.ta105(e, "R", "007", "must be present")
134
+ elsif not e.node.allowed?
135
+ acc.ta105(e, "R", "007", "is not an allowed value")
136
+ end
137
+ end
138
+ end
139
+
140
+ # Interchange Receiver ID
141
+ edit(:ISA08) do
142
+ isa.element(8).tap do |e|
143
+ if e.node.blank?
144
+ acc.ta105(e, "R", "008", "must be present")
145
+ end
146
+ end
147
+ end
148
+
149
+ # Interchange Date
150
+ edit(:ISA09) do
151
+ isa.element(9).tap do |e|
152
+ if e.node.blank?
153
+ acc.ta105(e, "R", "014", "must be present")
154
+ elsif e.node.invalid?
155
+ acc.ta105(e, "R", "014", "is not a valid date")
156
+ else
157
+ # Convert to a proper 4-digit year, by making the assumption
158
+ # that the date is less than 30 years old. Note we have to use
159
+ # Object#send to work around an incorrectly declared private
160
+ # method that wasn't fixed until after Ruby 1.8
161
+ date = e.node.oldest(received.send(:to_date) << 12*30)
162
+
163
+ if date > received.utc.send(:to_date)
164
+ acc.ta105(e, "R", "014", "must not be a future date")
165
+ end
166
+ end
167
+ end
168
+ end
169
+
170
+ # Interchange Time
171
+ edit(:ISA10) do
172
+ isa.element(10).tap do |e|
173
+ if e.node.blank?
174
+ acc.ta105(e, "R", "015", "must be present")
175
+ elsif e.node.invalid?
176
+ acc.ta105(e, "R", "015", "is not a valid time")
177
+ else
178
+ isa.element(9).reject{|f| f.node.invalid? }.tap do |f|
179
+ date = f.node.oldest(received.send(:to_date) << 12*30)
180
+
181
+ if e.node.to_time(date) > received.utc
182
+ acc.ta105(e, "R", "015", "must not be a future time")
183
+ end
184
+ end
185
+ end
186
+ end
187
+ end
188
+
189
+ # Interchange Standards Identifier
190
+ edit(:ISA11) do
191
+ isa.element(11).tap do |e|
192
+ if e.node.blank?
193
+ acc.ta105(e, "R", "026", "must be present")
194
+ end
195
+ end
196
+ end
197
+
198
+ # Interchange Version ID
199
+ edit(:ISA12) do
200
+ isa.element(12).tap do |e|
201
+ if e.node.blank?
202
+ acc.ta105(e, "R", "026", "must be present")
203
+ end
204
+ end
205
+ end
206
+
207
+ # Interchange Control Number
208
+ edit(:ISA13) do
209
+ isa.element(13).tap do |e|
210
+ if e.node.blank?
211
+ acc.ta105(e, "R", "018", "must be present")
212
+ elsif e.node.invalid?
213
+ acc.ta105(e, "R", "018", "must be numeric")
214
+ elsif e.node <= 0
215
+ acc.ta105(e, "R", "018", "must be positive")
216
+ end
217
+ end
218
+ end
219
+
220
+ # Acknowledgment Requested
221
+ edit(:ISA14) do
222
+ isa.element(14).tap do |e|
223
+ if e.node.blank?
224
+ acc.ta105(e, "R", "019", "must be present")
225
+ elsif not e.node.allowed?
226
+ acc.ta105(e, "R", "019", "is not an allowed value")
227
+ end
228
+ end
229
+ end
230
+
231
+ # Interchange Usage Indicator
232
+ edit(:ISA15) do
233
+ isa.element(15).tap do |e|
234
+ if e.node.blank?
235
+ acc.ta105(e, "R", "020", "must be present")
236
+ elsif not e.node.allowed?
237
+ acc.ta105(e, "R", "020", "is not an allowed value")
238
+ end
239
+ end
240
+ end
241
+
242
+ # Component Element Separator
243
+ edit(:ISA16) do
244
+ isa.element(16).tap do |e|
245
+ if e.node.blank?
246
+ acc.ta105(e, "R", "027", "must be present")
247
+ elsif e.node.invalid? or not config.editor.an?(e.node)
248
+ acc.ta105(e, "R", "027", "is not a valid string")
249
+ else
250
+ isa.element(11).tap do |f|
251
+ if e.node == f.node
252
+ acc.ta105(e, "R", "027", "must be distinct from repetition separator")
253
+ end
254
+ end
255
+ end
256
+ end
257
+ end
258
+
259
+ m, gs06s = isa.find!(:GS), Hash.new{|h,k| h[k] = [] }
260
+ # Collect all the GS06 elements within this interchange
261
+ while m.defined?
262
+ m = m.flatmap do |gs|
263
+ edit_gs(gs, acc)
264
+
265
+ gs.element(6).tap{|e| gs06s[e.node.to_s] << e }
266
+ gs.find!(:GS)
267
+ end
268
+ end
269
+
270
+ # Group Control Number
271
+ edit(:GS06) do
272
+ gs06s.each do |number, dupes|
273
+ next if number.blank?
274
+ dupes.tail.each do |e|
275
+ acc.ak905(e, "R", "19", "must be unique within interchange")
276
+ end
277
+ end
278
+ end
279
+
280
+ edit(:IEA) do
281
+ isa.find(:IEA).tap do |iea|
282
+ edit_iea(iea, isa, gs06s.length, acc)
283
+ end.explain do
284
+ isa.segment.tap{|s| acc.ta105(s, "R", "023", "missing IEA segment") }
285
+ end
286
+ end
287
+ end
288
+
289
+ def edit_iea(iea, isa, gs_count, acc)
290
+ # @todo: acc.ta105(s, "024", "only one IEA segment is allowed")
291
+
292
+ # Number of Included Functional Groups
293
+ edit(:IEA01) do
294
+ iea.element(1).tap do |e|
295
+ if e.node.blank?
296
+ acc.ta105(e, "R", "021", "must be present")
297
+ elsif e.node.invalid?
298
+ acc.ta105(e, "R", "021", "must be numeric")
299
+ elsif e.node != gs_count
300
+ acc.ta105(e, "R", "021", "must equal the number of functional groups")
301
+ end
302
+ end
303
+ end
304
+
305
+ # Interchange Control Number
306
+ edit(:IEA02) do
307
+ iea.element(2).tap do |e|
308
+ if e.node.blank?
309
+ acc.ta105(e, "R", "001", "must be present")
310
+ else
311
+ isa.element(13).reject{|f| e.node == f.node }.tap do
312
+ acc.ta105(e, "R", "001", "must match interchange header control number")
313
+ end
314
+ end
315
+ end
316
+ end
317
+ end
318
+
319
+ #
320
+ # @see FortyTenEd#critique
321
+ #
322
+ def edit_gs(gs, acc)
323
+ gs.segment.tap do |x|
324
+ unless x.node.invalid?
325
+ envelope_def = x.node.definition.parent.parent
326
+
327
+ # Invoke the version-specific functional group editor
328
+ if config.editor.defined_at?(envelope_def)
329
+ editor = config.editor.at(envelope_def)
330
+ editor.new(config, received).critique(gs, acc)
331
+ end
332
+ else
333
+ # Probably "unknown interchange version '...'"
334
+ acc.ak905(x, "R", "2", x.node.reason)
335
+ end
336
+ end
337
+ end
338
+ end
339
+
340
+ end
341
+ end
@@ -0,0 +1,452 @@
1
+ module Stupidedi
2
+ module Editor
3
+
4
+ #
5
+ # Critiques (edits) a "004010" functional groups (GS/GE), then selects the
6
+ # appropriate editor, according to the config, and edits each transaction
7
+ # set (ST/SE)
8
+ #
9
+ class FortyTenEd < AbstractEd
10
+
11
+ # @return [Config]
12
+ attr_reader :config
13
+
14
+ # @return [Time]
15
+ attr_reader :received
16
+
17
+ def initialize(config, received)
18
+ @config, @received =
19
+ config, received
20
+ end
21
+
22
+ def critique(gs, acc)
23
+ acc.tap { critique_gs(gs, acc) }
24
+ end
25
+
26
+ private
27
+
28
+ def critique_gs(gs, acc)
29
+ # Functional Group Code
30
+ edit(:GS01) do
31
+ gs.element(1).tap do |e|
32
+ if e.node.blank?
33
+ if e.node.usage.required?
34
+ acc.ak905(e, "R", "1", "must be present")
35
+ end
36
+ elsif e.node.usage.forbidden?
37
+ acc.ak905(e, "R", "1", "must not be present")
38
+ else
39
+ # @todo: The allowed value depends on the child transaction set,
40
+ # but the GS segment is not declared in the transaction set def.
41
+ # Furthermore, the functional group may contain many transaction
42
+ # sets, so we need to check it once we get to the ST segment...
43
+ end
44
+ end
45
+ end
46
+
47
+ # Application Sender's Code
48
+ edit(:GS02) do
49
+ gs.element(2).tap do |e|
50
+ if e.node.blank?
51
+ if e.node.usage.required?
52
+ acc.ak905(e, "R", "14", "must be present")
53
+ end
54
+ elsif e.node.usage.forbidden?
55
+ acc.ak905(e, "R", "14", "must not be present")
56
+ elsif e.node.invalid? or not config.editor.an?(e.node)
57
+ acc.ak905(e, "R", "14", "is not a valid string")
58
+ end
59
+ end
60
+ end
61
+
62
+ # Application Receiver's Code
63
+ edit(:GS03) do
64
+ gs.element(3).tap do |e|
65
+ if e.node.blank?
66
+ acc.ak905(e, "R", "13", "must be present")
67
+ elsif e.node.invalid? or not config.editor.an?(e.node)
68
+ acc.ak905(e, "R", "13", "is not a valid string")
69
+ end
70
+ end
71
+ end
72
+
73
+ # Date
74
+ edit(:GS04) do
75
+ gs.element(4).tap do |e|
76
+ if e.node.blank?
77
+ acc.ta105(e, "R", "024", "must be present")
78
+ elsif e.node.invalid?
79
+ acc.ta105(e, "R", "024", "is not a valid date")
80
+ elsif e.node > received.utc.send(:to_date)
81
+ acc.ta105(e, "R", "024", "must not be a future date")
82
+ end
83
+ end
84
+ end
85
+
86
+ # Time
87
+ edit(:GS05) do
88
+ gs.element(5).tap do |e|
89
+ if e.node.blank?
90
+ acc.ta105(e, "R", "024", "must be present")
91
+ elsif e.node.invalid?
92
+ acc.ta105(e, "R", "024", "is not a valid time")
93
+ else
94
+ gs.element(4).reject{|f| f.node.invalid? }.tap do |f|
95
+ if e.node.to_time(f.node) > received.utc
96
+ acc.ta105(e, "R", "024", "must not be a future date")
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
102
+
103
+ # Group Control Number
104
+ edit(:GS06) do
105
+ gs.element(6).tap do |e|
106
+ if e.node.blank?
107
+ acc.ak905(e, "R", "6", "must be present")
108
+ elsif e.node.invalid?
109
+ acc.ak905(e, "R", "6", "is not a valid string")
110
+ elsif e.node < 0
111
+ acc.ak905(e, "R", "6", "must be positive")
112
+ elsif e.node > 999_999_999
113
+ acc.ak905(e, "R", "6", "is too long")
114
+ end
115
+ end
116
+ end
117
+
118
+ # Responsible Agency Code
119
+ edit(:GS07) do
120
+ gs.element(7).tap do |e|
121
+ if e.node.blank?
122
+ acc.ta105(e, "R", "024", "must be present")
123
+ elsif e.node.invalid?
124
+ acc.ta105(e, "R", "024", "is not a valid string")
125
+ elsif not e.node.allowed?
126
+ acc.ta105(e, "R", "024", "is not an allowed value")
127
+ end
128
+ end
129
+ end
130
+
131
+ # Version/Release/Industry Identifier Code
132
+ edit(:GS08) do
133
+ gs.element(8).tap do |e|
134
+ if e.node.blank?
135
+ acc.ak905(e, "R", "2", "must be present")
136
+ end
137
+ end
138
+ end
139
+
140
+ st, st02s = gs.find!(:ST), Hash.new{|h,k| h[k] = [] }
141
+ # Collect all the ST02 elements within this functional group
142
+ while st.defined?
143
+ st = st.flatmap do |st|
144
+ critique_st(st, acc)
145
+
146
+ st.element(2).
147
+ tap{|e| st02s[e.node.to_s] << e }.
148
+ explain do
149
+ # The #element method failed because this was an invalid ST
150
+ # segment. To workaround that, we can get the SegmentTok and
151
+ # select the ST02 ElementTok (zero-based index)
152
+ st.segment.tap do |s|
153
+ elements = s.node.segment_tok.element_toks
154
+ st02s[elements.at(1).value] << s
155
+ end
156
+ end
157
+
158
+ st.find!(:ST)
159
+ end
160
+ end
161
+
162
+ edit(:ST) do
163
+ if st02s.empty?
164
+ gs.segment.tap{|s| acc.ik502(s, "R", "1", "missing ST segment") }
165
+ end
166
+ end
167
+
168
+ edit(:ST02) do
169
+ st02s.each do |number, es|
170
+ next if number.blank?
171
+ es.tail.each do |e|
172
+ acc.ik502(e, "R", "23", "must be unique within functional group")
173
+ end
174
+ end
175
+ end
176
+
177
+ edit(:GE) do
178
+ gs.find(:GE).tap do |ge|
179
+ critique_ge(ge, gs, st02s.length, acc)
180
+ end.explain do
181
+ gs.segment.tap{|s| acc.ak905(s, "R", "3", "missing GE segment") }
182
+ end
183
+ end
184
+ end
185
+
186
+ def critique_ge(ge, gs, st_count, acc)
187
+ # Number of Transaction Sets Included
188
+ edit(:GE01) do
189
+ ge.element(1).tap do |e|
190
+ if e.node.empty?
191
+ acc.ak905(e, "R", "5", "must be present")
192
+ elsif e.node.invalid?
193
+ acc.ak905(e, "R", "5", "must be numeric")
194
+ elsif e.node != st_count
195
+ acc.ak905(e, "R", "5", "must equal the number of transactions")
196
+ end
197
+ end
198
+ end
199
+
200
+ # Group Control Number
201
+ edit(:GE02) do
202
+ ge.element(2).tap do |e|
203
+ if e.node.empty?
204
+ acc.ak905(e, "R", "4", "must be present")
205
+ else
206
+ gs.element(6).reject{|f| e.node == f.node }.tap do |f|
207
+ acc.ak905(e, "R", "4", "must match functional group header control number")
208
+ end
209
+ end
210
+ end
211
+ end
212
+ end
213
+
214
+ def critique_st(st, acc)
215
+ st.segment.tap do |x|
216
+ unless x.node.invalid?
217
+ # Invoke a general transaction set editor, which will later
218
+ # dispatch to a guide-specific transaction set editor
219
+ editor = TransactionSetEd.new(config, received)
220
+ editor.critique(st, acc)
221
+ else
222
+ acc.ik502(x, "R", "I6", x.node.reason)
223
+ return
224
+ end
225
+ end
226
+
227
+ # Transaction Set Identifier Code
228
+ edit(:ST01) do
229
+ st.element(1).tap do |e|
230
+ if e.node.blank?
231
+ if e.node.usage.required?
232
+ acc.ik502(e, "R", "6", "must be present")
233
+ end
234
+ elsif e.node.usage.forbidden?
235
+ acc.ik502(e, "R", "6", "must not be present")
236
+ elsif e.node.invalid?
237
+ acc.ik502(e, "R", "6", "is not a valid identifier")
238
+ elsif not e.node.allowed?
239
+ acc.ik502(e, "R", "6", "is not an allowed value")
240
+ end
241
+ end
242
+ end
243
+
244
+ # Transaction Set Control Number
245
+ edit(:ST02) do
246
+ st.element(2).tap do |e|
247
+ if e.node.blank?
248
+ if e.node.usage.required?
249
+ acc.ik502(e, "R", "7", "must be present")
250
+ elsif e.node.usage.forbidden?
251
+ acc.ik502(e, "R", "7", "must not be present")
252
+ elsif e.node.invalid?
253
+ acc.ik502(e, "R", "7", "is not a valid string")
254
+ end
255
+ end
256
+ end
257
+ end
258
+
259
+ edit(:SE) do
260
+ st.find(:SE).tap do |se|
261
+ critique_se(se, st, acc)
262
+ end.explain do
263
+ st.segment.tap{|s| acc.ik502(s, "R", "2", "missing SE segment") }
264
+ end
265
+ end
266
+ end
267
+
268
+ def critique_se(se, st, acc)
269
+ # Number of Included Segments
270
+ edit(:SE01) do
271
+ se.element(1).tap do |e|
272
+ if e.node.empty?
273
+ if e.node.usage.required?
274
+ acc.ik502(e, "R", "4", "must be present")
275
+ end
276
+ elsif e.node.usage.forbidden?
277
+ acc.ik502(e, "R", "4", "must not be present")
278
+ elsif e.node.invalid?
279
+ acc.ik502(e, "R", "4", "must be numeric")
280
+ else
281
+ st.distance(se).tap do |d|
282
+ unless e.node == d + 1
283
+ acc.ik502(e, "R", "4", "must equal the transaction segment count")
284
+ end
285
+ end
286
+ end
287
+ end
288
+ end
289
+
290
+ # Transaction Set Control Number
291
+ edit(:SE02) do
292
+ se.element(2).tap do |e|
293
+ if e.node.empty?
294
+ if e.node.usage.required?
295
+ acc.ik502(e, "R", "3", "must be present")
296
+ end
297
+ elsif e.node.usage.forbidden?
298
+ acc.ik502(e, "R", "3", "must not be present")
299
+ elsif e.node.invalid?
300
+ acc.ik502(e, "R", "3", "is not a valid string")
301
+ else
302
+ st.element(2).reject{|f| f.node == e.node }.tap do
303
+ acc.ik502(e, "R", "3", "must equal transaction header control number")
304
+ end
305
+ end
306
+ end
307
+ end
308
+ end
309
+
310
+ def critique_nm1(nm1, acc)
311
+ edit(:NM1) do
312
+ # Organization/last name
313
+ nm1.element(3).tap do |e|
314
+ if e.node.blank? and e.node.usage.optional?
315
+ acc.warn(e, "optional element is not present")
316
+ end
317
+ end
318
+
319
+ # Non-person entity
320
+ if nm1.element(2).select{|e| e.node == "2" }.defined?
321
+ # First name
322
+ nm1.element(4).tap do |e|
323
+ if e.node.present? and e.node.usage.optional?
324
+ acc.stc01(e, "T", "A8", "505", "must not be present when NM102 is 2")
325
+ end
326
+ end
327
+
328
+ # Middle name
329
+ nm1.element(5).tap do |e|
330
+ if e.node.present? and e.node.usage.optional?
331
+ acc.stc01(e, "T", "A8", "514", "must not be present when NM102 is 2")
332
+ end
333
+ end
334
+
335
+ # Prefix name
336
+ nm1.element(6).tap do |e|
337
+ if e.node.present? and e.node.usage.optional?
338
+ acc.stc01(e, "T", "A8", "125", "must not be present when NM102 is 2")
339
+ end
340
+ end
341
+
342
+ # Suffix name
343
+ nm1.element(7).tap do |e|
344
+ if e.node.present? and e.node.usage.optional?
345
+ acc.stc01(e, "T", "A8", "125", "must not be present when NM102 is 2")
346
+ end
347
+ end
348
+ end
349
+
350
+ # Person
351
+ if nm1.element(2).select{|e| e.node == "1" }.defined?
352
+ # First name
353
+ nm1.element(4).tap do |e|
354
+ if e.node.blank? and e.node.usage.optional?
355
+ acc.warn(e, "optional element is not present")
356
+ end
357
+ end
358
+
359
+ # Middle name
360
+ nm1.element(5).tap do |e|
361
+ if e.node.blank? and e.node.usage.optional?
362
+ acc.warn(e, "optional element is not present")
363
+ end
364
+ end
365
+
366
+ # Prefix name
367
+ nm1.element(6).tap do |e|
368
+ if e.node.blank? and e.node.usage.optional?
369
+ acc.warn(e, "optional element is not present")
370
+ end
371
+ end
372
+
373
+ # Suffix name
374
+ nm1.element(7).tap do |e|
375
+ if e.node.blank? and e.node.usage.optional?
376
+ acc.warn(e, "optional element is not present")
377
+ end
378
+ end
379
+ end
380
+ end
381
+ end
382
+
383
+ def critique_n3(n3, acc)
384
+ edit(:N3) do
385
+ n3.element(2).tap do |e|
386
+ if e.node.usage.optional?
387
+ unless n3.element(1).relect(&:blank?).defined?
388
+ # Second address line (N302) shouldn't be present if the
389
+ # first (N301) isn't also present
390
+ acc.warn(e, "second address line present without first line")
391
+ end
392
+ end
393
+ end
394
+ end
395
+ end
396
+
397
+ def critique_n4(n4, acc)
398
+ edit(:N4) do
399
+ usa_canada =
400
+ n4.element(2).select(&:present?).defined? ||
401
+ n4.element(4).select(&:blank?).defined? ||
402
+ n4.element(4).select{|e| e.node == "US" }.defined? ||
403
+ n4.element(7).select(&:blank?).defined?
404
+
405
+ # State or Province Code
406
+ n4.element(2).tap do |e|
407
+ if usa_canada
408
+ if e.node.blank? and e.node.situational?
409
+ # Required
410
+ end
411
+ else
412
+ if e.node.present? and e.node.situational?
413
+ # Forbidden
414
+ end
415
+ end
416
+ end
417
+
418
+ # Postal Code
419
+ n4.element(3).tap do |e|
420
+ if usa_canada
421
+ # US zipcodes must be 9-digits
422
+ end
423
+ end
424
+
425
+ # Country Code
426
+ n4.element(4).tap do |e|
427
+ if usa_canada
428
+ if e.node.present? and e.node.situational?
429
+ # Forbidden
430
+ end
431
+ else
432
+ # Country codes 2-digit from ISO 3166
433
+ end
434
+ end
435
+
436
+ # Country Subdivision Code
437
+ n4.element(7).tap do |e|
438
+ if usa_canada
439
+ if e.node.present? and e.node.situational?
440
+ # Forbidden
441
+ end
442
+ else
443
+ # Country subdivision codes from ISO 3166
444
+ end
445
+ end
446
+ end
447
+ end
448
+
449
+ end
450
+
451
+ end
452
+ end