Commit 0f29247cffbdd7d3d8155dc45de46c2325df54d1

Authored by Isaac Lewis
1 parent 96149efa

add comfch and comfnd

@@ -21,8 +21,12 @@ require "syspro/api_operations/request" @@ -21,8 +21,12 @@ require "syspro/api_operations/request"
21 require "syspro/api_operations/query" 21 require "syspro/api_operations/query"
22 22
23 require "syspro/business_objects/combrw" 23 require "syspro/business_objects/combrw"
  24 +require "syspro/business_objects/comfch"
  25 +require "syspro/business_objects/comfnd"
24 26
25 require "syspro/business_objects/parsers/combrw_parser" 27 require "syspro/business_objects/parsers/combrw_parser"
  28 +require "syspro/business_objects/parsers/comfch_parser"
  29 +require "syspro/business_objects/parsers/comfnd_parser"
26 30
27 module Syspro 31 module Syspro
28 @api_base = "http://syspro.wildlandlabs.com:90/SYSPROWCFService/Rest" 32 @api_base = "http://syspro.wildlandlabs.com:90/SYSPROWCFService/Rest"
lib/syspro/api_operations/query.rb
@@ -8,10 +8,12 @@ module Syspro @@ -8,10 +8,12 @@ module Syspro
8 request(:get, "/Query/Browse", params) 8 request(:get, "/Query/Browse", params)
9 end 9 end
10 10
11 - def fetch 11 + def fetch(params)
  12 + request(:get, "/Query/Fetch", params)
12 end 13 end
13 14
14 - def query 15 + def query(params)
  16 + request(:get, "/Query/Query", params)
15 end 17 end
16 18
17 def find 19 def find
lib/syspro/business_objects/combrw.rb
@@ -23,7 +23,8 @@ module Syspro @@ -23,7 +23,8 @@ module Syspro
23 23
24 def parse_response(resp) 24 def parse_response(resp)
25 handle_errors(resp) 25 handle_errors(resp)
26 - ComBrwParser.parse(resp[0].data) 26 + parser = ComBrwParser.new(resp[0].data)
  27 + parser.parse
27 end 28 end
28 29
29 def handle_errors(resp) 30 def handle_errors(resp)
lib/syspro/business_objects/comfch.rb 0 → 100644
  1 +require "syspro/business_objects/parsers/comfch_parser"
  2 +require "erb"
  3 +
  4 +module Syspro
  5 + module BusinessObjects
  6 + class ComFch < ApiResource
  7 + include Syspro::ApiOperations::Query
  8 + include Syspro::BusinessObjects::Parsers
  9 +
  10 + attr_accessor :table_name, :key, :optional_keys, :full_key_provided,
  11 + :default_type, :espresso_fetch
  12 +
  13 + def call(user_id)
  14 + xml_in = template.result(binding)
  15 + params = { "UserId" => user_id, "XmlIn" => xml_in }
  16 + resp = ComFch.fetch(params)
  17 + parse_response(resp)
  18 + end
  19 +
  20 + def template
  21 + ERB.new File.read(File.expand_path("schemas/comfch.xml.erb", File.dirname(__FILE__))), nil, "%"
  22 + end
  23 +
  24 + def parse_response(resp)
  25 + handle_errors(resp)
  26 + parser = ComFchParser.new(resp[0].data)
  27 + parser.parse
  28 + end
  29 +
  30 + def handle_errors(resp)
  31 + body = resp[0].http_body
  32 + if body.match(/^(ERROR)/)
  33 + raise SysproError, body
  34 + end
  35 + end
  36 + end
  37 + end
  38 +end
  39 +
lib/syspro/business_objects/comfnd.rb 0 → 100644
  1 +require "syspro/business_objects/parsers/comfnd_parser"
  2 +require "erb"
  3 +
  4 +module Syspro
  5 + module BusinessObjects
  6 + class ComFnd < ApiResource
  7 + include Syspro::ApiOperations::Query
  8 + include Syspro::BusinessObjects::Parsers
  9 +
  10 + attr_accessor :table_name, :return_rows, :columns, :expressions,
  11 + :order_by
  12 +
  13 + def call(user_id)
  14 + xml_in = template.result(binding)
  15 + business_object = "COMFND"
  16 + params = { "UserId" => user_id, "BusinessObject" => business_object, "XmlIn" => xml_in }
  17 + resp = ComFnd.query(params)
  18 + parse_response(resp)
  19 + end
  20 +
  21 + def template
  22 + ERB.new File.read(File.expand_path("schemas/comfnd.xml.erb", File.dirname(__FILE__))), nil, "%"
  23 + end
  24 +
  25 + def parse_response(resp)
  26 + handle_errors(resp)
  27 + parser = ComFndParser.new(resp[0].data)
  28 + parser.parse
  29 + end
  30 +
  31 + def handle_errors(resp)
  32 + body = resp[0].http_body
  33 + if body.match(/^(ERROR)/)
  34 + raise SysproError, body
  35 + end
  36 + end
  37 + end
  38 + end
  39 +end
  40 +
lib/syspro/business_objects/parsers/combrw_parser.rb
@@ -2,8 +2,13 @@ module Syspro @@ -2,8 +2,13 @@ module Syspro
2 module BusinessObjects 2 module BusinessObjects
3 module Parsers 3 module Parsers
4 class ComBrwParser 4 class ComBrwParser
  5 + attr_reader :doc
5 6
6 - def self.parse(doc) 7 + def initialize(doc)
  8 + @doc = doc
  9 + end
  10 +
  11 + def parse
7 next_prev_key = doc.first_element_child.xpath("NextPrevKey") 12 next_prev_key = doc.first_element_child.xpath("NextPrevKey")
8 next_prev_key_obj = next_prev_key.children.map { |el| 13 next_prev_key_obj = next_prev_key.children.map { |el|
9 if el.name == "text" 14 if el.name == "text"
@@ -28,11 +33,11 @@ module Syspro @@ -28,11 +33,11 @@ module Syspro
28 33
29 rows = doc.first_element_child.xpath('Row') 34 rows = doc.first_element_child.xpath('Row')
30 rows_obj = rows.map { |el| 35 rows_obj = rows.map { |el|
31 - el.elements.map { |el| 36 + el.elements.map { |inner|
32 { 37 {
33 - name: el.name,  
34 - value: el.xpath('Value').text,  
35 - data_type: el.xpath('DataType').text 38 + name: inner.name,
  39 + value: inner.xpath('Value').text,
  40 + data_type: inner.xpath('DataType').text
36 } 41 }
37 } 42 }
38 }.flatten(1).compact 43 }.flatten(1).compact
lib/syspro/business_objects/parsers/comfch_parser.rb 0 → 100644
  1 +module Syspro
  2 + module BusinessObjects
  3 + module Parsers
  4 + class ComFchParser
  5 + attr_reader :doc
  6 +
  7 + def initialize(doc)
  8 + @doc = doc
  9 + end
  10 +
  11 + def parse
  12 + table_name = doc.first_element_child.name
  13 + columns = doc.first_element_child.elements
  14 + columns_obj = columns.map { |el|
  15 + { name: el.name, value: el.children.text }
  16 + }.compact
  17 +
  18 + FetchObject.new(
  19 + table_name,
  20 + columns_obj
  21 + )
  22 + end
  23 +
  24 + FetchObject = Struct.new(:table_name, :columns)
  25 + end
  26 + end
  27 + end
  28 +end
  29 +
lib/syspro/business_objects/parsers/comfnd_parser.rb 0 → 100644
  1 +module Syspro
  2 + module BusinessObjects
  3 + module Parsers
  4 + class ComFndParser
  5 + attr_reader :doc
  6 +
  7 + def initialize(doc)
  8 + @doc = doc
  9 + end
  10 +
  11 + def parse
  12 + header_details = doc.first_element_child.xpath("HeaderDetails")
  13 + header_details_obj = header_details.children.map { |el|
  14 + if el.name == "text"
  15 + next
  16 + end
  17 + {
  18 + name: el.name,
  19 + text: el.text
  20 + }
  21 + }.compact
  22 +
  23 + rows = doc.first_element_child.xpath('Row')
  24 + rows_obj = rows.map { |el|
  25 + el.elements.map { |inner|
  26 + {
  27 + name: inner.name,
  28 + value: inner.children.text
  29 + }
  30 + }
  31 + }.flatten(1).compact
  32 +
  33 + FindObject.new(
  34 + header_details_obj,
  35 + rows_obj,
  36 + doc.first_element_child.xpath('//RowsReturned').text.to_i
  37 + )
  38 + end
  39 +
  40 + FindObject = Struct.new(:header_details, :rows, :row_count)
  41 + end
  42 + end
  43 + end
  44 +end
  45 +
lib/syspro/business_objects/schemas/combrw.xml.erb
1 <?xml version="1.0" encoding="Windows-1252"?> 1 <?xml version="1.0" encoding="Windows-1252"?>
2 -<!-- Copyright 1994-2014 SYSPRO Ltd.-->  
3 -<!--  
4 - Sample XML for the Generic Browse Object  
5 --->  
6 <Browse xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xsd:noNamespaceSchemaLocation="COMBRW.XSD"> 2 <Browse xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xsd:noNamespaceSchemaLocation="COMBRW.XSD">
7 <BrowseName><%= @browse_name %></BrowseName> 3 <BrowseName><%= @browse_name %></BrowseName>
8 <StartAtKey/> 4 <StartAtKey/>
lib/syspro/business_objects/schemas/comfch.xml.erb 0 → 100644
  1 +<?xml version="1.0" encoding="Windows-1252"?>
  2 +<Fetch xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xsd:noNamespaceSchemaLocation="COMFCH.XSD">
  3 + <TableName><%= @table_name %></TableName>
  4 + <Key><%= @key %></Key>
  5 + <% unless @optional_keys.empty? %>
  6 + <% @optional_keys.each_with_index do |key, i| %>
  7 + <<%= "OptionalKey#{ i + 1 }" %>><%= key[:value] %></<%= "OptionalKey#{ i + 1 }" %>>
  8 + <% end %>
  9 + <% end %>
  10 + <FullKeyProvided><%= @full_key_provided ? "N" : "Y" %></FullKeyProvided>
  11 + <DefaultType><%= @default_type %></DefaultType>
  12 + <EspressoFetch><%= @espresso_fetch ? "N" : "Y" %></EspressoFetch>
  13 +</Fetch>
  14 +
lib/syspro/business_objects/schemas/comfnd.xml.erb 0 → 100644
  1 +<?xml version="1.0" encoding="Windows-1252"?>
  2 +<Query xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xsd:noNamespaceSchemaLocation="COMFND.XSD">
  3 + <TableName><%= @table_name %></TableName>
  4 + <ReturnRows><%= @return_rows %></ReturnRows>
  5 + <Columns>
  6 + <% for column in @columns %>
  7 + <Column><%= column[:name] %></Column>
  8 + <% end %>
  9 + </Columns>
  10 + <% unless @expressions.empty? %>
  11 + <Where>
  12 + <% for expression in @expressions %>
  13 + <Expression>
  14 + <OpenBracket>(</OpenBracket>
  15 + <% unless expression[:andor].nil? %>
  16 + <AndOr><%= expression[:andor] %></AndOr>
  17 + <% end %>
  18 + <Column><%= expression[:column] %></Column>
  19 + <Condition><%= expression[:condition] %></Condition>
  20 + <Value><%= expression[:value] %></Value>
  21 + <CloseBracket>)</CloseBracket>
  22 + </Expression>
  23 + <% end %>
  24 + </Where>
  25 + <% end %>
  26 + <OrderBy>
  27 + <Column><%= @order_by %></Column>
  28 + </OrderBy>
  29 +</Query>
test/query_test.rb
1 require "test_helper" 1 require "test_helper"
2 2
3 class QueryTest < Minitest::Test 3 class QueryTest < Minitest::Test
4 - def test_query 4 + def test_query_browse
5 user_id = Syspro::Logon.logon("wland", "piperita2016", "L", "") 5 user_id = Syspro::Logon.logon("wland", "piperita2016", "L", "")
6 6
7 combrw = Syspro::BusinessObjects::ComBrw.new 7 combrw = Syspro::BusinessObjects::ComBrw.new
@@ -15,8 +15,50 @@ class QueryTest &lt; Minitest::Test @@ -15,8 +15,50 @@ class QueryTest &lt; Minitest::Test
15 {name: "StockCode"} 15 {name: "StockCode"}
16 ] 16 ]
17 17
18 - query_result = combrw.call(user_id.guid) 18 + browse_result = combrw.call(user_id.guid)
19 19
20 - refute_nil query_result 20 + refute_nil browse_result
  21 + end
  22 +
  23 + def test_query_query
  24 + user_id = Syspro::Logon.logon("wland", "piperita2016", "L", "")
  25 +
  26 + comfnd = Syspro::BusinessObjects::ComFnd.new
  27 + comfnd.table_name = "InvMaster"
  28 + comfnd.return_rows = 5
  29 + comfnd.columns = [
  30 + {
  31 + name: "StockCode"
  32 + }
  33 + ]
  34 + comfnd.expressions = [
  35 + {
  36 + andor: "And",
  37 + column: "StockCode",
  38 + condition: "EQ",
  39 + value: "02"
  40 + }
  41 + ]
  42 + comfnd.order_by = "StockCode"
  43 +
  44 + find_result = comfnd.call(user_id.guid)
  45 +
  46 + refute_nil find_result
  47 + end
  48 +
  49 + def test_query_fetch
  50 + user_id = Syspro::Logon.logon("wland", "piperita2016", "L", "")
  51 +
  52 + comfch = Syspro::BusinessObjects::ComFch.new
  53 + comfch.table_name = "InvMaster"
  54 + comfch.key = "02"
  55 + comfch.optional_keys = []
  56 + comfch.full_key_provided = false
  57 + comfch.default_type = ""
  58 + comfch.espresso_fetch = true
  59 +
  60 + fetch_result = comfch.call(user_id.guid)
  61 +
  62 + refute_nil fetch_result
21 end 63 end
22 end 64 end