zaikio-procurement 0.1.0
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 +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +140 -0
- data/Rakefile +37 -0
- data/lib/zaikio/procurement/article.rb +35 -0
- data/lib/zaikio/procurement/authorization_middleware.rb +30 -0
- data/lib/zaikio/procurement/base.rb +7 -0
- data/lib/zaikio/procurement/configuration.rb +49 -0
- data/lib/zaikio/procurement/contract.rb +17 -0
- data/lib/zaikio/procurement/contract_request.rb +19 -0
- data/lib/zaikio/procurement/current_supplier.rb +17 -0
- data/lib/zaikio/procurement/delivery.rb +18 -0
- data/lib/zaikio/procurement/delivery_line_item.rb +17 -0
- data/lib/zaikio/procurement/invoice.rb +8 -0
- data/lib/zaikio/procurement/material_requirement.rb +19 -0
- data/lib/zaikio/procurement/order.rb +25 -0
- data/lib/zaikio/procurement/order_line_item.rb +19 -0
- data/lib/zaikio/procurement/price.rb +18 -0
- data/lib/zaikio/procurement/sales_group.rb +11 -0
- data/lib/zaikio/procurement/sales_group_membership.rb +11 -0
- data/lib/zaikio/procurement/sku.rb +28 -0
- data/lib/zaikio/procurement/substrate_search.rb +38 -0
- data/lib/zaikio/procurement/supplier.rb +54 -0
- data/lib/zaikio/procurement/variant.rb +47 -0
- data/lib/zaikio/procurement/version.rb +5 -0
- data/lib/zaikio/procurement.rb +64 -0
- metadata +155 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: f50427e350fe6e3c2a06efb244a9fef456e8ab840acf5c3d49384d0e242413b5
|
|
4
|
+
data.tar.gz: bb0358367208742ff48cd09762dc5187301d45e76a50f43015ba8a4a5606c99d
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 5dd46c3947dc8be40214939fd975306ff6578b94a5e22dc4aa93a649a97354d9b4f0939aabd7e0bb15441f44438e8756d05e9e6b4a75404732a57a3c2315693b
|
|
7
|
+
data.tar.gz: e1ec9997f5c0545d6211612b08fa91553369cb73ba792ec0f9318639c1ac569041e5a4464ee721bcc36bd38a92f66592e416ea239e3137828c3d7b362cb0a36f
|
data/MIT-LICENSE
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Copyright 2020 Zaikio GmbH
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
4
|
+
a copy of this software and associated documentation files (the
|
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
9
|
+
the following conditions:
|
|
10
|
+
|
|
11
|
+
The above copyright notice and this permission notice shall be
|
|
12
|
+
included in all copies or substantial portions of the Software.
|
|
13
|
+
|
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# Zaikio::Procurement
|
|
2
|
+
|
|
3
|
+
Ruby API Client for Zaikio's Procurement Platform.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
### 1. Add this line to your application's Gemfile:
|
|
8
|
+
|
|
9
|
+
```ruby
|
|
10
|
+
gem 'zaikio-procurement'
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
And then execute:
|
|
14
|
+
```bash
|
|
15
|
+
$ bundle
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Or install it yourself as:
|
|
19
|
+
```bash
|
|
20
|
+
$ gem install zaikio-procurement
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### 2. Configure the gem:
|
|
24
|
+
|
|
25
|
+
```rb
|
|
26
|
+
# config/initializers/zaikio_procurement.rb
|
|
27
|
+
|
|
28
|
+
Zaikio::Procurement.configure do |config|
|
|
29
|
+
config.environment = :production # sandbox or production
|
|
30
|
+
end
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
## Usage
|
|
35
|
+
|
|
36
|
+
The Procurement Client has an ORM like design.
|
|
37
|
+
|
|
38
|
+
For the requests to work, a valid JSON Web token with the correct OAuth Scopes must always be provided. Please refer to [zakio-oauth_client](https://github.com/zaikio/zaikio-oauth_client).
|
|
39
|
+
|
|
40
|
+
If you want to know which actions are available and which scopes are required, please refer to the [Procurement Consumer API Reference](https://docs.zaikio.com/api/procurement_consumers/procurement.html).
|
|
41
|
+
|
|
42
|
+
### As an organization
|
|
43
|
+
|
|
44
|
+
```rb
|
|
45
|
+
token = "..." # Your valid JWT for an organization
|
|
46
|
+
Zaikio::Procurement.with_token(token) do
|
|
47
|
+
|
|
48
|
+
# Fetch Data
|
|
49
|
+
Zaikio::Procurement::Article.all
|
|
50
|
+
Zaikio::Procurement::Article.find("7cbf51bd-35a8-47a1-84a2-57aa63140234")
|
|
51
|
+
Zaikio::Procurement::Article.list_by_article_type_or_supplier_slug("great_paper_company")
|
|
52
|
+
|
|
53
|
+
# Associations
|
|
54
|
+
article = Zaikio::Procurement::Article.find("7cbf51bd-35a8-47a1-84a2-57aa63140234")
|
|
55
|
+
article.supplier
|
|
56
|
+
article.variants
|
|
57
|
+
|
|
58
|
+
# Search for all variants of a substrate
|
|
59
|
+
search = Zaikio::Procurement::SubstrateSearch.new("Magno", grain: "long", paper_weight: 80)
|
|
60
|
+
|
|
61
|
+
# or by providing a supplier_id to search for all variants of a substrate of from a specific supplier
|
|
62
|
+
search = Zaikio::Procurement::SubstrateSearch.new("Magno", grain: "long", paper_weight: 80, supplier_id: "b5b14aa0-ae84-452b-9719-a38545365902")
|
|
63
|
+
|
|
64
|
+
search.results # Returns a list of matching variants
|
|
65
|
+
search.facets # Returns a list of search facets that can be used to further narrow down the results
|
|
66
|
+
|
|
67
|
+
# https://docs.zaikio.com/api/procurement_consumers/procurement.html#/LineItemSuggestions/post_variants__variant_id__line_item_suggestions
|
|
68
|
+
variant = Zaikio::Procurement::Variant.find("845a4d7e-db5a-46a6-9d30-bf2e884cb393")
|
|
69
|
+
variant.line_item_suggestion(amount: 10, unit: "sheet") # Returns a line item suggestion for a specifc variant
|
|
70
|
+
|
|
71
|
+
# https://docs.zaikio.com/api/procurement_consumers/procurement.html#/LineItemSuggestions/post_suppliers__supplier_id__line_item_suggestions
|
|
72
|
+
supplier = Zaikio::Procurement::Supplier.find("b5b14aa0-ae84-452b-9719-a38545365902")
|
|
73
|
+
supplier.line_item_suggestions(
|
|
74
|
+
variants: [
|
|
75
|
+
{
|
|
76
|
+
id: "0001b94e-4e87-4ee9-8b14-6ff9910b4f26",
|
|
77
|
+
amount: 2000,
|
|
78
|
+
exact_amount: false,
|
|
79
|
+
environmental_certification: "FSC Mix Credit",
|
|
80
|
+
unit: "sheet"
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
id: "10236394-ecd4-465b-ab72-0fbd79296e6a",
|
|
84
|
+
amount: 10,
|
|
85
|
+
exact_amount: false,
|
|
86
|
+
environmental_certification: "PEFC 100%",
|
|
87
|
+
unit: "sheet"
|
|
88
|
+
}
|
|
89
|
+
]
|
|
90
|
+
) # Returns line item suggestions for multiple variants of a supplier
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
# Create new resources
|
|
94
|
+
Zaikio::Procurement::Order.create(
|
|
95
|
+
contract_id: "fd677fc7-abd9-460c-b086-34de1a8349e8",
|
|
96
|
+
delivery_mode: "complete",
|
|
97
|
+
exclusive_sales_group_id: "42dcbaf6-e557-4423-96bc-707ebbc223c0",
|
|
98
|
+
references: ["CO/XXXXXX"],
|
|
99
|
+
state_event: "place",
|
|
100
|
+
deliveries_attributes: [
|
|
101
|
+
{
|
|
102
|
+
address_addressee: "Joey’s Print Ltd",
|
|
103
|
+
address_text: "Emmerich-Josef-Straße 1A, 55116 Mainz",
|
|
104
|
+
desired_delivery_date: "2021-01-29",
|
|
105
|
+
references: ["D/XXXXXX"]
|
|
106
|
+
}
|
|
107
|
+
],
|
|
108
|
+
order_line_items_attributes: [
|
|
109
|
+
{
|
|
110
|
+
sku_id: "26b3aadc-928f-4d1a-ba2d-13ac3c8f523d",
|
|
111
|
+
amount: 108000
|
|
112
|
+
}
|
|
113
|
+
]
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
order = Zaikio::Procurement::Order.find("86b4a0c5-6d54-4702-a059-da258643f260")
|
|
117
|
+
order.order_line_items.create(sku_id: "6535eeb0-45c2-4c63-8cb9-4814562bb875", amount: 68000)
|
|
118
|
+
|
|
119
|
+
# Update resources
|
|
120
|
+
line_item = Zaikio::Procurement::OrderLineItem.find("058a5513-925e-4d0c-923d-fa1ed4bfb3ce")
|
|
121
|
+
line_item.update(amount: 69000)
|
|
122
|
+
|
|
123
|
+
# Deleting resources
|
|
124
|
+
line_item = Zaikio::Procurement::OrderLineItem.find("2f5a99c2-9734-4aac-9cee-911b061d3a5a")
|
|
125
|
+
line_item.destroy
|
|
126
|
+
end
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Error Handling
|
|
130
|
+
|
|
131
|
+
If an unexpected error occurs with an API call (i.e. an error that has no status code `2xx`, `404` or `422`) then a `Zaikio::ConnectionError` is thrown automatically (for `404` there will be a `Zaikio::ResourceNotFound`).
|
|
132
|
+
|
|
133
|
+
This can be easily caught using the `with_fallback` method. We recommend to always work with fallbacks.
|
|
134
|
+
|
|
135
|
+
```rb
|
|
136
|
+
Zaikio::Directory.with_token(token) do
|
|
137
|
+
Zaikio::Procurement::Article.with_fallback.find("7cbf51bd-35a8-47a1-84a2-57aa63140234") # => nil
|
|
138
|
+
Zaikio::Procurement::Article.with_fallback.all # Automatically uses empty array as fallback
|
|
139
|
+
end
|
|
140
|
+
```
|
data/Rakefile
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
begin
|
|
2
|
+
require 'bundler/setup'
|
|
3
|
+
rescue LoadError
|
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
require 'rdoc/task'
|
|
8
|
+
require 'rubocop/rake_task'
|
|
9
|
+
|
|
10
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
|
11
|
+
rdoc.rdoc_dir = 'rdoc'
|
|
12
|
+
rdoc.title = 'Zaikio::Procurement'
|
|
13
|
+
rdoc.options << '--line-numbers'
|
|
14
|
+
rdoc.rdoc_files.include('README.md')
|
|
15
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
require 'bundler/gem_tasks'
|
|
19
|
+
|
|
20
|
+
require 'rake/testtask'
|
|
21
|
+
|
|
22
|
+
Rake::TestTask.new(:test) do |t|
|
|
23
|
+
t.libs << 'test'
|
|
24
|
+
t.pattern = 'test/**/*_test.rb'
|
|
25
|
+
t.verbose = false
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
task default: :test
|
|
29
|
+
|
|
30
|
+
namespace :test do
|
|
31
|
+
desc 'Runs RuboCop on specified directories'
|
|
32
|
+
RuboCop::RakeTask.new(:rubocop) do |task|
|
|
33
|
+
task.fail_on_error = false
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
Rake::Task[:test].enhance ['test:rubocop']
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
module Zaikio
|
|
2
|
+
module Procurement
|
|
3
|
+
class Article < Base
|
|
4
|
+
include_root_in_json :article
|
|
5
|
+
|
|
6
|
+
# Class methods
|
|
7
|
+
class << self
|
|
8
|
+
# Spyke URI override
|
|
9
|
+
def uri
|
|
10
|
+
Zaikio::Procurement.configuration.flavor == :supplier ? "substrate/articles(/:id)" : "articles(/:id)"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def list_by_article_type_or_supplier_slug(type_or_slug)
|
|
14
|
+
with("#{type_or_slug}/articles").get
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def list_by_article_type_and_supplier_slug(type, slug)
|
|
18
|
+
with("#{type}/#{slug}/articles").get
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Attributes
|
|
23
|
+
attributes :name, :base_unit, :coated, :description, :finish,
|
|
24
|
+
:kind, :supplier_id, :created_at, :updated_at
|
|
25
|
+
|
|
26
|
+
# Associations
|
|
27
|
+
has_one :supplier, class_name: "Zaikio::Procurement::Supplier",
|
|
28
|
+
uri: nil
|
|
29
|
+
# Manually build variants association to work for consumers and suppliers
|
|
30
|
+
def variants
|
|
31
|
+
self.class.request(:get, "#{uri}/variants").data.collect { |v| Zaikio::Procurement::Variant.new(v) }
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require "faraday"
|
|
2
|
+
require "jwt"
|
|
3
|
+
require "concurrent"
|
|
4
|
+
|
|
5
|
+
module Zaikio
|
|
6
|
+
module Procurement
|
|
7
|
+
class AuthorizationMiddleware < Faraday::Middleware
|
|
8
|
+
def self.token
|
|
9
|
+
@token ||= Concurrent::ThreadLocalVar.new { nil }
|
|
10
|
+
@token.value
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def self.token=(value)
|
|
14
|
+
@token ||= Concurrent::ThreadLocalVar.new { nil }
|
|
15
|
+
@token.value = value
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def self.reset_token
|
|
19
|
+
self.token = nil
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def call(request_env)
|
|
23
|
+
request_env[:request_headers]["Authorization"] = "Bearer #{self.class.token}" if self.class.token
|
|
24
|
+
|
|
25
|
+
@app.call(request_env).on_complete do |response_env|
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
require "logger"
|
|
2
|
+
|
|
3
|
+
module Zaikio
|
|
4
|
+
module Procurement
|
|
5
|
+
class Configuration
|
|
6
|
+
HOSTS = {
|
|
7
|
+
development: "https://procurement.zaikio.test",
|
|
8
|
+
test: "https://procurement.zaikio.test",
|
|
9
|
+
staging: "https://procurement.staging.zaikio.com",
|
|
10
|
+
sandbox: "https://procurement.sandbox.zaikio.com",
|
|
11
|
+
production: "https://procurement.zaikio.com"
|
|
12
|
+
}.freeze
|
|
13
|
+
|
|
14
|
+
FLAVORS = %i[consumer supplier].freeze
|
|
15
|
+
|
|
16
|
+
attr_accessor :host
|
|
17
|
+
attr_reader :environment, :flavor
|
|
18
|
+
attr_writer :logger
|
|
19
|
+
|
|
20
|
+
def initialize
|
|
21
|
+
@environment = :sandbox
|
|
22
|
+
@flavor = :consumer
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def logger
|
|
26
|
+
@logger ||= Logger.new($stdout)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def environment=(env)
|
|
30
|
+
@environment = env.to_sym
|
|
31
|
+
@host = host_for(environment)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def flavor=(flavor)
|
|
35
|
+
raise StandardError.new, "Invalid Zaikio::Procurement flavor '#{flavor}'" unless FLAVORS.include?(flavor)
|
|
36
|
+
|
|
37
|
+
@flavor = flavor
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
private
|
|
41
|
+
|
|
42
|
+
def host_for(environment)
|
|
43
|
+
HOSTS.fetch(environment) do
|
|
44
|
+
raise StandardError.new, "Invalid Zaikio::Procurement environment '#{environment}'"
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module Zaikio
|
|
2
|
+
module Procurement
|
|
3
|
+
class Contract < Base
|
|
4
|
+
uri "contracts(/:id)"
|
|
5
|
+
include_root_in_json :contract
|
|
6
|
+
|
|
7
|
+
# Attributes
|
|
8
|
+
attributes :currency, :customer_number, :references, :consumer_id,
|
|
9
|
+
:consumer, :supplier_id, :created_at, :updated_at
|
|
10
|
+
|
|
11
|
+
# Associations
|
|
12
|
+
has_one :supplier, class_name: "Zaikio::Procurement::Supplier",
|
|
13
|
+
uri: nil
|
|
14
|
+
has_one :contract_request, uri: nil
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Zaikio
|
|
2
|
+
module Procurement
|
|
3
|
+
class ContractRequest < Base
|
|
4
|
+
uri "contract_requests(/:id)"
|
|
5
|
+
include_root_in_json :contract_request
|
|
6
|
+
|
|
7
|
+
# Attributes
|
|
8
|
+
attributes :accepted_at, :connectivity_checked_at, :contact_email, :contact_first_name,
|
|
9
|
+
:contact_last_name, :contact_phone, :currency, :customer_number, :declined_at,
|
|
10
|
+
:mapped_at, :references, :state, :vetted_at, :consumer_id, :consumer, :supplier_id,
|
|
11
|
+
:created_at, :updated_at
|
|
12
|
+
|
|
13
|
+
# Associations
|
|
14
|
+
belongs_to :supplier, class_name: "Zaikio::Procurement::Supplier",
|
|
15
|
+
uri: nil
|
|
16
|
+
has_one :contract, uri: nil
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module Zaikio
|
|
2
|
+
module Procurement
|
|
3
|
+
class CurrentSupplier < Base
|
|
4
|
+
self.primary_key = nil
|
|
5
|
+
uri "supplier"
|
|
6
|
+
include_root_in_json :supplier
|
|
7
|
+
|
|
8
|
+
def self.find
|
|
9
|
+
all.find_one
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.find_with_fallback(fallback)
|
|
13
|
+
all.with_fallback(fallback).find_one
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Zaikio
|
|
2
|
+
module Procurement
|
|
3
|
+
class Delivery < Base
|
|
4
|
+
uri "deliveries(/:id)"
|
|
5
|
+
include_root_in_json :delivery
|
|
6
|
+
|
|
7
|
+
# Attributes
|
|
8
|
+
attributes :confirmed_delivery_date, :desired_delivery_date, :references,
|
|
9
|
+
:address, :order_id, :created_at, :updated_at
|
|
10
|
+
|
|
11
|
+
# Associations
|
|
12
|
+
belongs_to :order, class_name: "Zaikio::Procurement::Order",
|
|
13
|
+
uri: nil
|
|
14
|
+
has_many :delivery_line_items, class_name: "Zaikio::Procurement::DeliveryLineItem",
|
|
15
|
+
uri: "deliveries/:delivery_id/delivery_line_items(/:id)"
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module Zaikio
|
|
2
|
+
module Procurement
|
|
3
|
+
class DeliveryLineItem < Base
|
|
4
|
+
uri "delivery_line_items(/:id)"
|
|
5
|
+
include_root_in_json :delivery_line_item
|
|
6
|
+
|
|
7
|
+
# Attributes
|
|
8
|
+
attributes :amount, :created_at, :updated_at
|
|
9
|
+
|
|
10
|
+
# Associations
|
|
11
|
+
belongs_to :delivery, class_name: "Zaikio::Procurement::Delivery",
|
|
12
|
+
uri: nil
|
|
13
|
+
has_one :order_line_item, class_name: "Zaikio::Procurement::OrderLineItem",
|
|
14
|
+
uri: nil
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Zaikio
|
|
2
|
+
module Procurement
|
|
3
|
+
class MaterialRequirement < Base
|
|
4
|
+
uri "material_requirements(/:id)"
|
|
5
|
+
include_root_in_json :material_requirement
|
|
6
|
+
|
|
7
|
+
# Attributes
|
|
8
|
+
attributes :amount, :anticipated_costs, :archived_at, :archived_by, :article_category, :canceled_at, :currency,
|
|
9
|
+
:description, :environmental_certification, :expected_at, :fulfilled_at, :material_required_at,
|
|
10
|
+
:ordered_at, :order_number, :person, :price, :purchaser, :price_based_on_quantity, :processed_at,
|
|
11
|
+
:references, :state, :unit, :created_at, :updated_at
|
|
12
|
+
|
|
13
|
+
# Associations
|
|
14
|
+
has_one :supplier, class_name: "Zaikio::Procurement::Supplier", uri: nil
|
|
15
|
+
has_one :variant, class_name: "Zaikio::Procurement::Variant", uri: nil
|
|
16
|
+
has_many :order_line_items, class_name: "Zaikio::Procurement::OrderLineItem", uri: nil
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Zaikio
|
|
2
|
+
module Procurement
|
|
3
|
+
class Order < Base
|
|
4
|
+
uri "orders(/:id)"
|
|
5
|
+
include_root_in_json :order
|
|
6
|
+
|
|
7
|
+
# Attributes
|
|
8
|
+
attributes :canceled_by_consumer_at, :canceled_by_supplier_at, :cancelation_requested_at, :confirmed_at,
|
|
9
|
+
:currency, :delivery_mode, :gross_total, :net_handling_fee, :net_shipping_fee, :net_total,
|
|
10
|
+
:partially_shipped_at, :partially_shipped_remainder_canceled_at, :placed_at, :producing_at,
|
|
11
|
+
:references, :shipped_at, :state, :state_reason, :taxes, :taxes_on_fees, :transfer_failed_at,
|
|
12
|
+
:transferred_at, :contract_id, :exclusive_sales_group_id, :person_id, :created_at, :updated_at
|
|
13
|
+
|
|
14
|
+
# Associations
|
|
15
|
+
has_one :contract, class_name: "Zaikio::Procurement::Contract",
|
|
16
|
+
uri: "contracts(/:id)"
|
|
17
|
+
has_one :exclusive_sales_group, class_name: "Zaikio::Procurement::SalesGroup",
|
|
18
|
+
uri: "sales_groups(/:id)"
|
|
19
|
+
has_many :order_line_items, class_name: "Zaikio::Procurement::OrderLineItem",
|
|
20
|
+
uri: "orders/:order_id/order_line_items(/:id)"
|
|
21
|
+
has_many :deliveries, class_name: "Zaikio::Procurement::Delivery",
|
|
22
|
+
uri: "orders/:order_id/deliveries(/:id)"
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Zaikio
|
|
2
|
+
module Procurement
|
|
3
|
+
class OrderLineItem < Base
|
|
4
|
+
uri "order_line_items(/:id)"
|
|
5
|
+
include_root_in_json :order_line_item
|
|
6
|
+
|
|
7
|
+
# Attributes
|
|
8
|
+
attributes :amount, :amount_in_base_unit, :base_unit, :catalog_price, :confirmed_price, :description,
|
|
9
|
+
:order_number, :tax_rate, :taxes, :total_gross_price, :total_net_price, :unit, :order_id,
|
|
10
|
+
:sku_id, :created_at, :updated_at
|
|
11
|
+
|
|
12
|
+
# Associations
|
|
13
|
+
belongs_to :order, class_name: "Zaikio::Procurement::Order",
|
|
14
|
+
uri: nil
|
|
15
|
+
has_one :sku, class_name: "Zaikio::Procurement::Sku",
|
|
16
|
+
uri: nil
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Zaikio
|
|
2
|
+
module Procurement
|
|
3
|
+
class Price < Base
|
|
4
|
+
uri "prices(/:id)"
|
|
5
|
+
include_root_in_json :price
|
|
6
|
+
|
|
7
|
+
# Attributes
|
|
8
|
+
attributes :kind, :minimum_order_quantity, :order_number, :price, :valid_from,
|
|
9
|
+
:valid_until, :sales_group_id, :sku_id, :created_at, :updated_at
|
|
10
|
+
|
|
11
|
+
# Associations
|
|
12
|
+
has_one :sku, class_name: "Zaikio::Procurement::Sku",
|
|
13
|
+
uri: nil
|
|
14
|
+
has_one :sales_group, class_name: "Zaikio::Procurement::SalesGroup",
|
|
15
|
+
uri: nil
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
module Zaikio
|
|
2
|
+
module Procurement
|
|
3
|
+
class Sku < Base
|
|
4
|
+
uri "skus(/:id)"
|
|
5
|
+
include_root_in_json :sku
|
|
6
|
+
|
|
7
|
+
# Attributes
|
|
8
|
+
attributes :amount, :amount_in_base_unit, :availability_in_days, :dimension_unit,
|
|
9
|
+
:environmental_certification, :gross_weight, :height, :length, :net_weight,
|
|
10
|
+
:order_number, :unit, :weight_unit, :width, :variant_id, :created_at, :updated_at
|
|
11
|
+
|
|
12
|
+
# Associations
|
|
13
|
+
has_many :prices, class_name: "Zaikio::Procurement::Price",
|
|
14
|
+
uri: "skus/:sku_id/prices"
|
|
15
|
+
|
|
16
|
+
# Manually build variant association to work for consumers and suppliers
|
|
17
|
+
def variant
|
|
18
|
+
path = if Zaikio::Procurement.configuration.flavor == :supplier
|
|
19
|
+
"substrate/variants/#{variant_id}"
|
|
20
|
+
else
|
|
21
|
+
"variants/#{variant_id}"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
Zaikio::Procurement::Variant.new(self.class.request(:get, path).data)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
module Zaikio
|
|
2
|
+
module Procurement
|
|
3
|
+
class SubstrateSearch
|
|
4
|
+
def initialize(query = nil, options = {})
|
|
5
|
+
@query = query
|
|
6
|
+
@supplier = options.delete(:supplier_id)
|
|
7
|
+
@options = options
|
|
8
|
+
@article_type = "substrate"
|
|
9
|
+
|
|
10
|
+
unless @options.respond_to?(:stringify_keys)
|
|
11
|
+
raise ArgumentError, "When using additional search parameters, you must pass a hash as an argument."
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
@response = Zaikio::Procurement::Base.with(path).get
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def results
|
|
18
|
+
@response.results.collect { |variant| Zaikio::Procurement::Variant.new(variant) }
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def facets
|
|
22
|
+
@response.facets
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
|
|
27
|
+
def path
|
|
28
|
+
String.new(@article_type).tap do |qp|
|
|
29
|
+
qp << "/#{@supplier}" if @supplier
|
|
30
|
+
qp << "/variants/search?"
|
|
31
|
+
qp << "query=#{@query}" if @query
|
|
32
|
+
qp << "&" if @query && @options.any?
|
|
33
|
+
qp << @options.to_query if @options
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
module Zaikio
|
|
2
|
+
module Procurement
|
|
3
|
+
class Supplier < Base
|
|
4
|
+
uri "suppliers(/:id)"
|
|
5
|
+
|
|
6
|
+
# Attributes
|
|
7
|
+
attributes :automatically_accept_contract_requests, :brand_color, :cancelation_policy, :display_name,
|
|
8
|
+
:slug, :supports_split_delivery, :created_at, :updated_at
|
|
9
|
+
|
|
10
|
+
# Associations
|
|
11
|
+
has_many :contract_requests, class_name: "Zaikio::Procurement::ContractRequest",
|
|
12
|
+
uri: "suppliers/:supplier_id/contract_requests(/:id)"
|
|
13
|
+
|
|
14
|
+
def line_item_suggestions(**attributes)
|
|
15
|
+
variants = attributes.delete(:variants)
|
|
16
|
+
|
|
17
|
+
unless variants.is_a?(Array) && variants.all?(Hash)
|
|
18
|
+
raise ArgumentError, "For variants, you must pass an Array of Hashes"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
self.class.request(
|
|
22
|
+
:post, line_item_suggestions_path, payload(attributes, variants)
|
|
23
|
+
).data.deep_symbolize_keys
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def payload(attributes, variants)
|
|
29
|
+
MultiJson.dump(
|
|
30
|
+
line_item_suggestions: {
|
|
31
|
+
exclusive_sales_group_id: attributes[:exclusive_sales_group_id],
|
|
32
|
+
variants: variant_payload(variants)
|
|
33
|
+
}.reject { |_k, v| v.blank? }
|
|
34
|
+
)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def variant_payload(variants)
|
|
38
|
+
variants.collect do |variant|
|
|
39
|
+
{
|
|
40
|
+
id: variant[:id],
|
|
41
|
+
amount: variant[:amount],
|
|
42
|
+
exact_amount: variant[:exact_amount] || false,
|
|
43
|
+
environmental_certification: variant[:environmental_certification],
|
|
44
|
+
unit: variant[:unit] || "sheet"
|
|
45
|
+
}
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def line_item_suggestions_path
|
|
50
|
+
"suppliers/#{id}/line_item_suggestions"
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
module Zaikio
|
|
2
|
+
module Procurement
|
|
3
|
+
class Variant < Base
|
|
4
|
+
include_root_in_json :variant
|
|
5
|
+
|
|
6
|
+
# Spyke URI override
|
|
7
|
+
def self.uri
|
|
8
|
+
Zaikio::Procurement.configuration.flavor == :supplier ? "substrate/variants(/:id)" : "variants(/:id)"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# Attributes
|
|
12
|
+
attributes :brightness, :category, :color, :dimensions_unit, :form, :grain, :height, :paper_weight,
|
|
13
|
+
:paper_weight_unit, :roughness, :thickness, :transparency, :unit_system, :whiteness,
|
|
14
|
+
:width, :article_id, :created_at, :updated_at
|
|
15
|
+
|
|
16
|
+
# Associations
|
|
17
|
+
has_one :article, class_name: "Zaikio::Procurement::Article",
|
|
18
|
+
uri: nil
|
|
19
|
+
has_many :skus, class_name: "Zaikio::Procurement::Sku",
|
|
20
|
+
uri: "variants/:variant_id/skus"
|
|
21
|
+
|
|
22
|
+
def line_item_suggestion(**attributes)
|
|
23
|
+
self.class.request(
|
|
24
|
+
:post, line_item_suggestions_path, payload(attributes)
|
|
25
|
+
).data.map(&:deep_symbolize_keys)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
def line_item_suggestions_path
|
|
31
|
+
"variants/#{id}/line_item_suggestions"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def payload(attributes)
|
|
35
|
+
MultiJson.dump(
|
|
36
|
+
line_item_suggestion: {
|
|
37
|
+
amount: attributes[:amount] || 1,
|
|
38
|
+
unit: attributes[:unit],
|
|
39
|
+
exact_amount: attributes[:exact_amount],
|
|
40
|
+
environmental_certification: attributes[:environmental_certification],
|
|
41
|
+
exclusive_sales_group_id: attributes[:exclusive_sales_group_id]
|
|
42
|
+
}
|
|
43
|
+
)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
require "faraday"
|
|
2
|
+
require "spyke"
|
|
3
|
+
require "zaikio-client-helpers"
|
|
4
|
+
require "zaikio/procurement/configuration"
|
|
5
|
+
require "zaikio/procurement/authorization_middleware"
|
|
6
|
+
|
|
7
|
+
# Models
|
|
8
|
+
require "zaikio/procurement/base"
|
|
9
|
+
require "zaikio/procurement/article"
|
|
10
|
+
require "zaikio/procurement/variant"
|
|
11
|
+
require "zaikio/procurement/substrate_search"
|
|
12
|
+
require "zaikio/procurement/sku"
|
|
13
|
+
require "zaikio/procurement/price"
|
|
14
|
+
require "zaikio/procurement/supplier"
|
|
15
|
+
require "zaikio/procurement/contract"
|
|
16
|
+
require "zaikio/procurement/contract_request"
|
|
17
|
+
require "zaikio/procurement/sales_group"
|
|
18
|
+
require "zaikio/procurement/sales_group_membership"
|
|
19
|
+
require "zaikio/procurement/order"
|
|
20
|
+
require "zaikio/procurement/order_line_item"
|
|
21
|
+
require "zaikio/procurement/delivery"
|
|
22
|
+
require "zaikio/procurement/delivery_line_item"
|
|
23
|
+
require "zaikio/procurement/current_supplier"
|
|
24
|
+
require "zaikio/procurement/material_requirement"
|
|
25
|
+
module Zaikio
|
|
26
|
+
module Procurement
|
|
27
|
+
class << self
|
|
28
|
+
attr_accessor :configuration
|
|
29
|
+
|
|
30
|
+
class_attribute :connection
|
|
31
|
+
|
|
32
|
+
def configure
|
|
33
|
+
self.connection = nil
|
|
34
|
+
self.configuration ||= Configuration.new
|
|
35
|
+
yield(configuration)
|
|
36
|
+
|
|
37
|
+
Base.connection = create_connection
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def with_token(token)
|
|
41
|
+
AuthorizationMiddleware.token = token
|
|
42
|
+
yield
|
|
43
|
+
ensure
|
|
44
|
+
AuthorizationMiddleware.reset_token
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def connection_path
|
|
48
|
+
"#{configuration.host}/#{configuration.flavor.to_s.pluralize}/api/v1/"
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def create_connection
|
|
52
|
+
self.connection = Faraday.new(url: connection_path,
|
|
53
|
+
ssl: { verify: configuration.environment != :test }) do |c|
|
|
54
|
+
c.request :json
|
|
55
|
+
c.response :logger, configuration&.logger, headers: false
|
|
56
|
+
c.use Zaikio::Client::Helpers::Pagination::FaradayMiddleware
|
|
57
|
+
c.use Zaikio::Client::Helpers::JSONParser
|
|
58
|
+
c.use AuthorizationMiddleware
|
|
59
|
+
c.adapter Faraday.default_adapter
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: zaikio-procurement
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Zaikio GmbH
|
|
8
|
+
- Sascha Weidlich
|
|
9
|
+
autorequire:
|
|
10
|
+
bindir: bin
|
|
11
|
+
cert_chain: []
|
|
12
|
+
date: 2021-10-05 00:00:00.000000000 Z
|
|
13
|
+
dependencies:
|
|
14
|
+
- !ruby/object:Gem::Dependency
|
|
15
|
+
name: concurrent-ruby
|
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
|
17
|
+
requirements:
|
|
18
|
+
- - ">="
|
|
19
|
+
- !ruby/object:Gem::Version
|
|
20
|
+
version: '0'
|
|
21
|
+
type: :runtime
|
|
22
|
+
prerelease: false
|
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
24
|
+
requirements:
|
|
25
|
+
- - ">="
|
|
26
|
+
- !ruby/object:Gem::Version
|
|
27
|
+
version: '0'
|
|
28
|
+
- !ruby/object:Gem::Dependency
|
|
29
|
+
name: jwt
|
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
|
31
|
+
requirements:
|
|
32
|
+
- - ">="
|
|
33
|
+
- !ruby/object:Gem::Version
|
|
34
|
+
version: '0'
|
|
35
|
+
type: :runtime
|
|
36
|
+
prerelease: false
|
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
38
|
+
requirements:
|
|
39
|
+
- - ">="
|
|
40
|
+
- !ruby/object:Gem::Version
|
|
41
|
+
version: '0'
|
|
42
|
+
- !ruby/object:Gem::Dependency
|
|
43
|
+
name: multi_json
|
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
|
45
|
+
requirements:
|
|
46
|
+
- - ">="
|
|
47
|
+
- !ruby/object:Gem::Version
|
|
48
|
+
version: '0'
|
|
49
|
+
type: :runtime
|
|
50
|
+
prerelease: false
|
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
52
|
+
requirements:
|
|
53
|
+
- - ">="
|
|
54
|
+
- !ruby/object:Gem::Version
|
|
55
|
+
version: '0'
|
|
56
|
+
- !ruby/object:Gem::Dependency
|
|
57
|
+
name: oj
|
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
|
59
|
+
requirements:
|
|
60
|
+
- - ">="
|
|
61
|
+
- !ruby/object:Gem::Version
|
|
62
|
+
version: '0'
|
|
63
|
+
type: :runtime
|
|
64
|
+
prerelease: false
|
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
66
|
+
requirements:
|
|
67
|
+
- - ">="
|
|
68
|
+
- !ruby/object:Gem::Version
|
|
69
|
+
version: '0'
|
|
70
|
+
- !ruby/object:Gem::Dependency
|
|
71
|
+
name: spyke
|
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
|
73
|
+
requirements:
|
|
74
|
+
- - ">="
|
|
75
|
+
- !ruby/object:Gem::Version
|
|
76
|
+
version: '0'
|
|
77
|
+
type: :runtime
|
|
78
|
+
prerelease: false
|
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
80
|
+
requirements:
|
|
81
|
+
- - ">="
|
|
82
|
+
- !ruby/object:Gem::Version
|
|
83
|
+
version: '0'
|
|
84
|
+
- !ruby/object:Gem::Dependency
|
|
85
|
+
name: zaikio-client-helpers
|
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
|
87
|
+
requirements:
|
|
88
|
+
- - "~>"
|
|
89
|
+
- !ruby/object:Gem::Version
|
|
90
|
+
version: '0.2'
|
|
91
|
+
type: :runtime
|
|
92
|
+
prerelease: false
|
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
94
|
+
requirements:
|
|
95
|
+
- - "~>"
|
|
96
|
+
- !ruby/object:Gem::Version
|
|
97
|
+
version: '0.2'
|
|
98
|
+
description: Ruby API Client for Zaikio's Procurement Platform
|
|
99
|
+
email:
|
|
100
|
+
- sw@zaikio.com
|
|
101
|
+
executables: []
|
|
102
|
+
extensions: []
|
|
103
|
+
extra_rdoc_files: []
|
|
104
|
+
files:
|
|
105
|
+
- MIT-LICENSE
|
|
106
|
+
- README.md
|
|
107
|
+
- Rakefile
|
|
108
|
+
- lib/zaikio/procurement.rb
|
|
109
|
+
- lib/zaikio/procurement/article.rb
|
|
110
|
+
- lib/zaikio/procurement/authorization_middleware.rb
|
|
111
|
+
- lib/zaikio/procurement/base.rb
|
|
112
|
+
- lib/zaikio/procurement/configuration.rb
|
|
113
|
+
- lib/zaikio/procurement/contract.rb
|
|
114
|
+
- lib/zaikio/procurement/contract_request.rb
|
|
115
|
+
- lib/zaikio/procurement/current_supplier.rb
|
|
116
|
+
- lib/zaikio/procurement/delivery.rb
|
|
117
|
+
- lib/zaikio/procurement/delivery_line_item.rb
|
|
118
|
+
- lib/zaikio/procurement/invoice.rb
|
|
119
|
+
- lib/zaikio/procurement/material_requirement.rb
|
|
120
|
+
- lib/zaikio/procurement/order.rb
|
|
121
|
+
- lib/zaikio/procurement/order_line_item.rb
|
|
122
|
+
- lib/zaikio/procurement/price.rb
|
|
123
|
+
- lib/zaikio/procurement/sales_group.rb
|
|
124
|
+
- lib/zaikio/procurement/sales_group_membership.rb
|
|
125
|
+
- lib/zaikio/procurement/sku.rb
|
|
126
|
+
- lib/zaikio/procurement/substrate_search.rb
|
|
127
|
+
- lib/zaikio/procurement/supplier.rb
|
|
128
|
+
- lib/zaikio/procurement/variant.rb
|
|
129
|
+
- lib/zaikio/procurement/version.rb
|
|
130
|
+
homepage: https://www.zaikio.com/
|
|
131
|
+
licenses:
|
|
132
|
+
- MIT
|
|
133
|
+
metadata:
|
|
134
|
+
changelog_uri: https://github.com/zaikio/zaikio-procurement-ruby/blob/master/CHANGELOG.md
|
|
135
|
+
source_code_uri: https://github.com/zaikio/zaikio-procurement-ruby
|
|
136
|
+
post_install_message:
|
|
137
|
+
rdoc_options: []
|
|
138
|
+
require_paths:
|
|
139
|
+
- lib
|
|
140
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
141
|
+
requirements:
|
|
142
|
+
- - ">="
|
|
143
|
+
- !ruby/object:Gem::Version
|
|
144
|
+
version: 2.7.1
|
|
145
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
146
|
+
requirements:
|
|
147
|
+
- - ">="
|
|
148
|
+
- !ruby/object:Gem::Version
|
|
149
|
+
version: '0'
|
|
150
|
+
requirements: []
|
|
151
|
+
rubygems_version: 3.1.4
|
|
152
|
+
signing_key:
|
|
153
|
+
specification_version: 4
|
|
154
|
+
summary: Ruby API Client for Zaikio's Procurement Platform
|
|
155
|
+
test_files: []
|