tag = 'DTM'
Eancom.register_segment(tag: tag, klass: Eancom::Edifact::DTM)

structure = Eancom::Edifact::Structure.new(tag: tag)

composite = Eancom::Edifact::Composite.new()
data = Eancom::Edifact::Data.new(
  type: String,
  length: 3,
  description: "DATE/TIME/PERIOD",
  required: true
)
composite.add(:tag, data)
structure << composite

composite = Eancom::Edifact::Composite.new()

type_dictionary = {
  '1' => {
    description: 'Service completion date/time, actual',
    identifier: 'service_completion_date_time_actual'
  },
  '2' => {
    description: 'Delivery date/time, requested',
    identifier: 'delivery_date_time'
  },
  '3' => {
    description: 'Invoice date/time, requested',
    identifier: 'invoice_date_time'
  },
  '7' => {
    description: 'Effectiv date/time',
    identifier: 'effectiv_date_time'
  },
  '11' => {
    description: 'Despatch date and/or time',
    identifier: 'despatch_date_and_or_time'
  },
  '12' => {
    description: 'Terms discount due date/time',
    identifier: 'terms_discount_due_date_time'
  },
  '13' => {
    description: 'Terms net due date',
    identifier: 'terms_net_due_date'
  },
  '17' => {
    description: 'Delivery date/time, estimated',
    identifier: 'delivery_date_time_estimated'
  },
  '35' => {
    description: 'Delivery date and/or time',
    identifier: 'delivery_date_and_or_time'
  },
  '36' => {
    description: 'Expiry Date',
    identifier: 'expiry_date'
  },
  '44' => {
    description: 'Availability',
    identifier: 'availability'
  },
  '50' => {
    description: 'Goods receipt date/time',
    identifier: 'goods_receipt_date_time'
  },
  '63' => {
    description: 'Delivery date/time, latest',
    identifier: 'delivery_date_time_latest'
  },
  '90' => {
    description: 'Report start date',
    identifier: 'report_start_date'
  },
  '91' => {
    description: 'Report end date',
    identifier: 'report_end_date'
  },
  '64' => {
    description: 'Delivery date/time, earliest',
    identifier: 'delivery_date_time_earliest'
  },
  '100' => {
    description: 'Product ageing period before delivery',
    identifier: 'product_ageing_period_before_delivery'
  },
  '110' => {
    description: 'ship date/time',
    identifier: 'ship_date_time'
  },
  '132' => {
    description: 'Arrival date/time, estimated',
    identifier: 'arrival_date_time_estimated'
  },
  '133' => {
    description: 'Departure date/time, estimated',
    identifier: 'departure_date_time_estimated'
  },
  '134' => {
    description: 'Rate of exchange date/time',
    identifier: 'rate_of_exchange_date_time'
  },
  '137' => {
    description: 'Document/message date/time',
    identifier: 'document_message_date_time'
  },
  '140' => {
    description: 'Payment due date',
    identifier: 'payment_due_date'
  },
  '157' => {
    description: 'Validity start date',
    identifier: 'valitity_start_date'
  },
  '171' => {
    description: 'Reference date/time',
    identifier: 'reference_date_time'
  },
  '186' => {
    description: 'Departure date/time, actual',
    identifier: 'departure_date_time_actual'
  },
  '194' => {
    description: 'Start date/time',
    identifier: 'start_date_time'
  },
  '200' => {
    description: 'Pick-up/collection date/time of cargo',
    identifier: 'pick_up_collection_date_time_of_cargo'
  },
  '206' => {
    description: 'End date/time',
    identifier: 'end_date_time'
  },
  '209' => {
    description: 'Value date',
    identifier: 'value_date'
  },
  '235' => {
    description: 'Collection date/time',
    identifier: 'collection_date_time'
  },
  '263' => {
    description: 'Invoicing period',
    identifier: 'invoicing_period'
  },
  '267' => {
    description: 'Rate/price date/time',
    identifier: 'rate_price_date_time'
  },
  '273' => {
    description: 'Validity period',
    identifier: 'validity_period'
  },
  '325' => {
    description: 'Tax period',
    identifier: 'tax_period'
  },
  '326' => {
    description: 'Charge period',
    identifier: 'charge_period'
  },
  '356' => {
    description: 'Sales date, and or time, and or period',
    identifier: 'sales_date_and_or_time_and_or_period'
  },
  '366' => {
    description: 'Inventory report date',
    identifier: 'inventory_report_date'
  },
  '454' => {
    description: 'Accounting value date',
    identifier: 'accounting_value_date'
  },
  '44E' => {
    description: 'Connection date/time',
    identifier: 'connection_date_time'
  },
}

data = Eancom::Edifact::Data.new(
  type: String,
  length: 1..3,
  dictionary: type_dictionary,
  description: 'Date or time or period function code qualifier',
  required: true
)
composite.add(:type, data)

data = Eancom::Edifact::Data.new(
  type: String,
  length: 1..35,
  description: 'Date or time or period value',
  required: true
)
composite.add(:date_time, data)

format_dictionary = {
  '102' => {
    description: 'Date',
    value: 'CCYYMMDD',
    identifier: 'date'
  },
  '203' => {
    description: 'Date and Time',
    value: 'CCYYMMDDHHMM',
    identifier: 'date_time'
  },
  '204' => {
    description: 'Date and Time',
    value: 'CCYYMMDDHHMMSS',
    identifier: 'date_time_second'
  },
  '718' => {
    description: 'Period',
    value: 'CCYYMMDD-CCZZMMDD',
    identifier: 'period'
  },
  '802' => {
    description: 'Month',
    identifier: 'month'
  },
  '803' => {
    description: 'Week',
    identifier: 'week'
  },
  '804' => {
    description: 'Day',
    identifier: 'day'
  }
}

data = Eancom::Edifact::Data.new(
  type: String,
  length: 1..35,
  dictionary: format_dictionary,
  description: 'Date or time or period value',
  required: true
)
composite.add(:format, data)
structure << composite

Eancom.register_structure(tag: 'DTM', structure: structure)