connect-stoopid 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ M2Q3NzU4MDVlMWY2ZjQ5MjU2ZjIwNjAzMzVlNDVhMjYwOTY4YzU0NA==
5
+ data.tar.gz: !binary |-
6
+ ZjAyMjIyMTRlOWIzZmMxNDE4MjIzNTQxNmUzOGEwZDAwM2VmMGY2MA==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ MDU1NzcwYjM4NTU3ZTExMjU5NDI4OWIxZTk1YmU4ODUxYTRmMmNkYzc0NDEx
10
+ OTBmMjBiMDhkNDZhZjkwMzY5MWZmYWY0ZWU4ZDQwNDg4ZjQ2Nzg3MjBhM2Vj
11
+ YjY0YzgwOGRjZDQ3ZWI2NGZkY2RmODA2OWRiODI0YWE5NjdiYzA=
12
+ data.tar.gz: !binary |-
13
+ MzdmMWY3YzYyNTNkOGYwZGNjYTMxNjJkMjNkY2YwNWFjNWRiZWRmNGY3ZDdh
14
+ YzFmZTYxMmQ5MzA3YjhhYWU4NWMyMDhlMDBlN2ZiMThmOTMyYjMwYTliZTgy
15
+ ZDhkYTJiZThjN2NiNzhhMTEzMWVlYTBlYmYyZjZmZjRhMDM5NzQ=
@@ -0,0 +1,7 @@
1
+ module ConnectStoopid
2
+ VERSION = "0.1.3"
3
+
4
+ require 'savon'
5
+ require 'rexml/document'
6
+ require 'connect-stoopid/reporting-client'
7
+ end
@@ -0,0 +1,201 @@
1
+ =begin
2
+ ConnectStoopid::ReportingClient
3
+ Provides an interface to the ConnectWise Reporting API
4
+ =end
5
+
6
+ module ConnectStoopid
7
+ class ReportingClient
8
+
9
+ ##
10
+ # Parameters:
11
+ # psa_address -- The hostname of your ConnectWise PSA, ie. con.companyconnect.net
12
+ # company -- Company id used when logging into ConnectWise
13
+ # username -- ConnectWise Integration username
14
+ # password -- ConnectWise Integration password
15
+ # options -- Override the default ReportingClient options
16
+ ##
17
+ def initialize(psa_address, company, username, password, options = {})
18
+ @wsdl = "https://#{psa_address}/v4_6_release/apis/1.5/ReportingApi.asmx?wsdl"
19
+ @company = company
20
+ @username = username
21
+ @password = password
22
+
23
+ @client_options = {
24
+ :client_logging => true,
25
+ :client_logging_level => :error,
26
+ :soap_version => 2,
27
+ :soap_logging => false,
28
+ :soap_logging_level => :fatal
29
+ }
30
+ @client_options.merge!(options)
31
+
32
+ @soap_client = Savon.client({
33
+ :wsdl => @wsdl,
34
+ :soap_version => @client_options[:soap_version],
35
+ :log => @client_options[:soap_logging],
36
+ :log_level => @client_options[:soap_logging_level]
37
+ })
38
+ end
39
+
40
+ ##
41
+ # Parameters:
42
+ # options: Key value pairs to add to the Savon SOAP request
43
+ # For this request, options must include "includeFields" => "true" (or "false")
44
+ # Defaults to "includeFields" => "false"
45
+ # Returns:
46
+ # If the "includeFields" option is set to "false", returns an array of strings containing all report names in alphabetical order
47
+ # If set to "true", returns an array of hashes of format {:report_name => "Activity", :fields => ["field1", "field2", ...]}
48
+ ##
49
+ def get_all_report_types(options = {"includeFields" => "false"})
50
+ log_client_message("Getting list of report types", :debug)
51
+
52
+ request_options = base_soap_hash
53
+ request_options.merge!(options)
54
+
55
+ begin
56
+ response = @soap_client.call(:get_reports, :message => request_options)
57
+ rescue Savon::SOAPFault => error
58
+ log_client_message("SOAP Fault\nError Message:\n#{error}", :error)
59
+ else
60
+ if response.success?
61
+ report_types = []
62
+ xml_doc = REXML::Document.new(response.to_xml)
63
+ if options["includeFields"] == "false"
64
+ REXML::XPath.each(xml_doc, "//Report") do |report|
65
+ report_types << report.attributes["Name"].to_s
66
+ end
67
+ return report_types.sort
68
+ elsif options["includeFields"] == "true"
69
+ REXML::XPath.each(xml_doc, "//Report") do |report|
70
+ report_fields = []
71
+ REXML::XPath.each(report, "Field") do |field|
72
+ report_fields << field.attributes["Name"].to_s
73
+ end
74
+ report_types << {:report_name => report.attributes["Name"], :fields => report_fields}
75
+ end
76
+ return report_types.sort_by! {|x| x[:report_name]}
77
+ end
78
+ end
79
+ end
80
+ end
81
+
82
+ ##
83
+ # Parameters:
84
+ # options: Key value pairs to add to the Savon SOAP request
85
+ # For this request, options must include "reportName" => "Some_Report"
86
+ # Returns:
87
+ # [String]
88
+ ##
89
+ def get_all_report_fields(options = {})
90
+ log_client_message("Getting list of available fields for a given report type", :debug)
91
+
92
+ request_options = base_soap_hash
93
+ request_options.merge!(options)
94
+
95
+ begin
96
+ response = @soap_client.call(:get_report_fields, :message => request_options)
97
+ rescue Savon::SOAPFault => error
98
+ log_client_message("SOAP Fault\nError Message:\n#{error}", :error)
99
+ else
100
+ if response.success?
101
+ report_fields = []
102
+ xml_doc = REXML::Document.new(response.to_xml)
103
+ REXML::XPath.each(xml_doc, "//FieldInfo") do |field|
104
+ report_fields << field.attributes["Name"].to_s
105
+ end
106
+ return report_fields.sort
107
+ end
108
+ end
109
+ end
110
+
111
+ ##
112
+ # Parameters:
113
+ # options: Key value pairs to add to the Savon SOAP request
114
+ # For this request, options must include "reportName" => "Some_Report",
115
+ # and should probably include "conditions" => "some condition set"
116
+ # Returns:
117
+ # Integer
118
+ ##
119
+ def run_report_count(options = {})
120
+ log_client_message("Getting a count of records per a set of conditions", :debug)
121
+
122
+ request_options = base_soap_hash
123
+ request_options.merge!(options)
124
+
125
+ begin
126
+ response = @soap_client.call(:run_report_count, :message => request_options)
127
+ rescue Savon::SOAPFault => error
128
+ log_client_message("SOAP Fault\nError Message:\n#{error}", :error)
129
+ else
130
+ if response.success?
131
+ xml_doc = REXML::Document.new(response.to_xml)
132
+ return REXML::XPath.first(xml_doc, "//RunReportCountResult").text.to_i
133
+ end
134
+ end
135
+ end
136
+
137
+ ##
138
+ # Parameters:
139
+ # options: Key value pairs to add to the Savon SOAP request
140
+ # For this request, options must include "reportName" => "Some_Report",
141
+ # and should probably (read: definitely) include "conditions" => "some condition set"
142
+ # Returns:
143
+ # [{field1 => value1, field2 => value2}]
144
+ ##
145
+ def run_report_query(options = {})
146
+ log_client_message("Running full query per a set of conditions", :debug)
147
+
148
+ request_options = base_soap_hash
149
+ request_options.merge!(options)
150
+
151
+ begin
152
+ response = @soap_client.call(:run_report_query, :message => request_options)
153
+ rescue Savon::SOAPFault => error
154
+ log_client_message("SOAP Fault\nError Message:\n#{error}", :error)
155
+ else
156
+ if response.success?
157
+ xml_doc = REXML::Document.new(response.to_xml)
158
+ rows = []
159
+ REXML::XPath.each(xml_doc, "//ResultRow") do |row|
160
+ row_key_vals = {}
161
+ REXML::XPath.each(row, "Value") do |col|
162
+ row_key_vals[col.attributes["Name"].to_s] = col.text.to_s
163
+ end
164
+ rows << row_key_vals
165
+ end
166
+ return rows
167
+ end
168
+ end
169
+ end
170
+
171
+ private
172
+ LOG_LEVELS = {
173
+ :debug => 1,
174
+ :standard => 2,
175
+ :error => 3
176
+ }
177
+
178
+ def logging
179
+ return @client_options[:client_logging]
180
+ end
181
+
182
+ def log_client_message(message, level = :error)
183
+ if logging
184
+ if LOG_LEVELS[level] >= LOG_LEVELS[@client_options[:client_logging_level]]
185
+ puts "#{self.class.to_s.split("::").last} Logger -- #{message}"
186
+ end
187
+ end
188
+ end
189
+
190
+ def base_soap_hash
191
+ request_options = {
192
+ "credentials" => {
193
+ "CompanyId" => @company,
194
+ "IntegratorLoginId" => @username,
195
+ "IntegratorPassword" => @password
196
+ }
197
+ }
198
+ return request_options
199
+ end
200
+ end
201
+ end
metadata ADDED
@@ -0,0 +1,59 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: connect-stoopid
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.3
5
+ platform: ruby
6
+ authors:
7
+ - Josh Stump
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-09-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: savon
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: 2.2.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 2.2.0
27
+ description: Simple Ruby client handling access to the ConnectWise SOAP APIs
28
+ email: websupport@bytesofknowledge.com
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - ./lib/connect-stoopid.rb
34
+ - ./lib/connect-stoopid/reporting-client.rb
35
+ homepage: https://github.com/bytesofknowledge/connect-stoopid
36
+ licenses:
37
+ - GPL-2
38
+ metadata: {}
39
+ post_install_message:
40
+ rdoc_options: []
41
+ require_paths:
42
+ - lib
43
+ required_ruby_version: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ required_rubygems_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ! '>='
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ requirements: []
54
+ rubyforge_project:
55
+ rubygems_version: 2.0.6
56
+ signing_key:
57
+ specification_version: 4
58
+ summary: Run queries against the ConnectWise Reporting SOAP API
59
+ test_files: []