zaikio-procurement 0.4.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +75 -81
  3. data/lib/zaikio/procurement/article.rb +2 -29
  4. data/lib/zaikio/procurement/availability.rb +8 -0
  5. data/lib/zaikio/procurement/configuration.rb +6 -15
  6. data/lib/zaikio/procurement/contract_request.rb +8 -5
  7. data/lib/zaikio/procurement/delivery.rb +4 -12
  8. data/lib/zaikio/procurement/job.rb +8 -0
  9. data/lib/zaikio/procurement/material.rb +15 -0
  10. data/lib/zaikio/procurement/material_requirement.rb +25 -12
  11. data/lib/zaikio/procurement/order.rb +23 -13
  12. data/lib/zaikio/procurement/order_line_item.rb +3 -7
  13. data/lib/zaikio/procurement/person.rb +8 -0
  14. data/lib/zaikio/procurement/pricing.rb +6 -0
  15. data/lib/zaikio/procurement/quantity.rb +8 -0
  16. data/lib/zaikio/procurement/site.rb +11 -0
  17. data/lib/zaikio/procurement/sku.rb +2 -17
  18. data/lib/zaikio/procurement/supplier.rb +9 -45
  19. data/lib/zaikio/procurement/variant.rb +7 -37
  20. data/lib/zaikio/procurement/variant_search.rb +43 -0
  21. data/lib/zaikio/procurement/version.rb +1 -1
  22. data/lib/zaikio/procurement.rb +9 -13
  23. metadata +10 -12
  24. data/lib/zaikio/procurement/concern/article_type_scoped.rb +0 -21
  25. data/lib/zaikio/procurement/contract.rb +0 -17
  26. data/lib/zaikio/procurement/current_supplier.rb +0 -17
  27. data/lib/zaikio/procurement/delivery_line_item.rb +0 -17
  28. data/lib/zaikio/procurement/invoice.rb +0 -8
  29. data/lib/zaikio/procurement/order_conditions_inquiry.rb +0 -15
  30. data/lib/zaikio/procurement/price.rb +0 -18
  31. data/lib/zaikio/procurement/sales_group.rb +0 -11
  32. data/lib/zaikio/procurement/sales_group_membership.rb +0 -11
  33. data/lib/zaikio/procurement/substrate_search.rb +0 -38
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '00691a481c639aeef92efb3b1f8070564b0763ec232613fa4a1e7b47bd0b1770'
4
- data.tar.gz: 36ec16902de34b2c48ea043340b3714ff76e4feefa1b491e7cf62cf518640cd5
3
+ metadata.gz: '016449cd994a32db26e9bc0045b4ede62213fe4e3fa4cd5621181d51a4d6a36a'
4
+ data.tar.gz: fd65209c17d5ecb34120b74d6592dfbd685771aec031139ed14ca5901f764c3f
5
5
  SHA512:
6
- metadata.gz: d42302e4b51f4ee9505e9c34a20c07f257f96012f36a3e5471735b5cc1bd9a1e0be805e890b08171dc1d61855734834c4194b5b210b8e3908574c0c4a41a5171
7
- data.tar.gz: 943068ff4356498e78f5aaae3f047b472d63e507466cd61eb49fdafef6c22f0d69175de5e8f263dc27e92b7d98c4583746d46586636e1b0d9d1ca314a22b414f
6
+ metadata.gz: 1b32bae8614933368afd866da4b29463fbccf7ac8d0ae802b5247de2c2f58e8778680a0260c3608069175e29d97bb0c5a2952d2235ced7e320d35cc1511f19e1
7
+ data.tar.gz: 34f11708110b5db2ebfbdd89ebbb72749182e0dd0a79aaee6dceea45e6b93a407489eecea7ffe6ce8b8265b344ed8bc1a97577bd1af301d17a0dfda48d6eac77
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Zaikio::Procurement
2
2
 
3
- Ruby API Client for Zaikio's Procurement Platform.
3
+ Ruby API Client for Zaikio's Procurement Consumer Platform.
4
4
 
5
5
  ## Installation
6
6
 
@@ -30,14 +30,13 @@ Zaikio::Procurement.configure do |config|
30
30
  end
31
31
  ```
32
32
 
33
-
34
33
  ## Usage
35
34
 
36
35
  The Procurement Client has an ORM like design.
37
36
 
38
37
  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
38
 
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).
39
+ If you want to know which actions are available and which scopes are required, please refer to the [Procurement Consumer API V2 Reference](https://docs.zaikio.com/api/procurement_consumers/consumers_v2.html).
41
40
 
42
41
  ### As an organization
43
42
 
@@ -46,88 +45,83 @@ token = "..." # Your valid JWT for an organization
46
45
  Zaikio::Procurement.with_token(token) do
47
46
 
48
47
  # 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")
48
+ Zaikio::Procurement::MaterialRequirement.all
49
+ Zaikio::Procurement::MaterialRequirement.find("7cbf51bd-35a8-47a1-84a2-57aa63140234")
52
50
 
53
51
  # 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)
52
+ material_requirement = Zaikio::Procurement::MaterialRequirement.find("7cbf51bd-35a8-47a1-84a2-57aa63140234")
53
+ material_requirement.availability
54
+ material_requirement.pricing
55
+ material_requirement.order
60
56
 
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")
57
+ # Search for a variant
58
+ search = Zaikio::Procurement::VariantSearch.new(type: "sheet_substrate", query: "Soap", grain: "short", paper_weight: 80)
59
+ # You can either pass a single value or a comma separated list of types, e.g. type: "sheet_substrate,plate"
60
+ # Use all to include all available Variant types in the response
63
61
 
64
62
  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
- # in Supplier API one must provide a valid scope when using `Variant` or `Article`:
72
- # https://docs.zaikio.com/api/procurement_suppliers/procurement.html#/Variants/get__article_type__variants__variant_id_
73
- variant = Zaikio::Procurement::Variant.substrate.find("845a4d7e-db5a-46a6-9d30-bf2e884cb393")
74
- variant.skus
75
-
76
- # https://docs.zaikio.com/api/procurement_consumers/procurement.html#/LineItemSuggestions/post_suppliers__supplier_id__line_item_suggestions
77
- supplier = Zaikio::Procurement::Supplier.find("b5b14aa0-ae84-452b-9719-a38545365902")
78
- supplier.line_item_suggestions(
79
- variants: [
80
- {
81
- id: "0001b94e-4e87-4ee9-8b14-6ff9910b4f26",
82
- amount: 2000,
83
- exact_amount: false,
84
- environmental_certification: "FSC Mix Credit",
85
- unit: "sheet"
86
- },
87
- {
88
- id: "10236394-ecd4-465b-ab72-0fbd79296e6a",
89
- amount: 10,
90
- exact_amount: false,
91
- environmental_certification: "PEFC 100%",
92
- unit: "sheet"
93
- }
94
- ]
95
- ) # Returns line item suggestions for multiple variants of a supplier
96
-
97
-
98
- # Create new resources
63
+ search.available_filters # Returns a list of available filters that can be used to further narrow down the results
64
+
65
+ # Filter and search material requirements
66
+ # Available filters can be found here: https://docs.zaikio.com/api/procurement_consumers/consumers_v2.html#/MaterialRequirements/get_material_requirements
67
+ Zaikio::Procurement::MaterialRequirement.where(query: "Sappi", filters: { article_category: "sheet_substrate", status: "ordered" })
68
+
69
+ ### Create new resources
70
+
71
+ # Create a ContractRequest
72
+ Zaikio::Procurement::ContractRequest.create(
73
+ supplier_id: "061c2b43-ae94-459d-8739-35b20684e47a",
74
+ customer_number: "1968353479",
75
+ contact_first_name: "Frank",
76
+ contact_last_name: "Gallikanokus",
77
+ contact_email: "fgalli@example.com",
78
+ contact_phone: "+3333333333333",
79
+ references: ["my reference"])
80
+
81
+ # Create a MaterialRequirement
82
+ Zaikio::Procurement::MaterialRequirement.create(
83
+ amount: 200,
84
+ job_client: "Awesome Client",
85
+ job_description: "Awesome print product",
86
+ job_link: "https://www.example.com",
87
+ job_reference: "my job reference",
88
+ material_required_at: "2022-08-03",
89
+ supplier_id: "b2a0f1ab-7610-451e-acc7-633284300521",
90
+ variant_id: "31924842-b38b-47b2-90b0-68f8f42f37d6",
91
+ references: ["my requirement reference"],
92
+ visible_in_web: true)
93
+
94
+ # Create an Order
99
95
  Zaikio::Procurement::Order.create(
100
- contract_id: "fd677fc7-abd9-460c-b086-34de1a8349e8",
101
- delivery_mode: "complete",
102
- exclusive_sales_group_id: "42dcbaf6-e557-4423-96bc-707ebbc223c0",
103
- references: ["CO/XXXXXX"],
104
- state_event: "place",
105
- deliveries_attributes: [
106
- {
107
- address_addressee: "Joey’s Print Ltd",
108
- address_text: "Emmerich-Josef-Straße 1A, 55116 Mainz",
109
- desired_delivery_date: "2021-01-29",
110
- references: ["D/XXXXXX"]
111
- }
112
- ],
113
- order_line_items_attributes: [
114
- {
115
- sku_id: "26b3aadc-928f-4d1a-ba2d-13ac3c8f523d",
116
- amount: 108000
117
- }
118
- ]
119
- )
120
-
121
- order = Zaikio::Procurement::Order.find("86b4a0c5-6d54-4702-a059-da258643f260")
122
- order.order_line_items.create(sku_id: "6535eeb0-45c2-4c63-8cb9-4814562bb875", amount: 68000)
123
-
124
- # Update resources
125
- line_item = Zaikio::Procurement::OrderLineItem.find("058a5513-925e-4d0c-923d-fa1ed4bfb3ce")
126
- line_item.update(amount: 69000)
127
-
128
- # Deleting resources
129
- line_item = Zaikio::Procurement::OrderLineItem.find("2f5a99c2-9734-4aac-9cee-911b061d3a5a")
130
- line_item.destroy
96
+ material_requirement_ids: ["9f98e841-1502-4d7b-9b8a-0cf9b8072875"],
97
+ references: ["my order reference"],
98
+ copy_material_requirement_references_to_line_items: true)
99
+
100
+ ### Update resources
101
+ material_requirement = Zaikio::Procurement::MaterialRequirement.find("058a5513-925e-4d0c-923d-fa1ed4bfb3ce")
102
+ material_requirement.update(amount: 1000)
103
+
104
+ ### Deleting resources
105
+ material_requirement = Zaikio::Procurement::MaterialRequirement.find("2f5a99c2-9734-4aac-9cee-911b061d3a5a")
106
+ material_requirement.destroy
107
+
108
+ ### Custom methods
109
+
110
+ # Placing an order and submitting it to the supplier
111
+ order = Zaikio::Procurement::Order.find("8eaeb37a-d7aa-424a-aac1-1ade4b4030e2")
112
+ order.place
113
+
114
+ # Cancel a placed order
115
+ order = Zaikio::Procurement::Order.find("3d36c6c5-b979-4073-8fcc-78a6cf1bc8bd")
116
+ order.cancel
117
+
118
+ # Archive a canceled or completed material requirement
119
+ material_requirement = Zaikio::Procurement::MaterialRequirement.find("2f5a99c2-9734-4aac-9cee-911b061d3a5a")
120
+ material_requirement.archive
121
+
122
+ # Refreshing the order conditions (price, stock and delivery date) of the material requirement
123
+ material_requirement = Zaikio::Procurement::MaterialRequirement.find("2f5a99c2-9734-4aac-9cee-911b061d3a5a")
124
+ material_requirement.refresh
131
125
  end
132
126
  ```
133
127
 
@@ -139,7 +133,7 @@ This can be easily caught using the `with_fallback` method. We recommend to alwa
139
133
 
140
134
  ```rb
141
135
  Zaikio::Directory.with_token(token) do
142
- Zaikio::Procurement::Article.with_fallback.find("7cbf51bd-35a8-47a1-84a2-57aa63140234") # => nil
143
- Zaikio::Procurement::Article.with_fallback.all # Automatically uses empty array as fallback
136
+ Zaikio::Procurement::MaterialRequirement.with_fallback.find("7cbf51bd-35a8-47a1-84a2-57aa63140234") # => nil
137
+ Zaikio::Procurement::MaterialRequirement.with_fallback.all # Automatically uses empty array as fallback
144
138
  end
145
139
  ```
@@ -1,38 +1,11 @@
1
- require_relative "concern/article_type_scoped"
2
-
3
1
  module Zaikio
4
2
  module Procurement
5
3
  class Article < Base
6
- include ArticleTypeScoped
7
- include_root_in_json :article
8
-
9
- # Class methods
10
- class << self
11
- # Spyke URI override
12
- def uri
13
- Zaikio::Procurement.configuration.flavor == :supplier ? ":type/articles(/:id)" : "articles(/:id)"
14
- end
15
-
16
- def list_by_article_type_or_supplier_slug(type_or_slug)
17
- with("#{type_or_slug}/articles").get
18
- end
19
-
20
- def list_by_article_type_and_supplier_slug(type, slug)
21
- with("#{type}/#{slug}/articles").get
22
- end
23
- end
24
-
25
- # Attributes
26
- attributes :name, :base_unit, :coated, :description, :finish,
27
- :kind, :supplier_id, :created_at, :updated_at
28
-
29
4
  # Associations
30
5
  has_one :supplier, class_name: "Zaikio::Procurement::Supplier",
31
6
  uri: nil
32
- # Manually build variants association to work for consumers and suppliers
33
- def variants
34
- self.class.request(:get, "#{uri}/variants").data.collect { |v| Zaikio::Procurement::Variant.new(v) }
35
- end
7
+ has_many :skus, class_name: "Zaikio::Procurement::Sku",
8
+ uri: nil
36
9
  end
37
10
  end
38
11
  end
@@ -0,0 +1,8 @@
1
+ module Zaikio
2
+ module Procurement
3
+ class Availability < Base
4
+ # Attributes
5
+ attributes :delivery_date, :in_stock, :accuracy, :verified_at
6
+ end
7
+ end
8
+ end
@@ -4,22 +4,19 @@ module Zaikio
4
4
  module Procurement
5
5
  class Configuration
6
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"
7
+ development: "https://procurement.zaikio.test/api/v2/",
8
+ test: "https://procurement.zaikio.test/api/v2/",
9
+ staging: "https://procurement.staging.zaikio.com/api/v2/",
10
+ sandbox: "https://procurement.sandbox.zaikio.com/api/v2/",
11
+ production: "https://procurement.zaikio.com/api/v2/"
12
12
  }.freeze
13
13
 
14
- FLAVORS = %i[consumer supplier].freeze
15
-
16
14
  attr_accessor :host
17
- attr_reader :environment, :flavor
15
+ attr_reader :environment
18
16
  attr_writer :logger
19
17
 
20
18
  def initialize
21
19
  @environment = :sandbox
22
- @flavor = :consumer
23
20
  end
24
21
 
25
22
  def logger
@@ -31,12 +28,6 @@ module Zaikio
31
28
  @host = host_for(environment)
32
29
  end
33
30
 
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
31
  private
41
32
 
42
33
  def host_for(environment)
@@ -4,16 +4,19 @@ module Zaikio
4
4
  uri "contract_requests(/:id)"
5
5
  include_root_in_json :contract_request
6
6
 
7
+ def self.create(supplier_id:, **attributes)
8
+ new(request(:post, "suppliers/#{supplier_id}/contract_requests",
9
+ contract_request: attributes)&.body&.dig("data"))
10
+ end
11
+
7
12
  # 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
13
+ attributes :contact_email, :contact_first_name, :contact_last_name,
14
+ :contact_phone, :customer_number, :declined_at, :declined_reason,
15
+ :references, :state, :created_at, :updated_at
12
16
 
13
17
  # Associations
14
18
  belongs_to :supplier, class_name: "Zaikio::Procurement::Supplier",
15
19
  uri: nil
16
- has_one :contract, uri: nil
17
20
  end
18
21
  end
19
22
  end
@@ -1,19 +1,11 @@
1
1
  module Zaikio
2
2
  module Procurement
3
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
- :order_id, :created_at, :updated_at
10
-
11
4
  # Associations
12
- belongs_to :address, class_name: "Zaikio::Procurement::Address", uri: nil
13
- belongs_to :order, class_name: "Zaikio::Procurement::Order", uri: nil
14
-
15
- has_many :delivery_line_items, class_name: "Zaikio::Procurement::DeliveryLineItem",
16
- uri: "deliveries/:delivery_id/delivery_line_items(/:id)"
5
+ has_one :site, class_name: "Zaikio::Procurement::Site",
6
+ uri: nil
7
+ has_one :address, class_name: "Zaikio::Procurement::Address",
8
+ uri: nil
17
9
  end
18
10
  end
19
11
  end
@@ -0,0 +1,8 @@
1
+ module Zaikio
2
+ module Procurement
3
+ class Job < Base
4
+ # Attributes
5
+ attributes :anticipated_costs, :client, :description, :link, :reference
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,15 @@
1
+ module Zaikio
2
+ module Procurement
3
+ class Material < Base
4
+ attributes :amount,
5
+ :description,
6
+ :environmental_certification,
7
+ :unit,
8
+ :sku_preference_ids
9
+
10
+ # Associations
11
+ has_one :supplier, class_name: "Zaikio::Procurement::Supplier", uri: nil
12
+ has_one :variant, class_name: "Zaikio::Procurement::Variant", uri: nil
13
+ end
14
+ end
15
+ end
@@ -5,22 +5,35 @@ module Zaikio
5
5
  include_root_in_json :material_requirement
6
6
 
7
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
- :job_client, :job_description, :job_link, :job_reference, :ordered_at, :order_number, :person,
11
- :price, :purchaser, :price_based_on_quantity, :references, :site, :state, :unit,
12
- :created_at, :updated_at
8
+ attributes :state, :references, :visible_in_web, :ordered_at, :fulfilled_at, :canceled_at, :created_at,
9
+ :updated_at
13
10
 
14
11
  # Associations
15
- has_one :supplier, class_name: "Zaikio::Procurement::Supplier", uri: nil
16
- has_one :variant, class_name: "Zaikio::Procurement::Variant", uri: nil
17
- has_many :order_line_items, class_name: "Zaikio::Procurement::OrderLineItem", uri: nil
12
+ has_one :required_material, class_name: "Zaikio::Procurement::Material", uri: nil
13
+ has_one :delivery, class_name: "Zaikio::Procurement::Delivery", uri: nil
14
+ has_one :order, class_name: "Zaikio::Procurement::Order", uri: nil
15
+ has_one :pricing, class_name: "Zaikio::Procurement::Pricing", uri: nil
16
+ has_one :availability, class_name: "Zaikio::Procurement::Availability", uri: nil
17
+ has_one :quantity, class_name: "Zaikio::Procurement::Quantity", uri: nil
18
+ has_one :job, class_name: "Zaikio::Procurement::Job", uri: nil
19
+ has_one :creator, class_name: "Zaikio::Procurement::Person", uri: nil
18
20
 
19
- def order(purchaser_id:)
20
- result = self.class.request(:post, "material_requirements/#{id}/order",
21
- order: { purchaser_id: purchaser_id })
21
+ def archive
22
+ Zaikio::Procurement::MaterialRequirement.new(
23
+ self.class.request(:patch, "#{collection_name}/#{id}/archive").data
24
+ )
25
+ end
26
+
27
+ def refresh
28
+ Zaikio::Procurement::MaterialRequirement.new(
29
+ self.class.request(:patch, "#{collection_name}/#{id}/refresh").data
30
+ )
31
+ end
32
+
33
+ private
22
34
 
23
- Zaikio::Procurement::MaterialRequirement.new(result.data)
35
+ def collection_name
36
+ self.class.name.demodulize.underscore.pluralize
24
37
  end
25
38
  end
26
39
  end
@@ -5,21 +5,31 @@ module Zaikio
5
5
  include_root_in_json :order
6
6
 
7
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
8
+ attributes :copy_material_requirement_references_to_line_items, :currency, :references,
9
+ :state, :canceled_by_consumer_at, :canceled_by_supplier_at, :confirmed_at,
10
+ :placed_at, :transferred_at, :created_at, :updated_at
13
11
 
14
12
  # 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)"
13
+ has_one :delivery, class_name: "Zaikio::Procurement::Delivery",
14
+ uri: nil
15
+ has_many :order_line_items, class_name: "Zaikio::Procurement::OrderLineItem",
16
+ uri: nil
17
+ has_one :pricing, class_name: "Zaikio::Procurement::Pricing",
18
+ uri: nil
19
+ has_one :person, class_name: "Zaikio::Procurement::Person",
20
+ uri: nil
21
+
22
+ def place
23
+ Zaikio::Procurement::MaterialRequirement.new(
24
+ self.class.request(:patch, "orders/#{id}/place").data
25
+ )
26
+ end
27
+
28
+ def cancel
29
+ Zaikio::Procurement::MaterialRequirement.new(
30
+ self.class.request(:patch, "orders/#{id}/cancel").data
31
+ )
32
+ end
23
33
  end
24
34
  end
25
35
  end
@@ -1,16 +1,12 @@
1
1
  module Zaikio
2
2
  module Procurement
3
3
  class OrderLineItem < Base
4
- uri "order_line_items(/:id)"
5
- include_root_in_json :order_line_item
6
-
7
4
  # 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
5
+ attributes :references, :amount, :amount_in_base_unit, :base_unit, :confirmed_delivery_at, :description,
6
+ :order_number, :created_at, :updated_at
11
7
 
12
8
  # Associations
13
- belongs_to :order, class_name: "Zaikio::Procurement::Order",
9
+ has_one :pricing, class_name: "Zaikio::Procurement::Pricing",
14
10
  uri: nil
15
11
  has_one :sku, class_name: "Zaikio::Procurement::Sku",
16
12
  uri: nil
@@ -0,0 +1,8 @@
1
+ module Zaikio
2
+ module Procurement
3
+ class Person < Base
4
+ # Attributes
5
+ attributes :full_name
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,6 @@
1
+ module Zaikio
2
+ module Procurement
3
+ class Pricing < Base
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,8 @@
1
+ module Zaikio
2
+ module Procurement
3
+ class Quantity < Base
4
+ # Attributes
5
+ attributes :order_quantity_in_requested_unit, :order_quantity_in_base_unit
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,11 @@
1
+ module Zaikio
2
+ module Procurement
3
+ class Site < Base
4
+ uri "sites(/:id)"
5
+
6
+ # Associations
7
+ has_one :address, class_name: "Zaikio::Procurement::Address",
8
+ uri: nil
9
+ end
10
+ end
11
+ end
@@ -1,24 +1,9 @@
1
1
  module Zaikio
2
2
  module Procurement
3
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
4
  # 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
- Zaikio::Procurement::Variant.new(
19
- self.class.request(:get, attributes.dig("variant", "links", 0, "href")).data
20
- )
21
- end
5
+ has_many :suppliers, class_name: "Zaikio::Procurement::Supplier",
6
+ uri: nil
22
7
  end
23
8
  end
24
9
  end
@@ -3,54 +3,18 @@ module Zaikio
3
3
  class Supplier < Base
4
4
  uri "suppliers(/:id)"
5
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
- has_many :distributors, class_name: "Zaikio::Procurement::Supplier", uri: nil
15
-
16
- def line_item_suggestions(**attributes)
17
- variants = attributes.delete(:variants)
18
-
19
- unless variants.is_a?(Array) && variants.all?(Hash)
20
- raise ArgumentError, "For variants, you must pass an Array of Hashes"
21
- end
22
-
23
- self.class.request(
24
- :post, line_item_suggestions_path, payload(attributes, variants)
25
- ).data.deep_symbolize_keys
26
- end
27
-
28
- private
29
-
30
- def payload(attributes, variants)
31
- MultiJson.dump(
32
- line_item_suggestions: {
33
- exclusive_sales_group_id: attributes[:exclusive_sales_group_id],
34
- variants: variant_payload(variants)
35
- }.reject { |_k, v| v.blank? }
36
- )
37
- end
6
+ def self.upcoming
7
+ result = Zaikio::Procurement::Supplier
8
+ .request(:get, "upcoming_suppliers")&.body&.dig("data")
38
9
 
39
- def variant_payload(variants)
40
- variants.collect do |variant|
41
- {
42
- id: variant[:id],
43
- amount: variant[:amount],
44
- exact_amount: variant[:exact_amount] || false,
45
- environmental_certification: variant[:environmental_certification],
46
- unit: variant[:unit] || "sheet"
47
- }
48
- end
10
+ result.collect { |s| Zaikio::Procurement::Supplier.new(s) }
49
11
  end
50
12
 
51
- def line_item_suggestions_path
52
- "suppliers/#{id}/line_item_suggestions"
53
- end
13
+ # Attributes
14
+ attributes :slug, :name, :connected, :currency, :customer_number, :prices_updated_at,
15
+ :additional_pricing_agreements, :article_types, :automatically_accept_contract_requests,
16
+ :brand_color, :cancelation_policy, :logo_url, :maximum_days_until_delivery,
17
+ :minimum_days_before_delivery, :supports_split_delivery, :maximum_order_size, :created_at, :updated_at
54
18
  end
55
19
  end
56
20
  end
@@ -1,50 +1,20 @@
1
- require_relative "concern/article_type_scoped"
2
-
3
1
  module Zaikio
4
2
  module Procurement
5
3
  class Variant < Base
6
- include ArticleTypeScoped
7
4
  include_root_in_json :variant
8
5
 
9
- # Spyke URI override
10
- def self.uri
11
- Zaikio::Procurement.configuration.flavor == :supplier ? ":type/variants(/:id)" : "variants(/:id)"
6
+ # Constants
7
+ def self.types
8
+ %w[carbonless_copy_paper coating coating_plate envelope ink laminating_foil
9
+ offset_printing_blanket plate ring_binding self_adhesive sheet_substrate
10
+ sleeking_foil specialized_printing_blanket web_substrate].freeze
12
11
  end
13
12
 
14
- # Attributes
15
- attributes :brightness, :category, :color, :dimensions_unit, :form, :grain, :height, :paper_weight,
16
- :paper_weight_unit, :roughness, :thickness, :transparency, :unit_system, :whiteness,
17
- :width, :article_id, :created_at, :updated_at
18
-
19
13
  # Associations
20
14
  has_one :article, class_name: "Zaikio::Procurement::Article",
21
15
  uri: nil
22
- has_many :skus, class_name: "Zaikio::Procurement::Sku",
23
- uri: "variants/:variant_id/skus"
24
-
25
- def line_item_suggestion(**attributes)
26
- self.class.request(
27
- :post, line_item_suggestions_path, payload(attributes)
28
- ).data.map(&:deep_symbolize_keys)
29
- end
30
-
31
- private
32
-
33
- def line_item_suggestions_path
34
- "variants/#{id}/line_item_suggestions"
35
- end
36
-
37
- def payload(attributes)
38
- MultiJson.dump(
39
- line_item_suggestion: {
40
- amount: attributes[:amount] || 1,
41
- unit: attributes[:unit],
42
- exact_amount: attributes[:exact_amount],
43
- environmental_certification: attributes[:environmental_certification],
44
- exclusive_sales_group_id: attributes[:exclusive_sales_group_id]
45
- }
46
- )
47
- end
16
+ has_many :skus, class_name: "Zaikio::Procurement::Sku",
17
+ uri: nil
48
18
  end
49
19
  end
50
20
  end
@@ -0,0 +1,43 @@
1
+ module Zaikio
2
+ module Procurement
3
+ class VariantSearch
4
+ def initialize(type: "all", query: nil, **filters)
5
+ @type = type.split.join
6
+ @query = query
7
+ @filters = filters
8
+ @valid_types = Zaikio::Procurement::Variant.types + ["all"]
9
+
10
+ unless @filters.respond_to?(:stringify_keys)
11
+ raise ArgumentError, "When using additional search parameters, you must pass a hash as an argument."
12
+ end
13
+
14
+ unless @type.split(",").all? { |t| @valid_types.include?(t) }
15
+ raise ArgumentError,
16
+ "When using the type parameter, you must pass one or more of \
17
+ the following types: #{@valid_types.join(', ')}."
18
+ end
19
+
20
+ @response = Zaikio::Procurement::Base.with(path).get
21
+ end
22
+
23
+ def results
24
+ @response.results.collect { |variant| Zaikio::Procurement::Variant.new(variant) }
25
+ end
26
+
27
+ def available_filters
28
+ @response.available_filters
29
+ end
30
+
31
+ private
32
+
33
+ def path
34
+ "variants".tap do |qp|
35
+ qp << "?type=#{@type}"
36
+ qp << "&query=#{@query}" if @query
37
+ qp << "&" if @query && @filters.any?
38
+ qp << @filters.to_query("filters") if @filters
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -1,5 +1,5 @@
1
1
  module Zaikio
2
2
  module Procurement
3
- VERSION = "0.4.1".freeze
3
+ VERSION = "2.0.0".freeze
4
4
  end
5
5
  end
@@ -9,21 +9,21 @@ require "zaikio/procurement/base"
9
9
  require "zaikio/procurement/address"
10
10
  require "zaikio/procurement/article"
11
11
  require "zaikio/procurement/variant"
12
- require "zaikio/procurement/substrate_search"
12
+ require "zaikio/procurement/variant_search"
13
13
  require "zaikio/procurement/sku"
14
- require "zaikio/procurement/price"
15
14
  require "zaikio/procurement/supplier"
16
- require "zaikio/procurement/contract"
17
15
  require "zaikio/procurement/contract_request"
18
- require "zaikio/procurement/sales_group"
19
- require "zaikio/procurement/sales_group_membership"
20
16
  require "zaikio/procurement/order"
21
17
  require "zaikio/procurement/order_line_item"
22
18
  require "zaikio/procurement/delivery"
23
- require "zaikio/procurement/delivery_line_item"
24
- require "zaikio/procurement/current_supplier"
25
19
  require "zaikio/procurement/material_requirement"
26
- require "zaikio/procurement/order_conditions_inquiry"
20
+ require "zaikio/procurement/material"
21
+ require "zaikio/procurement/pricing"
22
+ require "zaikio/procurement/site"
23
+ require "zaikio/procurement/availability"
24
+ require "zaikio/procurement/quantity"
25
+ require "zaikio/procurement/job"
26
+ require "zaikio/procurement/person"
27
27
 
28
28
  module Zaikio
29
29
  module Procurement
@@ -48,12 +48,8 @@ module Zaikio
48
48
  AuthorizationMiddleware.token = original_token
49
49
  end
50
50
 
51
- def connection_path
52
- "#{configuration.host}/#{configuration.flavor.to_s.pluralize}/api/v1/"
53
- end
54
-
55
51
  def create_connection
56
- self.connection = Faraday.new(url: connection_path,
52
+ self.connection = Faraday.new(url: configuration.host,
57
53
  ssl: { verify: configuration.environment != :test }) do |c|
58
54
  c.request :json
59
55
  c.response :logger, configuration&.logger, headers: false
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zaikio-procurement
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Zaikio GmbH
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-02-10 00:00:00.000000000 Z
12
+ date: 2022-08-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: concurrent-ruby
@@ -109,26 +109,24 @@ files:
109
109
  - lib/zaikio/procurement/address.rb
110
110
  - lib/zaikio/procurement/article.rb
111
111
  - lib/zaikio/procurement/authorization_middleware.rb
112
+ - lib/zaikio/procurement/availability.rb
112
113
  - lib/zaikio/procurement/base.rb
113
- - lib/zaikio/procurement/concern/article_type_scoped.rb
114
114
  - lib/zaikio/procurement/configuration.rb
115
- - lib/zaikio/procurement/contract.rb
116
115
  - lib/zaikio/procurement/contract_request.rb
117
- - lib/zaikio/procurement/current_supplier.rb
118
116
  - lib/zaikio/procurement/delivery.rb
119
- - lib/zaikio/procurement/delivery_line_item.rb
120
- - lib/zaikio/procurement/invoice.rb
117
+ - lib/zaikio/procurement/job.rb
118
+ - lib/zaikio/procurement/material.rb
121
119
  - lib/zaikio/procurement/material_requirement.rb
122
120
  - lib/zaikio/procurement/order.rb
123
- - lib/zaikio/procurement/order_conditions_inquiry.rb
124
121
  - lib/zaikio/procurement/order_line_item.rb
125
- - lib/zaikio/procurement/price.rb
126
- - lib/zaikio/procurement/sales_group.rb
127
- - lib/zaikio/procurement/sales_group_membership.rb
122
+ - lib/zaikio/procurement/person.rb
123
+ - lib/zaikio/procurement/pricing.rb
124
+ - lib/zaikio/procurement/quantity.rb
125
+ - lib/zaikio/procurement/site.rb
128
126
  - lib/zaikio/procurement/sku.rb
129
- - lib/zaikio/procurement/substrate_search.rb
130
127
  - lib/zaikio/procurement/supplier.rb
131
128
  - lib/zaikio/procurement/variant.rb
129
+ - lib/zaikio/procurement/variant_search.rb
132
130
  - lib/zaikio/procurement/version.rb
133
131
  homepage: https://www.zaikio.com/
134
132
  licenses:
@@ -1,21 +0,0 @@
1
- module Zaikio
2
- module Procurement
3
- module ArticleTypeScoped
4
- extend ActiveSupport::Concern
5
- included do
6
- scope :substrate, -> { where(type: :substrate) }
7
- scope :plate, -> { where(type: :plate) }
8
- end
9
- module ClassMethods
10
- def find(id)
11
- if Zaikio::Procurement.configuration.flavor == :supplier &&
12
- (current_scope.nil? || current_scope.params[:type].blank?)
13
- raise ArgumentError, "id and type are required for #{name.demodulize} in Supplier API"
14
- end
15
-
16
- super
17
- end
18
- end
19
- end
20
- end
21
- end
@@ -1,17 +0,0 @@
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
@@ -1,17 +0,0 @@
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
@@ -1,17 +0,0 @@
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
@@ -1,8 +0,0 @@
1
- module Zaikio
2
- module Procurement
3
- class Invoice < Base
4
- uri "invoices(/:id)"
5
- include_root_in_json :invoice
6
- end
7
- end
8
- end
@@ -1,15 +0,0 @@
1
- module Zaikio
2
- module Procurement
3
- class OrderConditionsInquiry < Base
4
- uri "order_conditions_inquiries(/:id)"
5
- include_root_in_json :order_conditions_inquiry
6
-
7
- # Attributes
8
- attributes :contract_id, :currency, :created_at, :updated_at,
9
- :desired_delivery_date, :verified_at, :expires_at,
10
- :verified_net_handling_fee, :verified_net_shipping_fee,
11
- :verified_net_total, :verified_delivery_date, :order_line_items,
12
- :verified_order_line_items
13
- end
14
- end
15
- end
@@ -1,18 +0,0 @@
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
@@ -1,11 +0,0 @@
1
- module Zaikio
2
- module Procurement
3
- class SalesGroup < Base
4
- uri "sales_groups(/:id)"
5
- include_root_in_json :sales_group
6
-
7
- # Attributes
8
- attributes :currency, :exclusive, :name, :created_at, :updated_at
9
- end
10
- end
11
- end
@@ -1,11 +0,0 @@
1
- module Zaikio
2
- module Procurement
3
- class SalesGroupMembership < Base
4
- uri "sales_group_memberships(/:id)"
5
- include_root_in_json :sales_group_membership
6
-
7
- # Attributes
8
- attributes :contract, :sales_group, :created_at, :updated_at
9
- end
10
- end
11
- end
@@ -1,38 +0,0 @@
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