Commit f1e2e13b29c6df0a5d45c63629b4e2acc48f25a4

Authored by chadzink
Committed by GitHub
1 parent 762ae45f

Implemented PorTor Business Object (#16)

@@ -51,6 +51,7 @@ require 'syspro/business_objects/models/purchase_orders/comment_line' @@ -51,6 +51,7 @@ require 'syspro/business_objects/models/purchase_orders/comment_line'
51 require 'syspro/business_objects/models/comsfm_item' 51 require 'syspro/business_objects/models/comsfm_item'
52 require 'syspro/business_objects/models/invsws_item' 52 require 'syspro/business_objects/models/invsws_item'
53 require 'syspro/business_objects/models/inv' 53 require 'syspro/business_objects/models/inv'
  54 +require 'syspro/business_objects/models/receipt_interospection'
54 55
55 require 'syspro/business_objects/parsers/combrw_parser' 56 require 'syspro/business_objects/parsers/combrw_parser'
56 require 'syspro/business_objects/parsers/comfch_parser' 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 \ No newline at end of file 17 \ No newline at end of file
lib/syspro/business_objects/parsers/portor_parser.rb
@@ -11,6 +11,8 @@ module Syspro @@ -11,6 +11,8 @@ module Syspro
11 end 11 end
12 12
13 def parse 13 def parse
  14 + error_numbers = doc.xpath("//ErrorNumber").map{|e| e.text}
  15 +
14 gl_journal = doc.first_element_child.xpath('GlJournal') 16 gl_journal = doc.first_element_child.xpath('GlJournal')
15 gl_journal_obj = gl_journal.children.map do |el| 17 gl_journal_obj = gl_journal.children.map do |el|
16 next if el.name == 'text' 18 next if el.name == 'text'
@@ -27,7 +29,7 @@ module Syspro @@ -27,7 +29,7 @@ module Syspro
27 key[:entry_number] = doc.first_element_child.xpath('EntryNumber') 29 key[:entry_number] = doc.first_element_child.xpath('EntryNumber')
28 key[:warehouse] = doc.first_element_child.xpath('Warehouse') 30 key[:warehouse] = doc.first_element_child.xpath('Warehouse')
29 key[:gl_journal] = gl_journal_obj 31 key[:gl_journal] = gl_journal_obj
30 - 32 +
31 receipts = doc.first_element_child.xpath('Receipt') 33 receipts = doc.first_element_child.xpath('Receipt')
32 receipts_obj = receipts.flat_map do |el| 34 receipts_obj = receipts.flat_map do |el|
33 el.elements.map do |inner| 35 el.elements.map do |inner|
@@ -45,13 +47,15 @@ module Syspro @@ -45,13 +47,15 @@ module Syspro
45 ) 47 )
46 end 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 end 58 end
53 -  
54 - PorTorObject = Struct.new(:key, :receipts)  
55 end 59 end
56 end 60 end
57 end 61 end
lib/syspro/business_objects/portor.rb
@@ -9,30 +9,36 @@ module Syspro @@ -9,30 +9,36 @@ module Syspro
9 include Syspro::ApiOperations::Transaction 9 include Syspro::ApiOperations::Transaction
10 include Syspro::BusinessObjects::Parsers 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 def call(user_id) 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 end 34 end
29 35
30 def template 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 end 38 end
33 39
34 def params_template 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 end 42 end
37 43
38 def parse_response(resp) 44 def parse_response(resp)
@@ -40,6 +46,10 @@ module Syspro @@ -40,6 +46,10 @@ module Syspro
40 parser = PorTorParser.new(resp[0].data) 46 parser = PorTorParser.new(resp[0].data)
41 parser.parse 47 parser.parse
42 end 48 end
  49 +
  50 + def render_xml(inner_text, dflt_value = "")
  51 + inner_text ? inner_text.to_s : dflt_value
  52 + end
43 end 53 end
44 end 54 end
45 end 55 end
lib/syspro/business_objects/schemas/portor.xml.erb
1 <?xml version="1.0" encoding="Windows-1252"?> 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 \ No newline at end of file 15 \ No newline at end of file
lib/syspro/business_objects/schemas/portor_doc.xml.erb
1 <?xml version="1.0" encoding="Windows-1252"?> 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 \ No newline at end of file 24 \ No newline at end of file
test/invsws_test.rb
@@ -13,7 +13,7 @@ class ComsFmTest &lt; Minitest::Test @@ -13,7 +13,7 @@ class ComsFmTest &lt; Minitest::Test
13 Syspro::Logon.logon(username, password, company, company_password) 13 Syspro::Logon.logon(username, password, company, company_password)
14 end 14 end
15 15
16 - def test_comsfm 16 + def test_invsws
17 invsws_item = Syspro::BusinessObjects::Models::InvSwsItem.new 17 invsws_item = Syspro::BusinessObjects::Models::InvSwsItem.new
18 invsws_item.key_stock_code = "1003" 18 invsws_item.key_stock_code = "1003"
19 invsws_item.key_warehouse = "P0" 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 \ No newline at end of file 36 \ No newline at end of file