Skip to content

zaikio/zaikio-procurement-ruby

main
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Code

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
June 29, 2021 10:11
February 9, 2023 16:13
January 18, 2021 23:25
November 4, 2020 17:36
February 9, 2023 16:13
November 4, 2020 17:36
November 4, 2020 17:36
November 4, 2020 17:36
January 24, 2023 10:47
November 4, 2020 17:36
February 9, 2023 16:13

Zaikio::Procurement

Ruby API Client for Zaikio's Procurement Consumer Platform.

Installation

1. Add this line to your application's Gemfile:

gem 'zaikio-procurement'

And then execute:

$ bundle

Or install it yourself as:

$ gem install zaikio-procurement

2. Configure the gem:

# config/initializers/zaikio_procurement.rb

Zaikio::Procurement.configure do |config|
  config.environment = :production # sandbox or production
end

Usage

The Procurement Client has an ORM like design.

For the requests to work, a valid JSON Web token with the correct OAuth Scopes must always be provided. Please refer to zaikio-oauth_client.

If you want to know which actions are available and which scopes are required, please refer to the Procurement Consumer API V2 Reference.

As an organization

token = "..." # Your valid JWT for an organization
Zaikio::Procurement.with_token(token) do

  # Fetch Data
  Zaikio::Procurement::MaterialRequirement.all
  Zaikio::Procurement::MaterialRequirement.find("7cbf51bd-35a8-47a1-84a2-57aa63140234")

  # Associations
  material_requirement = Zaikio::Procurement::MaterialRequirement.find("7cbf51bd-35a8-47a1-84a2-57aa63140234")
  material_requirement.availability
  material_requirement.pricing
  material_requirement.order

  # Search for a variant
  search = Zaikio::Procurement::VariantSearch.new(type: "sheet_substrate", query: "Soap", grain: "short", paper_weight: 80)
  # You can either pass a single value or a comma separated list of types, e.g. type: "sheet_substrate,plate"
  # Use all to include all available Variant types in the response

  search.results # Returns a list of matching variants
  search.available_filters # Returns a list of available filters that can be used to further narrow down the results

  # Filter and search material requirements
  # Available filters can be found here:  https://docs.zaikio.com/api/procurement_consumers/consumers_v2.html#/MaterialRequirements/get_material_requirements
  Zaikio::Procurement::MaterialRequirement.where(query: "Sappi", filters: { article_category: "sheet_substrate", status: "ordered" })

  ### Create new resources

  # Create a ContractRequest
  supplier = Zaikio::Procurement::Supplier.find("5fd82941-ba2f-4d0b-971a-7050fbbafcef")
  supplier.contract_requests.create(
    customer_number: "1968353479",
    contact_first_name: "Frank",
    contact_last_name: "Gallikanokus",
    contact_email: "fgalli@example.com",
    contact_phone: "+3333333333333",
    references: ["my reference"])

  # Create a MaterialRequirement
  Zaikio::Procurement::MaterialRequirement.create(
    amount: 200,
    job_client: "Awesome Client",
    job_description: "Awesome print product",
    job_link: "https://www.example.com",
    job_reference: "my job reference",
    material_required_at: "2022-08-03",
    supplier_id: "b2a0f1ab-7610-451e-acc7-633284300521",
    variant_id: "31924842-b38b-47b2-90b0-68f8f42f37d6",
    references: ["my requirement reference"],
    visible_in_web: true)

  # Create an Order
  Zaikio::Procurement::Order.create(
    material_requirement_ids: ["9f98e841-1502-4d7b-9b8a-0cf9b8072875"],
    references: ["my order reference"],
    copy_material_requirement_references_to_line_items: true)

  ### Update resources
  material_requirement = Zaikio::Procurement::MaterialRequirement.find("058a5513-925e-4d0c-923d-fa1ed4bfb3ce")
  material_requirement.update(amount: 1000)

  ### Deleting resources
  material_requirement = Zaikio::Procurement::MaterialRequirement.find("2f5a99c2-9734-4aac-9cee-911b061d3a5a")
  material_requirement.destroy

  ### Custom methods

  # Placing an order and submitting it to the supplier
  order = Zaikio::Procurement::Order.find("8eaeb37a-d7aa-424a-aac1-1ade4b4030e2")
  order.place

  # Cancel a placed order
  order = Zaikio::Procurement::Order.find("3d36c6c5-b979-4073-8fcc-78a6cf1bc8bd")
  order.cancel

  # Archive a canceled or completed material requirement
  material_requirement = Zaikio::Procurement::MaterialRequirement.find("2f5a99c2-9734-4aac-9cee-911b061d3a5a")
  material_requirement.archive

  # Refreshing the order conditions (price, stock and delivery date) of the material requirement
  material_requirement = Zaikio::Procurement::MaterialRequirement.find("2f5a99c2-9734-4aac-9cee-911b061d3a5a")
  material_requirement.refresh
end

Error Handling

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).

This can be easily caught using the with_fallback method. We recommend to always work with fallbacks.

Zaikio::Directory.with_token(token) do
  Zaikio::Procurement::MaterialRequirement.with_fallback.find("7cbf51bd-35a8-47a1-84a2-57aa63140234") # => nil
  Zaikio::Procurement::MaterialRequirement.with_fallback.all # Automatically uses empty array as fallback
end