vng 0.1.0 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5db1598d18b48ee1c31a7e367c907bc8ba6c224623dc0590d573889812f27322
4
- data.tar.gz: 3384c1b42509e05a31c85b5335792c9796a9e20bb4985a0ecb0879d7c8f031c5
3
+ metadata.gz: 3cff4f73336138d9e2386b1273fd4e398c8d3e8e9c52fb60ba4f47fb7b98e3bf
4
+ data.tar.gz: 6dbfa0fdad71e5fe35b113071e451a27e0150cde5ccffc7bc0676f191d433486
5
5
  SHA512:
6
- metadata.gz: c9b6bdd93b8627c1512915dd353a08485047356a7cb7835c7a55dc587ce6eb27193fb4404dad08918e5e291cf22cd1380acf6544279a198eb593305232501f80
7
- data.tar.gz: 115ff16da1a5d29c4fb3a39404da2123332021df2d8bc1b809ce42126483010c4215c1030d1361120bea9943ee0c4e96eca8f0175f3b09e3b95f001d73bc8260
6
+ metadata.gz: d76586e4271dc06bfe12ab3784f9534373f82e1953084c012ca79522ffbad4744486f55f66076b735bcafe7bddddc1465ef624f2af001aa0c183106a4403f0c4
7
+ data.tar.gz: 5bb9df92265cf90e2e10a88efc2e5cbd4de6d0b4e80e38dc2faf597780ea9b759e951fe331ae453db38253df4c93a58bd04d8a6c299318f475a5c04f6b5d08c1
data/CHANGELOG.md CHANGED
@@ -1,5 +1,57 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.1.13] - 2024-11-15
4
+
5
+ - Enable Vng.configuration.security_token
6
+
7
+ ## [0.1.12] - 2024-11-15
8
+
9
+ - Adds ServiceType.where(zip:)
10
+
11
+ ## [0.1.11] - 2024-11-15
12
+
13
+ - Adds Zip
14
+
15
+ ## [0.1.10] - 2024-11-14
16
+
17
+ - Adds Service Type
18
+
19
+ ## [0.1.9] - 2024-11-13
20
+
21
+ - Adds Franchise
22
+
23
+ ## [0.1.8] - 2024-11-13
24
+
25
+ - Adds Security Token
26
+
27
+ ## [0.1.7] - 2024-11-12
28
+
29
+ - Adds Case
30
+
31
+ ## [0.1.6] - 2024-11-12
32
+
33
+ - Adds WorkOrder
34
+
35
+ ## [0.1.5] - 2024-11-11
36
+
37
+ - Adds Availability
38
+
39
+ ## [0.1.4] - 2024-11-11
40
+
41
+ - Adds Price Item
42
+
43
+ ## [0.1.3] - 2024-11-10
44
+
45
+ - Adds Location
46
+
47
+ ## [0.1.2] - 2024-11-10
48
+
49
+ - Adds Breed
50
+
51
+ ## [0.1.1] - 2024-11-10
52
+
53
+ - Adds Lead.create, Lead#destroy, Contact.create, Contact#destroy
54
+
3
55
  ## [0.1.0] - 2024-11-10
4
56
 
5
57
  - Initial release
data/README.md CHANGED
@@ -1,3 +1,115 @@
1
- # Vng
1
+ Vng - a Ruby client for the Vonigo API
2
+ ======================================================
2
3
 
3
- A Ruby API Client for the Vonigo API
4
+ Vng helps you write apps that need to interact with Vonigo.
5
+
6
+ The **source code** is available on [GitHub](https://github.com/HouseAccountEng/vng) and the **documentation** on [RubyDoc](http://www.rubydoc.info/gems/vng/frames).
7
+
8
+ After [registering your app](#configuring-your-app), you can run commands like:
9
+
10
+ ```ruby
11
+ Vng::Zip.all
12
+ Vng::Franchise.all
13
+ Vng::ServiceType.where zip:
14
+ Vng::SecurityToken.create host:, usename:, password:
15
+ Vng::Lead.create email:, phone:, name: full_name
16
+ Vng::Contact.create first_name:, last_name:, email:, phone:, client_id:
17
+ Vng::Location.create address:, city:, zip:, state: state, client_id:
18
+ Vng::Breed.all
19
+ Vng::Asset.create name:, weight:, breed_option_id:, client_id:
20
+ Vng::PriceItem.where location_id:, asset_id:
21
+ Vng::Availability.where(location_id:, duration:, from_time:, to_time:
22
+ Vng::Lock.create date:, duration: location_id:
23
+ Vng::WorkOrder.create lock_id:, client_id:, contact_id:, location_id:, duration:, summary:, line_items:
24
+ Vng::Case.create client_id:, summary:, comments:
25
+ ```
26
+
27
+ The **full documentation** is available at [rubydoc.info](http://www.rubydoc.info/gems/vng/frames).
28
+
29
+ How to install
30
+ ==============
31
+
32
+ To install on your system, run
33
+
34
+ gem install vng
35
+
36
+ To use inside a bundled Ruby project, add this line to the Gemfile:
37
+
38
+ gem 'vng', '~> 0.1.13'
39
+
40
+ Since the gem follows [Semantic Versioning](http://semver.org),
41
+ indicating the full version in your Gemfile (~> *major*.*minor*.*patch*)
42
+ guarantees that your project won’t occur in any error when you `bundle update`
43
+ and a new version of Vng is released.
44
+
45
+ Available resources
46
+ ===================
47
+
48
+ Vng::Zip
49
+ -------
50
+
51
+ TODO
52
+
53
+
54
+ Configuring your app
55
+ ====================
56
+
57
+ In order to use Vng you must have credentials to the [Vonigo](https://www.vonigo.com/) API.
58
+
59
+ Add them to your code with the following snippet of code (replacing with your own credentials):
60
+
61
+ ```ruby
62
+ Vng.configure do |config|
63
+ config.host = 'subdomain.vonigo.com'
64
+ config.username = 'VonigoUser'
65
+ config.password = 'VonigoPassword'
66
+ end
67
+ ```
68
+
69
+ Configuring with environment variables
70
+ --------------------------------------
71
+
72
+ As an alternative to the approach above, you can configure your app with
73
+ variables. Setting the following environment variables:
74
+
75
+ ```bash
76
+ export VNG_HOST="subdomain.vonigo.com"
77
+ export VNG_USERNAME="VonigoUser"
78
+ export VNG_PASSWORD="VonigoPassword"
79
+ ```
80
+
81
+ is equivalent to the previous approach so pick the one you prefer.
82
+ If a variable is set in both places, then `Vng.configure` takes precedence.
83
+
84
+ How to test
85
+ ===========
86
+
87
+ To run tests:
88
+
89
+ ```bash
90
+ rspec
91
+ ```
92
+
93
+ How to release new versions
94
+ ===========================
95
+
96
+ If you are a manager of this project, remember to upgrade the [Vng gem](http://rubygems.org/gems/vng)
97
+ whenever a new feature is added or a bug gets fixed.
98
+ Make sure all the tests are passing ,
99
+ document the changes in CHANGELOG.md and README.md, bump the version, then run
100
+
101
+ rake release
102
+
103
+ Remember that the vng gem follows [Semantic Versioning](http://semver.org).
104
+ Any new release that is fully backward-compatible should bump the *patch* version (0.0.x).
105
+ Any new version that breaks compatibility should bump the *minor* version (0.x.0)
106
+
107
+ How to contribute
108
+ =================
109
+
110
+ Vng needs your support!
111
+ The goal of Vng is to provide a Ruby interface for all the methods exposed by the Vonigo API.
112
+
113
+ If you find that a method is missing, fork the project, add the missing code,
114
+ write the appropriate tests, then submit a pull request, and it will gladly
115
+ be merged!
data/Rakefile CHANGED
@@ -1,7 +1,5 @@
1
- # frozen_string_literal: true
2
-
3
- require "bundler/gem_tasks"
4
- require "rspec/core/rake_task"
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
5
3
 
6
4
  RSpec::Core::RakeTask.new(:spec)
7
5
 
data/lib/vng/asset.rb ADDED
@@ -0,0 +1,62 @@
1
+ module Vng
2
+ # Provides methods to interact with Vonigo assets.
3
+ class Asset
4
+ attr_reader :id
5
+
6
+ def initialize(id:)
7
+ @id = id
8
+ end
9
+
10
+ def self.create(name:, weight:, breed_option_id:, client_id:)
11
+ body = {
12
+ securityToken: Vng.configuration.security_token,
13
+ method: '3',
14
+ clientID: client_id,
15
+ Fields: [
16
+ {fieldID: 1013, fieldValue: name},
17
+ {fieldID: 1017, fieldValue: weight},
18
+ {fieldID: 1014, optionID: breed_option_id},
19
+ ]
20
+ }
21
+
22
+ uri = URI::HTTPS.build host: 'aussiepetmobileusatraining2.vonigo.com', path: '/api/v1/data/Assets/'
23
+
24
+ request = Net::HTTP::Post.new(uri.request_uri)
25
+ request.initialize_http_header 'Content-Type' => 'application/json'
26
+ request.body = body.to_json
27
+
28
+ response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
29
+ http.request request
30
+ end
31
+
32
+ # curl = 'curl'.tap do |curl|
33
+ # curl << ' -X POST'
34
+ # request.each_header{|k, v| curl << %Q{ -H "#{k}: #{v}"}}
35
+ # curl << %Q{ -d '#{request.body}'} if request.body
36
+ # curl << %Q{ "#{uri.to_s}"}
37
+ # end
38
+ # puts curl
39
+
40
+ new id: JSON(response.body)['Asset']['objectID']
41
+ end
42
+
43
+ def destroy
44
+ body = {
45
+ securityToken: Vng.configuration.security_token,
46
+ method: '4',
47
+ objectID: id,
48
+ }
49
+
50
+ uri = URI::HTTPS.build host: 'aussiepetmobileusatraining2.vonigo.com', path: '/api/v1/data/Assets/'
51
+
52
+ request = Net::HTTP::Post.new(uri.request_uri)
53
+ request.initialize_http_header 'Content-Type' => 'application/json'
54
+ request.body = body.to_json
55
+
56
+ response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
57
+ http.request request
58
+ end
59
+ end
60
+ end
61
+ end
62
+
@@ -0,0 +1,42 @@
1
+ module Vng
2
+ # Provides methods to interact with Vonigo availabilities.
3
+ class Availability
4
+ attr_reader :route_id, :date, :minutes
5
+
6
+ def initialize(route_id:, date:, minutes:)
7
+ @route_id = route_id
8
+ @date = date
9
+ @minutes = minutes
10
+ end
11
+
12
+ def self.where(location_id:, duration:, from_time:, to_time:)
13
+ body = {
14
+ securityToken: Vng.configuration.security_token,
15
+ method: '0',
16
+ serviceTypeID: '14', # only return items of serviceType 'Pet Grooming'
17
+ locationID: location_id,
18
+ duration: duration.to_i,
19
+ dateStart: from_time.to_i,
20
+ dateEnd: to_time.to_i,
21
+ }
22
+
23
+ uri = URI::HTTPS.build host: 'aussiepetmobileusatraining2.vonigo.com', path: '/api/v1/resources/availability/'
24
+
25
+ request = Net::HTTP::Post.new(uri.request_uri)
26
+ request.initialize_http_header 'Content-Type' => 'application/json'
27
+ request.body = body.to_json
28
+
29
+ response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
30
+ http.request request
31
+ end
32
+
33
+ JSON(response.body)['Availability'].map do |body|
34
+ route_id = body['routeID']
35
+ date = Date.strptime body['dayID'], '%Y%m%d'
36
+ minutes = body['startTime'].to_i
37
+
38
+ new route_id: route_id, date: date, minutes: minutes
39
+ end
40
+ end
41
+ end
42
+ end
data/lib/vng/breed.rb ADDED
@@ -0,0 +1,43 @@
1
+ module Vng
2
+ # Provides methods to interact with Vonigo breeds.
3
+ class Breed
4
+ attr_reader :id, :name, :species, :option_id, :low_weight, :high_weight
5
+
6
+ def initialize(id:, name:, species:, option_id:, low_weight:, high_weight:)
7
+ @id = id
8
+ @name = name
9
+ @species = species
10
+ @option_id = option_id
11
+ @low_weight = low_weight
12
+ @high_weight = high_weight
13
+ end
14
+
15
+ # TODO: Needs pagination
16
+ def self.all
17
+ body = {
18
+ securityToken: Vng.configuration.security_token,
19
+ }
20
+
21
+ uri = URI::HTTPS.build host: 'aussiepetmobileusatraining2.vonigo.com', path: '/api/v1/resources/breeds/'
22
+
23
+ request = Net::HTTP::Post.new(uri.request_uri)
24
+ request.initialize_http_header 'Content-Type' => 'application/json'
25
+ request.body = body.to_json
26
+
27
+ response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
28
+ http.request request
29
+ end
30
+
31
+ JSON(response.body)['Breeds'].map do |body|
32
+ id = body['breedID']
33
+ name = body['breed']
34
+ species = body['species']
35
+ option_id = body['optionID']
36
+ low_weight = body['breedLowWeight']
37
+ high_weight = body['breedHighWeight']
38
+
39
+ new id: id, name: name, species: species, option_id: option_id, low_weight: low_weight, high_weight: high_weight
40
+ end
41
+ end
42
+ end
43
+ end
data/lib/vng/case.rb ADDED
@@ -0,0 +1,54 @@
1
+ module Vng
2
+ # Provides methods to interact with Vonigo cases.
3
+ class Case
4
+ attr_reader :id
5
+
6
+ def initialize(id:)
7
+ @id = id
8
+ end
9
+
10
+ def self.create(client_id:, summary:, comments:)
11
+ body = {
12
+ securityToken: Vng.configuration.security_token,
13
+ method: '3',
14
+ objectID: client_id,
15
+ Fields: [
16
+ {fieldID: 219, optionID: 239}, # Status: open
17
+ {fieldID: 220, fieldValue: summary},
18
+ {fieldID: 230, fieldValue: comments},
19
+ ]
20
+ }
21
+
22
+ uri = URI::HTTPS.build host: 'aussiepetmobileusatraining2.vonigo.com', path: '/api/v1/data/Cases/'
23
+
24
+ request = Net::HTTP::Post.new(uri.request_uri)
25
+ request.initialize_http_header 'Content-Type' => 'application/json'
26
+ request.body = body.to_json
27
+
28
+ response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
29
+ http.request request
30
+ end
31
+
32
+ new id: JSON(response.body)['Case']['objectID']
33
+ end
34
+
35
+ def destroy
36
+ body = {
37
+ securityToken: Vng.configuration.security_token,
38
+ method: '4',
39
+ objectID: id,
40
+ }
41
+
42
+ uri = URI::HTTPS.build host: 'aussiepetmobileusatraining2.vonigo.com', path: '/api/v1/data/Cases/'
43
+
44
+ request = Net::HTTP::Post.new(uri.request_uri)
45
+ request.initialize_http_header 'Content-Type' => 'application/json'
46
+ request.body = body.to_json
47
+
48
+ response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
49
+ http.request request
50
+ end
51
+ end
52
+ end
53
+ end
54
+
data/lib/vng/config.rb ADDED
@@ -0,0 +1,45 @@
1
+ require 'vng/configuration'
2
+
3
+ # An object-oriented Ruby client for Voonigo.
4
+ # @see http://www.rubydoc.info/gems/vng/
5
+ module Vng
6
+ # Provides methods to read and write global configuration settings.
7
+ #
8
+ # A typical usage is to set the Security Token for the API calls.
9
+ #
10
+ # @example Set the Security Token for the API client:
11
+ # Vng.configure do |config|
12
+ # config.security_token = 'ABCDEFGHIJ1234567890'
13
+ # end
14
+ #
15
+ module Config
16
+ # Yields the global configuration to the given block.
17
+ #
18
+ # @example
19
+ # Vng.configure do |config|
20
+ # config.security_token = 'ABCDEFGHIJ1234567890'
21
+ # end
22
+ #
23
+ # @yield [Vng::Models::Configuration] The global configuration.
24
+ def configure
25
+ yield configuration if block_given?
26
+ end
27
+
28
+ # Returns the global {Vng::Models::Configuration} object.
29
+ #
30
+ # While this method _can_ be used to read and write configuration settings,
31
+ # it is easier to use {Vng::Config#configure} Vng.configure}.
32
+ #
33
+ # @example
34
+ # Vng.configuration.security_token = 'ABCDEFGHIJ1234567890'
35
+ #
36
+ # @return [Vng::Models::Configuration] The global configuration.
37
+ def configuration
38
+ @configuration ||= Vng::Configuration.new
39
+ end
40
+ end
41
+
42
+ # @note Config is the only module auto-loaded in the Vng module,
43
+ # in order to have a syntax as easy as Vng.configure
44
+ extend Config
45
+ end
@@ -0,0 +1,51 @@
1
+ module Vng
2
+ # Provides an object to store global configuration settings.
3
+ #
4
+ # This class is typically not used directly, but by calling
5
+ # {Vng::Config#configure Vng.configure}, which creates and updates a single
6
+ # instance of {Vng::Models::Configuration}.
7
+ #
8
+ # @example Set the Security Token for the API client:
9
+ # Vng.configure do |config|
10
+ # config.security_token = 'ABCDEFGHIJ1234567890'
11
+ # end
12
+ #
13
+ # @see Vng::Config for more examples.
14
+ #
15
+ # An alternative way to set global configuration settings is by storing
16
+ # them in the following environment variables:
17
+ #
18
+ # * +VNG_HOST+ to store the host for the Vonigo API
19
+ # * +VNG_USERNAME+ to store the username for the Vonigo API
20
+ # * +VNG_PASSWORD+ to store the password for the Vonigo API
21
+ #
22
+ # In case both methods are used together,
23
+ # {Vng::Config#configure Vng.configure} takes precedence.
24
+ #
25
+ # @example Set the API credentials
26
+ # ENV['VNG_HOST'] = 'subdomain.vonigo.com'
27
+ # ENV['VNG_USERNAME'] = 'VonigoUser'
28
+ # ENV['VNG_Password'] = 'VonigoPassword'
29
+ #
30
+ class Configuration
31
+ # @return [String] the Security Token for the API calls.
32
+ attr_accessor :security_token
33
+
34
+ # @return [String] the URI host for the API calls.
35
+ attr_accessor :host
36
+
37
+ # @return [String] the username for the API calls.
38
+ attr_accessor :username
39
+
40
+ # @return [String] the password for the API calls.
41
+ attr_accessor :password
42
+
43
+ # Initialize the global configuration settings, using the values of
44
+ # the specified following environment variables by default.
45
+ def initialize
46
+ @host = ENV['VNG_HOST']
47
+ @username = ENV['VNG_USERNAME']
48
+ @password = ENV['VNG_PASSWORD']
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,67 @@
1
+ module Vng
2
+ # Provides methods to interact with Vonigo contacts.
3
+ class Contact
4
+ attr_reader :id, :first_name, :last_name, :email, :phone
5
+
6
+ def initialize(id:, first_name:, last_name:, email:, phone:)
7
+ @id = id
8
+ @first_name = first_name
9
+ @last_name = last_name
10
+ @email = email
11
+ @phone = phone
12
+ end
13
+
14
+ def self.create(first_name:, last_name:, email:, phone:, client_id:)
15
+ body = {
16
+ securityToken: Vng.configuration.security_token,
17
+ method: '3',
18
+ clientID: client_id,
19
+ Fields: [
20
+ {fieldID: 127, fieldValue: first_name},
21
+ {fieldID: 128, fieldValue: last_name},
22
+ {fieldID: 97, fieldValue: email},
23
+ {fieldID: 96, fieldValue: phone},
24
+ ]
25
+ }
26
+
27
+ uri = URI::HTTPS.build host: 'aussiepetmobileusatraining2.vonigo.com', path: '/api/v1/data/Contacts/'
28
+
29
+ request = Net::HTTP::Post.new(uri.request_uri)
30
+ request.initialize_http_header 'Content-Type' => 'application/json'
31
+ request.body = body.to_json
32
+
33
+ response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
34
+ http.request request
35
+ end
36
+
37
+ body = JSON response.body
38
+
39
+ id = body['Contact']['objectID']
40
+ first_name = body['Fields'].find{|field| field['fieldID'] == 127}['fieldValue']
41
+ last_name = body['Fields'].find{|field| field['fieldID'] == 128}['fieldValue']
42
+ email = body['Fields'].find{|field| field['fieldID'] == 97}['fieldValue']
43
+ phone = body['Fields'].find{|field| field['fieldID'] == 96}['fieldValue']
44
+
45
+ new id: id, first_name: first_name, last_name: last_name, email: email, phone: phone
46
+ end
47
+
48
+ def destroy
49
+ body = {
50
+ securityToken: Vng.configuration.security_token,
51
+ method: '4',
52
+ objectID: id,
53
+ }
54
+
55
+ uri = URI::HTTPS.build host: 'aussiepetmobileusatraining2.vonigo.com', path: '/api/v1/data/Contacts/'
56
+
57
+ request = Net::HTTP::Post.new(uri.request_uri)
58
+ request.initialize_http_header 'Content-Type' => 'application/json'
59
+ request.body = body.to_json
60
+
61
+ response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
62
+ http.request request
63
+ end
64
+ end
65
+ end
66
+ end
67
+
@@ -0,0 +1,60 @@
1
+ module Vng
2
+ # Provides methods to interact with Vonigo franchises.
3
+ class Franchise
4
+ attr_reader :id, :name, :gmt_offset
5
+
6
+ def initialize(id:, name: nil, gmt_offset: nil)
7
+ @id = id
8
+ @name = name
9
+ @gmt_offset = gmt_offset
10
+ end
11
+
12
+
13
+ def self.find_by(zip:)
14
+ body = {
15
+ securityToken: Vng.configuration.security_token,
16
+ method: '1',
17
+ zip: zip,
18
+ }
19
+
20
+ uri = URI::HTTPS.build host: 'aussiepetmobileusatraining2.vonigo.com', path: '/api/v1/resources/availability/'
21
+
22
+ request = Net::HTTP::Post.new(uri.request_uri)
23
+ request.initialize_http_header 'Content-Type' => 'application/json'
24
+ request.body = body.to_json
25
+
26
+ response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
27
+ http.request request
28
+ end
29
+
30
+ franchise_id = JSON(response.body)['Ids']['franchiseID']
31
+ new(id: franchise_id) unless franchise_id == '0'
32
+ end
33
+
34
+ def self.all
35
+ body = {
36
+ securityToken: Vng.configuration.security_token,
37
+ }
38
+
39
+ uri = URI::HTTPS.build host: 'aussiepetmobileusatraining2.vonigo.com', path: '/api/v1/resources/franchises/'
40
+
41
+ request = Net::HTTP::Post.new(uri.request_uri)
42
+ request.initialize_http_header 'Content-Type' => 'application/json'
43
+ request.body = body.to_json
44
+
45
+ response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
46
+ http.request request
47
+ end
48
+
49
+ JSON(response.body)['Franchises'].filter do |body|
50
+ body['isActive']
51
+ end.map do |body|
52
+ id = body['franchiseID']
53
+ name = body['franchiseName']
54
+ gmt_offset = body['gmtOffsetFranchise']
55
+
56
+ new id: id, name: name, gmt_offset: gmt_offset
57
+ end
58
+ end
59
+ end
60
+ end
data/lib/vng/lead.rb ADDED
@@ -0,0 +1,72 @@
1
+ module Vng
2
+ # Provides methods to interact with Vonigo leads.
3
+ class Lead
4
+ attr_reader :id, :name, :email, :phone
5
+
6
+ def initialize(id:, name:, email:, phone:)
7
+ @id = id
8
+ @name = name
9
+ @email = email
10
+ @phone = phone
11
+ end
12
+
13
+ def self.create(name:, email:, phone:)
14
+ body = {
15
+ securityToken: Vng.configuration.security_token,
16
+ method: '3',
17
+ Fields: [
18
+ {fieldID: 121, optionID: '59'},
19
+ {fieldID: 126, fieldValue: name},
20
+ {fieldID: 238, fieldValue: email},
21
+ {fieldID: 1024, fieldValue: phone},
22
+ ]
23
+ }
24
+
25
+ uri = URI::HTTPS.build host: 'aussiepetmobileusatraining2.vonigo.com', path: '/api/v1/data/Leads/'
26
+
27
+ request = Net::HTTP::Post.new(uri.request_uri)
28
+ request.initialize_http_header 'Content-Type' => 'application/json'
29
+ request.body = body.to_json
30
+
31
+ response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
32
+ http.request request
33
+ end
34
+
35
+ body = JSON response.body
36
+
37
+ if body['errNo']
38
+ # 'errNo'=>-600,
39
+ # 'errMsg'=>'Data validation failed.',
40
+ # 'dateNow'=>'1731342482',
41
+ # 'Errors'=>[{"fieldID"=>1024, "fieldName"=>"Phone # to Reach You", "errNo"=>-602, "errMsg"=>"Field data is in incorrect format."}]}
42
+
43
+ # raise Vng::Error
44
+ end
45
+
46
+ id = body['Client']['objectID']
47
+ name = body['Fields'].find{|field| field['fieldID'] == 126}['fieldValue']
48
+ email = body['Fields'].find{|field| field['fieldID'] == 238}['fieldValue']
49
+ phone = body['Fields'].find{|field| field['fieldID'] == 1024}['fieldValue']
50
+
51
+ new id: id, name: name, email: email, phone: phone
52
+ end
53
+
54
+ def destroy
55
+ body = {
56
+ securityToken: Vng.configuration.security_token,
57
+ method: '4',
58
+ objectID: id,
59
+ }
60
+
61
+ uri = URI::HTTPS.build host: 'aussiepetmobileusatraining2.vonigo.com', path: '/api/v1/data/Leads/'
62
+
63
+ request = Net::HTTP::Post.new(uri.request_uri)
64
+ request.initialize_http_header 'Content-Type' => 'application/json'
65
+ request.body = body.to_json
66
+
67
+ response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
68
+ http.request request
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,68 @@
1
+ module Vng
2
+ # Provides methods to interact with Vonigo locations.
3
+ class Location
4
+ # TODO: fetch from /system/objects/ method: 1, objectID: 20
5
+ STATES_OPTION_ID = {
6
+ AK: 9879, AL: 9878, AR: 9877, AZ: 9880, CA: 9883, CO: 9876, CT: 9875,
7
+ DC: 9874, DE: 9873, FL: 9872, GA: 9871, HI: 9870, IA: 9869, ID: 9868,
8
+ IL: 9867, IN: 9866, KS: 9865, KY: 9864, LA: 9863, MA: 9862, MD: 9861,
9
+ ME: 9860, MI: 9859, MN: 9858, MO: 9857, MS: 9856, MT: 9855, NC: 9854,
10
+ ND: 9853, NE: 9852, NH: 9851, NJ: 9850, NM: 9849, NV: 9829, NY: 9848,
11
+ OH: 9847, OK: 9846, OR: 9881, PA: 9845, RI: 9843, SC: 9841, SD: 9842,
12
+ TN: 9840, TX: 9839, UT: 9838, VA: 9837, VT: 9836, WA: 9882, WI: 9828,
13
+ WV: 9835, WY: 9834,
14
+ }
15
+
16
+ attr_reader :id
17
+
18
+ def initialize(id:)
19
+ @id = id
20
+ end
21
+
22
+ def self.create(address:, city:, zip:, state:, client_id:)
23
+ body = {
24
+ securityToken: Vng.configuration.security_token,
25
+ method: '3',
26
+ clientID: client_id,
27
+ Fields: [
28
+ {fieldID: 779, optionID: 9906}, # 'USA'
29
+ {fieldID: 778, optionID: STATES_OPTION_ID[state.to_sym]},
30
+ {fieldID: 776, fieldValue: city},
31
+ {fieldID: 773, fieldValue: address},
32
+ {fieldID: 775, fieldValue: zip},
33
+ ]
34
+ }
35
+
36
+ uri = URI::HTTPS.build host: 'aussiepetmobileusatraining2.vonigo.com', path: '/api/v1/data/Locations/'
37
+
38
+ request = Net::HTTP::Post.new(uri.request_uri)
39
+ request.initialize_http_header 'Content-Type' => 'application/json'
40
+ request.body = body.to_json
41
+
42
+ response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
43
+ http.request request
44
+ end
45
+
46
+ new id: JSON(response.body)['Location']['objectID']
47
+ end
48
+
49
+ def destroy
50
+ body = {
51
+ securityToken: Vng.configuration.security_token,
52
+ method: '4',
53
+ objectID: id,
54
+ }
55
+
56
+ uri = URI::HTTPS.build host: 'aussiepetmobileusatraining2.vonigo.com', path: '/api/v1/data/Locations/'
57
+
58
+ request = Net::HTTP::Post.new(uri.request_uri)
59
+ request.initialize_http_header 'Content-Type' => 'application/json'
60
+ request.body = body.to_json
61
+
62
+ response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
63
+ http.request request
64
+ end
65
+ end
66
+ end
67
+ end
68
+
data/lib/vng/lock.rb ADDED
@@ -0,0 +1,54 @@
1
+ module Vng
2
+ # Provides methods to interact with Vonigo locks.
3
+ class Lock
4
+ attr_reader :id
5
+
6
+ def initialize(id:)
7
+ @id = id
8
+ end
9
+
10
+ def self.create(duration:, location_id:, date:, minutes:, route_id:)
11
+ body = {
12
+ securityToken: Vng.configuration.security_token,
13
+ method: '2',
14
+ serviceTypeID: '14', # only create items of serviceType 'Pet Grooming'
15
+ duration: duration.to_i,
16
+ locationID: location_id,
17
+ dayID: date.strftime('%Y%m%d'),
18
+ routeID: route_id,
19
+ startTime: minutes,
20
+ }
21
+
22
+ uri = URI::HTTPS.build host: 'aussiepetmobileusatraining2.vonigo.com', path: '/api/v1/resources/availability/'
23
+
24
+ request = Net::HTTP::Post.new(uri.request_uri)
25
+ request.initialize_http_header 'Content-Type' => 'application/json'
26
+ request.body = body.to_json
27
+
28
+ response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
29
+ http.request request
30
+ end
31
+
32
+ id = JSON(response.body)['Ids']['lockID']
33
+ new id: id
34
+ end
35
+
36
+ def destroy
37
+ body = {
38
+ securityToken: Vng.configuration.security_token,
39
+ method: '4',
40
+ objectID: id,
41
+ }
42
+
43
+ uri = URI::HTTPS.build host: 'aussiepetmobileusatraining2.vonigo.com', path: '/api/v1/resources/availability/'
44
+
45
+ request = Net::HTTP::Post.new(uri.request_uri)
46
+ request.initialize_http_header 'Content-Type' => 'application/json'
47
+ request.body = body.to_json
48
+
49
+ response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
50
+ http.request request
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,51 @@
1
+ module Vng
2
+ # Provides methods to interact with Vonigo price items.
3
+ class PriceItem
4
+ attr_reader :id, :price_item, :value, :tax_id, :duration_per_unit, :service_badge, :service_category
5
+
6
+ def initialize(id:, price_item:, value:, tax_id:, duration_per_unit:, service_badge:, service_category:)
7
+ @id = id
8
+ @price_item = price_item
9
+ @value = value
10
+ @tax_id = tax_id
11
+ @duration_per_unit = duration_per_unit
12
+ @service_badge = service_badge
13
+ @service_category = service_category
14
+ end
15
+
16
+ def self.where(location_id:, asset_id:)
17
+ body = {
18
+ securityToken: Vng.configuration.security_token,
19
+ method: '2',
20
+ serviceTypeID: '14', # only return items of serviceType 'Pet Grooming'
21
+ locationID: location_id,
22
+ assetID: asset_id,
23
+ }
24
+
25
+ uri = URI::HTTPS.build host: 'aussiepetmobileusatraining2.vonigo.com', path: '/api/v1/data/priceLists/'
26
+
27
+ request = Net::HTTP::Post.new(uri.request_uri)
28
+ request.initialize_http_header 'Content-Type' => 'application/json'
29
+ request.body = body.to_json
30
+
31
+ response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
32
+ http.request request
33
+ end
34
+
35
+ JSON(response.body)['PriceItems'].filter do |body|
36
+ # TODO: body['serviceBadge'] != 'Not Offered'
37
+ body['isOnline'] && body['isActive']
38
+ end.map do |body|
39
+ id = body['priceItemID']
40
+ price_item = body['priceItem']
41
+ value = body['value']
42
+ tax_id = body['taxID']
43
+ duration_per_unit = body['durationPerUnit']
44
+ service_badge = body['serviceBadge']
45
+ service_category = body['serviceCategory']
46
+
47
+ new id: id, price_item: price_item, value: value, tax_id: tax_id, duration_per_unit: duration_per_unit, service_badge: service_badge, service_category: service_category
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,51 @@
1
+ module Vng
2
+ # Provides methods to interact with Vonigo work security tokens.
3
+ class SecurityToken
4
+ attr_reader :token
5
+
6
+ def initialize(token:, host:)
7
+ @token = token
8
+ @host = host
9
+ end
10
+
11
+ def self.create(host:, username:, password:)
12
+ body = {
13
+ app_version: '1',
14
+ company: 'Vonigo',
15
+ host: host,
16
+ password: Digest::MD5.hexdigest(password),
17
+ username: username,
18
+ }
19
+
20
+ uri = URI::HTTPS.build host: host, path: '/api/v1/security/login/'
21
+
22
+ request = Net::HTTP::Get.new(uri.request_uri)
23
+ request.initialize_http_header 'Content-Type' => 'application/json; charset=utf-8'
24
+ request.body = body.to_json
25
+
26
+ response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
27
+ http.request request
28
+ end
29
+
30
+ token = JSON(response.body)['securityToken']
31
+
32
+ new token: token, host: host
33
+ end
34
+
35
+ def destroy
36
+ body = {
37
+ securityToken: @token,
38
+ }
39
+
40
+ uri = URI::HTTPS.build host: @host, path: '/api/v1/security/login/'
41
+
42
+ request = Net::HTTP::Post.new(uri.request_uri)
43
+ request.initialize_http_header 'Content-Type' => 'application/json'
44
+ request.body = body.to_json
45
+
46
+ response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
47
+ http.request request
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,64 @@
1
+ module Vng
2
+ # Provides methods to interact with Vonigo service types.
3
+ class ServiceType
4
+ attr_reader :id, :type, :duration
5
+
6
+ def initialize(id:, type:, duration:)
7
+ @id = id
8
+ @type = type
9
+ @duration = duration
10
+ end
11
+
12
+ # TODO: Needs pagination
13
+ def self.all
14
+ body = {
15
+ securityToken: Vng.configuration.security_token,
16
+ }
17
+
18
+ uri = URI::HTTPS.build host: 'aussiepetmobileusatraining2.vonigo.com', path: '/api/v1/resources/serviceTypes/'
19
+
20
+ request = Net::HTTP::Post.new(uri.request_uri)
21
+ request.initialize_http_header 'Content-Type' => 'application/json'
22
+ request.body = body.to_json
23
+
24
+ response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
25
+ http.request request
26
+ end
27
+
28
+ JSON(response.body)['ServiceTypes'].map do |body|
29
+ id = body['serviceTypeID']
30
+ type = body['serviceType']
31
+ duration = body['duration']
32
+
33
+ new id: id, type: type, duration: duration
34
+ end
35
+ end
36
+
37
+ def self.where(zip:)
38
+ body = {
39
+ securityToken: Vng.configuration.security_token,
40
+ zip: zip,
41
+ }
42
+
43
+ uri = URI::HTTPS.build host: 'aussiepetmobileusatraining2.vonigo.com', path: '/api/v1/resources/serviceTypes/'
44
+
45
+ request = Net::HTTP::Post.new(uri.request_uri)
46
+ request.initialize_http_header 'Content-Type' => 'application/json'
47
+ request.body = body.to_json
48
+
49
+ response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
50
+ http.request request
51
+ end
52
+
53
+ JSON(response.body)['ServiceTypes'].filter do |body|
54
+ body['isActive']
55
+ end.map do |body|
56
+ id = body['serviceTypeID']
57
+ type = body['serviceType']
58
+ duration = body['duration']
59
+
60
+ new id: id, type: type, duration: duration
61
+ end
62
+ end
63
+ end
64
+ end
data/lib/vng/version.rb CHANGED
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  module Vng
4
- VERSION = "0.1.0"
2
+ VERSION = '0.1.13'
5
3
  end
@@ -0,0 +1,71 @@
1
+ module Vng
2
+ # Provides methods to interact with Vonigo work orders.
3
+ class WorkOrder
4
+ attr_reader :id
5
+
6
+ def initialize(id:)
7
+ @id = id
8
+ end
9
+
10
+ def self.create(lock_id:, client_id:, contact_id:, location_id:, duration:, summary:, line_items:)
11
+ charges = line_items.map do |line_item|
12
+ {
13
+ priceItemID: line_item[:price_item_id],
14
+ taxID: line_item[:tax_id],
15
+ assetID: line_item[:asset_id],
16
+ Fields: [
17
+ {fieldID: 9289, fieldValue: line_item[:description]},
18
+ {fieldID: 9287, fieldValue: line_item[:price]}
19
+ ]
20
+ }
21
+ end
22
+
23
+ body = {
24
+ securityToken: Vng.configuration.security_token,
25
+ method: '3',
26
+ serviceTypeID: '14', # only return items of serviceType 'Pet Grooming'
27
+ lockID: lock_id,
28
+ clientID: client_id,
29
+ contactID: contact_id,
30
+ locationID: location_id,
31
+ Fields: [
32
+ {fieldID: 200, fieldValue: summary},
33
+ {fieldID: 186, fieldValue: duration.to_i},
34
+ {fieldID: 201, optionID: '9537'} # label: Online Tentative
35
+ ],
36
+ Charges: charges
37
+ }
38
+
39
+ uri = URI::HTTPS.build host: 'aussiepetmobileusatraining2.vonigo.com', path: '/api/v1/data/WorkOrders/'
40
+
41
+ request = Net::HTTP::Post.new(uri.request_uri)
42
+ request.initialize_http_header 'Content-Type' => 'application/json'
43
+ request.body = body.to_json
44
+
45
+ response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
46
+ http.request request
47
+ end
48
+
49
+ id = JSON(response.body)['WorkOrder']['objectID']
50
+ new id: id
51
+ end
52
+
53
+ def destroy
54
+ body = {
55
+ securityToken: Vng.configuration.security_token,
56
+ method: '4',
57
+ objectID: id,
58
+ }
59
+
60
+ uri = URI::HTTPS.build host: 'aussiepetmobileusatraining2.vonigo.com', path: '/api/v1/data/WorkOrders/'
61
+
62
+ request = Net::HTTP::Post.new(uri.request_uri)
63
+ request.initialize_http_header 'Content-Type' => 'application/json'
64
+ request.body = body.to_json
65
+
66
+ response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
67
+ http.request request
68
+ end
69
+ end
70
+ end
71
+ end
data/lib/vng/zip.rb ADDED
@@ -0,0 +1,37 @@
1
+ module Vng
2
+ # Provides methods to interact with Vonigo ZIP codes.
3
+ class Zip
4
+ attr_reader :zip, :state, :zone_name
5
+
6
+ def initialize(zip:, state:, zone_name:)
7
+ @zip = zip
8
+ @state = state
9
+ @zone_name = zone_name
10
+ end
11
+
12
+ # TODO: Needs pagination
13
+ def self.all
14
+ body = {
15
+ securityToken: Vng.configuration.security_token,
16
+ }
17
+
18
+ uri = URI::HTTPS.build host: 'aussiepetmobileusatraining2.vonigo.com', path: '/api/v1/resources/zips/'
19
+
20
+ request = Net::HTTP::Post.new(uri.request_uri)
21
+ request.initialize_http_header 'Content-Type' => 'application/json'
22
+ request.body = body.to_json
23
+
24
+ response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
25
+ http.request request
26
+ end
27
+
28
+ JSON(response.body)['Zips'].map do |body|
29
+ zip = body['zip']
30
+ state = body['state']
31
+ zone_name = body['zoneName']
32
+
33
+ new zip: zip, state: state, zone_name: zone_name
34
+ end
35
+ end
36
+ end
37
+ end
data/lib/vng.rb CHANGED
@@ -1,6 +1,25 @@
1
- # frozen_string_literal: true
1
+ require 'date'
2
+ require 'digest/md5'
3
+ require 'json'
4
+ require 'net/http'
5
+ require 'uri'
2
6
 
3
- require_relative "vng/version"
7
+ require_relative 'vng/asset'
8
+ require_relative 'vng/availability'
9
+ require_relative 'vng/breed'
10
+ require_relative 'vng/case'
11
+ require_relative 'vng/config'
12
+ require_relative 'vng/contact'
13
+ require_relative 'vng/franchise'
14
+ require_relative 'vng/lead'
15
+ require_relative 'vng/location'
16
+ require_relative 'vng/lock'
17
+ require_relative 'vng/price_item'
18
+ require_relative 'vng/security_token'
19
+ require_relative 'vng/service_type'
20
+ require_relative 'vng/version'
21
+ require_relative 'vng/work_order'
22
+ require_relative 'vng/zip'
4
23
 
5
24
  module Vng
6
25
  class Error < StandardError; end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vng
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - claudiob
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-11-10 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2024-11-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: simplecov
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  description: A Ruby client for the Vonigo API.
14
28
  email:
15
29
  - claudiob@users.noreply.github.com
@@ -23,12 +37,28 @@ files:
23
37
  - README.md
24
38
  - Rakefile
25
39
  - lib/vng.rb
40
+ - lib/vng/asset.rb
41
+ - lib/vng/availability.rb
42
+ - lib/vng/breed.rb
43
+ - lib/vng/case.rb
44
+ - lib/vng/config.rb
45
+ - lib/vng/configuration.rb
46
+ - lib/vng/contact.rb
47
+ - lib/vng/franchise.rb
48
+ - lib/vng/lead.rb
49
+ - lib/vng/location.rb
50
+ - lib/vng/lock.rb
51
+ - lib/vng/price_item.rb
52
+ - lib/vng/security_token.rb
53
+ - lib/vng/service_type.rb
26
54
  - lib/vng/version.rb
27
- homepage: https://github.com/HouseAccountEng/vng
55
+ - lib/vng/work_order.rb
56
+ - lib/vng/zip.rb
57
+ homepage: https://rubygems.org/gems/vng
28
58
  licenses:
29
59
  - MIT
30
60
  metadata:
31
- homepage_uri: https://github.com/HouseAccountEng/vng
61
+ homepage_uri: https://rubygems.org/gems/vng
32
62
  source_code_uri: https://github.com/HouseAccountEng/vng
33
63
  changelog_uri: https://github.com/HouseAccountEng/vng/blob/main/CHANGELOG.md
34
64
  post_install_message: