Commit f1e2e13b29c6df0a5d45c63629b4e2acc48f25a4

Authored by chadzink
Committed by GitHub
1 parent 762ae45f

Implemented PorTor Business Object (#16)

lib/syspro.rb
... ... @@ -51,6 +51,7 @@ require 'syspro/business_objects/models/purchase_orders/comment_line'
51 51 require 'syspro/business_objects/models/comsfm_item'
52 52 require 'syspro/business_objects/models/invsws_item'
53 53 require 'syspro/business_objects/models/inv'
  54 +require 'syspro/business_objects/models/receipt_interospection'
54 55  
55 56 require 'syspro/business_objects/parsers/combrw_parser'
56 57 require 'syspro/business_objects/parsers/comfch_parser'
... ...
lib/syspro/business_objects/models/receipt_interospection.rb 0 → 100644
  1 +module Syspro
  2 + module BusinessObjects
  3 + module Models
  4 + class ReceiptInterospection
  5 + attr_accessor :purchase_order,
  6 + :warehouse,
  7 + :stock_code,
  8 + :quantity,
  9 + :counted_quantity_complete,
  10 + :delivery_note,
  11 + :certificate,
  12 + :lot
  13 + end
  14 + end
  15 + end
  16 +end
0 17 \ No newline at end of file
... ...
lib/syspro/business_objects/parsers/portor_parser.rb
... ... @@ -11,6 +11,8 @@ module Syspro
11 11 end
12 12  
13 13 def parse
  14 + error_numbers = doc.xpath("//ErrorNumber").map{|e| e.text}
  15 +
14 16 gl_journal = doc.first_element_child.xpath('GlJournal')
15 17 gl_journal_obj = gl_journal.children.map do |el|
16 18 next if el.name == 'text'
... ... @@ -27,7 +29,7 @@ module Syspro
27 29 key[:entry_number] = doc.first_element_child.xpath('EntryNumber')
28 30 key[:warehouse] = doc.first_element_child.xpath('Warehouse')
29 31 key[:gl_journal] = gl_journal_obj
30   -
  32 +
31 33 receipts = doc.first_element_child.xpath('Receipt')
32 34 receipts_obj = receipts.flat_map do |el|
33 35 el.elements.map do |inner|
... ... @@ -45,13 +47,15 @@ module Syspro
45 47 )
46 48 end
47 49  
48   - PorTorObject.new(
49   - key,
50   - receipt_models
51   - )
  50 + grns = doc.xpath("//Grn").map{|e| e.text}
  51 +
  52 + {
  53 + error_numbers: error_numbers,
  54 + key: key,
  55 + receipt: receipt_models,
  56 + grns: grns
  57 + }
52 58 end
53   -
54   - PorTorObject = Struct.new(:key, :receipts)
55 59 end
56 60 end
57 61 end
... ...
lib/syspro/business_objects/portor.rb
... ... @@ -9,30 +9,36 @@ module Syspro
9 9 include Syspro::ApiOperations::Transaction
10 10 include Syspro::BusinessObjects::Parsers
11 11  
12   - attr_accessor :transaction_date, :ignore_warnings, :non_stocked_wh_to_use, :grn_matching_action,
13   - :allow_blank_supplier, :apply_if_entire_document_valid, :validate_only,
14   - :manual_serial_transfers_allowed, :ignore_analysis
  12 + attr_accessor :transaction_date,
  13 + :ignore_warnings,
  14 + :non_stocked_wh_to_use,
  15 + :grn_matching_action,
  16 + :allow_blank_supplier,
  17 + :apply_if_entire_document_valid,
  18 + :validate_only,
  19 + :manual_serial_transfers_allowed,
  20 + :ignore_analysis,
  21 + # :receipts # NOT implemented yet
  22 + :receipt_interospections
15 23  
16 24 def call(user_id)
17   - raise NotImplementedError.new("PORTOR not implemented yet.")
18   - #xml_parameters = params_template.result(binding)
19   - #xml_in = template.result(binding)
20   - #business_object = 'PORTOR'
21   - #params = { 'UserId' => user_id,
22   - #'BusinessObject' => business_object,
23   - #'XmlParameters' => xml_parameters,
24   - #'XmlIn' => xml_in }
25   - #resp = PorTor.post(params)
26   -
27   - #parse_response(resp)
  25 + xml_parameters = params_template.result(binding)
  26 + xml_in = template.result(binding)
  27 + business_object = 'PORTOR'
  28 + params = { 'UserId' => user_id,
  29 + 'BusinessObject' => business_object,
  30 + 'XmlParameters' => xml_parameters,
  31 + 'XmlIn' => xml_in }
  32 + resp = PorTor.post(params)
  33 + parse_response(resp)
28 34 end
29 35  
30 36 def template
31   - ERB.new File.read(File.expand_path('schemas/portor.xml.erb', File.dirname(__FILE__))), nil, '%'
  37 + ERB.new File.read(File.expand_path('schemas/portor_doc.xml.erb', File.dirname(__FILE__))), nil, '%'
32 38 end
33 39  
34 40 def params_template
35   - ERB.new File.read(File.expand_path('schemas/portor_doc.xml.erb', File.dirname(__FILE__))), nil, '%'
  41 + ERB.new File.read(File.expand_path('schemas/portor.xml.erb', File.dirname(__FILE__))), nil, '%'
36 42 end
37 43  
38 44 def parse_response(resp)
... ... @@ -40,6 +46,10 @@ module Syspro
40 46 parser = PorTorParser.new(resp[0].data)
41 47 parser.parse
42 48 end
  49 +
  50 + def render_xml(inner_text, dflt_value = "")
  51 + inner_text ? inner_text.to_s : dflt_value
  52 + end
43 53 end
44 54 end
45 55 end
... ...
lib/syspro/business_objects/schemas/portor.xml.erb
1 1 <?xml version="1.0" encoding="Windows-1252"?>
2   -<!-- Copyright 1994-2010 SYSPRO Ltd.-->
3   -<!--
4   - This is an example XML instance to demonstrate
5   - use of the Purchase Order Receipts Business Object
6   --->
7   -<PostPurchaseOrderReceipts xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xsd:noNamespaceSchemaLocation="portordoc.xsd">
8   - <Item>
9   - <Receipt>
10   - <Journal/>
11   - <PurchaseOrder>436</PurchaseOrder>
12   - <PurchaseOrderLine>1</PurchaseOrderLine>
13   - <Warehouse/>
14   - <StockCode/>
15   - <Quantity>750.000</Quantity>
16   - <UnitOfMeasure/>
17   - <Units/>
18   - <Pieces/>
19   - <DeliveryNote/>
20   - <Cost/>
21   - <CostBasis>P</CostBasis>
22   - <SwitchOnGRNMatching>N</SwitchOnGRNMatching>
23   - <GRNNumber>311</GRNNumber>
24   - <Reference/>
25   - <GRNSource>1</GRNSource>
26   - <UseSingleTypeABCElements>N</UseSingleTypeABCElements>
27   - <Lot/>
28   - <LotExpiryDate/>
29   - <Certificate/>
30   - <Concession/>
31   - <Bins>
32   - <BinLocation>A1</BinLocation>
33   - <BinQuantity>750.000</BinQuantity>
34   - <BinUnits/>
35   - <BinPieces/>
36   - </Bins>
37   - <Serials>
38   - <SerialNumber>0205</SerialNumber>
39   - <SerialQuantity>1</SerialQuantity>
40   - <SerialUnits/>
41   - <SerialPieces/>
42   - <SerialExpiryDate/>
43   - <SerialLocation/>
44   - </Serials>
45   - <SerialRange>
46   - <SerialPrefix>999</SerialPrefix>
47   - <SerialSuffix>1</SerialSuffix>
48   - <StartSerialNumber/>
49   - <SerialQuantity>8</SerialQuantity>
50   - <SerialExpiryDate/>
51   - <SerialLocation/>
52   - </SerialRange>
53   - <PurchaseOrderLineComplete>N</PurchaseOrderLineComplete>
54   - <IncreaseSalesOrderQuantity>N</IncreaseSalesOrderQuantity>
55   - <ChangeSalesOrderStatus>N</ChangeSalesOrderStatus>
56   - <ApplyCostMultiplier>Y</ApplyCostMultiplier>
57   - <CostMultiplier/>
58   - <NonMerchandiseCost>150.00</NonMerchandiseCost>
59   - <NonMerchandiseDistribution>
60   - <NmReference>Cost Ref</NmReference>
61   - <NmLedgerCode>00-1170</NmLedgerCode>
62   - <NmSupplier>0000026</NmSupplier>
63   - <NmAmount>150.00</NmAmount>
64   - <NmAnalysisEntry/>
65   - <NmAnalysisLineEntry>
66   - <AnalysisCode1>Air</AnalysisCode1>
67   - <AnalysisCode2>Conf</AnalysisCode2>
68   - <AnalysisCode3>East</AnalysisCode3>
69   - <AnalysisCode4/>
70   - <AnalysisCode5/>
71   - <StartDate/>
72   - <EndDate/>
73   - <EntryAmount>100</EntryAmount>
74   - <Comment>Analysis entry details</Comment>
75   - </NmAnalysisLineEntry>
76   - <DebitNmAnalysisEntry/>
77   - <DebitNmAnalysisLineEntry>
78   - <AnalysisCode1>Air</AnalysisCode1>
79   - <AnalysisCode2>Conf</AnalysisCode2>
80   - <AnalysisCode3>East</AnalysisCode3>
81   - <AnalysisCode4/>
82   - <AnalysisCode5/>
83   - <StartDate/>
84   - <EndDate/>
85   - <EntryAmount>100</EntryAmount>
86   - <Comment>Analysis entry details</Comment>
87   - </DebitNmAnalysisLineEntry>
88   - </NonMerchandiseDistribution>
89   - <Notation>P/O Receipt note</Notation>
90   - <LedgerCode>00-1540</LedgerCode>
91   - <PasswordForLedgerCode/>
92   - <DebitLedgerCode/>
93   - <PasswordForDebitLedgerCode/>
94   - <CountryOfOrigin/>
95   - <DeliveryTerms/>
96   - <NatureOfTransaction/>
97   - <ModeOfTransport/>
98   - <TradersReference/>
99   - <TariffCode/>
100   - <UnitMass/>
101   - <SupplementaryUnits>N</SupplementaryUnits>
102   - <SupplementaryUnitsFactor></SupplementaryUnitsFactor>
103   - <AnalysisEntry/>
104   - <AnalysisLineEntry>
105   - <AnalysisCode1>Air</AnalysisCode1>
106   - <AnalysisCode2>Conf</AnalysisCode2>
107   - <AnalysisCode3>East</AnalysisCode3>
108   - <AnalysisCode4/>
109   - <AnalysisCode5/>
110   - <StartDate/>
111   - <EndDate/>
112   - <EntryAmount>100</EntryAmount>
113   - <Comment>Analysis entry details</Comment>
114   - </AnalysisLineEntry>
115   - <DebitAnalysisEntry/>
116   - <DebitAnalysisLineEntry>
117   - <AnalysisCode1>Air</AnalysisCode1>
118   - <AnalysisCode2>Conf</AnalysisCode2>
119   - <AnalysisCode3>East</AnalysisCode3>
120   - <AnalysisCode4/>
121   - <AnalysisCode5/>
122   - <StartDate/>
123   - <EndDate/>
124   - <EntryAmount>100</EntryAmount>
125   - <Comment>Analysis entry details</Comment>
126   - </DebitAnalysisLineEntry>
127   - <eSignature/>
128   - </Receipt>
129   - </Item>
130   - <Item>
131   - <ReceiptIntoInspection>
132   - <Journal/>
133   - <PurchaseOrder>436</PurchaseOrder>
134   - <PurchaseOrderLine>2</PurchaseOrderLine>
135   - <Warehouse/>
136   - <StockCode/>
137   - <Quantity>50.000</Quantity>
138   - <UnitOfMeasure/>
139   - <Units/>
140   - <Pieces/>
141   - <CountedQuantityComplete>N</CountedQuantityComplete>
142   - <DeliveryNote/>
143   - <DeliveryDate/>
144   - <Certificate/>
145   - <Narration/>
146   - <SwitchOnGRNMatching>N</SwitchOnGRNMatching>
147   - <GRNNumber>301</GRNNumber>
148   - <Lot/>
149   - <LotExpiryDate/>
150   - <PurchaseOrderLineComplete>N</PurchaseOrderLineComplete>
151   - <Serials>
152   - <SerialNumber>0205</SerialNumber>
153   - <SerialQuantity>50</SerialQuantity>
154   - <SerialUnits/>
155   - <SerialPieces/>
156   - <SerialExpiryDate/>
157   - <SerialLocation/>
158   - </Serials>
159   - <SerialRange>
160   - <SerialPrefix>98</SerialPrefix>
161   - <SerialSuffix>1</SerialSuffix>
162   - <StartSerialNumber/>
163   - <SerialQuantity>8</SerialQuantity>
164   - <SerialExpiryDate/>
165   - <SerialLocation/>
166   - </SerialRange>
167   - <eSignature/>
168   - </ReceiptIntoInspection>
169   - </Item>
170   - <Item>
171   - <ReceiptFromInspection>
172   - <Journal/>
173   - <GRNNumber>312</GRNNumber>
174   - <Quantity>10.000</Quantity>
175   - <Units/>
176   - <Pieces/>
177   - <DeliveryNote/>
178   - <Concession/>
179   - <Cost/>
180   - <CostBasis>P</CostBasis>
181   - <Reference/>
182   - <GRNSource>1</GRNSource>
183   - <UseSingleTypeABCElements>N</UseSingleTypeABCElements>
184   - <Bins>
185   - <BinLocation>A1</BinLocation>
186   - <BinQuantity>10.000</BinQuantity>
187   - <BinUnits/>
188   - <BinPieces/>
189   - </Bins>
190   - <SelectAvailableSerials>N</SelectAvailableSerials>
191   - <Serials>
192   - <SerialNumber>0205</SerialNumber>
193   - <SerialQuantity>1</SerialQuantity>
194   - <SerialUnits/>
195   - <SerialPieces/>
196   - <SerialExpiryDate/>
197   - <SerialLocation/>
198   - </Serials>
199   - <IncreaseSalesOrderQuantity>N</IncreaseSalesOrderQuantity>
200   - <ChangeSalesOrderStatus>N</ChangeSalesOrderStatus>
201   - <ApplyCostMultiplier>Y</ApplyCostMultiplier>
202   - <CostMultiplier/>
203   - <NonMerchandiseCost>150.00</NonMerchandiseCost>
204   - <NonMerchandiseDistribution>
205   - <NmReference>Cost Ref</NmReference>
206   - <NmLedgerCode>30-4400</NmLedgerCode>
207   - <NmSupplier/>
208   - <NmAmount>150.00</NmAmount>
209   - </NonMerchandiseDistribution>
210   - <Notation>P/O Receipt note</Notation>
211   - <LedgerCode>00-1540</LedgerCode>
212   - <PasswordForLedgerCode/>
213   - <DebitLedgerCode/>
214   - <PasswordForDebitLedgerCode/>
215   - <CountryOfOrigin/>
216   - <DeliveryTerms/>
217   - <NatureOfTransaction/>
218   - <ModeOfTransport/>
219   - <TradersReference/>
220   - <TariffCode/>
221   - <UnitMass/>
222   - <SupplementaryUnits>N</SupplementaryUnits>
223   - <SupplementaryUnitsFactor></SupplementaryUnitsFactor>
224   - </ReceiptFromInspection>
225   - </Item>
226   -</PostPurchaseOrderReceipts>
227   -
  2 +<PostPurchaseOrderReceipts xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xsd:noNamespaceSchemaLocation="portor.xsd">
  3 + <Parameters>
  4 + <TransactionDate><%= render_xml(@transaction_date) %></TransactionDate>
  5 + <IgnoreWarnings><%= render_xml(@ignore_warnings, "N") %></IgnoreWarnings>
  6 + <NonStockedWhToUse><%= render_xml(@non_stocked_wh_to_use) %></NonStockedWhToUse>
  7 + <GRNMatchingAction><%= render_xml(@grn_matching_action, "A") %></GRNMatchingAction>
  8 + <AllowBlankSupplier><%= render_xml(@allow_blank_supplier, "N")%></AllowBlankSupplier>
  9 + <ApplyIfEntireDocumentValid><%= render_xml(@apply_if_entire_document_valid, "N")%></ApplyIfEntireDocumentValid>
  10 + <ValidateOnly><%= render_xml(@validate_only, "N")%></ValidateOnly>
  11 + <ManualSerialTransfersAllowed><%= render_xml(@manual_serial_transfers_allowed, "N")%></ManualSerialTransfersAllowed>
  12 + <IgnoreAnalysis><%= render_xml(@ignore_analysis, "N")%></IgnoreAnalysis>
  13 + </Parameters>
  14 +</PostPurchaseOrderReceipts>
228 15 \ No newline at end of file
... ...
lib/syspro/business_objects/schemas/portor_doc.xml.erb
1 1 <?xml version="1.0" encoding="Windows-1252"?>
2   -<PostPurchaseOrderReceipts xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xsd:noNamespaceSchemaLocation="portor.xsd">
3   - <Parameters>
4   - <TransactionDate><%= @transaction_date %></TransactionDate>
5   - <IgnoreWarnings><%= @ignore_warnings ? "N" : "Y"%></IgnoreWarnings>
6   - <NonStockedWhToUse><%= @non_stocked_wh_to_use %></NonStockedWhToUse>
7   - <GRNMatchingAction><%= @grn_matching_action %></GRNMatchingAction>
8   - <AllowBlankSupplier><%= @allow_blank_supplier ? "N" : "Y" %></AllowBlankSupplier>
9   - <ApplyIfEntireDocumentValid><%= @apply_if_entire_document_valid ? "N" : "Y" %></ApplyIfEntireDocumentValid>
10   - <ValidateOnly><%= @validate_only ? "N" : "Y" %></ValidateOnly>
11   - <ManualSerialTransfersAllowed><%= @manual_serial_transfers_allowed ? "N" : "Y" %></ManualSerialTransfersAllowed>
12   - <IgnoreAnalysis><%= @ignore_analysis ? "N" : "Y" %></IgnoreAnalysis>
13   - </Parameters>
14   -</PostPurchaseOrderReceipts>
15   -
  2 +<PostPurchaseOrderReceipts xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xsd:noNamespaceSchemaLocation="portordoc.xsd">
  3 + <%
  4 + if receipt_interospections
  5 + @receipt_interospections.each do |interospection_item|
  6 + %>
  7 + <Item>
  8 + <ReceiptIntoInspection>
  9 + <PurchaseOrder><%= render_xml(interospection_item.purchase_order)%></PurchaseOrder>
  10 + <Warehouse><%= render_xml(interospection_item.warehouse)%></Warehouse>
  11 + <StockCode><%= render_xml(interospection_item.stock_code)%></StockCode>
  12 + <Quantity><%= render_xml(interospection_item.quantity)%></Quantity>
  13 + <CountedQuantityComplete><%= render_xml(interospection_item.counted_quantity_complete, "Y")%></CountedQuantityComplete>
  14 + <DeliveryNote><%= render_xml(interospection_item.delivery_note)%></DeliveryNote>
  15 + <Certificate><%= render_xml(interospection_item.certificate)%></Certificate>
  16 + <Lot><%= render_xml(interospection_item.lot)%></Lot>
  17 + </ReceiptIntoInspection>
  18 + </Item>
  19 + <%
  20 + end
  21 + end
  22 + %>
  23 +</PostPurchaseOrderReceipts>
16 24 \ No newline at end of file
... ...
test/invsws_test.rb
... ... @@ -13,7 +13,7 @@ class ComsFmTest &lt; Minitest::Test
13 13 Syspro::Logon.logon(username, password, company, company_password)
14 14 end
15 15  
16   - def test_comsfm
  16 + def test_invsws
17 17 invsws_item = Syspro::BusinessObjects::Models::InvSwsItem.new
18 18 invsws_item.key_stock_code = "1003"
19 19 invsws_item.key_warehouse = "P0"
... ...
test/portor_test.rb 0 → 100644
  1 +# frozen_string_literal: true
  2 +
  3 +require 'test_helper'
  4 +
  5 +class PorTorTest < 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_portor
  17 + receipt_intero = Syspro::BusinessObjects::Models::ReceiptInterospection.new
  18 + receipt_intero.purchase_order = "Z01310"
  19 + receipt_intero.warehouse = "P0"
  20 + receipt_intero.stock_code = "8801"
  21 + receipt_intero.quantity = 10.21
  22 + receipt_intero.delivery_note = "DELIVER NOTE HERE-WL"
  23 + receipt_intero.certificate = "8/45-3"
  24 + receipt_intero.lot = "7097505"
  25 +
  26 + req = Syspro::BusinessObjects::PorTor.new
  27 + req.transaction_date = Time.now.strftime("%Y-%m-%d")
  28 + req.ignore_warnings = "N"
  29 +
  30 + req.receipt_interospections = [receipt_intero]
  31 + resp = req.call(user_id.guid)
  32 +
  33 + assert_equal resp[:error_numbers].length, 0
  34 + end
  35 +end
0 36 \ No newline at end of file
... ...