eancom 0.1.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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)