Commit 1fce007e8de7831f53e5cb27b01b488517415230

Authored by Nathan Ockerman
Committed by GitHub
1 parent 4984d61a

LM Issue 769 - sale order lines parsing (#7)

* added parsing for sales order lines on the SorDetail business object

* removed .gem file
Gemfile.lock
1 1 PATH
2 2 remote: .
3 3 specs:
4   - syspro-ruby (1.0.0.alpha.1)
  4 + syspro-ruby (1.0.0.alpha.2)
5 5 faraday (~> 0.10)
6 6 nokogiri (~> 1.8.2)
7 7  
... ... @@ -14,7 +14,7 @@ GEM
14 14 coderay (1.1.2)
15 15 crack (0.4.3)
16 16 safe_yaml (~> 1.0.0)
17   - faraday (0.14.0)
  17 + faraday (0.15.4)
18 18 multipart-post (>= 1.2, < 3)
19 19 hashdiff (0.3.7)
20 20 method_source (0.9.0)
... ... @@ -27,7 +27,7 @@ GEM
27 27 minitest (>= 4.7.5)
28 28 vcr (>= 2.9)
29 29 multipart-post (2.0.0)
30   - nokogiri (1.8.2)
  30 + nokogiri (1.8.5)
31 31 mini_portile2 (~> 2.3.0)
32 32 parallel (1.12.1)
33 33 parser (2.5.0.5)
... ... @@ -69,4 +69,4 @@ DEPENDENCIES
69 69 webmock (~> 3.3.0)
70 70  
71 71 BUNDLED WITH
72   - 1.16.1
  72 + 1.16.4
... ...
lib/syspro/business_objects/models/sor_detail.rb
... ... @@ -20,9 +20,8 @@ module Syspro
20 20 :jobs_exist_flag, :alternate_key, :hierarchy_flag, :deposit_flag, :edi_source, :mult_ship_code,
21 21 :company_tax_no, :last_operator, :operator, :state, :county_zip, :extended_tax_code, :web_created,
22 22 :quote, :dispatches_made, :live_disp_exist, :num_dispatches, :include_in_mrp, :header_text,
23   - :header_notes, :commissions
  23 + :header_notes, :commissions, :sales_order_lines
24 24 end
25 25 end
26 26 end
27 27 end
28   -
... ...
lib/syspro/business_objects/parsers/sorqry_parser.rb
... ... @@ -121,20 +121,181 @@ module Syspro
121 121 sor.header_text = doc.first_element_child.xpath("HeaderText").text
122 122 sor.header_notes = doc.first_element_child.xpath("HeaderNotes").text
123 123  
  124 + # Inner Nested Structure Parsing
  125 + sor.commissions = parse_commissions(doc)
  126 + sor.sales_order_lines = parse_sales_order_lines(doc)
  127 +
  128 + sor
  129 + end
  130 +
  131 + def parse_commissions(doc)
124 132 commissions = doc.first_element_child.xpath("Commissions")
125   - commissions_obj = commissions.children.map do |el|
  133 + commissions_obj = parse_children_elements(commissions)
  134 +
  135 + commissions_obj
  136 + end
  137 +
  138 +
  139 + def parse_sales_order_lines(doc)
  140 + sales_order_lines = doc.first_element_child.xpath("SalesOrderLine")
  141 + sales_order_lines_obj = {}
  142 +
  143 + sales_order_lines.children.each do |el|
  144 + next if el.name == "text"
  145 +
  146 + serial_obj = {}
  147 + bin_obj = {}
  148 + attached_items_obj = {}
  149 + lot_obj = {}
  150 +
  151 + if el.name == "MiscCharge"
  152 + unless sales_order_lines_obj[:misc_charge]
  153 + sales_order_lines_obj[:misc_charge] = []
  154 + end
  155 +
  156 + misc_charge_arr = parse_children_elements(el)
  157 + sales_order_lines_obj[:misc_charge].push(misc_charge_arr)
  158 + end
  159 +
  160 + if el.name == "Freight"
  161 + unless sales_order_lines_obj[:freight]
  162 + sales_order_lines_obj[:freight] = []
  163 + end
  164 +
  165 + freight_arr = parse_children_elements(el)
  166 + sales_order_lines_obj[:freight].push(freight_arr)
  167 + end
  168 +
  169 + if el.name == "CommentLine"
  170 + unless sales_order_lines_obj[:comment_line]
  171 + sales_order_lines_obj[:comment_line] = []
  172 + end
  173 +
  174 + comment_line_arr = parse_children_elements(el)
  175 + sales_order_lines_obj[:comment_line].push(comment_line_arr)
  176 + end
  177 +
  178 + if el.name == "Merchandise"
  179 + unless sales_order_lines_obj[:merchandise]
  180 + sales_order_lines_obj[:merchandise] = []
  181 + end
  182 +
  183 + merchandise_arr = el.children.map do |el_child|
  184 + next if el_child.name == "text"
  185 +
  186 + # NOTE: These first three in the following
  187 + # conditionals are "Merchandise" elements with
  188 + # thier own nested structure that need parsed
  189 + if el_child.name == "Serial"
  190 + unless serial_obj[:serial]
  191 + serial_obj[:serial] = []
  192 + end
  193 +
  194 + serial_arr = parse_children_elements(el_child)
  195 + serial_obj[:serial].push(serial_arr)
  196 + serial_obj
  197 +
  198 + elsif el_child.name == "Bin"
  199 + unless bin_obj[:bin]
  200 + bin_obj[:bin] = []
  201 + end
  202 +
  203 + bin_arr = parse_children_elements(el_child)
  204 + bin_obj[:bin].push(bin_arr)
  205 + bin_obj
  206 +
  207 + elsif el_child.name == "Lot"
  208 + unless lot_obj[:lot]
  209 + lot_obj[:lot] = []
  210 + end
  211 +
  212 + lot_arr = parse_children_elements(el_child)
  213 + lot_obj[:lot].push(lot_arr)
  214 + lot_obj
  215 +
  216 + elsif el_child.name == "AttachedItems"
  217 + # NOTE: Like "Merchandise", "AttachedItems" is
  218 + # an element within "Merchandise" that contains
  219 + # elements with thier own nested structure that
  220 + # need parsed
  221 +
  222 + sct_item_obj = {}
  223 + requisition_item_obj = {}
  224 + purchase_order_obj = {}
  225 +
  226 + unless attached_items_obj[:attached_items]
  227 + attached_items_obj[:attached_items] = []
  228 + end
  229 +
  230 + attached_items_arr = el_child.children.map do |attached_items_child|
  231 + next if attached_items_child.name == "text"
  232 +
  233 + if attached_items_child.name == "SctItem"
  234 + unless sct_item_obj[:sct_item]
  235 + sct_item_obj[:sct_item] = []
  236 + end
  237 +
  238 + sct_item_arr = parse_children_elements(attached_items_child)
  239 + sct_item_obj[:sct_item].push(sct_item_arr)
  240 + sct_item_obj
  241 +
  242 + elsif attached_items_child.name == "RequisitionItem"
  243 + unless requisition_item_obj[:requisition_item]
  244 + requisition_item_obj[:requisition_item] = []
  245 + end
  246 +
  247 + requisition_item_arr = parse_children_elements(attached_items_child)
  248 + requisition_item_obj[:requisition_item].push(requisition_item_arr)
  249 + requisition_item_obj
  250 +
  251 + elsif attached_items_child.name == "PurchaseOrder"
  252 + unless purchase_order_obj[:purchase_order]
  253 + purchase_order_obj[:purchase_order] = []
  254 + end
  255 +
  256 + purchase_order_arr = parse_children_elements(attached_items_child)
  257 + purchase_order_obj[:purchase_order].push(purchase_order_arr)
  258 + purchase_order_obj
  259 +
  260 + else
  261 + {
  262 + name: attached_items_child.name,
  263 + text: attached_items_child.text
  264 + }
  265 + end
  266 + end.compact
  267 +
  268 + attached_items_obj[:attached_items].push(attached_items_arr)
  269 + attached_items_obj
  270 +
  271 + else
  272 + {
  273 + name: el_child.name,
  274 + text: el_child.text
  275 + }
  276 + end
  277 + end.compact
  278 +
  279 + sales_order_lines_obj[:merchandise].push(merchandise_arr)
  280 + end
  281 + end
  282 +
  283 + sales_order_lines_obj
  284 + end
  285 +
  286 + def parse_children_elements(el_child)
  287 + obj_array = el_child.children.map do |el|
126 288 next if el.name == "text"
127 289 {
128 290 name: el.name,
129 291 text: el.text
130 292 }
131 293 end.compact
132   - sor.commissions = commissions_obj
133 294  
134   - sor
  295 + obj_array
135 296 end
  297 +
136 298 end
137 299 end
138 300 end
139 301 end
140   -
... ...
lib/syspro/business_objects/sorqry.rb
... ... @@ -34,4 +34,3 @@ module Syspro
34 34 end
35 35 end
36 36 end
37   -
... ...
lib/syspro/syspro_object.rb
... ... @@ -44,7 +44,7 @@ module Syspro
44 44  
45 45 def to_hash # rubocop:disable Metrics/MethodLength
46 46 maybe_to_hash = lambda do |value|
47   - value&.respond_to?(:to_hash) ? value.to_hash : value
  47 + value.respond_to?(:to_hash) ? value.to_hash : value
48 48 end
49 49  
50 50 @values.each_with_object({}) do |(key, value), acc|
... ...