From 762ae45f21d8a603884ae8cd5b4a6150b852beb1 Mon Sep 17 00:00:00 2001 From: chadzink Date: Wed, 16 Jan 2019 09:27:30 -0800 Subject: [PATCH] Added InvSws Business Object (#14) --- lib/syspro.rb | 3 +++ lib/syspro/business_objects/comsfm.rb | 2 +- lib/syspro/business_objects/invsws.rb | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ lib/syspro/business_objects/models/invsws_item.rb | 47 +++++++++++++++++++++++++++++++++++++++++++++++ lib/syspro/business_objects/parsers/invsws_parser.rb | 28 ++++++++++++++++++++++++++++ lib/syspro/business_objects/schemas/invsws.xml.erb | 8 ++++++++ lib/syspro/business_objects/schemas/invsws_doc.xml.erb | 43 +++++++++++++++++++++++++++++++++++++++++++ test/comsfm_test.rb | 2 +- test/invsws_test.rb | 33 +++++++++++++++++++++++++++++++++ 9 files changed, 214 insertions(+), 2 deletions(-) create mode 100644 lib/syspro/business_objects/invsws.rb create mode 100644 lib/syspro/business_objects/models/invsws_item.rb create mode 100644 lib/syspro/business_objects/parsers/invsws_parser.rb create mode 100644 lib/syspro/business_objects/schemas/invsws.xml.erb create mode 100644 lib/syspro/business_objects/schemas/invsws_doc.xml.erb create mode 100644 test/invsws_test.rb diff --git a/lib/syspro.rb b/lib/syspro.rb index ee4cc4e..dfa2a8d 100644 --- a/lib/syspro.rb +++ b/lib/syspro.rb @@ -34,6 +34,7 @@ require 'syspro/business_objects/portor' require 'syspro/business_objects/portoi' require 'syspro/business_objects/porqry' require 'syspro/business_objects/comsfm' +require 'syspro/business_objects/invsws' require 'syspro/business_objects/invqry' require 'syspro/business_objects/models/sor' @@ -48,6 +49,7 @@ require 'syspro/business_objects/models/purchase_orders/freight_line' require 'syspro/business_objects/models/purchase_orders/misc_charge_line' require 'syspro/business_objects/models/purchase_orders/comment_line' require 'syspro/business_objects/models/comsfm_item' +require 'syspro/business_objects/models/invsws_item' require 'syspro/business_objects/models/inv' require 'syspro/business_objects/parsers/combrw_parser' @@ -57,6 +59,7 @@ require 'syspro/business_objects/parsers/sorqry_parser' require 'syspro/business_objects/parsers/portor_parser' require 'syspro/business_objects/parsers/portoi_parser' require 'syspro/business_objects/parsers/comsfm_parser' +require 'syspro/business_objects/parsers/invsws_parser' require 'syspro/business_objects/parsers/invqry_parser' # Main Module diff --git a/lib/syspro/business_objects/comsfm.rb b/lib/syspro/business_objects/comsfm.rb index 8d337fc..158e2f5 100644 --- a/lib/syspro/business_objects/comsfm.rb +++ b/lib/syspro/business_objects/comsfm.rb @@ -12,7 +12,7 @@ module Syspro attr_accessor :validate_only, :items - def call(user_id) + def add(user_id) xml_parameters = params_template.result(binding) xml_in = template.result(binding) business_object = 'COMSFM' diff --git a/lib/syspro/business_objects/invsws.rb b/lib/syspro/business_objects/invsws.rb new file mode 100644 index 0000000..765d46d --- /dev/null +++ b/lib/syspro/business_objects/invsws.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +require 'syspro/business_objects/parsers/invsws_parser' +require 'erb' + +module Syspro + module BusinessObjects + class InvSws < ApiResource + include Syspro::ApiOperations::Setup + include Syspro::BusinessObjects::Parsers + + attr_accessor :validate_only, + :apply_product_class_default, + :ignore_warnings, + :apply_if_entire_document_valid, + :item + + def add(user_id) + xml_parameters = params_template.result(binding) + xml_in = template.result(binding) + business_object = 'INVSWS' + params = { 'UserId' => user_id, + 'BusinessObject' => business_object, + 'XmlParameters' => xml_parameters, + 'XmlIn' => xml_in } + resp = InvSws.add(params) + + parse_response(resp) + end + + def template + ERB.new File.read(File.expand_path('schemas/invsws_doc.xml.erb', File.dirname(__FILE__))), nil, '%' + end + + def params_template + ERB.new File.read(File.expand_path('schemas/invsws.xml.erb', File.dirname(__FILE__))), nil, '%' + end + + def parse_response(resp) + handle_errors(resp) + parser = InvSwsParser.new(resp[0].data) + parser.parse + end + + def render_xml(inner_text, dflt_value = "") + inner_text ? inner_text.to_s : dflt_value + end + end + end +end diff --git a/lib/syspro/business_objects/models/invsws_item.rb b/lib/syspro/business_objects/models/invsws_item.rb new file mode 100644 index 0000000..30367a8 --- /dev/null +++ b/lib/syspro/business_objects/models/invsws_item.rb @@ -0,0 +1,47 @@ +module Syspro + module BusinessObjects + module Models + class InvSwsItem + attr_accessor :key_stock_code, + :key_warehouse, + :cost_multiplier, + :minimum_qty, + :maximum_qty, + :unit_cost, + :default_bin, + :safety_stock_qty, + :re_order_qty, + :pallet_qty, + :user_field1, + :user_field2, + :user_field3, + :order_policy, + :major_order_mult, + :minor_order_mult, + :order_minimum, + :order_maximum, + :order_fix_period, + :trf_supplied_item, + :default_source_wh, + :trf_lead_time, + :trf_cost_gl_code, + :trf_cost_multiply, + :trf_replenish_wh, + :trf_buying_rule, + :trf_dock_to_stock, + :trf_fix_time_period, + :labour_cost, + :material_cost, + :fixed_overhead, + :variable_overhead, + :sub_contract_cost, + :manual_cost_flag, + :e_signature + end + + class InvSwsItemKey + attr_accessor + end + end + end +end \ No newline at end of file diff --git a/lib/syspro/business_objects/parsers/invsws_parser.rb b/lib/syspro/business_objects/parsers/invsws_parser.rb new file mode 100644 index 0000000..ee00298 --- /dev/null +++ b/lib/syspro/business_objects/parsers/invsws_parser.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +module Syspro + module BusinessObjects + module Parsers + class InvSwsParser + attr_reader :doc + + def initialize(doc) + @doc = doc + end + + def parse + { + "key": { + "stock_code": doc.xpath("//item/key/stockcode").map{|e| e.text}.first, + "warehouse": doc.xpath("//item/key/stockcode").map{|e| e.text}.first + }, + "reacords_read": doc.xpath("//StatusOfItems/RecordsRead").map{|e| e.text}.first, + "reacords_invalid": doc.xpath("//StatusOfItems/RecordsInvalid").map{|e| e.text}.first, + "error_numbers": doc.xpath("//ErrorNumber").map{|e| e.text} + } + end + end + end + end +end + diff --git a/lib/syspro/business_objects/schemas/invsws.xml.erb b/lib/syspro/business_objects/schemas/invsws.xml.erb new file mode 100644 index 0000000..e9ee74d --- /dev/null +++ b/lib/syspro/business_objects/schemas/invsws.xml.erb @@ -0,0 +1,8 @@ + + + <%= render_xml(@apply_product_class_default, "BA") %> + <%= render_xml(@ignore_warnings, "N") %> + <%= render_xml(@apply_if_entire_document_valid, "Y") %> + <%= render_xml(@validate_only, "N") %> + + diff --git a/lib/syspro/business_objects/schemas/invsws_doc.xml.erb b/lib/syspro/business_objects/schemas/invsws_doc.xml.erb new file mode 100644 index 0000000..b4a6c37 --- /dev/null +++ b/lib/syspro/business_objects/schemas/invsws_doc.xml.erb @@ -0,0 +1,43 @@ + + + + <%= render_xml(@item.key_stock_code) %> + <%= render_xml(@item.key_warehouse) %> + + <%= render_xml(@item.cost_multiplier, "1.0") %> + <%= render_xml(@item.minimum_qty) %> + <%= render_xml(@item.maximum_qty) %> + <%= render_xml(@item.unit_cost) %> + <%= render_xml(@item.default_bin, "FG") %> + <%= render_xml(@item.safety_stock_qty) %> + <%= render_xml(@item.re_order_qty) %> + <%= render_xml(@item.pallet_qty) %> + <%= render_xml(@item.user_field1) %> + <%= render_xml(@item.user_field2) %> + <%= render_xml(@item.user_field3) %> + <%= render_xml(@item.order_policy, "C") %> + <%= render_xml(@item.major_order_mult) %> + <%= render_xml(@item.minor_order_mult) %> + <%= render_xml(@item.order_minimum) %> + <%= render_xml(@item.order_maximum) %> + <%= render_xml(@item.order_fix_period, "01") %> + <%= render_xml(@item.trf_supplied_item, "N") %> + <%= render_xml(@item.default_source_wh) %> + <%= render_xml(@item.trf_lead_time, "0") %> + <%= render_xml(@item.trf_cost_gl_code) %> + <%= render_xml(@item.trf_cost_multiply) %> + <%= render_xml(@item.trf_replenish_wh, "0") %> + <%= render_xml(@item.trf_buying_rule, "A") %> + <%= render_xml(@item.trf_dock_to_stock) %> + <%= render_xml(@item.trf_fix_time_period) %> + <%= render_xml(@item.labour_cost) %> + <%= render_xml(@item.material_cost) %> + <%= render_xml(@item.fixed_overhead) %> + <%= render_xml(@item.variable_overhead) %> + <%= render_xml(@item.sub_contract_cost) %> + <%= render_xml(@item.manual_cost_flag, "N") %> + <% if @item.e_signature %> + <%= render_xml(@item.e_signature) %> + <% end %> + + \ No newline at end of file diff --git a/test/comsfm_test.rb b/test/comsfm_test.rb index 32e1708..c969b6c 100644 --- a/test/comsfm_test.rb +++ b/test/comsfm_test.rb @@ -24,7 +24,7 @@ class ComsFmTest < Minitest::Test cust_form.validate_only = "Y" cust_form.items = [cust_item] - errors = cust_form.call(user_id.guid) + errors = cust_form.add(user_id.guid) assert_equal errors.length, 0 end diff --git a/test/invsws_test.rb b/test/invsws_test.rb new file mode 100644 index 0000000..ff6becf --- /dev/null +++ b/test/invsws_test.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +require 'test_helper' + +class ComsFmTest < Minitest::Test + extend Minitest::Spec::DSL + + let(:username) { ENV['SYSPRO_USERNAME'] } + let(:password) { ENV['SYSPRO_PASSWORD'] } + let(:company) { ENV['SYSPRO_COMPANY'] } + let(:company_password) { '' } + let(:user_id) do + Syspro::Logon.logon(username, password, company, company_password) + end + + def test_comsfm + invsws_item = Syspro::BusinessObjects::Models::InvSwsItem.new + invsws_item.key_stock_code = "1003" + invsws_item.key_warehouse = "P0" + invsws_item.default_bin = "P0" + + invsws_req = Syspro::BusinessObjects::InvSws.new + invsws_req.validate_only = "Y" + invsws_req.apply_product_class_default = "BA" + invsws_req.ignore_warnings = "N" + invsws_req.apply_if_entire_document_valid = "Y" + invsws_req.item = invsws_item + + invsws_resp = invsws_req.add(user_id.guid) + + assert_equal invsws_resp[:error_numbers].length, 0 + end +end \ No newline at end of file -- libgit2 0.21.4