eddy 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +103 -37
- data/.solargraph.yml +4 -0
- data/.vscode/settings.json +17 -0
- data/.yardopts +2 -2
- data/CHANGELOG.md +50 -0
- data/Gemfile.lock +21 -7
- data/README.md +32 -3
- data/Rakefile +1 -10
- data/data/004010/code-lists/100.tsv +164 -0
- data/data/004010/code-lists/156.tsv +52 -0
- data/data/004010/code-lists/26.tsv +499 -0
- data/data/004010/code-lists/etc/100-fancy-definitions.tsv +164 -0
- data/data/004010/code-lists/etc/100-with-funds-codes.tsv +180 -0
- data/data/004010/code-lists/etc/26-alpha2.tsv +250 -0
- data/data/004010/code-lists/etc/26-alpha3.tsv +250 -0
- data/data/004010/elements-short.tsv +1405 -0
- data/data/004010/elements.tsv +3 -3
- data/data/004010/segments.tsv +1009 -1003
- data/data/004010/segments/ack.segment.yml +15 -0
- data/data/004010/segments/bak.segment.yml +9 -0
- data/data/004010/segments/beg.segment.yml +17 -0
- data/data/004010/segments/big.segment.yml +10 -0
- data/data/004010/segments/bsn.segment.yml +10 -0
- data/data/004010/segments/cad.segment.yml +14 -0
- data/data/004010/segments/ctp.segment.yml +19 -0
- data/data/004010/segments/ctt.segment.yml +13 -0
- data/data/004010/segments/dtm.segment.yml +7 -0
- data/data/004010/segments/envelope/ge.segment.yml +7 -0
- data/data/004010/segments/envelope/gs.segment.yml +13 -0
- data/data/004010/segments/envelope/iea.segment.yml +8 -0
- data/data/004010/segments/envelope/isa.segment.yml +22 -0
- data/data/004010/segments/envelope/se.segment.yml +7 -0
- data/data/004010/segments/envelope/st.segment.yml +12 -0
- data/data/004010/segments/hl.segment.yml +9 -0
- data/data/004010/segments/it1.segment.yml +20 -0
- data/data/004010/segments/lin.segment.yml +10 -0
- data/data/004010/segments/loop/hl.segment.yml +8 -0
- data/data/004010/segments/man.segment.yml +7 -0
- data/data/004010/segments/n1.segment.yml +9 -0
- data/data/004010/segments/n2.segment.yml +7 -0
- data/data/004010/segments/n3.segment.yml +6 -0
- data/data/004010/segments/n4.segment.yml +9 -0
- data/data/004010/segments/pid.segment.yml +10 -0
- data/data/004010/segments/po1.segment.yml +14 -0
- data/data/004010/segments/prf.segment.yml +9 -0
- data/data/004010/segments/ref.segment.yml +7 -0
- data/data/004010/segments/sac.segment.yml +20 -0
- data/data/004010/segments/sln.segment.yml +12 -0
- data/data/004010/segments/sn1.segment.yml +11 -0
- data/data/004010/segments/td1.segment.yml +13 -0
- data/data/004010/segments/td5.segment.yml +11 -0
- data/data/004010/segments/tds.segment.yml +10 -0
- data/data/schema/element_summary.json +60 -0
- data/data/schema/loop_summary.json +49 -0
- data/data/schema/segment_summary.json +66 -0
- data/data/schema/src/element_summary.schema.yml +73 -0
- data/data/schema/src/loop_summary.schema.yml +50 -0
- data/data/schema/src/segment_summary.schema.yml +59 -0
- data/data/schema/src/transaction_set_summary.schema.yml +27 -0
- data/data/schema/transaction_set_summary.json +33 -0
- data/data/sources.md +114 -145
- data/eddy.gemspec +6 -3
- data/exe/eddy +14 -0
- data/lib/definitions/elements/generated/1005.hierarchical_structure_code.rb +98 -0
- data/lib/definitions/elements/generated/1019.invoice_type_code.rb +40 -0
- data/lib/definitions/elements/generated/103.packaging_code.rb +29 -0
- data/lib/definitions/elements/generated/1166.contract_type_code.rb +87 -0
- data/lib/definitions/elements/generated/1232.purchase_category.rb +53 -0
- data/lib/definitions/elements/generated/127.reference_identification.rb +29 -0
- data/lib/definitions/elements/generated/128.reference_identification_qualifier.rb +1540 -0
- data/lib/definitions/elements/generated/1300.service_promotion_allowance_or_charge_code.rb +1090 -0
- data/lib/definitions/elements/generated/1301.agency_service_promotion_allowance_or_charge_code.rb +29 -0
- data/lib/definitions/elements/generated/133.routing_sequence_code.rb +60 -0
- data/lib/definitions/elements/generated/166.address_information.rb +29 -0
- data/lib/definitions/elements/generated/183.volume.rb +29 -0
- data/lib/definitions/elements/generated/187.weight_qualifier.rb +88 -0
- data/lib/definitions/elements/generated/19.city_name.rb +29 -0
- data/lib/definitions/elements/generated/206.equipment_initial.rb +29 -0
- data/lib/definitions/elements/generated/207.equipment_number.rb +29 -0
- data/lib/definitions/elements/generated/212.unit_price.rb +29 -0
- data/lib/definitions/elements/generated/22.commodity_code.rb +29 -0
- data/lib/definitions/elements/generated/23.commodity_code_qualifier.rb +60 -0
- data/lib/definitions/elements/generated/234.product_service_id.rb +29 -0
- data/lib/definitions/elements/generated/235.product_service_id_qualifier.rb +514 -0
- data/lib/definitions/elements/generated/236.price_identifier_code.rb +201 -0
- data/lib/definitions/elements/generated/248.allowance_or_charge_indicator.rb +44 -0
- data/lib/definitions/elements/generated/26.country_code.rb +535 -0
- data/lib/definitions/elements/generated/284.service_level_code.rb +103 -0
- data/lib/definitions/elements/generated/324.purchase_order_number.rb +29 -0
- data/lib/definitions/elements/generated/326.request_reference_number.rb +29 -0
- data/lib/definitions/elements/generated/327.change_order_sequence_number.rb +29 -0
- data/lib/definitions/elements/generated/328.release_number.rb +29 -0
- data/lib/definitions/elements/generated/330.quantity_ordered.rb +29 -0
- data/lib/definitions/elements/generated/347.hash_total.rb +29 -0
- data/lib/definitions/elements/generated/349.item_description_type.rb +40 -0
- data/lib/definitions/elements/generated/352.description.rb +29 -0
- data/lib/definitions/elements/generated/353.transaction_set_purpose_code.rb +102 -0
- data/lib/definitions/elements/generated/354.number_of_line_items.rb +30 -0
- data/lib/definitions/elements/generated/355.unit_or_basis_for_measurement_code.rb +831 -0
- data/lib/definitions/elements/generated/358.quantity_invoiced.rb +29 -0
- data/lib/definitions/elements/generated/367.contract_number.rb +29 -0
- data/lib/definitions/elements/generated/368.shipment_order_status_code.rb +139 -0
- data/lib/definitions/elements/generated/374.date_time_qualifier.rb +1149 -0
- data/lib/definitions/elements/generated/380.quantity.rb +29 -0
- data/lib/definitions/elements/generated/382.number_of_units_shipped.rb +29 -0
- data/lib/definitions/elements/generated/387.routing.rb +29 -0
- data/lib/definitions/elements/generated/396.shipment_identification.rb +29 -0
- data/lib/definitions/elements/generated/559.agency_qualifier_code.rb +213 -0
- data/lib/definitions/elements/generated/587.acknowledgment_type.rb +52 -0
- data/lib/definitions/elements/generated/610.amount.rb +30 -0
- data/lib/definitions/elements/generated/639.basis_of_unit_price_code.rb +128 -0
- data/lib/definitions/elements/generated/640.transaction_type_code.rb +483 -0
- data/lib/definitions/elements/generated/646.quantity_shipped_to_date.rb +29 -0
- data/lib/definitions/elements/generated/648.price_multiplier_qualifier.rb +43 -0
- data/lib/definitions/elements/generated/649.multiplier.rb +29 -0
- data/lib/definitions/elements/generated/66.identification_code_qualifier.rb +252 -0
- data/lib/definitions/elements/generated/662.relationship_code.rb +42 -0
- data/lib/definitions/elements/generated/668.line_item_status_code.rb +63 -0
- data/lib/definitions/elements/generated/67.identification_code.rb +29 -0
- data/lib/definitions/elements/generated/687.class_of_trade_code.rb +89 -0
- data/lib/definitions/elements/generated/750.product_process_characteristic_code.rb +254 -0
- data/lib/definitions/elements/generated/751.product_description_code.rb +29 -0
- data/lib/definitions/elements/generated/76.invoice_number.rb +29 -0
- data/lib/definitions/elements/generated/782.monetary_amount.rb +29 -0
- data/lib/definitions/elements/generated/786.security_level_code.rb +54 -0
- data/lib/definitions/elements/generated/79.lading_description.rb +29 -0
- data/lib/definitions/elements/generated/80.lading_quantity.rb +30 -0
- data/lib/definitions/elements/generated/87.marks_and_numbers.rb +29 -0
- data/lib/definitions/elements/generated/88.marks_and_numbers_qualifier.rb +57 -0
- data/lib/definitions/elements/generated/91.transportation_method_type_code.rb +108 -0
- data/lib/definitions/elements/generated/92.purchase_order_type_code.rb +106 -0
- data/lib/definitions/elements/generated/98.entity_identifier_code.rb +1349 -0
- data/lib/definitions/elements/manual/116.postal_code.rb +44 -0
- data/lib/definitions/elements/manual/124.application_receivers_code.rb +29 -0
- data/lib/definitions/elements/manual/140.standard_carrier_alpha_code.rb +211 -0
- data/lib/definitions/elements/manual/142.application_senders_code.rb +29 -0
- data/lib/definitions/elements/manual/143.transaction_set_identifier_code.rb +335 -0
- data/lib/definitions/elements/manual/156.state_or_province_code.rb +92 -0
- data/lib/definitions/elements/manual/28.group_control_number.rb +34 -0
- data/lib/definitions/elements/manual/329.transactional_set_control_number.rb +35 -0
- data/lib/definitions/elements/manual/337.time.rb +30 -0
- data/lib/definitions/elements/manual/350.assigned_identification.rb +33 -0
- data/lib/definitions/elements/manual/373.date.rb +30 -0
- data/lib/definitions/elements/manual/455.responsible_agency_code.rb +43 -0
- data/lib/definitions/elements/manual/479.functional_identifier_code.rb +271 -0
- data/lib/definitions/elements/manual/480.version_release_industry_identifier_code.rb +145 -0
- data/lib/definitions/elements/manual/784.length_of_binary_data.rb +30 -0
- data/lib/definitions/elements/manual/785.binary_data.rb +30 -0
- data/lib/definitions/elements/manual/96.number_of_included_segments.rb +30 -0
- data/lib/definitions/elements/manual/97.number_of_transaction_sets_included.rb +30 -0
- data/lib/definitions/elements/manual/hl/628.hierarchical_id_number.rb +29 -0
- data/lib/definitions/elements/manual/hl/734.hierarchical_parent_id_number.rb +29 -0
- data/lib/definitions/elements/manual/hl/735.hierarchical_level_code.rb +207 -0
- data/lib/definitions/elements/manual/hl/736.hierarchical_child_code.rb +39 -0
- data/lib/definitions/elements/manual/i/I01.authorization_information_qualifier.rb +48 -0
- data/lib/definitions/elements/manual/i/I02.authorization_information.rb +33 -0
- data/lib/definitions/elements/manual/i/I03.security_information_qualifier.rb +43 -0
- data/lib/definitions/elements/manual/i/I04.security_information.rb +33 -0
- data/lib/definitions/elements/manual/i/I05.interchange_id_qualifier.rb +75 -0
- data/lib/definitions/elements/manual/i/I06.interchange_sender_id.rb +29 -0
- data/lib/definitions/elements/manual/i/I07.interchange_receiver_id.rb +29 -0
- data/lib/definitions/elements/manual/i/I08.interchange_date.rb +35 -0
- data/lib/definitions/elements/manual/i/I09.interchange_time.rb +36 -0
- data/lib/definitions/elements/manual/i/I10.interchange_control_standards_identifier.rb +42 -0
- data/lib/definitions/elements/manual/i/I11.interchange_control_version_number.rb +55 -0
- data/lib/definitions/elements/manual/i/I12.interchange_control_number.rb +34 -0
- data/lib/definitions/elements/manual/i/I13.acknowledgment_requested.rb +43 -0
- data/lib/definitions/elements/manual/i/I14.usage_indicator.rb +40 -0
- data/lib/definitions/elements/manual/i/I15.component_element_separator.rb +36 -0
- data/lib/definitions/elements/manual/i/I16.number_of_included_functional_groups.rb +30 -0
- data/lib/definitions/elements/manual/misc/81.weight.rb +29 -0
- data/lib/definitions/elements/manual/misc/93.name.rb +29 -0
- data/lib/definitions/segments/generated/ack.rb +192 -0
- data/lib/definitions/segments/generated/bak.rb +90 -0
- data/lib/definitions/segments/generated/beg.rb +226 -0
- data/lib/definitions/segments/generated/big.rb +107 -0
- data/lib/definitions/segments/generated/bsn.rb +107 -0
- data/lib/definitions/segments/generated/cad.rb +175 -0
- data/lib/definitions/segments/generated/ctp.rb +158 -0
- data/lib/definitions/segments/generated/ctt.rb +141 -0
- data/lib/definitions/segments/generated/dtm.rb +56 -0
- data/lib/definitions/segments/generated/it1.rb +277 -0
- data/lib/definitions/segments/generated/lin.rb +107 -0
- data/lib/definitions/segments/generated/man.rb +56 -0
- data/lib/definitions/segments/generated/n1.rb +90 -0
- data/lib/definitions/segments/generated/n3.rb +39 -0
- data/lib/definitions/segments/generated/n4.rb +90 -0
- data/lib/definitions/segments/generated/pid.rb +107 -0
- data/lib/definitions/segments/generated/po1.rb +175 -0
- data/lib/definitions/segments/generated/prf.rb +90 -0
- data/lib/definitions/segments/generated/ref.rb +56 -0
- data/lib/definitions/segments/generated/sac.rb +107 -0
- data/lib/definitions/segments/generated/sln.rb +141 -0
- data/lib/definitions/segments/generated/sn1.rb +124 -0
- data/lib/definitions/segments/generated/td1.rb +158 -0
- data/lib/definitions/segments/generated/td5.rb +107 -0
- data/lib/definitions/segments/generated/tds.rb +39 -0
- data/lib/definitions/segments/manual/envelopes/ge.rb +53 -0
- data/lib/definitions/segments/manual/envelopes/gs.rb +163 -0
- data/lib/definitions/segments/manual/envelopes/iea.rb +53 -0
- data/lib/definitions/segments/manual/envelopes/isa.rb +295 -0
- data/lib/definitions/segments/manual/envelopes/se.rb +52 -0
- data/lib/definitions/segments/manual/envelopes/st.rb +52 -0
- data/lib/definitions/segments/manual/hl.rb +96 -0
- data/lib/definitions/segments/manual/n2.rb +52 -0
- data/lib/definitions/transaction_sets/manual/810/810.rb +143 -0
- data/lib/definitions/transaction_sets/manual/810/loops.rb +109 -0
- data/lib/definitions/transaction_sets/manual/850/850.rb +92 -0
- data/lib/definitions/transaction_sets/manual/850/loops.rb +58 -0
- data/lib/definitions/transaction_sets/manual/855/855.rb +83 -0
- data/lib/definitions/transaction_sets/manual/855/loops.rb +104 -0
- data/lib/definitions/transaction_sets/manual/856/856.rb +83 -0
- data/lib/definitions/transaction_sets/manual/856/loops.rb +155 -0
- data/lib/eddy.rb +29 -7
- data/lib/eddy/build/build.rb +47 -0
- data/lib/eddy/build/elements/element.rb +67 -0
- data/lib/eddy/build/elements/elements.rb +46 -0
- data/lib/eddy/build/elements/id.rb +55 -0
- data/lib/eddy/build/elements/n.rb +48 -0
- data/lib/eddy/build/loop_builder.rb +93 -0
- data/lib/eddy/build/segment_builder.rb +169 -0
- data/lib/eddy/build/transaction_set_builder.rb +218 -0
- data/lib/eddy/cli/cli.rb +39 -0
- data/lib/eddy/config.rb +51 -0
- data/lib/eddy/data.rb +50 -0
- data/lib/eddy/data/persistence/active_record.rb +10 -0
- data/lib/eddy/data/persistence/base.rb +47 -0
- data/lib/eddy/data/persistence/file.rb +50 -0
- data/lib/eddy/data/persistence/memory.rb +65 -0
- data/lib/eddy/data/store.rb +108 -0
- data/lib/eddy/errors.rb +112 -0
- data/lib/eddy/models/element.rb +14 -0
- data/lib/eddy/models/element/an.rb +55 -0
- data/lib/eddy/models/element/b.rb +53 -0
- data/lib/eddy/models/element/base.rb +116 -0
- data/lib/eddy/models/element/composite.rb +6 -0
- data/lib/eddy/models/element/dt.rb +100 -0
- data/lib/eddy/models/element/id.rb +58 -0
- data/lib/eddy/models/element/n.rb +94 -0
- data/lib/eddy/models/element/r.rb +84 -0
- data/lib/eddy/models/element/tm.rb +113 -0
- data/lib/eddy/models/loop.rb +74 -0
- data/lib/eddy/models/segment.rb +35 -0
- data/lib/eddy/models/transaction_set.rb +101 -0
- data/lib/eddy/parse.rb +58 -0
- data/lib/eddy/schema/element_summary.rb +123 -0
- data/lib/eddy/schema/loop_summary.rb +101 -0
- data/lib/eddy/schema/segment_summary.rb +116 -0
- data/lib/eddy/schema/transaction_set_summary.rb +96 -0
- data/lib/eddy/schema/validate.rb +41 -0
- data/lib/eddy/util.rb +16 -0
- data/lib/eddy/util/clean_folder.rb +14 -0
- data/lib/eddy/util/edi_data.rb +153 -0
- data/lib/eddy/util/new_number.rb +24 -0
- data/lib/eddy/util/normalize.rb +51 -0
- data/lib/eddy/util/paths.rb +19 -0
- data/lib/eddy/util/read.rb +38 -0
- data/lib/eddy/util/time.rb +56 -0
- data/lib/eddy/util/timestamp.rb +12 -0
- data/lib/eddy/util/trim.rb +29 -0
- data/lib/eddy/version.rb +1 -1
- data/lib/eddy/write/functional_group.rb +33 -0
- data/lib/eddy/write/interchange.rb +28 -0
- data/lib/eddy/write/simple_interchange.rb +57 -0
- data/lib/generators/eddy/initializer/initializer_generator.rb +17 -0
- data/lib/generators/eddy/initializer/templates/eddy.rb.erb +6 -0
- data/lib/generators/eddy/migration/migration_generator.rb +53 -0
- data/lib/generators/eddy/migration/templates/migration.rb.erb +35 -0
- data/tasks/build.rake +15 -0
- data/tasks/misc/gemspec.rake +12 -0
- data/tasks/misc/missing_lists.rake +240 -0
- data/tasks/misc/yaml2json.rake +20 -0
- data/todo.txt +16 -0
- metadata +297 -42
- data/data/004010/segments/ISA.tsv +0 -17
- data/data/schema.jsonc +0 -67
- data/lib/eddy/build/build_an.rb +0 -31
- data/lib/eddy/build/build_dt.rb +0 -46
- data/lib/eddy/build/build_elements.rb +0 -181
- data/lib/eddy/build/build_id.rb +0 -56
- data/lib/eddy/build/build_r_and_n.rb +0 -69
- data/lib/eddy/build/build_tm.rb +0 -52
- data/lib/eddy/build/segments.rb +0 -25
- data/lib/eddy/definitions/manual/elements/109.dt.pickup_date.rb +0 -20
- data/lib/eddy/definitions/manual/elements/111.tm.pickup_time.rb +0 -20
- data/lib/eddy/definitions/manual/elements/112.an.pier_name.rb +0 -19
- data/lib/eddy/definitions/manual/elements/785.b.binary_data.rb +0 -19
- data/lib/eddy/definitions/manual/elements/81.r.weight.rb +0 -19
- data/lib/eddy/definitions/manual/elements/86.n0.total_equipment.rb +0 -20
- data/lib/eddy/definitions/manual/elements/I02.authorization_information.rb +0 -20
- data/lib/eddy/definitions/manual/elements/I04.security_information.rb +0 -20
- data/lib/eddy/definitions/manual/elements/I08.interchange_date.rb +0 -20
- data/lib/eddy/definitions/manual/elements/I09.interchange_time.rb +0 -20
- data/lib/eddy/definitions/manual/elements/I15.component_element_separator.rb +0 -32
- data/lib/eddy/definitions/manual/segments/n1.rb +0 -14
- data/lib/eddy/element.rb +0 -14
- data/lib/eddy/element/an.rb +0 -36
- data/lib/eddy/element/b.rb +0 -9
- data/lib/eddy/element/base.rb +0 -37
- data/lib/eddy/element/dt.rb +0 -89
- data/lib/eddy/element/id.rb +0 -40
- data/lib/eddy/element/n.rb +0 -43
- data/lib/eddy/element/r.rb +0 -47
- data/lib/eddy/element/tm.rb +0 -108
- data/lib/eddy/error.rb +0 -14
- data/lib/eddy/helpers.rb +0 -31
- data/lib/eddy/segment.rb +0 -12
- data/lib/eddy/transaction_set.rb +0 -35
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
require "time"
|
|
2
|
+
|
|
3
|
+
module Eddy
|
|
4
|
+
module Element
|
|
5
|
+
# Date in `YYMMDD` or `CCYYMMDD` format based on EDI version being used (DLMS Baseline is 004010)
|
|
6
|
+
#
|
|
7
|
+
# Values for this type are generated from a *UTC* formatted [Time][time] object.
|
|
8
|
+
#
|
|
9
|
+
# [time]: https://ruby-doc.org/stdlib-2.6.5/libdoc/time/rdoc/Time.html
|
|
10
|
+
class DT < Base
|
|
11
|
+
|
|
12
|
+
# Format for the date. Valid values: `:yymmdd` or `:ccyymmdd`
|
|
13
|
+
# @return [Symbol<:yymmdd, :ccyymmdd>]
|
|
14
|
+
attr_reader :fmt
|
|
15
|
+
|
|
16
|
+
# @param min [Integer] (nil)
|
|
17
|
+
# @param max [Integer] (nil)
|
|
18
|
+
# @param req [String] (nil)
|
|
19
|
+
# @param ref [String] (nil)
|
|
20
|
+
# @param val [Time] (nil) A *UTC* formatted Time object.
|
|
21
|
+
# @param fmt [Symbol] (nil) Format for the date. Valid values: `:yymmdd` or `:ccyymmdd`.
|
|
22
|
+
# @return [void]
|
|
23
|
+
def initialize(
|
|
24
|
+
min: nil,
|
|
25
|
+
max: nil,
|
|
26
|
+
req: nil,
|
|
27
|
+
ref: nil,
|
|
28
|
+
val: nil,
|
|
29
|
+
fmt: nil
|
|
30
|
+
)
|
|
31
|
+
@type = "DT"
|
|
32
|
+
@min = min
|
|
33
|
+
@max = max
|
|
34
|
+
self.req = req
|
|
35
|
+
self.ref = ref
|
|
36
|
+
if fmt.nil?
|
|
37
|
+
raise ArgumentError, "DT elements require either a `fmt` value, or `min` and `max` values." if min.nil? || max.nil?
|
|
38
|
+
@fmt = determine_format()
|
|
39
|
+
else
|
|
40
|
+
self.fmt = fmt
|
|
41
|
+
end
|
|
42
|
+
self.value = val
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# @raise [Eddy::Errors::ElementNilValueError] If the element is required and no value has been set.
|
|
46
|
+
# @return [String]
|
|
47
|
+
def value()
|
|
48
|
+
if @val.nil?
|
|
49
|
+
case self.req
|
|
50
|
+
when "M" then raise Eddy::Errors::ElementNilValueError.new(element: self)
|
|
51
|
+
when "O", "C" then return ""
|
|
52
|
+
else raise Eddy::Errors::Error, "Invalid req value: #{self.req}"
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
case self.fmt
|
|
56
|
+
when :yymmdd then return Eddy::Util::Time.yymmdd(@val)
|
|
57
|
+
when :ccyymmdd then return Eddy::Util::Time.ccyymmdd(@val)
|
|
58
|
+
else raise Eddy::Errors::Error "invalid fmt value for DT object"
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# @raise [ElementValidationError] Unless passed a *UTC* formatted `Time` object.
|
|
63
|
+
# @param arg [Time] A *UTC* formatted [Time](https://ruby-doc.org/stdlib-2.6.5/libdoc/time/rdoc/Time.html) object.
|
|
64
|
+
# @return [void]
|
|
65
|
+
def value=(arg)
|
|
66
|
+
if arg.nil?
|
|
67
|
+
@val = arg
|
|
68
|
+
return
|
|
69
|
+
end
|
|
70
|
+
raise Eddy::Errors::TypeValidationError.new(element: self, arg: arg) unless arg.is_a?(Time)
|
|
71
|
+
raise Eddy::Errors::ElementValidationError.new("Argument passed is not in UTC format", element: self) unless arg.utc?()
|
|
72
|
+
@val = arg
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# @param fmt [Symbol]
|
|
76
|
+
# @return [void]
|
|
77
|
+
def fmt=(fmt)
|
|
78
|
+
return if fmt.nil?
|
|
79
|
+
fmt = fmt.to_sym.downcase
|
|
80
|
+
raise ArgumentError, "Invalid fmt for DT value: #{fmt}" unless accepted_formats.include?(fmt)
|
|
81
|
+
@fmt = fmt
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# @return [Array<Symbol>]
|
|
85
|
+
def accepted_formats()
|
|
86
|
+
return [:yymmdd, :ccyymmdd]
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# @return [Symbol]
|
|
90
|
+
def determine_format()
|
|
91
|
+
case self.max
|
|
92
|
+
when 6 then return :yymmdd
|
|
93
|
+
when 8 then return :ccyymmdd
|
|
94
|
+
else raise Eddy::Errors::Error, "unable to determine format for dt element"
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
module Eddy
|
|
2
|
+
module Element
|
|
3
|
+
# Identifier (works with a code list specified by the dictionary).
|
|
4
|
+
class ID < Base
|
|
5
|
+
|
|
6
|
+
# @param min [Integer]
|
|
7
|
+
# @param max [Integer]
|
|
8
|
+
# @param req [String] (nil)
|
|
9
|
+
# @param ref [String] (nil)
|
|
10
|
+
# @param val [String] (nil)
|
|
11
|
+
# @return [void]
|
|
12
|
+
def initialize(
|
|
13
|
+
min:,
|
|
14
|
+
max:,
|
|
15
|
+
req: nil,
|
|
16
|
+
ref: nil,
|
|
17
|
+
val: nil
|
|
18
|
+
)
|
|
19
|
+
@type = "ID"
|
|
20
|
+
@min = min
|
|
21
|
+
@max = max
|
|
22
|
+
self.req = req
|
|
23
|
+
self.ref = ref
|
|
24
|
+
self.value = val
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# @raise [Eddy::Errors::ElementNilValueError] If the element is required and no value has been set.
|
|
28
|
+
# @return [String]
|
|
29
|
+
def value()
|
|
30
|
+
if @val.nil?
|
|
31
|
+
case self.req
|
|
32
|
+
when "M" then raise Eddy::Errors::ElementNilValueError.new(element: self)
|
|
33
|
+
when "O", "C" then return ""
|
|
34
|
+
else raise Eddy::Errors::Error, "Invalid req value: #{self.req}"
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
return @val
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# @param arg [String]
|
|
41
|
+
# return [void]
|
|
42
|
+
def value=(arg)
|
|
43
|
+
if arg.nil?
|
|
44
|
+
@val = arg
|
|
45
|
+
return
|
|
46
|
+
end
|
|
47
|
+
raise Eddy::Errors::ElementValidationError.new("Value not present in code list: #{arg}", element: self) unless self.code_list().include?(arg)
|
|
48
|
+
@val = arg
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# @return [Array<String>]
|
|
52
|
+
def code_list()
|
|
53
|
+
raise NotImplementedError, "Each ID element must define its own code_list"
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
module Eddy
|
|
2
|
+
module Element
|
|
3
|
+
# Numeric (implies the number of decimal points, e.g., N2 would be two decimal positions)
|
|
4
|
+
class N < Base
|
|
5
|
+
|
|
6
|
+
# *Implied* number of decimal points.
|
|
7
|
+
# @return [Integer]
|
|
8
|
+
attr_accessor :decimals
|
|
9
|
+
|
|
10
|
+
# @param min [Integer]
|
|
11
|
+
# @param max [Integer]
|
|
12
|
+
# @param req [String] (nil)
|
|
13
|
+
# @param ref [String] (nil)
|
|
14
|
+
# @param val [Numeric] (nil)
|
|
15
|
+
# @param decimals [Integer] (0)
|
|
16
|
+
# @return [void]
|
|
17
|
+
def initialize(
|
|
18
|
+
min:,
|
|
19
|
+
max:,
|
|
20
|
+
req: nil,
|
|
21
|
+
ref: nil,
|
|
22
|
+
val: nil,
|
|
23
|
+
decimals: 0
|
|
24
|
+
)
|
|
25
|
+
@min = min
|
|
26
|
+
@max = max
|
|
27
|
+
self.req = req
|
|
28
|
+
self.ref = ref
|
|
29
|
+
self.decimals = decimals
|
|
30
|
+
self.value = val
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# @raise [Eddy::Errors::ElementNilValueError] If the element is required and no value has been set.
|
|
34
|
+
# @return [String]
|
|
35
|
+
def value()
|
|
36
|
+
if @val.nil?
|
|
37
|
+
case self.req
|
|
38
|
+
when "M" then raise Eddy::Errors::ElementNilValueError.new(element: self)
|
|
39
|
+
when "O", "C" then return ""
|
|
40
|
+
else raise Eddy::Errors::Error, "Invalid req value: #{self.req}"
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
return self.process_value()
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# @raise [Eddy::Errors::ElementValidationError]
|
|
47
|
+
# @param arg [Numeric]
|
|
48
|
+
# @return [void]
|
|
49
|
+
def value=(arg)
|
|
50
|
+
if arg.nil?
|
|
51
|
+
@val = nil
|
|
52
|
+
return
|
|
53
|
+
end
|
|
54
|
+
raise Eddy::Errors::TypeValidationError.new(element: self, arg: arg) unless arg.is_a?(Numeric)
|
|
55
|
+
@val = arg
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# @return [String]
|
|
59
|
+
def process_value()
|
|
60
|
+
return self.class.process_value(
|
|
61
|
+
@val,
|
|
62
|
+
self.decimals,
|
|
63
|
+
min: self.min,
|
|
64
|
+
max: self.max,
|
|
65
|
+
)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Convert a Float or Integer value to a valid EDI string representation.
|
|
69
|
+
# [Stas Spiridonov is a wizard](https://github.com/spiridonov/baldr/blob/master/lib/baldr/types.rb#L43).
|
|
70
|
+
#
|
|
71
|
+
# @param val [Numeric] Original value.
|
|
72
|
+
# @param decimals [Integer] *Implied* number of decimal points.
|
|
73
|
+
# @param min [Integer] (1) Minimum length for a valid value.
|
|
74
|
+
# @param max [Integer] (nil) Maximum length for a valid value.
|
|
75
|
+
# @return [String]
|
|
76
|
+
def self.process_value(val, decimals, min: 1, max: nil)
|
|
77
|
+
case val
|
|
78
|
+
when Integer
|
|
79
|
+
if (val - val.floor) == 0
|
|
80
|
+
return sprintf("%0#{min}d", val.truncate)
|
|
81
|
+
else
|
|
82
|
+
return sprintf("%0#{min}d", val.round(2))
|
|
83
|
+
end
|
|
84
|
+
# return sprintf("%0#{min}d", val)
|
|
85
|
+
when Float
|
|
86
|
+
return (val * (10.0**decimals)).round.to_s
|
|
87
|
+
else
|
|
88
|
+
raise ArgumentError, "'val' must be a Float or an Integer."
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
require "bigdecimal"
|
|
2
|
+
|
|
3
|
+
module Eddy
|
|
4
|
+
module Element
|
|
5
|
+
# Decimal Numeric (decimal points must be transmitted if used).
|
|
6
|
+
class R < Base
|
|
7
|
+
|
|
8
|
+
# @param min [Integer]
|
|
9
|
+
# @param max [Integer]
|
|
10
|
+
# @param req [String] (nil)
|
|
11
|
+
# @param ref [String] (nil)
|
|
12
|
+
# @param val [Numeric] (nil)
|
|
13
|
+
# @return [void]
|
|
14
|
+
def initialize(
|
|
15
|
+
min:,
|
|
16
|
+
max:,
|
|
17
|
+
req: nil,
|
|
18
|
+
ref: nil,
|
|
19
|
+
val: nil
|
|
20
|
+
)
|
|
21
|
+
@type = "R"
|
|
22
|
+
@min = min
|
|
23
|
+
@max = max
|
|
24
|
+
self.req = req
|
|
25
|
+
self.ref = ref
|
|
26
|
+
self.value = val
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# @return [String]
|
|
30
|
+
def value()
|
|
31
|
+
if @val.nil?
|
|
32
|
+
case self.req
|
|
33
|
+
when "M" then raise Eddy::Errors::ElementNilValueError.new(element: self)
|
|
34
|
+
when "O", "C" then return ""
|
|
35
|
+
else raise Eddy::Errors::Error, "Invalid req value: #{self.req}"
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
return process(@val)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# @param arg [Numeric]
|
|
42
|
+
# @raise [ArgumentError] Unless passed a Numeric value.
|
|
43
|
+
# @return [void]
|
|
44
|
+
def value=(arg)
|
|
45
|
+
if arg.nil?
|
|
46
|
+
@val = arg
|
|
47
|
+
return
|
|
48
|
+
end
|
|
49
|
+
raise Eddy::Errors::TypeValidationError.new(element: self, arg: arg) unless arg.is_a?(Numeric)
|
|
50
|
+
@val = arg
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Stringify a float value and trim to the element's `max` attribute.
|
|
54
|
+
#
|
|
55
|
+
# TODO: Use `sprintf` here?
|
|
56
|
+
#
|
|
57
|
+
# See:
|
|
58
|
+
#
|
|
59
|
+
# - [Ruby class types and case statements (Stack Overflow)](https://stackoverflow.com/questions/3908380/ruby-class-types-and-case-statements)
|
|
60
|
+
# - [Numbers and Class Hierarchy in Ruby (Medium)](https://medium.com/rubyinside/numbers-and-class-hierarchy-in-ruby-8c93c4749316)
|
|
61
|
+
#
|
|
62
|
+
# @param val [Numeric]
|
|
63
|
+
# @return [String]
|
|
64
|
+
def process(val)
|
|
65
|
+
case val
|
|
66
|
+
when Integer
|
|
67
|
+
return val.to_s.slice(0..self.max)
|
|
68
|
+
when Float
|
|
69
|
+
return val.to_s.slice(0..(self.max + 1))
|
|
70
|
+
when Complex
|
|
71
|
+
# TODO: Handle case
|
|
72
|
+
raise NotImplementedError
|
|
73
|
+
when Rational
|
|
74
|
+
# TODO: Handle case
|
|
75
|
+
raise NotImplementedError
|
|
76
|
+
when BigDecimal
|
|
77
|
+
# TODO: Handle case
|
|
78
|
+
raise NotImplementedError
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
require "time"
|
|
2
|
+
|
|
3
|
+
module Eddy
|
|
4
|
+
module Element
|
|
5
|
+
# Time in `HHMMSSDD` format.
|
|
6
|
+
# Time expressed in 24-hour clock time as follows:
|
|
7
|
+
# `HHMM`, or `HHMMSS`, or `HHMMSSD`, or `HHMMSSDD`
|
|
8
|
+
# where H = hours (00-23), M = minutes (00-59), S = integer seconds (00-59) and DD = decimal seconds;
|
|
9
|
+
# decimal seconds are expressed as follows:
|
|
10
|
+
# D = tenths (0-9) and DD = hundredths (00-99)
|
|
11
|
+
#
|
|
12
|
+
# Values for this type are generated from a *UTC* formatted [Time][time] object.
|
|
13
|
+
#
|
|
14
|
+
# [time]: https://ruby-doc.org/stdlib-2.6.5/libdoc/time/rdoc/Time.html
|
|
15
|
+
class TM < Base
|
|
16
|
+
|
|
17
|
+
# Format for the date. Valid values: `:hhmm`, `:hhmmss`, `:hhmmssd`, and `:hhmmssdd`
|
|
18
|
+
# TODO: Decide if this should be an attr_accessor
|
|
19
|
+
# @return [Symbol<:hhmm, :hhmmss, :hhmmssd, :hhmmssdd>]
|
|
20
|
+
attr_reader :fmt
|
|
21
|
+
|
|
22
|
+
# TM elements require either a `fmt` value, or `min` and `max` values.
|
|
23
|
+
#
|
|
24
|
+
# @raise [ArgumentError] If an invalid format argument is passed.
|
|
25
|
+
# @param min [Integer] (nil)
|
|
26
|
+
# @param max [Integer] (nil)
|
|
27
|
+
# @param req [String] (nil)
|
|
28
|
+
# @param ref [String] (nil)
|
|
29
|
+
# @param val [Time] (nil)
|
|
30
|
+
# @param fmt [Symbol] (nil) Format for the date. Valid values: `:hhmm`, `:hhmmss`, `:hhmmssd`, and `:hhmmssdd`
|
|
31
|
+
# @return [void]
|
|
32
|
+
def initialize(
|
|
33
|
+
min: nil,
|
|
34
|
+
max: nil,
|
|
35
|
+
req: nil,
|
|
36
|
+
ref: nil,
|
|
37
|
+
val: nil,
|
|
38
|
+
fmt: nil
|
|
39
|
+
)
|
|
40
|
+
@type = "TM"
|
|
41
|
+
@min = min
|
|
42
|
+
@max = max
|
|
43
|
+
self.req = req
|
|
44
|
+
self.ref = ref
|
|
45
|
+
if fmt.nil?
|
|
46
|
+
raise ArgumentError, "TM elements require either a `fmt` value, or `min` and `max` values." if min.nil? || max.nil?
|
|
47
|
+
@fmt = determine_format()
|
|
48
|
+
else
|
|
49
|
+
self.fmt = fmt
|
|
50
|
+
end
|
|
51
|
+
self.value = val
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# @raise [Eddy::Errors::ElementNilValueError] If the element is required and no value has been set.
|
|
55
|
+
# @return [String]
|
|
56
|
+
def value()
|
|
57
|
+
if @val.nil?
|
|
58
|
+
case self.req
|
|
59
|
+
when "M" then raise Eddy::Errors::ElementNilValueError.new(element: self)
|
|
60
|
+
when "O", "C" then return ""
|
|
61
|
+
else raise Eddy::Errors::Error, "Invalid req value: #{self.req}"
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
case self.fmt
|
|
65
|
+
when :hhmm then return Eddy::Util::Time.hhmm(@val)
|
|
66
|
+
when :hhmmss then return Eddy::Util::Time.hhmmss(@val)
|
|
67
|
+
when :hhmmssd then return Eddy::Util::Time.hhmmssd(@val)
|
|
68
|
+
when :hhmmssdd then return Eddy::Util::Time.hhmmssdd(@val)
|
|
69
|
+
else raise Eddy::Errors::Error, "invalid fmt value for TM object"
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# @raise [ElementValidationError] Unless passed a *UTC* formatted Time object.
|
|
74
|
+
# @param arg [Time] A *UTC* formatted `Time` object.
|
|
75
|
+
# @return [void]
|
|
76
|
+
def value=(arg)
|
|
77
|
+
if arg.nil?
|
|
78
|
+
@val = arg
|
|
79
|
+
return
|
|
80
|
+
end
|
|
81
|
+
raise Eddy::Errors::TypeValidationError.new(element: self, arg: arg) unless arg.is_a?(Time)
|
|
82
|
+
raise Eddy::Errors::ElementValidationError.new("Argument is not in UTC format", element: self) unless arg.utc?()
|
|
83
|
+
@val = arg
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# @param fmt [Symbol]
|
|
87
|
+
# @return [void]
|
|
88
|
+
def fmt=(fmt)
|
|
89
|
+
return if fmt.nil?
|
|
90
|
+
fmt = fmt.to_sym.downcase
|
|
91
|
+
raise ArgumentError unless accepted_formats.include?(fmt)
|
|
92
|
+
@fmt = fmt
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# @return [Array<Symbol>]
|
|
96
|
+
def accepted_formats()
|
|
97
|
+
return [:hhmm, :hhmmss, :hhmmssd, :hhmmssdd]
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# @return [Symbol]
|
|
101
|
+
def determine_format()
|
|
102
|
+
case self.max
|
|
103
|
+
when 4 then return :hhmm
|
|
104
|
+
when 6 then return :hhmmss
|
|
105
|
+
when 7 then return :hhmmssd
|
|
106
|
+
when 8 then return :hhmmssdd
|
|
107
|
+
else raise Eddy::Errors::Error, "unable to determine format for TM element"
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|