Commit d9a9cb5d7c94bd0e9446633c1cd1a98b02804098

Authored by chadzink
Committed by GitHub
1 parent 23108441

Add portoi and comsfm bus obj (#11)

* WIP

* Added ComsFn for custom form data and finished off PorToi to send new Purchase Orders

* Finished

Add Purchase Order with header and lines
Fixes #752 in LMT 2.0
@@ -24,23 +24,38 @@ require 'syspro/version' @@ -24,23 +24,38 @@ require 'syspro/version'
24 require 'syspro/api_operations/request' 24 require 'syspro/api_operations/request'
25 require 'syspro/api_operations/query' 25 require 'syspro/api_operations/query'
26 require 'syspro/api_operations/transaction' 26 require 'syspro/api_operations/transaction'
  27 +require 'syspro/api_operations/setup'
27 28
28 require 'syspro/business_objects/combrw' 29 require 'syspro/business_objects/combrw'
29 require 'syspro/business_objects/comfch' 30 require 'syspro/business_objects/comfch'
30 require 'syspro/business_objects/comfnd' 31 require 'syspro/business_objects/comfnd'
31 require 'syspro/business_objects/sorqry' 32 require 'syspro/business_objects/sorqry'
32 require 'syspro/business_objects/portor' 33 require 'syspro/business_objects/portor'
  34 +require 'syspro/business_objects/portoi'
33 require 'syspro/business_objects/porqry' 35 require 'syspro/business_objects/porqry'
  36 +require 'syspro/business_objects/comsfm'
34 37
35 require 'syspro/business_objects/models/sor' 38 require 'syspro/business_objects/models/sor'
36 require 'syspro/business_objects/models/sor_detail' 39 require 'syspro/business_objects/models/sor_detail'
37 require 'syspro/business_objects/models/por_detail' 40 require 'syspro/business_objects/models/por_detail'
38 41
  42 +require 'syspro/business_objects/models/purchase_order'
  43 +require 'syspro/business_objects/models/purchase_orders/header'
  44 +require 'syspro/business_objects/models/purchase_orders/order_details'
  45 +require 'syspro/business_objects/models/purchase_orders/stock_line'
  46 +require 'syspro/business_objects/models/purchase_orders/freight_line'
  47 +require 'syspro/business_objects/models/purchase_orders/misc_charge_line'
  48 +require 'syspro/business_objects/models/purchase_orders/comment_line'
  49 +
  50 +require 'syspro/business_objects/models/comsfm_item'
  51 +
39 require 'syspro/business_objects/parsers/combrw_parser' 52 require 'syspro/business_objects/parsers/combrw_parser'
40 require 'syspro/business_objects/parsers/comfch_parser' 53 require 'syspro/business_objects/parsers/comfch_parser'
41 require 'syspro/business_objects/parsers/comfnd_parser' 54 require 'syspro/business_objects/parsers/comfnd_parser'
42 require 'syspro/business_objects/parsers/sorqry_parser' 55 require 'syspro/business_objects/parsers/sorqry_parser'
43 require 'syspro/business_objects/parsers/portor_parser' 56 require 'syspro/business_objects/parsers/portor_parser'
  57 +require 'syspro/business_objects/parsers/portoi_parser'
  58 +require 'syspro/business_objects/parsers/comsfm_parser'
44 59
45 # Main Module 60 # Main Module
46 module Syspro 61 module Syspro
lib/syspro/api_operations/setup.rb 0 → 100644
  1 +# frozen_string_literal: true
  2 +
  3 +module Syspro
  4 + module ApiOperations
  5 + module Setup
  6 + module ClassMethods
  7 + def add(params)
  8 + request(:get, '/Setup/Add', params)
  9 + end
  10 +
  11 + def update(params)
  12 + request(:get, '/Setup/Update', params)
  13 + end
  14 +
  15 + def delete(params)
  16 + request(:get, '/Setup/Delete', params)
  17 + end
  18 +
  19 + private
  20 +
  21 + def warn_on_opts_in_params(params)
  22 + Util::OPTS_USER_SPECIFIED.each do |opt|
  23 + if params.key?(opt)
  24 + warn("WARNING: #{opt} should be in opts instead of params.")
  25 + end
  26 + end
  27 + end
  28 + end # ClassMethods
  29 +
  30 + def self.included(base)
  31 + base.extend(ClassMethods)
  32 + end
  33 +
  34 + protected
  35 +
  36 + def request(method, url, params = {}, opts ={})
  37 + opts = @opts.merge(Util.normalize_opts(opts))
  38 + Request.request(method, url, params, opts)
  39 + end
  40 + end
  41 + end
  42 +end
  43 +
lib/syspro/business_objects/comsfm.rb 0 → 100644
  1 +# frozen_string_literal: true
  2 +
  3 +require 'syspro/business_objects/parsers/comsfm_parser'
  4 +require 'erb'
  5 +
  6 +module Syspro
  7 + module BusinessObjects
  8 + class ComsFm < ApiResource
  9 + include Syspro::ApiOperations::Setup
  10 + include Syspro::BusinessObjects::Parsers
  11 +
  12 + attr_accessor :validate_only,
  13 + :items
  14 +
  15 + def call(user_id)
  16 + xml_parameters = params_template.result(binding)
  17 + xml_in = template.result(binding)
  18 + business_object = 'COMSFM'
  19 + params = { 'UserId' => user_id,
  20 + 'BusinessObject' => business_object,
  21 + 'XmlParameters' => xml_parameters,
  22 + 'XmlIn' => xml_in }
  23 + resp = ComsFm.add(params)
  24 +
  25 + parse_response(resp)
  26 + end
  27 +
  28 + def template
  29 + ERB.new File.read(File.expand_path('schemas/comsfm_doc.xml.erb', File.dirname(__FILE__))), nil, '%'
  30 + end
  31 +
  32 + def params_template
  33 + ERB.new File.read(File.expand_path('schemas/comsfm.xml.erb', File.dirname(__FILE__))), nil, '%'
  34 + end
  35 +
  36 + def parse_response(resp)
  37 + handle_errors(resp)
  38 + parser = ComsFmParser.new(resp[0].data)
  39 + parser.parse
  40 + end
  41 + end
  42 + end
  43 +end
0 \ No newline at end of file 44 \ No newline at end of file
lib/syspro/business_objects/models/comsfm_item.rb 0 → 100644
  1 +module Syspro
  2 + module BusinessObjects
  3 + module Models
  4 + class ComsFmItem
  5 + attr_accessor :form_type,
  6 + :key_field,
  7 + :field_name,
  8 + :alpha_value
  9 + end
  10 + end
  11 + end
  12 +end
0 \ No newline at end of file 13 \ No newline at end of file
lib/syspro/business_objects/models/purchase_order.rb 0 → 100644
  1 +module Syspro
  2 + module BusinessObjects
  3 + module Models
  4 + class PurchaseOrder
  5 + attr_accessor :error_numbers,
  6 + :purchase_order,
  7 + :item_number,
  8 + :order_action_type,
  9 + :supplier
  10 + end
  11 + end
  12 + end
  13 +end
0 \ No newline at end of file 14 \ No newline at end of file
lib/syspro/business_objects/models/purchase_orders/comment_line.rb 0 → 100644
  1 +module Syspro
  2 + module BusinessObjects
  3 + module Models
  4 + module PurchaseOrders
  5 + class CommentLine
  6 + attr_accessor :purchase_order_line,
  7 + :line_action_type,
  8 + :comment,
  9 + :attached_to_stk_line_number,
  10 + :delete_attached_comment_lines,
  11 + :change_single_comment_line
  12 + end
  13 + end
  14 + end
  15 + end
  16 +end
0 \ No newline at end of file 17 \ No newline at end of file
lib/syspro/business_objects/models/purchase_orders/freight_line.rb 0 → 100644
  1 +module Syspro
  2 + module BusinessObjects
  3 + module Models
  4 + module PurchaseOrders
  5 + class FreightLine
  6 + attr_accessor :purchase_order_line,
  7 + :line_action_type,
  8 + :freight_value,
  9 + :freight_tax_code,
  10 + :freight_taxable
  11 + :freight_f_loc
  12 + end
  13 + end
  14 + end
  15 + end
  16 +end
0 \ No newline at end of file 17 \ No newline at end of file
lib/syspro/business_objects/models/purchase_orders/header.rb 0 → 100644
  1 +module Syspro
  2 + module BusinessObjects
  3 + module Models
  4 + module PurchaseOrders
  5 + class Header
  6 + attr_accessor :order_action_type,
  7 + :supplier,
  8 + :exch_rate_fixed,
  9 + :exchange_rate,
  10 + :order_type,
  11 + :customer,
  12 + :tax_status,
  13 + :payment_terms,
  14 + :invoice_terms,
  15 + :customer_po_number,
  16 + :shipping_instrs,
  17 + :order_date,
  18 + :due_date,
  19 + :memo_date,
  20 + :apply_due_date_to_lines,
  21 + :memo_code,
  22 + :buyer,
  23 + :delivery_name,
  24 + :delivery_addr1,
  25 + :delivery_addr2,
  26 + :delivery_addr3,
  27 + :delivery_addr4,
  28 + :delivery_addr5,
  29 + :postal_code,
  30 + :warehouse,
  31 + :discount_less_plus,
  32 + :disc_percent1,
  33 + :disc_percent2,
  34 + :disc_percent3,
  35 + :purchase_order,
  36 + :chg_po_stat_to_ready_to_print
  37 + end
  38 + end
  39 + end
  40 + end
  41 +end
  42 +
  43 +
  44 +
lib/syspro/business_objects/models/purchase_orders/misc_charge_line.rb 0 → 100644
  1 +module Syspro
  2 + module BusinessObjects
  3 + module Models
  4 + module PurchaseOrders
  5 + class MiscChargeLine
  6 + attr_accessor :purchase_order_line,
  7 + :line_action_type,
  8 + :misc_charge_value,
  9 + :misc_charge_tax,
  10 + :misc_taxable,
  11 + :misc_charge_f_loc,
  12 + :misc_description,
  13 + :misc_comment_code
  14 + end
  15 + end
  16 + end
  17 + end
  18 +end
0 \ No newline at end of file 19 \ No newline at end of file
lib/syspro/business_objects/models/purchase_orders/order_details.rb 0 → 100644
  1 +module Syspro
  2 + module BusinessObjects
  3 + module Models
  4 + module PurchaseOrders
  5 + class OrderDetails
  6 + attr_accessor :stock_lines,
  7 + :comment_lines,
  8 + :misc_charge_lines,
  9 + :freight_lines
  10 +
  11 + def has_data
  12 + has_stock || has_comment || has_misc_charge || has_freight
  13 + end
  14 +
  15 + def has_stock
  16 + (stock_lines && stock_lines.length)
  17 + end
  18 +
  19 + def has_comment
  20 + (comment_lines && comment_lines.length)
  21 + end
  22 +
  23 + def has_misc_charge
  24 + (misc_charge_lines && misc_charge_lines.length)
  25 + end
  26 +
  27 + def has_freight
  28 + (freight_lines && freight_lines.length)
  29 + end
  30 + end
  31 + end
  32 + end
  33 + end
  34 +end
0 \ No newline at end of file 35 \ No newline at end of file
lib/syspro/business_objects/models/purchase_orders/stock_line.rb 0 → 100644
  1 +module Syspro
  2 + module BusinessObjects
  3 + module Models
  4 + module PurchaseOrders
  5 + class StockLine
  6 + attr_accessor :purchase_order_line,
  7 + :line_action_type,
  8 + :stock_code,
  9 + :stock_description,
  10 + :warehouse,
  11 + :sup_catalogue,
  12 + :order_qty,
  13 + :order_uom,
  14 + :units,
  15 + :pieces,
  16 + :price_method,
  17 + :supplier_contract,
  18 + :price,
  19 + :price_uom,
  20 + :line_disc_type,
  21 + :line_disc_less_plus,
  22 + :line_disc_percent1,
  23 + :line_disc_percent2,
  24 + :line_disc_percent3,
  25 + :line_disc_value,
  26 + :taxable,
  27 + :tax_codev,
  28 + :job,
  29 + :version,
  30 + :release,
  31 + :latest_due_date,
  32 + :original_due_date,
  33 + :reschedule_due_date,
  34 + :ledger_code,
  35 + :password_for_ledger_code,
  36 + :subcontract_op,
  37 + :inspection_reqd,
  38 + :product_class,
  39 + :nons_unit_mass,
  40 + :nons_unit_vol
  41 + end
  42 + end
  43 + end
  44 + end
  45 +end
  46 +
  47 +
  48 +
lib/syspro/business_objects/parsers/comsfm_parser.rb 0 → 100644
  1 +# frozen_string_literal: true
  2 +
  3 +module Syspro
  4 + module BusinessObjects
  5 + module Parsers
  6 + class ComsFmParser
  7 + attr_reader :doc
  8 +
  9 + def initialize(doc)
  10 + @doc = doc
  11 + end
  12 +
  13 + def parse
  14 + error_numbers = doc.xpath("//ErrorNumber").map{|e| e.text}
  15 + end
  16 + end
  17 + end
  18 + end
  19 +end
  20 +
lib/syspro/business_objects/parsers/portoi_parser.rb 0 → 100644
  1 +# frozen_string_literal: true
  2 +
  3 +module Syspro
  4 + module BusinessObjects
  5 + module Parsers
  6 + class PorToiParser
  7 + attr_reader :doc
  8 +
  9 + def initialize(doc)
  10 + @doc = doc
  11 + end
  12 +
  13 + def parse
  14 + po = Syspro::BusinessObjects::Models::PurchaseOrder.new()
  15 +
  16 + po.error_numbers = doc.xpath("//ErrorNumber").map{|e| e.text}
  17 +
  18 + po.purchase_order = doc.first_element_child.xpath('Order/Key/PurchaseOrder').text
  19 + po.item_number = doc.first_element_child.xpath('Order/ItemNumber').text
  20 + po.order_action_type = doc.first_element_child.xpath('Order/OrderActionType').text
  21 + po.supplier = doc.first_element_child.xpath('Order/Supplier').text
  22 +
  23 + po
  24 + end
  25 +
  26 + PorToiObject = Struct.new(:key, :receipts)
  27 + end
  28 + end
  29 + end
  30 +end
  31 +
lib/syspro/business_objects/portoi.rb 0 → 100644
  1 +# frozen_string_literal: true
  2 +
  3 +require 'syspro/business_objects/parsers/portoi_parser'
  4 +require 'erb'
  5 +
  6 +module Syspro
  7 + module BusinessObjects
  8 + class PorToi < ApiResource
  9 + include Syspro::ApiOperations::Transaction
  10 + include Syspro::BusinessObjects::Parsers
  11 +
  12 + # input params
  13 + attr_accessor :purchase_order_header,
  14 + :order_details,
  15 + :validate_only,
  16 + :ignore_warnings,
  17 + :allow_non_stock_items,
  18 + :allow_zero_price,
  19 + :validate_working_days,
  20 + :allow_po_when_blanket_po,
  21 + :default_memo_code,
  22 + :fixed_exchange_rate,
  23 + :default_memo_days,
  24 + :allow_blank_ledger_code,
  25 + :calc_due_date,
  26 + :default_delivery_address,
  27 + :insert_dangerous_goods_text,
  28 + :insert_additional_po_text,
  29 + :status
  30 +
  31 + def call(user_id)
  32 + xml_parameters = params_template.result(binding)
  33 + xml_in = template.result(binding)
  34 + business_object = 'PORTOI'
  35 + params = { 'UserId' => user_id,
  36 + 'BusinessObject' => business_object,
  37 + 'XmlParameters' => xml_parameters,
  38 + 'XmlIn' => xml_in }
  39 + resp = PorToi.post(params)
  40 +
  41 + parse_response(resp)
  42 + end
  43 +
  44 + def template
  45 + ERB.new File.read(File.expand_path('schemas/portoi_doc.xml.erb', File.dirname(__FILE__))), nil, '%'
  46 + end
  47 +
  48 + def params_template
  49 + ERB.new File.read(File.expand_path('schemas/portoi.xml.erb', File.dirname(__FILE__))), nil, '%'
  50 + end
  51 +
  52 + def parse_response(resp)
  53 + handle_errors(resp)
  54 + parser = PorToiParser.new(resp[0].data)
  55 + parser.parse
  56 + end
  57 +
  58 + def render_xml(inner_text)
  59 + inner_text ? inner_text.to_s : ''
  60 + end
  61 + end
  62 + end
  63 +end
  64 +
lib/syspro/business_objects/schemas/comsfm.xml.erb 0 → 100644
  1 +<SetupCustomForm xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xsd:noNamespaceSchemaLocation="COMSFM.XSD">
  2 + <Parameters>
  3 + <ValidateOnly><%= @validate_only ? "Y" : "N" %></ValidateOnly>
  4 + </Parameters>
  5 +</SetupCustomForm>
0 \ No newline at end of file 6 \ No newline at end of file
lib/syspro/business_objects/schemas/comsfm_doc.xml.erb 0 → 100644
  1 +<SetupCustomForm xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xsd:noNamespaceSchemaLocation="COMSFMDOC.XSD">
  2 +<% @items.each do |item| %>
  3 + <Item>
  4 + <Key>
  5 + <FormType><%= item.form_type %></FormType>
  6 + <KeyField><%= item.key_field %></KeyField>
  7 + <FieldName><%= item.field_name %></FieldName>
  8 + </Key>
  9 + <AlphaValue><%= item.alpha_value ? "Y" : "N" %></AlphaValue>
  10 + </Item>
  11 +<% end %>
  12 +</SetupCustomForm>
0 \ No newline at end of file 13 \ No newline at end of file
lib/syspro/business_objects/schemas/portoi.xml.erb 0 → 100644
  1 +<?xml version="1.0" encoding="Windows-1252"?>
  2 +<PostPurchaseOrders xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xsd:noNamespaceSchemaLocation="PORTOI.XSD">
  3 + <Parameters>
  4 + <ValidateOnly><%= @validate_only ? @validate_only : "N" %></ValidateOnly>
  5 + <IgnoreWarnings><%= @ignore_warnings ? @ignore_warnings : "N" %></IgnoreWarnings>
  6 + <AllowNonStockItems><%= @allow_non_stock_items ? @allow_non_stock_items : "N" %></AllowNonStockItems>
  7 + <AllowZeroPrice><%= @allow_zero_price ? @allow_zero_price : "N" %></AllowZeroPrice>
  8 + <ValidateWorkingDays><%= @validate_working_days ? @validate_working_days : "N" %></ValidateWorkingDays>
  9 + <AllowPoWhenBlanketPo><%= @allow_po_when_blanket_po ? @allow_po_when_blanket_po : "N" %></AllowPoWhenBlanketPo>
  10 + <DefaultMemoCode><%= @default_memo_code ? default_memo_code.to_s : "" %></DefaultMemoCode>
  11 + <FixedExchangeRate><%= @fixed_exchange_rate ? @fixed_exchange_rate : "N" %></FixedExchangeRate>
  12 + <DefaultMemoDays><%= @default_memo_days ? @default_memo_days.to_s : "0" %></DefaultMemoDays>
  13 + <AllowBlankLedgerCode><%= @allow_blank_ledger_code ? @allow_blank_ledger_code : "N" %></AllowBlankLedgerCode>
  14 + <DefaultDeliveryAddress/>
  15 + <CalcDueDate><%= @calc_due_date ? @calc_due_date : "N" %></CalcDueDate>
  16 + <InsertDangerousGoodsText><%= @insert_dangerous_goods_text ? @insert_dangerous_goods_text : "N" %></InsertDangerousGoodsText>
  17 + <InsertAdditionalPOText><%= @insert_additional_po_text ? @insert_additional_po_text : "N" %></InsertAdditionalPOText>
  18 + <Status><%= @status ? status.to_s : "1" %></Status>
  19 + </Parameters>
  20 +</PostPurchaseOrders>
0 \ No newline at end of file 21 \ No newline at end of file
lib/syspro/business_objects/schemas/portoi_doc.xml.erb 0 → 100644
  1 +<?xml version="1.0" encoding="Windows-1252"?>
  2 +<PostPurchaseOrders xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xsd:noNamespaceSchemaLocation="PORTOIDOC.XSD">
  3 + <Orders>
  4 + <OrderHeader>
  5 + <OrderActionType><%= render_xml(@purchase_order_header.order_action_type) %></OrderActionType>
  6 + <Supplier><%= render_xml(@purchase_order_header.supplier) %></Supplier>
  7 + <ExchRateFixed><%= render_xml(@purchase_order_header.exch_rate_fixed) %></ExchRateFixed>
  8 + <ExchangeRate><%= render_xml(@purchase_order_header.exchange_rate) %></ExchangeRate>
  9 + <OrderType><%= render_xml(@purchase_order_header.order_type) %></OrderType>
  10 + <Customer><%= render_xml(@purchase_order_header.customer) %></Customer>
  11 + <TaxStatus><%= render_xml(@purchase_order_header.tax_status) %></TaxStatus>
  12 + <PaymentTerms><%= render_xml(@purchase_order_header.payment_terms) %></PaymentTerms>
  13 + <InvoiceTerms><%= render_xml(@purchase_order_header.invoice_terms) %></InvoiceTerms>
  14 + <CustomerPoNumber><%= render_xml(@purchase_order_header.customer_po_number) %></CustomerPoNumber>
  15 + <ShippingInstrs><%= render_xml(@purchase_order_header.shipping_instrs) %></ShippingInstrs>
  16 + <OrderDate><%= render_xml(@purchase_order_header.order_date) %></OrderDate>
  17 + <DueDate><%= render_xml(@purchase_order_header.due_date) %></DueDate>
  18 + <MemoDate><%= render_xml(@purchase_order_header.memo_date) %></MemoDate>
  19 + <ApplyDueDateToLines><%= render_xml(@purchase_order_header.apply_due_date_to_lines) %></ApplyDueDateToLines>
  20 + <MemoCode><%= render_xml(@purchase_order_header.memo_code) %></MemoCode>
  21 + <Buyer><%= render_xml(@purchase_order_header.buyer) %></Buyer>
  22 + <DeliveryName><%= render_xml(@purchase_order_header.delivery_name) %></DeliveryName>
  23 + <DeliveryAddr1><%= render_xml(@purchase_order_header.delivery_addr1) %></DeliveryAddr1>
  24 + <DeliveryAddr2><%= render_xml(@purchase_order_header.delivery_addr2) %></DeliveryAddr2>
  25 + <DeliveryAddr3><%= render_xml(@purchase_order_header.delivery_addr3) %></DeliveryAddr3>
  26 + <DeliveryAddr4><%= render_xml(@purchase_order_header.delivery_addr4) %></DeliveryAddr4>
  27 + <DeliveryAddr5><%= render_xml(@purchase_order_header.delivery_addr5) %></DeliveryAddr5>
  28 + <PostalCode><%= render_xml(@purchase_order_header.postal_code) %></PostalCode>
  29 + <Warehouse><%= render_xml(@purchase_order_header.warehouse) %></Warehouse>
  30 + <DiscountLessPlus><%= render_xml(@purchase_order_header.discount_less_plus) %></DiscountLessPlus>
  31 + <DiscPercent1><%= render_xml(@purchase_order_header.disc_percent1) %></DiscPercent1>
  32 + <DiscPercent2><%= render_xml(@purchase_order_header.disc_percent2) %></DiscPercent2>
  33 + <DiscPercent3><%= render_xml(@purchase_order_header.disc_percent3) %></DiscPercent3>
  34 + <PurchaseOrder><%= render_xml(@purchase_order_header.purchase_order) %></PurchaseOrder>
  35 + <ChgPOStatToReadyToPrint><%= render_xml(@purchase_order_header.chg_po_stat_to_ready_to_print) %></ChgPOStatToReadyToPrint>
  36 + </OrderHeader>
  37 + <%
  38 + if @order_details && @order_details.has_data
  39 + %>
  40 + <OrderDetails>
  41 + <%
  42 + if @order_details.has_stock
  43 + @order_details.stock_lines.each do |stock_line|
  44 + %>
  45 + <StockLine>
  46 + <PurchaseOrderLine><%= render_xml(stock_line.purchase_order_line) %></PurchaseOrderLine>
  47 + <LineActionType><%= render_xml(stock_line.line_action_type)%></LineActionType>
  48 + <StockCode><%= render_xml(stock_line.stock_code)%></StockCode>
  49 + <StockDescription><%= render_xml(stock_line.stock_description)%></StockDescription>
  50 + <Warehouse><%= render_xml(stock_line.warehouse)%></Warehouse>
  51 + <SupCatalogue><%= render_xml(stock_line.sup_catalogue)%></SupCatalogue>
  52 + <OrderQty><%= render_xml(stock_line.order_qty)%></OrderQty>
  53 + <OrderUom><%= render_xml(stock_line.order_uom)%></OrderUom>
  54 + <Units><%= render_xml(stock_line.units)%></Units>
  55 + <Pieces><%= render_xml(stock_line.pieces)%></Pieces>
  56 + <PriceMethod><%= render_xml(stock_line.price_method)%></PriceMethod>
  57 + <SupplierContract><%= render_xml(stock_line.supplier_contract)%></SupplierContract>
  58 + <Price><%= render_xml(stock_line.price)%></Price>
  59 + <PriceUom><%= render_xml(stock_line.price_uom)%></PriceUom>
  60 + <LineDiscType><%= render_xml(stock_line.line_disc_type)%></LineDiscType>
  61 + <LineDiscLessPlus><%= render_xml(stock_line.line_disc_less_plus)%></LineDiscLessPlus>
  62 + <LineDiscPercent1><%= render_xml(stock_line.line_disc_percent1)%></LineDiscPercent1>
  63 + <LineDiscPercent2><%= render_xml(stock_line.line_disc_percent2)%></LineDiscPercent2>
  64 + <LineDiscPercent3><%= render_xml(stock_line.line_disc_percent3)%></LineDiscPercent3>
  65 + <LineDiscValue><%= render_xml(stock_line.line_disc_value)%></LineDiscValue>
  66 + <Taxable><%= render_xml(stock_line.taxable)%></Taxable>
  67 + <TaxCode><%= render_xml(stock_line.tax_codev)%></TaxCode>
  68 + <Job><%= render_xml(stock_line.job)%></Job>
  69 + <Version><%= render_xml(stock_line.version)%></Version>
  70 + <Release><%= render_xml(stock_line.release)%></Release>
  71 + <LatestDueDate><%= render_xml(stock_line.latest_due_date)%></LatestDueDate>
  72 + <OriginalDueDate><%= render_xml(stock_line.original_due_date)%></OriginalDueDate>
  73 + <RescheduleDueDate><%= render_xml(stock_line.reschedule_due_date)%></RescheduleDueDate>
  74 + <LedgerCode><%= render_xml(stock_line.ledger_code)%></LedgerCode>
  75 + <PasswordForLedgerCode><%= render_xml(stock_line.password_for_ledger_code)%></PasswordForLedgerCode>
  76 + <SubcontractOp><%= render_xml(stock_line.subcontract_op)%></SubcontractOp>
  77 + <InspectionReqd><%= render_xml(stock_line.inspection_reqd)%></InspectionReqd>
  78 + <ProductClass><%= render_xml(stock_line.product_class)%></ProductClass>
  79 + <NonsUnitMass><%= render_xml(stock_line.nons_unit_mass)%></NonsUnitMass>
  80 + <NonsUnitVol><%= render_xml(stock_line.nons_unit_vol)%></NonsUnitVol>
  81 + </StockLine>
  82 + <%
  83 + end
  84 + end
  85 +
  86 + if @order_details.has_comment
  87 + @order_details.comment_lines.each do |comment_line|
  88 + %>
  89 + <CommentLine>
  90 + <PurchaseOrderLine><%= render_xml(comment_line.purchase_order_line)%></PurchaseOrderLine>
  91 + <LineActionType><%= render_xml(comment_line.line_action_type)%></LineActionType>
  92 + <Comment><%= render_xml(comment_line.comment)%></Comment>
  93 + <AttachedToStkLineNumber><%= render_xml(comment_line.attached_to_stk_line_number)%></AttachedToStkLineNumber>
  94 + <DeleteAttachedCommentLines><%= render_xml(comment_line.delete_attached_comment_lines)%></DeleteAttachedCommentLines>
  95 + <ChangeSingleCommentLine><%= render_xml(comment_line.change_single_comment_line)%></ChangeSingleCommentLine>
  96 + </CommentLine>
  97 + <%
  98 + end
  99 + end
  100 +
  101 + if @order_details.has_misc_charge
  102 + @order_details.misc_charge_lines.each do |misc_charge_line|
  103 + %>
  104 + <MiscChargeLine>
  105 + <PurchaseOrderLine><%= render_xml(misc_charge_line.purchase_order_line)%></PurchaseOrderLine>
  106 + <LineActionType><%= render_xml(misc_charge_line.line_action_type)%></LineActionType>
  107 + <MiscChargeValue><%= render_xml(misc_charge_line.misc_charge_value)%></MiscChargeValue>
  108 + <MiscChargeTax><%= render_xml(misc_charge_line.misc_charge_tax)%></MiscChargeTax>
  109 + <MiscTaxable><%= render_xml(misc_charge_line.misc_taxable)%></MiscTaxable>
  110 + <MiscChargeFLoc><%= render_xml(misc_charge_line.misc_charge_f_loc)%></MiscChargeFLoc>
  111 + <MiscDescription><%= render_xml(misc_charge_line.misc_description)%></MiscDescription>
  112 + <MiscCommentCode><%= render_xml(misc_charge_line.misc_comment_code)%></MiscCommentCode>
  113 + </MiscChargeLine>
  114 + <%
  115 + end
  116 + end
  117 +
  118 + if @order_details.has_freight
  119 + @order_details.freight_lines.each do |freight_line|
  120 + %>
  121 + <FreightLine>
  122 + <PurchaseOrderLine><%= render_xml(freight_line.purchase_order_line)%></PurchaseOrderLine>
  123 + <LineActionType><%= render_xml(freight_line.line_action_type)%></LineActionType>
  124 + <FreightValue><%= render_xml(freight_line.freight_value)%></FreightValue>
  125 + <FreightTaxCode><%= render_xml(freight_line.freight_tax_code)%></FreightTaxCode>
  126 + <FreightTaxable><%= render_xml(freight_line.freight_taxable)%></FreightTaxable>
  127 + <FreightFLoc><%= render_xml(freight_line.freight_f_loc)%></FreightFLoc>
  128 + </FreightLine>
  129 + <%
  130 + end
  131 + end
  132 + %>
  133 + </OrderDetails>
  134 + <%
  135 + end
  136 + %>
  137 + </Orders>
  138 +</PostPurchaseOrders>
0 \ No newline at end of file 139 \ No newline at end of file
test/comsfm_test.rb 0 → 100644
  1 +# frozen_string_literal: true
  2 +
  3 +require 'test_helper'
  4 +
  5 +class ComsFmTest < Minitest::Test
  6 + extend Minitest::Spec::DSL
  7 +
  8 + let(:username) { ENV['SYSPRO_USERNAME'] }
  9 + let(:password) { ENV['SYSPRO_PASSWORD'] }
  10 + let(:company) { ENV['SYSPRO_COMPANY'] }
  11 + let(:company_password) { '' }
  12 + let(:user_id) do
  13 + Syspro::Logon.logon(username, password, company, company_password)
  14 + end
  15 +
  16 + def test_comsfm
  17 + cust_item = Syspro::BusinessObjects::Models::ComsFmItem.new
  18 + cust_item.form_type = "POR"
  19 + cust_item.key_field = "U03421"
  20 + cust_item.field_name = "TempPO"
  21 + cust_item.alpha_value = "Y"
  22 +
  23 + cust_form = Syspro::BusinessObjects::ComsFm.new
  24 + cust_form.validate_only = "Y"
  25 + cust_form.items = [cust_item]
  26 +
  27 + errors = cust_form.call(user_id.guid)
  28 +
  29 + assert_equal errors.length, 0
  30 + end
  31 +end
0 \ No newline at end of file 32 \ No newline at end of file
test/portoi_test.rb 0 → 100644
  1 +# frozen_string_literal: true
  2 +
  3 +require 'test_helper'
  4 +
  5 +class PorToiTest < Minitest::Test
  6 + extend Minitest::Spec::DSL
  7 +
  8 + let(:username) { ENV['SYSPRO_USERNAME'] }
  9 + let(:password) { ENV['SYSPRO_PASSWORD'] }
  10 + let(:company) { ENV['SYSPRO_COMPANY'] }
  11 + let(:company_password) { '' }
  12 + let(:user_id) do
  13 + Syspro::Logon.logon(username, password, company, company_password)
  14 + end
  15 +
  16 + def test_portoi
  17 + po = Syspro::BusinessObjects::PorToi.new
  18 + po.purchase_order_header = Syspro::BusinessObjects::Models::PurchaseOrders::Header.new
  19 +
  20 + # Setup the PORTOI params
  21 + po.validate_only = "N"
  22 + po.ignore_warnings = "N"
  23 + po.allow_non_stock_items = "N"
  24 + po.allow_zero_price = "Y"
  25 + po.validate_working_days = "N"
  26 + po.allow_po_when_blanket_po = "N"
  27 + po.default_memo_code = ""
  28 + po.fixed_exchange_rate = "N"
  29 + po.default_memo_days = 0
  30 + po.allow_blank_ledger_code = "Y"
  31 + po.default_delivery_address = ""
  32 + po.calc_due_date = "N"
  33 + po.insert_dangerous_goods_text = "N"
  34 + po.insert_additional_po_text = "N"
  35 + po.status = "1"
  36 +
  37 + # Setup the purchase order header data attributes
  38 + po.purchase_order_header.order_action_type = "A"
  39 + po.purchase_order_header.order_type = "L"
  40 + po.purchase_order_header.supplier = "WYC001"
  41 + po.purchase_order_header.customer_po_number = "H01993-1"
  42 + po.purchase_order_header.buyer = "PCD"
  43 + po.purchase_order_header.warehouse = "P0"
  44 + po.purchase_order_header.tax_status = "N"
  45 + po.purchase_order_header.invoice_terms = "X"
  46 + po.purchase_order_header.order_date = Time.now.strftime("%Y-%m-%d")
  47 + po.purchase_order_header.apply_due_date_to_lines = "A"
  48 + po.purchase_order_header.disc_percent1 = 0
  49 + po.purchase_order_header.disc_percent2 = 0
  50 + po.purchase_order_header.disc_percent3 = 0
  51 +
  52 + line1 = Syspro::BusinessObjects::Models::PurchaseOrders::StockLine.new
  53 + line1.purchase_order_line = 1
  54 + line1.line_action_type = "A"
  55 + line1.stock_code = "8801"
  56 + line1.warehouse = "P0"
  57 + line1.order_qty = "100"
  58 + line1.order_uom = "KG"
  59 + line1.pieces = "0"
  60 + line1.price_method = "M"
  61 + line1.price = 0
  62 + line1.line_disc_type = "P"
  63 + line1.line_disc_less_plus = "L"
  64 + line1.line_disc_percent1 = 0
  65 + line1.line_disc_percent2 = 0
  66 + line1.line_disc_percent3 = 0
  67 + line1.line_disc_value = 0
  68 + line1.taxable = "N"
  69 +
  70 + po.order_details = Syspro::BusinessObjects::Models::PurchaseOrders::OrderDetails.new
  71 + po.order_details.stock_lines = [line1]
  72 + binding.pry
  73 +
  74 + syspro_po = po.call(user_id.guid)
  75 +
  76 + assert_equal syspro_po.error_numbers.length, 0
  77 + end
  78 +end
0 \ No newline at end of file 79 \ No newline at end of file
test/test_helper.rb
@@ -11,6 +11,7 @@ require &#39;webmock&#39; @@ -11,6 +11,7 @@ require &#39;webmock&#39;
11 VCR.configure do |c| 11 VCR.configure do |c|
12 c.cassette_library_dir = 'test/cassettes' 12 c.cassette_library_dir = 'test/cassettes'
13 c.hook_into :webmock 13 c.hook_into :webmock
  14 + c.allow_http_connections_when_no_cassette = true
14 c.filter_sensitive_data('<syspro_username>') { ENV['SYSPRO_USERNAME'] } 15 c.filter_sensitive_data('<syspro_username>') { ENV['SYSPRO_USERNAME'] }
15 c.filter_sensitive_data('<syspro_password>') { ENV['SYSPRO_PASSWORD'] } 16 c.filter_sensitive_data('<syspro_password>') { ENV['SYSPRO_PASSWORD'] }
16 c.filter_sensitive_data('<syspro_company>') { ENV['SYSPRO_COMPANY'] } 17 c.filter_sensitive_data('<syspro_company>') { ENV['SYSPRO_COMPANY'] }