definitions/slsrpt/d01b.rb in eancom-1.6.3 vs definitions/slsrpt/d01b.rb in eancom-2.0.0

- old
+ new

@@ -1,19 +1,19 @@ Eancom::Definition.create(name: 'D01B', type: :slsrpt) do |document, config| document.header do |header| - header.segment Eancom::Edifact::UNA.new() + header.segment Eancom::Edifact::UNA.new header.segment Eancom::Edifact::UNB.new( syntax_identifier: 'UNOC', syntax_version_number: '3', interchange_sender_identification: config.header.interchange_sender_identification, - sender_identifiction_code_qualifier: config.header.sender_identifiction_code_qualifier || '14', + sender_identifiction_code_qualifier: '14', interchange_recipient_identification: config.header.interchange_recipient_identification, - recipient_identifiction_code_qualifier: config.header.recipient_identifiction_code_qualifier || '14', + recipient_identifiction_code_qualifier: '14', date: config.header.date, time: config.header.time, - interchange_control_reference: config.header.interchange_control_reference, + interchange_control_reference: config.header.interchange_control_reference ) header.segment Eancom::Edifact::UNH.new( message_reference_number: config.header.message_reference_number, message_type: config.header.message_type, @@ -23,180 +23,184 @@ association_assigned_code: config.header.association_assigned_code ) end document.body do |body| - - # Messages messages = config.body.messages messages.each do |message| - + code_list_identification_code = if message.code_list_identification_code.nil? + '' + else + message.code_list_identification_code + end body.segment Eancom::Edifact::BGM.new( - document_name_code: '73E', - code_list_identification_code: '', + document_name_code: message.document_name_code, + code_list_identification_code: code_list_identification_code, code_list_responsible_agency_code: '9', document_identifier: message.document_identifier, - message_function_code: '9' + message_function_code: message.message_function_code ) - # Document Date - body.segment Eancom::Edifact::DTM.new( - type: '137', - date_time: message.document_message_date_time.date_time, - format: '102' - ) + date_time_messages = message.date_time_messages + date_time_messages.each_with_index do |dtm, index| + next unless index == 0 - # Report Start Date - if date_time = message.report_start_date.date_time + structure = Eancom.find_structure(tag: 'DTM') + key = dtm.identifier.intern.to_sym body.segment Eancom::Edifact::DTM.new( - type: '90', - date_time: date_time, + type: structure.dictionary_lookup(:type, dtm.identifier), + date_time: dtm[key].date_time, format: '102' ) end - # Report End Date - if date_time = message.report_end_date.date_time + date_time_messages.each_with_index do |dtm, index| + next unless index == 1 + + structure = Eancom.find_structure(tag: 'DTM') + key = dtm.identifier.intern.to_sym body.segment Eancom::Edifact::DTM.new( - type: '91', - date_time: date_time, + type: structure.dictionary_lookup(:type, dtm.identifier), + date_time: dtm[key].date_time, format: '102' ) end - # Supplier - if supplier = message.supplier - code_list_responsible_agency_code_1 = if supplier.code_list_responsible_agancy_code_1 - structure = Eancom.find_structure(tag: 'NAD') - structure.dictionary_lookup( - :code_list_responsible_agancy_code_1, - supplier.code_list_responsible_agancy_code_1 - ) - else - '9' - end + date_time_messages.each_with_index do |dtm, index| + next unless index == 2 + + structure = Eancom.find_structure(tag: 'DTM') + key = dtm.identifier.intern.to_sym + body.segment Eancom::Edifact::DTM.new( + type: structure.dictionary_lookup(:type, dtm.identifier), + date_time: dtm[key].date_time, + format: '102' + ) + end + + nads = message.nads + nads.each_with_index do |nad, index| + next unless index == 0 + + structure = Eancom.find_structure(tag: 'NAD') + key = nad.identifier.intern.to_sym body.segment Eancom::Edifact::NAD.new( - party_function_code_qualifier: 'SU', - party_identifier: supplier.party_identifier, - code_list_responsible_agancy_code_1: code_list_responsible_agency_code_1 + party_function_code_qualifier: structure.dictionary_lookup(:party_function_code_qualifier, nad.identifier), + party_identifier: nad[key].party_identifier, + code_list_responsible_agency_code_1: '9' ) end - # Buyer - if buyer = message.buyer - code_list_responsible_agency_code_1 = if buyer.code_list_responsible_agancy_code_1 - structure = Eancom.find_structure(tag: 'NAD') - structure.dictionary_lookup( - :code_list_responsible_agancy_code_1, - buyer.code_list_responsible_agancy_code_1 - ) - else - '9' - end + nads.each_with_index do |nad, index| + next unless index == 1 + + structure = Eancom.find_structure(tag: 'NAD') + key = nad.identifier.intern.to_sym body.segment Eancom::Edifact::NAD.new( - party_function_code_qualifier: 'BY', - party_identifier: buyer.party_identifier, - code_list_responsible_agancy_code_1: code_list_responsible_agency_code_1 + party_function_code_qualifier: structure.dictionary_lookup(:party_function_code_qualifier, nad.identifier), + party_identifier: nad[key].party_identifier, + code_list_responsible_agency_code_1: '9' ) end # Reference Currency if currency = message.currency + structure = Eancom.find_structure(tag: 'CUX') body.segment Eancom::Edifact::CUX.new( currency_identification_code_1: currency.currency_identification_code_1, - currency_type_code_qualifier_1: '10', - currency_usage_code_qualifier_1: '2' + currency_type_code_qualifier_1: structure.dictionary_lookup(:currency_type_code_qualifier_1, + currency.currency_type_code_qualifier_1), + currency_usage_code_qualifier_1: structure.dictionary_lookup(:currency_usage_code_qualifier_1, + currency.currency_usage_code_qualifier_1) ) end - item_counter = 0 + # Location + if location = message.location + structure = Eancom.find_structure(tag: 'LOC') + body.segment Eancom::Edifact::LOC.new( + code_list_identification_code: location.code_list_identification_code, + code_list_responsible_agency_code: structure.dictionary_lookup(:code_list_responsible_agency_code, location.code_list_responsible_agency_code), + location_function_qualifier: structure.dictionary_lookup(:location_function_qualifier, location.location_function_qualifier), + location_name_code: location.location_name_code + ) + end - message.locations.each do |location_group| - if location = location_group.location - code_list_responsible_agency_code = if location.code_list_responsible_agancy_code - structure = Eancom.find_structure(tag: 'LOC') - structure.dictionary_lookup( - :code_list_responsible_agancy_code, - location.code_list_responsible_agancy_code - ) - else - '9' - end + # Sales Date + date_time_messages.each_with_index do |dtm, index| + next unless index == 3 - body.segment Eancom::Edifact::LOC.new( - code_list_identification_code: location.code_list_identification_code, - code_list_responsible_agancy_code: code_list_responsible_agency_code, - location_function_qualifier: '162', - location_name_code: location.location_name_code - ) - end + structure = Eancom.find_structure(tag: 'DTM') + key = dtm.identifier.intern.to_sym + body.segment Eancom::Edifact::DTM.new( + type: structure.dictionary_lookup(:type, dtm.identifier), + date_time: dtm[key].date_time, + format: '102' + ) + end - # Sales Date - if date_time = location_group.sales_date_and_or_time_and_or_period&.date_time - body.segment Eancom::Edifact::DTM.new( - type: '356', - date_time: date_time, - format: '102' + total_quantity = 0 + + items = message.items + + items.each_with_index do |item, index| + total_quantity += item.quantity.to_i + + structure = Eancom.find_structure(tag: 'LIN') + body.segment Eancom::Edifact::LIN.new( + line_item_identifier_1: (index + 1).to_s, + item_identifier: item.ean, + item_type_identification_code: structure.dictionary_lookup(:item_type_identification_code, item.item_type_identification_code) + ) + + references = item.references + references.each_with_index do |rff, index| + structure = Eancom.find_structure(tag: 'RFF') + key = rff.identifier.intern.to_sym + body.segment Eancom::Edifact::RFF.new( + reference_code_qualifier: structure.dictionary_lookup(:reference_code_qualifier, rff.identifier), + reference_identifier: rff[key].reference_identifier ) end - # Items - location_group.items.each do |item| - item_counter += 1 + prices = item.prices + prices.each do |price| + next unless price = price.price - body.segment Eancom::Edifact::LIN.new( - line_item_identifier_1: item_counter.to_s, - item_identifier: item.ean, - item_type_identification_code: 'SRV' + structure = Eancom.find_structure(tag: 'PRI') + body.segment Eancom::Edifact::PRI.new( + price_amount: price.price_amount, + price_code_qualifier: structure.dictionary_lookup(:price_code_qualifier, price.price_code_qualifier), + price_specification_code: structure.dictionary_lookup(:price_specification_code, + price.price_specification_code), + price_type_code: price.price_type_code ) + end - if transaction_reference_number = item.transaction_reference_number - body.segment Eancom::Edifact::RFF.new( - reference_code_qualifier: 'TN', - reference_identifier: transaction_reference_number.reference_identifier - ) - end - - prices = item.prices - prices.each do |price_group| - if price = price_group.price - structure = Eancom.find_structure(tag: 'PRI') - body.segment Eancom::Edifact::PRI.new( - price_amount: price.price_amount, - price_code_qualifier: structure.dictionary_lookup(:price_code_qualifier, price.price_code_qualifier), - price_specification_code: structure.dictionary_lookup(:price_specification_code, price.price_specification_code), - price_type_code: price.price_type_code - ) - end - end - - # Quantity - if statistical_sales_quantitiy = item.statistical_sales_quantitiy - body.segment Eancom::Edifact::QTY.new( - quantity_type_code_qualifier: '153', - quantity: statistical_sales_quantitiy.quantity - ) - end + qty = item.quantities + qty.each_with_index do |qty, index| + structure = Eancom.find_structure(tag: 'QTY') + key = qty.identifier.intern.to_sym + body.segment Eancom::Edifact::QTY.new( + quantity_type_code_qualifier: structure.dictionary_lookup(:quantity_type_code_qualifier, qty.identifier), + quantity: qty[key].quantity + ) end end - - body.segment Eancom::Edifact::UNS.new( - section_identification: 'S' - ) - body.segment Eancom::Edifact::UNT.new( - number_of_segments_in_message: "#{document.total_segments + 2}", - message_reference_number: config.header.message_reference_number, + number_of_segments_in_message: (document.total_segments + 2).to_s, + message_reference_number: config.header.message_reference_number ) end + end - document.footer do |footer| + document.footer do |footer| + messages = config.body.messages - footer.segment Eancom::Edifact::UNZ.new( - interchange_control_count: '1', - interchange_control_reference: "#{config.header.interchange_control_reference}" - ) - end + footer.segment Eancom::Edifact::UNZ.new( + interchange_control_count: messages.size.to_s, + interchange_control_reference: config.header.interchange_control_reference.to_s + ) end end