eancom 0.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
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)