eancom 0.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.DS_Store +0 -0
- data/.gitignore +187 -6
- data/.gitlab-ci.yml +27 -0
- data/.rspec_status +225 -0
- data/.rubocop.yml +2 -0
- data/.ruby-version +1 -0
- data/Gemfile +4 -2
- data/Gemfile.lock +87 -3
- data/bin/console +3 -2
- data/definitions/desadv/d01b.rb +205 -0
- data/definitions/desadv/d96a.rb +108 -73
- data/definitions/segments/alc.rb +236 -0
- data/definitions/segments/ali.rb +93 -0
- data/definitions/segments/bgm.rb +267 -0
- data/definitions/segments/cav.rb +122 -0
- data/definitions/segments/cci.rb +136 -0
- data/definitions/segments/cnt.rb +78 -0
- data/definitions/segments/cps.rb +76 -0
- data/definitions/segments/cux.rb +167 -0
- data/definitions/segments/dtm.rb +159 -0
- data/definitions/segments/ftx.rb +143 -0
- data/definitions/segments/imd.rb +356 -0
- data/definitions/segments/lin.rb +113 -0
- data/definitions/segments/loc.rb +89 -0
- data/definitions/segments/mea.rb +189 -0
- data/definitions/segments/moa.rb +144 -0
- data/definitions/segments/nad.rb +254 -0
- data/definitions/segments/pac.rb +250 -0
- data/definitions/segments/pgi.rb +148 -0
- data/definitions/segments/pia.rb +501 -0
- data/definitions/segments/pri.rb +188 -0
- data/definitions/segments/qty.rb +79 -0
- data/definitions/segments/rff.rb +166 -0
- data/definitions/segments/tax.rb +259 -0
- data/definitions/segments/tdt.rb +254 -0
- data/definitions/segments/una.rb +85 -0
- data/definitions/segments/unb.rb +284 -0
- data/definitions/segments/unh.rb +118 -0
- data/definitions/segments/uns.rb +40 -0
- data/definitions/segments/unt.rb +48 -0
- data/definitions/segments/unz.rb +48 -0
- data/definitions/slsrpt/d01b.rb +201 -0
- data/definitions/slsrpt/d96a.rb +194 -0
- data/eancom.gemspec +9 -5
- data/lib/eancom/definition.rb +1 -1
- data/lib/eancom/edifact/body.rb +63 -0
- data/lib/eancom/edifact/composite.rb +38 -0
- data/lib/eancom/edifact/data.rb +108 -0
- data/lib/eancom/edifact/document.rb +43 -11
- data/lib/eancom/edifact/document_element.rb +26 -0
- data/lib/eancom/edifact/footer.rb +6 -0
- data/lib/eancom/edifact/header.rb +15 -0
- data/lib/eancom/edifact/item.rb +40 -0
- data/lib/eancom/edifact/message.rb +24 -16
- data/lib/eancom/edifact/segment.rb +131 -12
- data/lib/eancom/edifact/segments/alc.rb +61 -0
- data/lib/eancom/edifact/segments/ali.rb +52 -0
- data/lib/eancom/edifact/segments/bgm.rb +45 -0
- data/lib/eancom/edifact/segments/cav.rb +47 -0
- data/lib/eancom/edifact/segments/cci.rb +53 -0
- data/lib/eancom/edifact/segments/cnt.rb +33 -0
- data/lib/eancom/edifact/segments/cps.rb +30 -0
- data/lib/eancom/edifact/segments/cux.rb +60 -0
- data/lib/eancom/edifact/segments/dtm.rb +43 -0
- data/lib/eancom/edifact/segments/ftx.rb +63 -0
- data/lib/eancom/edifact/segments/imd.rb +69 -0
- data/lib/eancom/edifact/segments/lin.rb +43 -0
- data/lib/eancom/edifact/segments/loc.rb +43 -0
- data/lib/eancom/edifact/segments/mea.rb +53 -0
- data/lib/eancom/edifact/segments/moa.rb +45 -0
- data/lib/eancom/edifact/segments/nad.rb +107 -0
- data/lib/eancom/edifact/segments/pac.rb +54 -0
- data/lib/eancom/edifact/segments/pgi.rb +45 -0
- data/lib/eancom/edifact/segments/pia.rb +107 -0
- data/lib/eancom/edifact/segments/pri.rb +54 -0
- data/lib/eancom/edifact/segments/qty.rb +40 -0
- data/lib/eancom/edifact/segments/rff.rb +41 -0
- data/lib/eancom/edifact/segments/tax.rb +72 -0
- data/lib/eancom/edifact/segments/tdt.rb +54 -0
- data/lib/eancom/edifact/segments/una.rb +51 -0
- data/lib/eancom/edifact/segments/unb.rb +69 -0
- data/lib/eancom/edifact/segments/unh.rb +46 -0
- data/lib/eancom/edifact/segments/uns.rb +29 -0
- data/lib/eancom/edifact/segments/unt.rb +28 -0
- data/lib/eancom/edifact/segments/unz.rb +28 -0
- data/lib/eancom/edifact/structure.rb +91 -0
- data/lib/eancom/edifact.rb +45 -12
- data/lib/eancom/factory.rb +8 -7
- data/lib/eancom/parser/document.rb +68 -0
- data/lib/eancom/parser/segment.rb +71 -0
- data/lib/eancom/parser.rb +7 -0
- data/lib/eancom/version.rb +1 -1
- data/lib/eancom.rb +59 -16
- metadata +138 -5
- data/lib/eancom/edifact/element.rb +0 -16
- 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 =
|
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
|
27
|
-
spec.add_development_dependency
|
28
|
-
spec.add_development_dependency
|
29
|
-
spec.add_development_dependency
|
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
|
data/lib/eancom/definition.rb
CHANGED