Commit 1fce007e8de7831f53e5cb27b01b488517415230
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
Showing
5 changed files
with
171 additions
and
12 deletions
Show diff stats
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
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| | ... | ... |