Eancom::Definition.create(name: 'D01B', type: :desadv) do |document, config| document.header do |header| 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: '14', interchange_recipient_identification: config.header.interchange_recipient_identification, recipient_identifiction_code_qualifier: '14', date: config.header.date, time: config.header.time, interchange_control_reference: config.header.interchange_control_reference, application_reference: config.header.application_reference, interchange_agreement_identifier: config.header.interchange_agreement_identifier, test_indicator: '0' ) header.segment Eancom::Edifact::UNH.new( message_reference_number: config.header.message_reference_number, message_type: config.header.message_type, message_version_number: config.header.message_version_number, message_release_number: config.header.message_release_number, controlling_agency: config.header.controlling_agency, association_assigned_code: config.header.association_assigned_code ) end document.body do |body| # Messages messages = config.body.messages messages.each do |message| body.segment Eancom::Edifact::BGM.new( document_name_code: message.document_name_code, document_identifier: message.document_identifier, message_function_code: message.message_function_code ) date_time_messages = message.date_time_messages date_time_messages.each_with_index do |dtm, index| next unless index == 0 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: '204' ) end 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: structure.dictionary_lookup(:type, dtm.identifier), date_time: dtm[key].date_time, format: '204' ) end references = message.references references.each_with_index do |rff, index| next unless index == 0 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 # Supplier 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: structure.dictionary_lookup(:party_function_code_qualifier, nad.identifier), party_identifier: nad[key].party_identifier, code_list_responsible_agency_code_1: '9' ) end # Manufacturer ILN nads = message.nads 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: structure.dictionary_lookup(:party_function_code_qualifier, nad.identifier), party_identifier: nad[key].party_identifier, code_list_responsible_agency_code_1: '9' ) end nads = message.nads nads.each_with_index do |nad, index| next unless index == 2 structure = Eancom.find_structure(tag: 'NAD') key = nad.identifier.intern.to_sym body.segment Eancom::Edifact::NAD.new( 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', city_name: nad[key].city_name, party_name_1: nad[key].party_name_1, postal_identification_code: nad[key].postal_identification_code, street_and_number_1: nad[key].street_and_number_1, country_name_code: nad[key].country_name_code ) end # Ultimate consignee nads = message.nads nads.each_with_index do |nad, index| next unless index == 3 structure = Eancom.find_structure(tag: 'NAD') key = nad.identifier.intern.to_sym body.segment Eancom::Edifact::NAD.new( 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', city_name: nad[key].city_name, party_name_1: nad[key].party_name_1, postal_identification_code: nad[key].postal_identification_code, street_and_number_1: nad[key].street_and_number_1, country_name_code: nad[key].country_name_code ) end structure = Eancom.find_structure(tag: 'TDT') qualifier = structure.dictionary_lookup(:transport_stage_code_qualifier, message.transport_stage_code_qualifier) body.segment Eancom::Edifact::TDT.new( transport_stage_code_qualifier: qualifier, transport_mode_name_code: message.transport_mode_name_code ) # CPS can remain hardcoded. body.segment Eancom::Edifact::CPS.new( hierarchical_structure_level_identifier: '1' ) body.segment Eancom::Edifact::PAC.new( package_quantity: message.package_quantity ) body.segment Eancom::Edifact::CPS.new( hierarchical_structure_level_identifier: '2', hierarchical_structure_parent_identifier: message.hierarchical_structure_parent_identifier ) # Items 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) ) if additional_product_id = item.additional_product_id additional_product_id.each do |id| next unless additional_information = id.additional_information structure = Eancom.find_structure(tag: 'PIA') body.segment Eancom::Edifact::PIA.new( product_identifier_code_qualifier: structure.dictionary_lookup(:product_identifier_code_qualifier, additional_information.product_identifier_code_qualifier), item_identifier_1: additional_information.item_identifier_1, item_type_identification_code_1: structure.dictionary_lookup(:item_type_identification_code_1, additional_information.item_type_identification_code_1) ) end end item_descriptions = item.item_descriptions item_descriptions.each do |description| structure = Eancom.find_structure(tag: 'IMD') body.segment Eancom::Edifact::IMD.new( description_format_code: structure.dictionary_lookup(:description_format_code, description.description_format_code), item_description_code: structure.dictionary_lookup(:item_description_code, description.item_description_code), code_list_responsible_agency_code_1: structure.dictionary_lookup(:code_list_responsible_agency_code_1, description.code_list_responsible_agency_code_1) ) end quantities = item.quantities quantities.each_with_index do |qty, index| next unless index == 0 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.to_s ) end quantities.each_with_index do |qty, index| next unless index == 1 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.to_s ) end 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, document_line_identifier: rff[key].document_line_identifier ) end end body.segment Eancom::Edifact::UNT.new( number_of_segments_in_message: (document.total_segments + 2).to_s, message_reference_number: config.header.message_reference_number ) end end messages = config.body.messages document.footer do |footer| 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