zaikio-procurement 0.4.1 → 2.0.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.
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