eancom 0.1.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (137) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +190 -5
  3. data/.gitlab-ci.yml +25 -0
  4. data/.ruby-version +1 -0
  5. data/Gemfile.lock +22 -18
  6. data/README.md +46 -0
  7. data/bin/console +3 -2
  8. data/definitions/desadv/d01b.rb +251 -0
  9. data/definitions/desadv/d96a.rb +208 -87
  10. data/definitions/invoic/d01b.rb +559 -0
  11. data/definitions/invoic/d96a.rb +389 -0
  12. data/definitions/invrpt/d01b.rb +134 -0
  13. data/definitions/invrpt/d96a.rb +125 -0
  14. data/definitions/orders/d01b.rb +182 -0
  15. data/definitions/orders/d96b.rb +198 -0
  16. data/definitions/ordrsp/d01b.rb +251 -0
  17. data/definitions/ordrsp/d96b.rb +226 -0
  18. data/definitions/pricat/d01b.rb +225 -0
  19. data/definitions/pricat/d96b.rb +207 -0
  20. data/definitions/retann/d01b.rb +172 -0
  21. data/definitions/retann/d96b.rb +221 -0
  22. data/definitions/segments/ajt.rb +47 -0
  23. data/definitions/segments/alc.rb +328 -0
  24. data/definitions/segments/ali.rb +93 -0
  25. data/definitions/segments/bgm.rb +395 -0
  26. data/definitions/segments/cav.rb +122 -0
  27. data/definitions/segments/cci.rb +136 -0
  28. data/definitions/segments/cdi.rb +39 -0
  29. data/definitions/segments/cnt.rb +82 -0
  30. data/definitions/segments/cps.rb +76 -0
  31. data/definitions/segments/cta.rb +89 -0
  32. data/definitions/segments/cux.rb +174 -0
  33. data/definitions/segments/dgs.rb +34 -0
  34. data/definitions/segments/doc.rb +45 -0
  35. data/definitions/segments/dtm.rb +243 -0
  36. data/definitions/segments/efi.rb +67 -0
  37. data/definitions/segments/eqd.rb +37 -0
  38. data/definitions/segments/ftx.rb +165 -0
  39. data/definitions/segments/gin.rb +113 -0
  40. data/definitions/segments/imd.rb +360 -0
  41. data/definitions/segments/inv.rb +94 -0
  42. data/definitions/segments/lin.rb +133 -0
  43. data/definitions/segments/loc.rb +137 -0
  44. data/definitions/segments/mea.rb +189 -0
  45. data/definitions/segments/moa.rb +228 -0
  46. data/definitions/segments/nad.rb +314 -0
  47. data/definitions/segments/pac.rb +262 -0
  48. data/definitions/segments/pat.rb +171 -0
  49. data/definitions/segments/pcd.rb +72 -0
  50. data/definitions/segments/pci.rb +110 -0
  51. data/definitions/segments/pgi.rb +152 -0
  52. data/definitions/segments/pia.rb +501 -0
  53. data/definitions/segments/pri.rb +208 -0
  54. data/definitions/segments/qty.rb +293 -0
  55. data/definitions/segments/rff.rb +210 -0
  56. data/definitions/segments/rte.rb +52 -0
  57. data/definitions/segments/tax.rb +266 -0
  58. data/definitions/segments/tdt.rb +278 -0
  59. data/definitions/segments/tod.rb +64 -0
  60. data/definitions/segments/tru.rb +34 -0
  61. data/definitions/segments/una.rb +85 -0
  62. data/definitions/segments/unb.rb +284 -0
  63. data/definitions/segments/unh.rb +183 -0
  64. data/definitions/segments/uns.rb +40 -0
  65. data/definitions/segments/unt.rb +48 -0
  66. data/definitions/segments/unz.rb +48 -0
  67. data/definitions/slsrpt/d01b.rb +206 -0
  68. data/definitions/slsrpt/d96a.rb +199 -0
  69. data/eancom.gemspec +2 -1
  70. data/lib/eancom.rb +61 -16
  71. data/lib/eancom/definition.rb +1 -1
  72. data/lib/eancom/edifact.rb +60 -13
  73. data/lib/eancom/edifact/body.rb +63 -0
  74. data/lib/eancom/edifact/composite.rb +38 -0
  75. data/lib/eancom/edifact/data.rb +108 -0
  76. data/lib/eancom/edifact/document.rb +43 -11
  77. data/lib/eancom/edifact/document_element.rb +26 -0
  78. data/lib/eancom/edifact/footer.rb +7 -0
  79. data/lib/eancom/edifact/header.rb +15 -0
  80. data/lib/eancom/edifact/item.rb +40 -0
  81. data/lib/eancom/edifact/message.rb +24 -16
  82. data/lib/eancom/edifact/segment.rb +131 -12
  83. data/lib/eancom/edifact/segments/ajt.rb +32 -0
  84. data/lib/eancom/edifact/segments/alc.rb +61 -0
  85. data/lib/eancom/edifact/segments/ali.rb +50 -0
  86. data/lib/eancom/edifact/segments/bgm.rb +46 -0
  87. data/lib/eancom/edifact/segments/cav.rb +47 -0
  88. data/lib/eancom/edifact/segments/cci.rb +53 -0
  89. data/lib/eancom/edifact/segments/cdi.rb +30 -0
  90. data/lib/eancom/edifact/segments/cnt.rb +40 -0
  91. data/lib/eancom/edifact/segments/cps.rb +33 -0
  92. data/lib/eancom/edifact/segments/cta.rb +30 -0
  93. data/lib/eancom/edifact/segments/cux.rb +60 -0
  94. data/lib/eancom/edifact/segments/dgs.rb +31 -0
  95. data/lib/eancom/edifact/segments/doc.rb +30 -0
  96. data/lib/eancom/edifact/segments/dtm.rb +47 -0
  97. data/lib/eancom/edifact/segments/efi.rb +38 -0
  98. data/lib/eancom/edifact/segments/eqd.rb +30 -0
  99. data/lib/eancom/edifact/segments/ftx.rb +63 -0
  100. data/lib/eancom/edifact/segments/gin.rb +45 -0
  101. data/lib/eancom/edifact/segments/imd.rb +69 -0
  102. data/lib/eancom/edifact/segments/inv.rb +43 -0
  103. data/lib/eancom/edifact/segments/lin.rb +47 -0
  104. data/lib/eancom/edifact/segments/loc.rb +46 -0
  105. data/lib/eancom/edifact/segments/mea.rb +54 -0
  106. data/lib/eancom/edifact/segments/moa.rb +45 -0
  107. data/lib/eancom/edifact/segments/nad.rb +112 -0
  108. data/lib/eancom/edifact/segments/pac.rb +56 -0
  109. data/lib/eancom/edifact/segments/pat.rb +37 -0
  110. data/lib/eancom/edifact/segments/pcd.rb +33 -0
  111. data/lib/eancom/edifact/segments/pci.rb +40 -0
  112. data/lib/eancom/edifact/segments/pgi.rb +45 -0
  113. data/lib/eancom/edifact/segments/pia.rb +108 -0
  114. data/lib/eancom/edifact/segments/pri.rb +53 -0
  115. data/lib/eancom/edifact/segments/qty.rb +44 -0
  116. data/lib/eancom/edifact/segments/rff.rb +47 -0
  117. data/lib/eancom/edifact/segments/rte.rb +33 -0
  118. data/lib/eancom/edifact/segments/tax.rb +78 -0
  119. data/lib/eancom/edifact/segments/tdt.rb +57 -0
  120. data/lib/eancom/edifact/segments/tod.rb +33 -0
  121. data/lib/eancom/edifact/segments/tru.rb +31 -0
  122. data/lib/eancom/edifact/segments/una.rb +52 -0
  123. data/lib/eancom/edifact/segments/unb.rb +68 -0
  124. data/lib/eancom/edifact/segments/unh.rb +50 -0
  125. data/lib/eancom/edifact/segments/uns.rb +32 -0
  126. data/lib/eancom/edifact/segments/unt.rb +28 -0
  127. data/lib/eancom/edifact/segments/unz.rb +28 -0
  128. data/lib/eancom/edifact/structure.rb +90 -0
  129. data/lib/eancom/factory.rb +9 -8
  130. data/lib/eancom/parser.rb +7 -0
  131. data/lib/eancom/parser/document.rb +60 -0
  132. data/lib/eancom/parser/segment.rb +71 -0
  133. data/lib/eancom/version.rb +1 -1
  134. data/pricat.json +1 -0
  135. metadata +141 -9
  136. data/lib/eancom/edifact/element.rb +0 -16
  137. data/lib/eancom/edifact/envelope.rb +0 -24
@@ -0,0 +1,262 @@
1
+ tag = 'PAC'
2
+ Eancom.register_segment(tag: tag, klass: Eancom::Edifact::PAC)
3
+
4
+ structure = Eancom::Edifact::Structure.new(tag: tag)
5
+ #==============================================================================
6
+ # Tag #
7
+ #==============================================================================
8
+ tag = Eancom::Edifact::Composite.new()
9
+ data = Eancom::Edifact::Data.new(
10
+ type: String,
11
+ length: 3,
12
+ description: "Message Header",
13
+ required: true
14
+ )
15
+ tag.add(:tag, data)
16
+
17
+ structure << tag
18
+ #==============================================================================
19
+ # Document/Message Name #
20
+ #==============================================================================
21
+ package_quantity = Eancom::Edifact::Composite.new()
22
+
23
+ data = Eancom::Edifact::Data.new(
24
+ # TODO: int
25
+ type: String,
26
+ length: 1..8,
27
+ description: "Package quantity",
28
+ required: false
29
+ )
30
+ package_quantity.add(:package_quantity, data)
31
+
32
+ structure << package_quantity
33
+ #==============================================================================
34
+ # Packaging Details #
35
+ #==============================================================================
36
+ packaging_details = Eancom::Edifact::Composite.new()
37
+
38
+ packaging_level_code = Eancom::Edifact::Data.new(
39
+ type: String,
40
+ length: 1..3,
41
+ dictionary: {
42
+ '1' => {
43
+ description: 'Inner',
44
+ identifier: 'inner'
45
+ },
46
+ '3' => {
47
+ description: 'Outer',
48
+ identifier: 'outer'
49
+ }
50
+ },
51
+ description: "Packaging level code",
52
+ required: false
53
+ )
54
+ packaging_details.add(:packaging_level_code, packaging_level_code)
55
+
56
+ packaging_related_description_code = Eancom::Edifact::Data.new(
57
+ type: String,
58
+ length: 0..3,
59
+ dictionary: {
60
+ '50' => {
61
+ description: 'Package barcoded EAN-13 or EAN-8',
62
+ identifier: 'package_barcoded_ean13_or_ean8'
63
+ },
64
+ '51' => {
65
+ description: 'Package barcoded ITF-14',
66
+ identifier: 'package_barcoded_itf14'
67
+ },
68
+ '52' => {
69
+ description: 'Package barcoded UCC or EAN-128',
70
+ identifier: 'package_barcoded_ucc_or_ean128'
71
+ },
72
+ '78' => {
73
+ description: 'Package bar-coded and EPC tagged',
74
+ identifier: 'package_barcoded_and_epc_tagged'
75
+ },
76
+ '79' => {
77
+ description: 'Package EPC tagged only',
78
+ identifier: 'package_epc_tagged_only'
79
+ },
80
+ },
81
+ description: "Packaging related description code",
82
+ required: false
83
+ )
84
+ packaging_details.add(:packaging_related_description_code, packaging_related_description_code)
85
+
86
+
87
+ packaging_terms_and_conditions = Eancom::Edifact::Data.new(
88
+ type: String,
89
+ length: 0..3,
90
+ dictionary: {
91
+ '1' => {
92
+ description: 'Packaging cost paid by supplier',
93
+ identifier: 'packaging_cost_paid_by_supplier'
94
+ },
95
+ '2' => {
96
+ description: 'Packaging cost paid by recipient',
97
+ identifier: 'packaging_cost_paid_by_recipient'
98
+ },
99
+ '3' => {
100
+ description: 'Packaging cost not charged (returnable)',
101
+ identifier: 'packaging_cost_not_charged'
102
+ },
103
+ '24' => {
104
+ description: 'Rented',
105
+ identifier: 'rented'
106
+ },
107
+ '25' => {
108
+ description: 'Safe return deposit',
109
+ identifier: 'safe_return_deposit'
110
+ },
111
+ '26' => {
112
+ description: 'Not reusable',
113
+ identifier: 'not_reusable'
114
+ },
115
+ '27' => {
116
+ description: 'Package exchangeable at the point of delivery',
117
+ identifier: 'package_exchangeable_at_the_point_of_delivery'
118
+ },
119
+ },
120
+ description: "Packaging terms and conditions code",
121
+ required: false
122
+ )
123
+ packaging_details.add(:packaging_terms_and_conditions, packaging_terms_and_conditions)
124
+
125
+ structure << packaging_details
126
+ #==============================================================================
127
+ # Package Type #
128
+ #==============================================================================
129
+ package_type = Eancom::Edifact::Composite.new()
130
+
131
+ package_type_description_code = Eancom::Edifact::Data.new(
132
+ type: String,
133
+ length: 0..17,
134
+ dictionary: {
135
+ '09' => {
136
+ description: 'Returnable pallet (GS1 Temporary Code)',
137
+ identifier: 'returnable_pallet'
138
+ },
139
+ '201' => {
140
+ description: 'Pallet ISO 1 - 1/1 EURO Pallet (GS1 Temporary Code)',
141
+ identifier: 'pallet_iso_1_euro_pallet'
142
+ },
143
+ 'PK' => {
144
+ # TODO: Find out what this is used for
145
+ # PK means package. This should explain its use.
146
+ description: 'PK: Function Unknown',
147
+ identifier: 'pk_function_unknown'
148
+ },
149
+ 'SL' => {
150
+ # TODO: Find out what this is used for
151
+ # SL means slipsheet. This should explain its use.
152
+ description: 'SL: Function Unknown',
153
+ identifier: 'sl_function_unknown'
154
+ },
155
+ },
156
+ description: "Package type description code",
157
+ required: false
158
+ )
159
+ package_type.add(:package_type_description_code, package_type_description_code)
160
+
161
+ code_list_identification_code = Eancom::Edifact::Data.new(
162
+ type: String,
163
+ length: 0..17,
164
+ description: "Code list identification code",
165
+ required: false
166
+ )
167
+ package_type.add(:code_list_identification_code, code_list_identification_code)
168
+
169
+ code_list_responsible_agency_code = Eancom::Edifact::Data.new(
170
+ type: String,
171
+ length: 0..17,
172
+ dictionary: {
173
+ '9' => {
174
+ description: 'GS1',
175
+ identifier: 'gs1'
176
+ }
177
+ },
178
+ description: "Code list responsible agency code",
179
+ required: false
180
+ )
181
+ package_type.add(:code_list_responsible_agency_code, code_list_responsible_agency_code)
182
+
183
+ type_of_packages = Eancom::Edifact::Data.new(
184
+ type: String,
185
+ length: 0..35,
186
+ description: "Type of packages",
187
+ required: false
188
+ )
189
+ package_type.add(:type_of_packages, type_of_packages)
190
+
191
+ structure << package_type
192
+ #==============================================================================
193
+ # Package Type Identification #
194
+ #==============================================================================
195
+ package_type_identification = Eancom::Edifact::Composite.new()
196
+
197
+ description_format_code = Eancom::Edifact::Data.new(
198
+ type: String,
199
+ length: 0..3,
200
+ description: "Description format code",
201
+ required: false
202
+ )
203
+ package_type_identification.add(:description_format_code, description_format_code)
204
+
205
+ type_of_packages = Eancom::Edifact::Data.new(
206
+ type: String,
207
+ length: 0..35,
208
+ description: "Type of packages",
209
+ required: false
210
+ )
211
+ package_type_identification.add(:type_of_packages_1, type_of_packages)
212
+
213
+ item_type_identification_code = Eancom::Edifact::Data.new(
214
+ type: String,
215
+ length: 0..3,
216
+ description: "Item type identification code",
217
+ required: false
218
+ )
219
+ package_type_identification.add(:item_type_identification_code_1, item_type_identification_code)
220
+
221
+ package_type_identification.add(:type_of_packages_2, type_of_packages)
222
+ package_type_identification.add(:item_type_identification_code_2, item_type_identification_code)
223
+
224
+ structure << package_type_identification
225
+ #==============================================================================
226
+ # Returnable Package Details #
227
+ #==============================================================================
228
+ returnable_package_details = Eancom::Edifact::Composite.new()
229
+
230
+ returnable_package_freight_payment_responsibility_code = Eancom::Edifact::Data.new(
231
+ type: String,
232
+ length: 0..3,
233
+ dictionary: {
234
+ '1' => {
235
+ description: 'Paid by customer',
236
+ identifier: 'paid_by_customer'
237
+ },
238
+ '2' => {
239
+ description: 'Free',
240
+ identifier: 'free'
241
+ },
242
+ '3' => {
243
+ description: 'Paid by supplier',
244
+ identifier: 'paid_by_supplier'
245
+ }
246
+ },
247
+ description: "Returnable package freight",
248
+ required: false
249
+ )
250
+ returnable_package_details.add(:returnable_package_freight_payment_responsibility_code, returnable_package_freight_payment_responsibility_code)
251
+
252
+ returnable_package_load_contents_code = Eancom::Edifact::Data.new(
253
+ type: String,
254
+ length: 0..3,
255
+ description: "Returnable package load contents code",
256
+ required: false
257
+ )
258
+ returnable_package_details.add(:returnable_package_load_contents_code, returnable_package_load_contents_code)
259
+
260
+ structure << returnable_package_details
261
+ #==============================================================================
262
+ Eancom.register_structure(tag: 'PAC', structure: structure)
@@ -0,0 +1,171 @@
1
+ tag = 'PAT'
2
+ Eancom.register_segment(tag: tag, klass: Eancom::Edifact::PAT)
3
+
4
+ structure = Eancom::Edifact::Structure.new(tag: tag)
5
+ #==============================================================================
6
+ # Tag #
7
+ #==============================================================================
8
+ tag = Eancom::Edifact::Composite.new
9
+ data = Eancom::Edifact::Data.new(
10
+ type: String,
11
+ length: 1..3,
12
+ dictionary: nil,
13
+ description: 'Message Header',
14
+ required: true
15
+ )
16
+ tag.add(:tag, data)
17
+
18
+ structure << tag
19
+
20
+ payment_terms_type_code_qualifier = Eancom::Edifact::Composite.new
21
+ data = Eancom::Edifact::Data.new(
22
+ type: String,
23
+ length: 1..3,
24
+ dictionary: {
25
+ '1' => {
26
+ description: 'Basic',
27
+ identifier: 'basic'
28
+ },
29
+ '2' => {
30
+ description: 'End of month',
31
+ identifier: 'end_of_month'
32
+ },
33
+ '3' => {
34
+ description: 'Fixed date',
35
+ identifier: 'fixed_date'
36
+ },
37
+ '4' => {
38
+ description: 'Deferred',
39
+ identifier: 'deferred'
40
+ },
41
+ '5' => {
42
+ description: 'Discount not applicable',
43
+ identifier: 'discount_not_applicable'
44
+ },
45
+ '6' => {
46
+ description: 'Mixed',
47
+ identifier: 'mixed'
48
+ },
49
+ '7' => {
50
+ description: 'Extended',
51
+ identifier: 'extended'
52
+ },
53
+ '8' => {
54
+ desription: 'Basic discount offered',
55
+ identifier: 'basic_discount_offered'
56
+ },
57
+ '9' => {
58
+ description: 'Proximo',
59
+ identifier: 'proximo'
60
+ },
61
+ '10' => {
62
+ description: 'Instant',
63
+ identifier: 'instant'
64
+ },
65
+ '11' => {
66
+ description: 'Elective',
67
+ identifier: 'elective'
68
+ },
69
+ '12' => {
70
+ description: '10 days after end of month',
71
+ identifier: '10_days_after_end_of_month'
72
+ },
73
+ '18' => {
74
+ description: 'Previously agreed upon',
75
+ identifier: 'previously_agreed_upon'
76
+ },
77
+ '20' => {
78
+ description: 'Penalty terms',
79
+ identifier: 'penalty_terms'
80
+ },
81
+ '22' => {
82
+ description: 'Discount',
83
+ identifier: 'discount'
84
+ },
85
+ '37' => {
86
+ description: 'Complete payment',
87
+ identifier: 'complete_payment'
88
+ }
89
+ },
90
+ description: 'Payment terms type code qualifier',
91
+ required: true
92
+ )
93
+ payment_terms_type_code_qualifier.add(:payment_terms_type_code_qualifier, data)
94
+
95
+ structure << payment_terms_type_code_qualifier
96
+ #==============================================================================
97
+ # PAYMENT TERMS #
98
+ #==============================================================================
99
+ payment_terms_type_description_identifier = Eancom::Edifact::Composite.new
100
+ data = Eancom::Edifact::Data.new(
101
+ type: String,
102
+ length: 1..17,
103
+ dictionary: {
104
+ '1' => {
105
+ description: 'Draft(s) drawn on issuing bank',
106
+ identifier: 'drafts_drawn_on_issuing_bank'
107
+ },
108
+ '2' => {
109
+ description: 'Draft(s) drawn on advising bank',
110
+ identifier: 'drafts_drawn_on_advising_bank'
111
+ },
112
+ '3' => {
113
+ description: 'Draft(s) drawn on reimbursing bank',
114
+ identifier: 'drafts_drawn_on_reimbursing_bank'
115
+ },
116
+ '4' => {
117
+ description: 'Draft(s) drawn on applicant',
118
+ identifier: 'drafts_drawn_on_applicant'
119
+ },
120
+ '5' => {
121
+ description: 'Draft(s) drawn on any other drawee',
122
+ identifier: 'drafts_drawn_on_any_other_drawee'
123
+ },
124
+ '6' => {
125
+ description: 'No drafts',
126
+ identifier: 'no_drafts'
127
+ },
128
+ 'ZZZ' => {
129
+ description: 'Mutually defined',
130
+ identifier: 'mutually_defined'
131
+ }
132
+ },
133
+ description: 'Payment terms description identifier',
134
+ required: true
135
+ )
136
+ payment_terms_type_description_identifier.add(:payment_terms_type_description_identifier, data)
137
+
138
+ structure << payment_terms_type_description_identifier
139
+ #==============================================================================
140
+ # TERMS/TIME INFORMATION #
141
+ #==============================================================================
142
+ time_reference_code = Eancom::Edifact::Composite.new
143
+ data = Eancom::Edifact::Data.new(
144
+ type: String,
145
+ length: 1..3,
146
+ dictionary: {
147
+ '5' => {
148
+ description: 'Date of invoice',
149
+ identifier: 'date_of_invoice'
150
+ },
151
+ '66' => {
152
+ description: 'Specified date',
153
+ identifier: 'specified_date'
154
+ },
155
+ '69' => {
156
+ description: 'Invoice transmission date',
157
+ identifier: 'invoice_transmission_date'
158
+ },
159
+ '81' => {
160
+ description: 'Date of shipment as evidenced by the transport document(s)',
161
+ identifier: 'date_of_shipment_as_evid_by_the_transp_docs'
162
+ }
163
+ },
164
+ description: 'Time reference code',
165
+ required: true
166
+ )
167
+ time_reference_code.add(:time_reference_code, data)
168
+
169
+ structure << time_reference_code
170
+ #==============================================================================
171
+ Eancom.register_structure(tag: 'PAT', structure: structure)
@@ -0,0 +1,72 @@
1
+ tag = 'PCD'
2
+ Eancom.register_segment(tag: tag, klass: Eancom::Edifact::PCD)
3
+
4
+ structure = Eancom::Edifact::Structure.new(tag: tag)
5
+ #==============================================================================
6
+ # Tag #
7
+ #==============================================================================
8
+ tag = Eancom::Edifact::Composite.new
9
+ data = Eancom::Edifact::Data.new(
10
+ type: String,
11
+ length: 1..3,
12
+ dictionary: nil,
13
+ description: 'Message Header',
14
+ required: true
15
+ )
16
+ tag.add(:tag, data)
17
+
18
+ structure << tag
19
+ #==============================================================================
20
+ # PERCENTAGE DETAILS #
21
+ #==============================================================================
22
+ percentage_details = Eancom::Edifact::Composite.new
23
+ data = Eancom::Edifact::Data.new(
24
+ type: String,
25
+ length: 1..3,
26
+ dictionary: {
27
+ '1' => {
28
+ description: 'Allowance',
29
+ identifier: 'allowance'
30
+ },
31
+ '2' => {
32
+ description: 'Charge',
33
+ identifier: 'charge'
34
+ },
35
+ '3' => {
36
+ description: 'Allowance or charge',
37
+ identifier: 'allowance_or_charge'
38
+ },
39
+ '7' => {
40
+ description: 'Percentage of invoice',
41
+ identifier: 'percentage_of_invoice'
42
+ },
43
+ '12' => {
44
+ description: 'Discount',
45
+ identifier: 'discount'
46
+ },
47
+ '15' => {
48
+ description: 'Penalty percentage',
49
+ identifier: 'penalty_percentage'
50
+ },
51
+ '16' => {
52
+ description: 'Interest percentage',
53
+ identifier: 'interest_percentage'
54
+ }
55
+ },
56
+ description: 'Percentage type code qualifier',
57
+ required: true
58
+ )
59
+ percentage_details.add(:percentage_type_code_qualifier, data)
60
+
61
+ data = Eancom::Edifact::Data.new(
62
+ type: String,
63
+ length: 1..10,
64
+ dictionary: nil,
65
+ description: 'Percentage',
66
+ required: false
67
+ )
68
+ percentage_details.add(:percentage, data)
69
+
70
+ structure << percentage_details
71
+ #===============================================================================#
72
+ Eancom.register_structure(tag: 'PCD', structure: structure)