eancom 0.1.0 → 1.2.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 (97) hide show
  1. checksums.yaml +4 -4
  2. data/.DS_Store +0 -0
  3. data/.gitignore +187 -6
  4. data/.gitlab-ci.yml +27 -0
  5. data/.rspec_status +225 -0
  6. data/.rubocop.yml +2 -0
  7. data/.ruby-version +1 -0
  8. data/Gemfile +4 -2
  9. data/Gemfile.lock +87 -3
  10. data/bin/console +3 -2
  11. data/definitions/desadv/d01b.rb +205 -0
  12. data/definitions/desadv/d96a.rb +108 -73
  13. data/definitions/segments/alc.rb +236 -0
  14. data/definitions/segments/ali.rb +93 -0
  15. data/definitions/segments/bgm.rb +267 -0
  16. data/definitions/segments/cav.rb +122 -0
  17. data/definitions/segments/cci.rb +136 -0
  18. data/definitions/segments/cnt.rb +78 -0
  19. data/definitions/segments/cps.rb +76 -0
  20. data/definitions/segments/cux.rb +167 -0
  21. data/definitions/segments/dtm.rb +159 -0
  22. data/definitions/segments/ftx.rb +143 -0
  23. data/definitions/segments/imd.rb +356 -0
  24. data/definitions/segments/lin.rb +113 -0
  25. data/definitions/segments/loc.rb +89 -0
  26. data/definitions/segments/mea.rb +189 -0
  27. data/definitions/segments/moa.rb +144 -0
  28. data/definitions/segments/nad.rb +254 -0
  29. data/definitions/segments/pac.rb +250 -0
  30. data/definitions/segments/pgi.rb +148 -0
  31. data/definitions/segments/pia.rb +501 -0
  32. data/definitions/segments/pri.rb +188 -0
  33. data/definitions/segments/qty.rb +79 -0
  34. data/definitions/segments/rff.rb +166 -0
  35. data/definitions/segments/tax.rb +259 -0
  36. data/definitions/segments/tdt.rb +254 -0
  37. data/definitions/segments/una.rb +85 -0
  38. data/definitions/segments/unb.rb +284 -0
  39. data/definitions/segments/unh.rb +118 -0
  40. data/definitions/segments/uns.rb +40 -0
  41. data/definitions/segments/unt.rb +48 -0
  42. data/definitions/segments/unz.rb +48 -0
  43. data/definitions/slsrpt/d01b.rb +201 -0
  44. data/definitions/slsrpt/d96a.rb +194 -0
  45. data/eancom.gemspec +9 -5
  46. data/lib/eancom/definition.rb +1 -1
  47. data/lib/eancom/edifact/body.rb +63 -0
  48. data/lib/eancom/edifact/composite.rb +38 -0
  49. data/lib/eancom/edifact/data.rb +108 -0
  50. data/lib/eancom/edifact/document.rb +43 -11
  51. data/lib/eancom/edifact/document_element.rb +26 -0
  52. data/lib/eancom/edifact/footer.rb +6 -0
  53. data/lib/eancom/edifact/header.rb +15 -0
  54. data/lib/eancom/edifact/item.rb +40 -0
  55. data/lib/eancom/edifact/message.rb +24 -16
  56. data/lib/eancom/edifact/segment.rb +131 -12
  57. data/lib/eancom/edifact/segments/alc.rb +61 -0
  58. data/lib/eancom/edifact/segments/ali.rb +52 -0
  59. data/lib/eancom/edifact/segments/bgm.rb +45 -0
  60. data/lib/eancom/edifact/segments/cav.rb +47 -0
  61. data/lib/eancom/edifact/segments/cci.rb +53 -0
  62. data/lib/eancom/edifact/segments/cnt.rb +33 -0
  63. data/lib/eancom/edifact/segments/cps.rb +30 -0
  64. data/lib/eancom/edifact/segments/cux.rb +60 -0
  65. data/lib/eancom/edifact/segments/dtm.rb +43 -0
  66. data/lib/eancom/edifact/segments/ftx.rb +63 -0
  67. data/lib/eancom/edifact/segments/imd.rb +69 -0
  68. data/lib/eancom/edifact/segments/lin.rb +43 -0
  69. data/lib/eancom/edifact/segments/loc.rb +43 -0
  70. data/lib/eancom/edifact/segments/mea.rb +53 -0
  71. data/lib/eancom/edifact/segments/moa.rb +45 -0
  72. data/lib/eancom/edifact/segments/nad.rb +107 -0
  73. data/lib/eancom/edifact/segments/pac.rb +54 -0
  74. data/lib/eancom/edifact/segments/pgi.rb +45 -0
  75. data/lib/eancom/edifact/segments/pia.rb +107 -0
  76. data/lib/eancom/edifact/segments/pri.rb +54 -0
  77. data/lib/eancom/edifact/segments/qty.rb +40 -0
  78. data/lib/eancom/edifact/segments/rff.rb +41 -0
  79. data/lib/eancom/edifact/segments/tax.rb +72 -0
  80. data/lib/eancom/edifact/segments/tdt.rb +54 -0
  81. data/lib/eancom/edifact/segments/una.rb +51 -0
  82. data/lib/eancom/edifact/segments/unb.rb +69 -0
  83. data/lib/eancom/edifact/segments/unh.rb +46 -0
  84. data/lib/eancom/edifact/segments/uns.rb +29 -0
  85. data/lib/eancom/edifact/segments/unt.rb +28 -0
  86. data/lib/eancom/edifact/segments/unz.rb +28 -0
  87. data/lib/eancom/edifact/structure.rb +91 -0
  88. data/lib/eancom/edifact.rb +45 -12
  89. data/lib/eancom/factory.rb +8 -7
  90. data/lib/eancom/parser/document.rb +68 -0
  91. data/lib/eancom/parser/segment.rb +71 -0
  92. data/lib/eancom/parser.rb +7 -0
  93. data/lib/eancom/version.rb +1 -1
  94. data/lib/eancom.rb +59 -16
  95. metadata +138 -5
  96. data/lib/eancom/edifact/element.rb +0 -16
  97. data/lib/eancom/edifact/envelope.rb +0 -24
@@ -0,0 +1,118 @@
1
+ tag = 'UNH'
2
+ Eancom.register_segment(tag: tag, klass: Eancom::Edifact::UNH)
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
+ dictionary: nil,
13
+ description: "Message Header",
14
+ required: true
15
+ )
16
+ tag.add(:tag, data)
17
+
18
+ structure << tag
19
+ #==============================================================================
20
+ # Message reference number #
21
+ #==============================================================================
22
+ message_reference_number = Eancom::Edifact::Composite.new()
23
+ data = Eancom::Edifact::Data.new(
24
+ type: String,
25
+ length: 1..14,
26
+ dictionary: nil,
27
+ description: 'Unique reference number assigned to a message within an interchange by the sender. Same reference number as in DE 0062 of the UNT segment of the message.',
28
+ required: true
29
+ )
30
+ message_reference_number.add(:message_reference_number, data)
31
+
32
+ structure << message_reference_number
33
+ #==============================================================================
34
+ # Message Identifier #
35
+ #==============================================================================
36
+ message_identifier = Eancom::Edifact::Composite.new()
37
+
38
+ data = Eancom::Edifact::Data.new(
39
+ type: String,
40
+ length: 1..6,
41
+ dictionary: nil,
42
+ description: 'Identification of a message',
43
+ required: true
44
+ )
45
+ message_identifier.add(:message_type, data)
46
+
47
+ data = Eancom::Edifact::Data.new(
48
+ type: String,
49
+ length: 1..3,
50
+ dictionary: {
51
+ 'D' => {
52
+ description: 'UN/EDIFACT Directory'
53
+ }
54
+ },
55
+ description: 'Message version number',
56
+ required: true
57
+ )
58
+ message_identifier.add(:message_version_number, data)
59
+
60
+ data = Eancom::Edifact::Data.new(
61
+ type: String,
62
+ length: 1..3,
63
+ dictionary: {
64
+ '01B' => {
65
+ description: 'Release 2001 - B'
66
+ },
67
+ '93A' => {
68
+ description: 'Release 93A'
69
+ },
70
+ '96A' => {
71
+ description: 'Release 96A'
72
+ }
73
+ },
74
+ description: 'Message release number',
75
+ required: true
76
+ )
77
+ message_identifier.add(:message_release_number, data)
78
+
79
+ data = Eancom::Edifact::Data.new(
80
+ type: String,
81
+ length: 1..2,
82
+ dictionary: {
83
+ 'UN' => {
84
+ description: 'UN/CEFACT'
85
+ }
86
+ },
87
+ description: 'Controlling agency',
88
+ required: true
89
+ )
90
+ message_identifier.add(:controlling_agency, data)
91
+
92
+ data = Eancom::Edifact::Data.new(
93
+ type: String,
94
+ length: 1..6,
95
+ dictionary: nil,
96
+ description: 'Association assigned code',
97
+ required: true
98
+ )
99
+ message_identifier.add(:association_assigned_code, data)
100
+
101
+ structure << message_identifier
102
+ #==============================================================================
103
+ # Code list directory version number # #
104
+ #==============================================================================
105
+ code_list_directory_version_number = Eancom::Edifact::Composite.new()
106
+
107
+ data = Eancom::Edifact::Data.new(
108
+ type: String,
109
+ length: 1..6,
110
+ dictionary: nil,
111
+ description: 'Code list directory version number',
112
+ required: false
113
+ )
114
+ code_list_directory_version_number.add(:code_list_directory_version_number, data)
115
+
116
+ structure << code_list_directory_version_number
117
+ #==============================================================================
118
+ Eancom.register_structure(tag: 'UNH', structure: structure)
@@ -0,0 +1,40 @@
1
+ tag = 'UNS'
2
+ Eancom.register_segment(tag: tag, klass: Eancom::Edifact::UNS)
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
+ dictionary: nil,
13
+ description: "Message Header",
14
+ required: true
15
+ )
16
+ tag.add(:tag, data)
17
+
18
+ structure << tag
19
+ #==============================================================================
20
+ # Section identification
21
+ #==============================================================================
22
+ section_identification = Eancom::Edifact::Composite.new()
23
+
24
+ data = Eancom::Edifact::Data.new(
25
+ type: String,
26
+ length: 1,
27
+ dictionary: {
28
+ 'S' => {
29
+ description: 'Detail/summary section separation',
30
+ identifier: 'detail_summary_section_separation'
31
+ }
32
+ },
33
+ description: "Section identification",
34
+ required: true
35
+ )
36
+ section_identification.add(:section_identification, data)
37
+
38
+ structure << section_identification
39
+ #==============================================================================
40
+ Eancom.register_structure(tag: 'UNS', structure: structure)
@@ -0,0 +1,48 @@
1
+ tag = 'UNT'
2
+ Eancom.register_segment(tag: tag, klass: Eancom::Edifact::UNT)
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
+ dictionary: nil,
13
+ description: "Message Header",
14
+ required: true
15
+ )
16
+ tag.add(:tag, data)
17
+
18
+ structure << tag
19
+ #==============================================================================
20
+ # Number of segments in the message #
21
+ #==============================================================================
22
+ number_of_segments_in_message = Eancom::Edifact::Composite.new()
23
+ data = Eancom::Edifact::Data.new(
24
+ type: String,
25
+ length: 1..10,
26
+ dictionary: nil,
27
+ description: "Number of segments in the message",
28
+ required: true
29
+ )
30
+ number_of_segments_in_message.add(:number_of_segments_in_message, data)
31
+
32
+ structure << number_of_segments_in_message
33
+ #==============================================================================
34
+ # Message reference number #
35
+ #==============================================================================
36
+ message_reference_number = Eancom::Edifact::Composite.new()
37
+ data = Eancom::Edifact::Data.new(
38
+ type: String,
39
+ length: 1..14,
40
+ dictionary: nil,
41
+ description: "Number of segments in the message",
42
+ required: true
43
+ )
44
+ message_reference_number.add(:message_reference_number, data)
45
+
46
+ structure << message_reference_number
47
+ #==============================================================================
48
+ Eancom.register_structure(tag: 'UNT', structure: structure)
@@ -0,0 +1,48 @@
1
+ tag = 'UNZ'
2
+ Eancom.register_segment(tag: tag, klass: Eancom::Edifact::UNZ)
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
+ dictionary: nil,
13
+ description: "Message Header",
14
+ required: true
15
+ )
16
+ tag.add(:tag, data)
17
+
18
+ structure << tag
19
+ #==============================================================================
20
+ # Interchange control count #
21
+ #==============================================================================
22
+ interchange_control_count = Eancom::Edifact::Composite.new()
23
+ data = Eancom::Edifact::Data.new(
24
+ type: String,
25
+ length: 1..6,
26
+ dictionary: nil,
27
+ description: "Interchange control count",
28
+ required: true
29
+ )
30
+ interchange_control_count.add(:interchange_control_count, data)
31
+
32
+ structure << interchange_control_count
33
+ #==============================================================================
34
+ # Interchange control reference #
35
+ #==============================================================================
36
+ interchange_control_reference = Eancom::Edifact::Composite.new()
37
+ data = Eancom::Edifact::Data.new(
38
+ type: String,
39
+ length: 1..14,
40
+ dictionary: nil,
41
+ description: "Number of segments in the message",
42
+ required: true
43
+ )
44
+ interchange_control_reference.add(:interchange_control_reference, data)
45
+
46
+ structure << interchange_control_reference
47
+ #==============================================================================
48
+ Eancom.register_structure(tag: 'UNZ', structure: structure)
@@ -0,0 +1,201 @@
1
+ Eancom::Definition.create(name: 'D01B', type: :slsrpt) do |document, config|
2
+ document.header do |header|
3
+ header.segment Eancom::Edifact::UNA.new()
4
+
5
+ header.segment Eancom::Edifact::UNB.new(
6
+ syntax_identifier: 'UNOC',
7
+ syntax_version_number: '3',
8
+ interchange_sender_identification: config.header.interchange_sender_identification,
9
+ sender_identifiction_code_qualifier: config.header.sender_identifiction_code_qualifier || '14',
10
+ interchange_recipient_identification: config.header.interchange_recipient_identification,
11
+ recipient_identifiction_code_qualifier: config.header.recipient_identifiction_code_qualifier || '14',
12
+ date: config.header.date,
13
+ time: config.header.time,
14
+ interchange_control_reference: config.header.interchange_control_reference,
15
+ )
16
+
17
+ header.segment Eancom::Edifact::UNH.new(
18
+ message_reference_number: config.header.message_reference_number,
19
+ message_type: config.header.message_type,
20
+ message_version_number: config.header.message_version_number,
21
+ message_release_number: config.header.message_release_number,
22
+ controlling_agency: config.header.controlling_agency,
23
+ association_assigned_code: config.header.association_assigned_code
24
+ )
25
+ end
26
+
27
+ document.body do |body|
28
+
29
+ # Messages
30
+ messages = config.body.messages
31
+
32
+ messages.each do |message|
33
+
34
+ body.segment Eancom::Edifact::BGM.new(
35
+ document_name_code: '73E',
36
+ code_list_identification_code: '',
37
+ code_list_responsible_agency_code: '9',
38
+ document_identifier: message.document_identifier,
39
+ message_function_code: '9'
40
+ )
41
+
42
+ # Document Date
43
+ body.segment Eancom::Edifact::DTM.new(
44
+ type: '137',
45
+ date_time: message.document_message_date_time.date_time,
46
+ format: '102'
47
+ )
48
+
49
+ # Report Start Date
50
+ if date_time = message.report_start_date.date_time
51
+ body.segment Eancom::Edifact::DTM.new(
52
+ type: '90',
53
+ date_time: date_time,
54
+ format: '102'
55
+ )
56
+ end
57
+
58
+ # Report End Date
59
+ if date_time = message.report_end_date.date_time
60
+ body.segment Eancom::Edifact::DTM.new(
61
+ type: '91',
62
+ date_time: date_time,
63
+ format: '102'
64
+ )
65
+ end
66
+
67
+ # Supplier
68
+ if supplier = message.supplier
69
+ code_list_responsible_agency_code_1 = if supplier.code_list_responsible_agancy_code_1
70
+ structure = Eancom.find_structure(tag: 'NAD')
71
+ structure.dictionary_lookup(
72
+ :code_list_responsible_agancy_code_1,
73
+ supplier.code_list_responsible_agancy_code_1
74
+ )
75
+ else
76
+ '9'
77
+ end
78
+ body.segment Eancom::Edifact::NAD.new(
79
+ party_function_code_qualifier: 'SU',
80
+ party_identifier: supplier.party_identifier,
81
+ code_list_responsible_agancy_code_1: code_list_responsible_agency_code_1
82
+ )
83
+ end
84
+
85
+ # Buyer
86
+ if buyer = message.buyer
87
+ code_list_responsible_agency_code_1 = if buyer.code_list_responsible_agancy_code_1
88
+ structure = Eancom.find_structure(tag: 'NAD')
89
+ structure.dictionary_lookup(
90
+ :code_list_responsible_agancy_code_1,
91
+ buyer.code_list_responsible_agancy_code_1
92
+ )
93
+ else
94
+ '9'
95
+ end
96
+ body.segment Eancom::Edifact::NAD.new(
97
+ party_function_code_qualifier: 'BY',
98
+ party_identifier: buyer.party_identifier,
99
+ code_list_responsible_agancy_code_1: code_list_responsible_agency_code_1
100
+ )
101
+ end
102
+
103
+ # Reference Currency
104
+ if currency = message.currency
105
+ body.segment Eancom::Edifact::CUX.new(
106
+ currency_identification_code_1: currency.currency_identification_code_1,
107
+ currency_type_code_qualifier_1: '10',
108
+ currency_usage_code_qualifier_1: '2'
109
+ )
110
+ end
111
+
112
+ # Location
113
+ if location = message.location
114
+ code_list_responsible_agency_code = if location.code_list_responsible_agancy_code
115
+ structure = Eancom.find_structure(tag: 'LOC')
116
+ structure.dictionary_lookup(
117
+ :code_list_responsible_agancy_code,
118
+ location.code_list_responsible_agancy_code
119
+ )
120
+ else
121
+ '9'
122
+ end
123
+
124
+ body.segment Eancom::Edifact::LOC.new(
125
+ code_list_identification_code: location.code_list_identification_code,
126
+ code_list_responsible_agancy_code: code_list_responsible_agency_code,
127
+ location_function_qualifier: '162',
128
+ location_name_code: location.location_name_code
129
+ )
130
+ end
131
+
132
+ # Sales Date
133
+ if date_time = message.sales_date_and_or_time_and_or_period.date_time
134
+ body.segment Eancom::Edifact::DTM.new(
135
+ type: '356',
136
+ date_time: date_time,
137
+ format: '102'
138
+ )
139
+ end
140
+
141
+ # Items
142
+ total_quantity = 0
143
+
144
+ items = message.items
145
+
146
+ items.each_with_index do |item, index|
147
+ total_quantity += item.quantity.to_i
148
+
149
+ body.segment Eancom::Edifact::LIN.new(
150
+ line_item_identifier_1: "#{index + 1}",
151
+ item_identifier: item.ean,
152
+ item_type_identification_code: 'SRV'
153
+ )
154
+
155
+ if transaction_reference_number = item.transaction_reference_number
156
+ body.segment Eancom::Edifact::RFF.new(
157
+ reference_code_qualifier: 'TN',
158
+ reference_identifier: transaction_reference_number.reference_identifier
159
+ )
160
+ end
161
+
162
+ prices = item.prices
163
+ prices.each do |price|
164
+ if price = price.price
165
+ structure = Eancom.find_structure(tag: 'PRI')
166
+ body.segment Eancom::Edifact::PRI.new(
167
+ price_amount: price.price_amount,
168
+ price_code_qualifier: structure.dictionary_lookup(:price_code_qualifier, price.price_code_qualifier),
169
+ price_specification_code: structure.dictionary_lookup(:price_specification_code, price.price_specification_code),
170
+ price_type_code: price.price_type_code
171
+ )
172
+ end
173
+ end
174
+
175
+ # Quantity
176
+ if statistical_sales_quantitiy = item.statistical_sales_quantitiy
177
+ body.segment Eancom::Edifact::QTY.new(
178
+ quantity_type_code_qualifier: '153',
179
+ quantity: statistical_sales_quantitiy.quantity
180
+ )
181
+ end
182
+ end
183
+
184
+ body.segment Eancom::Edifact::UNT.new(
185
+ number_of_segments_in_message: "#{document.total_segments + 2}",
186
+ message_reference_number: config.header.message_reference_number,
187
+ )
188
+ end
189
+
190
+ document.footer do |footer|
191
+ footer.segment Eancom::Edifact::UNS.new(
192
+ section_identification: 'S'
193
+ )
194
+
195
+ footer.segment Eancom::Edifact::UNZ.new(
196
+ interchange_control_count: '1',
197
+ interchange_control_reference: "#{config.header.interchange_control_reference}"
198
+ )
199
+ end
200
+ end
201
+ end
@@ -0,0 +1,194 @@
1
+ Eancom::Definition.create(name: 'D96A', type: :slsrpt) do |document, config|
2
+ document.header do |header|
3
+ header.segment Eancom::Edifact::UNA.new()
4
+
5
+ header.segment Eancom::Edifact::UNB.new(
6
+ syntax_identifier: config.header.syntax_identifier || 'UNOA',
7
+ syntax_version_number: config.header.syntax_version_number || '2',
8
+ interchange_sender_identification: config.header.interchange_sender_identification,
9
+ sender_identifiction_code_qualifier: config.header.sender_identification_code_qualifier || '14',
10
+ interchange_recipient_identification: config.header.interchange_recipient_identification,
11
+ recipient_identifiction_code_qualifier: config.header.recipient_identification_code_qualifier || '14',
12
+ date: config.header.date,
13
+ time: config.header.time,
14
+ interchange_control_reference: config.header.interchange_control_reference,
15
+ )
16
+
17
+ header.segment Eancom::Edifact::UNH.new(
18
+ message_reference_number: config.header.message_reference_number,
19
+ message_type: config.header.message_type,
20
+ message_version_number: config.header.message_version_number,
21
+ message_release_number: config.header.message_release_number,
22
+ controlling_agency: config.header.controlling_agency,
23
+ association_assigned_code: config.header.association_assigned_code
24
+ )
25
+ end
26
+
27
+ document.body do |body|
28
+
29
+ # Messages
30
+ messages = config.body.messages
31
+
32
+ messages.each do |message|
33
+
34
+ body.segment Eancom::Edifact::BGM.new(
35
+ document_name_code: '11',
36
+ document_identifier: message.document_identifier,
37
+ )
38
+
39
+ # Document Date
40
+ body.segment Eancom::Edifact::DTM.new(
41
+ type: '137',
42
+ date_time: message.document_message_date_time.date_time,
43
+ format: '102'
44
+ )
45
+
46
+ # Report Start Date
47
+ if date_time = message.report_start_date.date_time
48
+ body.segment Eancom::Edifact::DTM.new(
49
+ type: '90',
50
+ date_time: date_time,
51
+ format: '102'
52
+ )
53
+ end
54
+
55
+ # Report End Date
56
+ if date_time = message.report_end_date.date_time
57
+ body.segment Eancom::Edifact::DTM.new(
58
+ type: '91',
59
+ date_time: date_time,
60
+ format: '102'
61
+ )
62
+ end
63
+
64
+ # Supplier
65
+ if supplier = message.supplier
66
+ code_list_responsible_agency_code_1 = if supplier.code_list_responsible_agancy_code_1
67
+ structure = Eancom.find_structure(tag: 'NAD')
68
+ structure.dictionary_lookup(
69
+ :code_list_responsible_agancy_code_1,
70
+ supplier.code_list_responsible_agancy_code_1
71
+ )
72
+ else
73
+ '9'
74
+ end
75
+ body.segment Eancom::Edifact::NAD.new(
76
+ party_function_code_qualifier: 'SU',
77
+ party_identifier: supplier.party_identifier,
78
+ code_list_responsible_agancy_code_1: code_list_responsible_agency_code_1
79
+ )
80
+ end
81
+
82
+ # Buyer
83
+ if buyer = message.buyer
84
+ code_list_responsible_agency_code_1 = if supplier.code_list_responsible_agancy_code_1
85
+ structure = Eancom.find_structure(tag: 'NAD')
86
+ structure.dictionary_lookup(
87
+ :code_list_responsible_agancy_code_1,
88
+ supplier.code_list_responsible_agancy_code_1
89
+ )
90
+ else
91
+ '9'
92
+ end
93
+ body.segment Eancom::Edifact::NAD.new(
94
+ party_function_code_qualifier: 'BY',
95
+ party_identifier: buyer.party_identifier,
96
+ code_list_responsible_agancy_code_1: code_list_responsible_agency_code_1
97
+ )
98
+ end
99
+
100
+ # Reference Currency
101
+ if currency = message.currency
102
+ body.segment Eancom::Edifact::CUX.new(
103
+ currency_identification_code_1: currency.currency_identification_code_1,
104
+ currency_type_code_qualifier_1: '10',
105
+ currency_usage_code_qualifier_1: '2'
106
+ )
107
+ end
108
+
109
+ # Location
110
+ if location = message.location
111
+ code_list_responsible_agency_code = if location.code_list_responsible_agancy_code
112
+ structure = Eancom.find_structure(tag: 'LOC')
113
+ structure.dictionary_lookup(
114
+ :code_list_responsible_agancy_code,
115
+ location.code_list_responsible_agancy_code
116
+ )
117
+ else
118
+ '9'
119
+ end
120
+ body.segment Eancom::Edifact::LOC.new(
121
+ code_list_identification_code: location.code_list_identification_code,
122
+ code_list_responsible_agancy_code: code_list_responsible_agency_code,
123
+ location_function_qualifier: '150',
124
+ location_name_code: location.location_name_code
125
+ )
126
+ end
127
+
128
+ # Sales Date
129
+ if date_time = message.sales_date_and_or_time_and_or_period.date_time
130
+ body.segment Eancom::Edifact::DTM.new(
131
+ type: '356',
132
+ date_time: date_time,
133
+ format: '203'
134
+ )
135
+ end
136
+
137
+ # Items
138
+ total_quantity = 0
139
+
140
+ items = message.items
141
+
142
+ items.each_with_index do |item, index|
143
+ total_quantity += item.quantity.to_i
144
+
145
+ body.segment Eancom::Edifact::LIN.new(
146
+ line_item_identifier_1: "#{index + 1}",
147
+ item_identifier: item.ean,
148
+ item_type_identification_code: 'EN'
149
+ )
150
+
151
+ if transaction_reference_number = item.transaction_reference_number
152
+ body.segment Eancom::Edifact::RFF.new(
153
+ reference_code_qualifier: 'TN',
154
+ reference_identifier: transaction_reference_number.reference_identifier
155
+ )
156
+ end
157
+
158
+ prices = item.prices
159
+ prices.each do |price|
160
+ if price = price.price
161
+ structure = Eancom.find_structure(tag: 'PRI')
162
+ body.segment Eancom::Edifact::PRI.new(
163
+ price_amount: price.price_amount,
164
+ price_code_qualifier: structure.dictionary_lookup(:price_code_qualifier, price.price_code_qualifier),
165
+ price_specification_code: structure.dictionary_lookup(:price_specification_code, price.price_specification_code),
166
+ price_type_code: price.price_type_code
167
+ )
168
+ end
169
+ end
170
+
171
+ # Quantity
172
+ if minimum_production_batch = item.minimum_production_batch
173
+ body.segment Eancom::Edifact::QTY.new(
174
+ quantity_type_code_qualifier: '160',
175
+ quantity: minimum_production_batch.quantity,
176
+ measurement_unit_code: 'PCE'
177
+ )
178
+ end
179
+ end
180
+
181
+ body.segment Eancom::Edifact::UNT.new(
182
+ number_of_segments_in_message: "#{document.total_segments + 2}",
183
+ message_reference_number: config.header.message_reference_number,
184
+ )
185
+ end
186
+
187
+ document.footer do |footer|
188
+ footer.segment Eancom::Edifact::UNZ.new(
189
+ interchange_control_count: '1',
190
+ interchange_control_reference: "#{config.header.interchange_control_reference}"
191
+ )
192
+ end
193
+ end
194
+ end
data/eancom.gemspec CHANGED
@@ -1,7 +1,7 @@
1
1
  require_relative 'lib/eancom/version'
2
2
 
3
3
  Gem::Specification.new do |spec|
4
- spec.name = "eancom"
4
+ spec.name = 'eancom'
5
5
  spec.version = Eancom::VERSION
6
6
  spec.authors = ["Fadendaten GmbH"]
7
7
  spec.email = ["support@fadendaten.ch"]
@@ -23,8 +23,12 @@ Gem::Specification.new do |spec|
23
23
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
24
  spec.require_paths = ["lib"]
25
25
 
26
- spec.add_development_dependency "pry"
27
- spec.add_development_dependency "pry-remote"
28
- spec.add_development_dependency "pry-nav"
29
- spec.add_development_dependency "simplecov"
26
+ spec.add_development_dependency 'pry'
27
+ spec.add_development_dependency 'pry-nav'
28
+ spec.add_development_dependency 'pry-remote'
29
+ spec.add_development_dependency 'rake'
30
+ spec.add_development_dependency 'rspec'
31
+ spec.add_development_dependency 'rubocop'
32
+ spec.add_development_dependency 'simplecov'
33
+ spec.add_development_dependency 'timecop'
30
34
  end
@@ -5,7 +5,7 @@ module Eancom
5
5
 
6
6
  def self.create(name:, type:, &block)
7
7
  definition = new(name: name, type: type, &block)
8
- Eancom::register_definition(definition)
8
+ Eancom.register_definition(definition)
9
9
  end
10
10
 
11
11
  def initialize(name:, type:, &block)