From f1e2e13b29c6df0a5d45c63629b4e2acc48f25a4 Mon Sep 17 00:00:00 2001 From: chadzink Date: Thu, 17 Jan 2019 05:17:22 -0800 Subject: [PATCH] Implemented PorTor Business Object (#16) --- lib/syspro.rb | 1 + lib/syspro/business_objects/models/receipt_interospection.rb | 16 ++++++++++++++++ lib/syspro/business_objects/parsers/portor_parser.rb | 18 +++++++++++------- lib/syspro/business_objects/portor.rb | 42 ++++++++++++++++++++++++++---------------- lib/syspro/business_objects/schemas/portor.xml.erb | 239 +++++++++++++---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- lib/syspro/business_objects/schemas/portor_doc.xml.erb | 36 ++++++++++++++++++++++-------------- test/invsws_test.rb | 2 +- test/portor_test.rb | 35 +++++++++++++++++++++++++++++++++++ 8 files changed, 125 insertions(+), 264 deletions(-) create mode 100644 lib/syspro/business_objects/models/receipt_interospection.rb create mode 100644 test/portor_test.rb diff --git a/lib/syspro.rb b/lib/syspro.rb index dfa2a8d..1cdd3fc 100644 --- a/lib/syspro.rb +++ b/lib/syspro.rb @@ -51,6 +51,7 @@ 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/models/receipt_interospection' require 'syspro/business_objects/parsers/combrw_parser' require 'syspro/business_objects/parsers/comfch_parser' diff --git a/lib/syspro/business_objects/models/receipt_interospection.rb b/lib/syspro/business_objects/models/receipt_interospection.rb new file mode 100644 index 0000000..ad9484c --- /dev/null +++ b/lib/syspro/business_objects/models/receipt_interospection.rb @@ -0,0 +1,16 @@ +module Syspro + module BusinessObjects + module Models + class ReceiptInterospection + attr_accessor :purchase_order, + :warehouse, + :stock_code, + :quantity, + :counted_quantity_complete, + :delivery_note, + :certificate, + :lot + end + end + end +end \ No newline at end of file diff --git a/lib/syspro/business_objects/parsers/portor_parser.rb b/lib/syspro/business_objects/parsers/portor_parser.rb index 44371e0..f00affa 100644 --- a/lib/syspro/business_objects/parsers/portor_parser.rb +++ b/lib/syspro/business_objects/parsers/portor_parser.rb @@ -11,6 +11,8 @@ module Syspro end def parse + error_numbers = doc.xpath("//ErrorNumber").map{|e| e.text} + gl_journal = doc.first_element_child.xpath('GlJournal') gl_journal_obj = gl_journal.children.map do |el| next if el.name == 'text' @@ -27,7 +29,7 @@ module Syspro key[:entry_number] = doc.first_element_child.xpath('EntryNumber') key[:warehouse] = doc.first_element_child.xpath('Warehouse') key[:gl_journal] = gl_journal_obj - + receipts = doc.first_element_child.xpath('Receipt') receipts_obj = receipts.flat_map do |el| el.elements.map do |inner| @@ -45,13 +47,15 @@ module Syspro ) end - PorTorObject.new( - key, - receipt_models - ) + grns = doc.xpath("//Grn").map{|e| e.text} + + { + error_numbers: error_numbers, + key: key, + receipt: receipt_models, + grns: grns + } end - - PorTorObject = Struct.new(:key, :receipts) end end end diff --git a/lib/syspro/business_objects/portor.rb b/lib/syspro/business_objects/portor.rb index 05914ab..5a17d90 100644 --- a/lib/syspro/business_objects/portor.rb +++ b/lib/syspro/business_objects/portor.rb @@ -9,30 +9,36 @@ module Syspro include Syspro::ApiOperations::Transaction include Syspro::BusinessObjects::Parsers - attr_accessor :transaction_date, :ignore_warnings, :non_stocked_wh_to_use, :grn_matching_action, - :allow_blank_supplier, :apply_if_entire_document_valid, :validate_only, - :manual_serial_transfers_allowed, :ignore_analysis + attr_accessor :transaction_date, + :ignore_warnings, + :non_stocked_wh_to_use, + :grn_matching_action, + :allow_blank_supplier, + :apply_if_entire_document_valid, + :validate_only, + :manual_serial_transfers_allowed, + :ignore_analysis, + # :receipts # NOT implemented yet + :receipt_interospections def call(user_id) - raise NotImplementedError.new("PORTOR not implemented yet.") - #xml_parameters = params_template.result(binding) - #xml_in = template.result(binding) - #business_object = 'PORTOR' - #params = { 'UserId' => user_id, - #'BusinessObject' => business_object, - #'XmlParameters' => xml_parameters, - #'XmlIn' => xml_in } - #resp = PorTor.post(params) - - #parse_response(resp) + xml_parameters = params_template.result(binding) + xml_in = template.result(binding) + business_object = 'PORTOR' + params = { 'UserId' => user_id, + 'BusinessObject' => business_object, + 'XmlParameters' => xml_parameters, + 'XmlIn' => xml_in } + resp = PorTor.post(params) + parse_response(resp) end def template - ERB.new File.read(File.expand_path('schemas/portor.xml.erb', File.dirname(__FILE__))), nil, '%' + ERB.new File.read(File.expand_path('schemas/portor_doc.xml.erb', File.dirname(__FILE__))), nil, '%' end def params_template - ERB.new File.read(File.expand_path('schemas/portor_doc.xml.erb', File.dirname(__FILE__))), nil, '%' + ERB.new File.read(File.expand_path('schemas/portor.xml.erb', File.dirname(__FILE__))), nil, '%' end def parse_response(resp) @@ -40,6 +46,10 @@ module Syspro parser = PorTorParser.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/schemas/portor.xml.erb b/lib/syspro/business_objects/schemas/portor.xml.erb index 0ed2c23..f7ed985 100644 --- a/lib/syspro/business_objects/schemas/portor.xml.erb +++ b/lib/syspro/business_objects/schemas/portor.xml.erb @@ -1,227 +1,14 @@ - - - - - - - 436 - 1 - - - 750.000 - - - - - - P - N - 311 - - 1 - N - - - - - - A1 - 750.000 - - - - - 0205 - 1 - - - - - - - 999 - 1 - - 8 - - - - N - N - N - Y - - 150.00 - - Cost Ref - 00-1170 - 0000026 - 150.00 - - - Air - Conf - East - - - - - 100 - Analysis entry details - - - - Air - Conf - East - - - - - 100 - Analysis entry details - - - P/O Receipt note - 00-1540 - - - - - - - - - - - N - - - - Air - Conf - East - - - - - 100 - Analysis entry details - - - - Air - Conf - East - - - - - 100 - Analysis entry details - - - - - - - - 436 - 2 - - - 50.000 - - - - N - - - - - N - 301 - - - N - - 0205 - 50 - - - - - - - 98 - 1 - - 8 - - - - - - - - - - 312 - 10.000 - - - - - - P - - 1 - N - - A1 - 10.000 - - - - N - - 0205 - 1 - - - - - - N - N - Y - - 150.00 - - Cost Ref - 30-4400 - - 150.00 - - P/O Receipt note - 00-1540 - - - - - - - - - - - N - - - - - + + + <%= render_xml(@transaction_date) %> + <%= render_xml(@ignore_warnings, "N") %> + <%= render_xml(@non_stocked_wh_to_use) %> + <%= render_xml(@grn_matching_action, "A") %> + <%= render_xml(@allow_blank_supplier, "N")%> + <%= render_xml(@apply_if_entire_document_valid, "N")%> + <%= render_xml(@validate_only, "N")%> + <%= render_xml(@manual_serial_transfers_allowed, "N")%> + <%= render_xml(@ignore_analysis, "N")%> + + \ No newline at end of file diff --git a/lib/syspro/business_objects/schemas/portor_doc.xml.erb b/lib/syspro/business_objects/schemas/portor_doc.xml.erb index 21687fa..67554d4 100644 --- a/lib/syspro/business_objects/schemas/portor_doc.xml.erb +++ b/lib/syspro/business_objects/schemas/portor_doc.xml.erb @@ -1,15 +1,23 @@ - - - <%= @transaction_date %> - <%= @ignore_warnings ? "N" : "Y"%> - <%= @non_stocked_wh_to_use %> - <%= @grn_matching_action %> - <%= @allow_blank_supplier ? "N" : "Y" %> - <%= @apply_if_entire_document_valid ? "N" : "Y" %> - <%= @validate_only ? "N" : "Y" %> - <%= @manual_serial_transfers_allowed ? "N" : "Y" %> - <%= @ignore_analysis ? "N" : "Y" %> - - - + + <% + if receipt_interospections + @receipt_interospections.each do |interospection_item| + %> + + + <%= render_xml(interospection_item.purchase_order)%> + <%= render_xml(interospection_item.warehouse)%> + <%= render_xml(interospection_item.stock_code)%> + <%= render_xml(interospection_item.quantity)%> + <%= render_xml(interospection_item.counted_quantity_complete, "Y")%> + <%= render_xml(interospection_item.delivery_note)%> + <%= render_xml(interospection_item.certificate)%> + <%= render_xml(interospection_item.lot)%> + + + <% + end + end + %> + \ No newline at end of file diff --git a/test/invsws_test.rb b/test/invsws_test.rb index ff6becf..c422872 100644 --- a/test/invsws_test.rb +++ b/test/invsws_test.rb @@ -13,7 +13,7 @@ class ComsFmTest < Minitest::Test Syspro::Logon.logon(username, password, company, company_password) end - def test_comsfm + def test_invsws invsws_item = Syspro::BusinessObjects::Models::InvSwsItem.new invsws_item.key_stock_code = "1003" invsws_item.key_warehouse = "P0" diff --git a/test/portor_test.rb b/test/portor_test.rb new file mode 100644 index 0000000..0507c3e --- /dev/null +++ b/test/portor_test.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +require 'test_helper' + +class PorTorTest < 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_portor + receipt_intero = Syspro::BusinessObjects::Models::ReceiptInterospection.new + receipt_intero.purchase_order = "Z01310" + receipt_intero.warehouse = "P0" + receipt_intero.stock_code = "8801" + receipt_intero.quantity = 10.21 + receipt_intero.delivery_note = "DELIVER NOTE HERE-WL" + receipt_intero.certificate = "8/45-3" + receipt_intero.lot = "7097505" + + req = Syspro::BusinessObjects::PorTor.new + req.transaction_date = Time.now.strftime("%Y-%m-%d") + req.ignore_warnings = "N" + + req.receipt_interospections = [receipt_intero] + resp = req.call(user_id.guid) + + assert_equal resp[:error_numbers].length, 0 + end +end \ No newline at end of file -- libgit2 0.21.4