erp_integration 0.26.0 → 0.27.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '0820135e4a0b603c15f4e46615a3682c229f415ac5f9023b6a8c8fdd118f2471'
4
- data.tar.gz: e7a1cdb300cebb0c9005823160ccfc54162eb27b4037b427a391f79ce21cc822
3
+ metadata.gz: af2d7c35bd0582dd14abd43703dfe8eaff596501a17e19d6b600ab7b77771437
4
+ data.tar.gz: d42c0df0a66e21e1b51e64da1761cd774d30bde60a273e5eda2fe907871405cf
5
5
  SHA512:
6
- metadata.gz: f225c537e56518eab0d9356b965802a074ab67995ff0ee3aaabc23eafd383094c6eb0650add2589496fb9dbcbe9810cefec1677b278d46363082850f931cf0ec
7
- data.tar.gz: 0d63e7169eb701247f5f89e0759de9f3a8f2a936a093e93b9cda449b9ba163e307010e0c25c059b9932935ca344e8d33613c2a669538a5ed49256bcb4747ae2e
6
+ metadata.gz: e9c61186614433de65b90c79eabed2980d44447c7b7f1dc7416960ad7d40f6ce92768fb7f81d9024cea3707dac48b0007f63d17c74b104fd112f2ce0dcf3c161
7
+ data.tar.gz: bec060c2f626b39e375561e4c19453e359243158877a10f12baf570aab10ae218ef9d30e9422178a704c54f9e2015ad7bcfb9f9cd0c13516af178cb1dcaa6259
@@ -8,6 +8,16 @@ module ErpIntegration
8
8
  class SalesOrder < ApiResource
9
9
  self.model_name = 'sale.sale'
10
10
 
11
+ class MissingIdempotencyKey < ErpIntegration::Error
12
+ def initialize
13
+ super(
14
+ '[ERP Integration] Missing the required reference attribute. ' \
15
+ 'Setting the reference prevents Fulfil from processing the same sales ' \
16
+ "order twice. For this reason, it's required to provide it as a safeguard."
17
+ )
18
+ end
19
+ end
20
+
11
21
  # Allows cancelling the entire sales order in Fulfil.
12
22
  # @param id [Integer|String] The ID of the to be cancelled order.
13
23
  # @return [boolean] Whether the sales order was cancelled successfully or not.
@@ -29,25 +39,6 @@ module ErpIntegration
29
39
  true
30
40
  end
31
41
 
32
- def return!(id, options)
33
- client.put("model/sale.sale/#{id}/return_order", options)
34
- rescue ErpIntegration::HttpError::BadRequest
35
- false
36
- end
37
-
38
- # Allows duplicating the entire sales order in Fulfil.
39
- # @param id [Integer|String] The ID of the to be duplicated order.
40
- # @return [Array|boolean] Whether the sales order was duplicated successfully or not.
41
- def duplicate(id)
42
- duplicated_order_id = client.put("model/sale.sale/#{id}/copy").first
43
- ErpIntegration::SalesOrder.new(id: duplicated_order_id)
44
-
45
- # Fulfil will return an 400 (a.k.a. "Bad Request") status code when a sales order couldn't
46
- # be duplicated.
47
- rescue ErpIntegration::HttpError::BadRequest
48
- false
49
- end
50
-
51
42
  # Confirm the order on Fulfil.
52
43
  # @param id [Integer|String] The ID of the to be confirmed order.
53
44
  # @return [boolean] Whether the sales order was confirmed successfully or not.
@@ -66,6 +57,45 @@ module ErpIntegration
66
57
  true
67
58
  end
68
59
 
60
+ # Creates the sales order in one API call in Fulfil.
61
+ #
62
+ # Fulfil allows two ways of creating a new sales order. Through their
63
+ # regular/generic API endpoint just like any other resource or through the
64
+ # sales channel.
65
+ #
66
+ # The benefit of using the Sales Channel route is it allows creating the sales
67
+ #
68
+ # @see https://developers.fulfil.io/guides/creating-orders/#create-order-api
69
+ #
70
+ # The sales order number is used as an idempotency key for Fulfil to prevent
71
+ # sales orders from being processed twice. Due to that it's a required attribute.
72
+ #
73
+ # @see https://developers.fulfil.io/guides/creating-orders/#channel_identifier
74
+ #
75
+ # @param sales_channel [String, Integer] The ID of the sales channel in Fulfil.
76
+ # @param attributes [Hash] The attributes of the sales order
77
+ # @return [ErpIntegration::SalesOrder]
78
+ def create_for(sales_channel, attributes:)
79
+ raise MissingIdempotencyKey if attributes['reference'].blank? && attributes[:reference].blank?
80
+
81
+ ErpIntegration::SalesOrder.new(
82
+ client.put("model/sale.channel/#{sales_channel}/create_order", [attributes])
83
+ )
84
+ end
85
+
86
+ # Allows duplicating the entire sales order in Fulfil.
87
+ # @param id [Integer|String] The ID of the to be duplicated order.
88
+ # @return [Array|boolean] Whether the sales order was duplicated successfully or not.
89
+ def duplicate(id)
90
+ duplicated_order_id = client.put("model/sale.sale/#{id}/copy").first
91
+ ErpIntegration::SalesOrder.new(id: duplicated_order_id)
92
+
93
+ # Fulfil will return an 400 (a.k.a. "Bad Request") status code when a sales order couldn't
94
+ # be duplicated.
95
+ rescue ErpIntegration::HttpError::BadRequest
96
+ false
97
+ end
98
+
69
99
  # Process the order on Fulfil.
70
100
  # @param id [Integer|String] The ID of the to be processed order.
71
101
  # @return [boolean] Whether the sales order was processed successfully or not.
@@ -83,6 +113,16 @@ module ErpIntegration
83
113
  rescue Faraday::ParsingError
84
114
  true
85
115
  end
116
+
117
+ # Creates a return order in Fulfil.
118
+ #
119
+ # @param id [Integer, String] The ID of the sales order
120
+ # @param options [Hash] The attributes needed for the return.
121
+ def return!(id, options)
122
+ client.put("model/sale.sale/#{id}/return_order", options)
123
+ rescue ErpIntegration::HttpError::BadRequest
124
+ false
125
+ end
86
126
  end
87
127
  end
88
128
  end
@@ -80,12 +80,14 @@ module ErpIntegration
80
80
  # Due to `method_missing` we're able to delegate all the work automatically
81
81
  # to the adapter. However, if the method doesn't exist on the adapter, the
82
82
  # `NoMethodError` is still being raised.
83
+ #
83
84
  # @param method_name [Symbol] The name of the missing method.
84
- # @param args [Array] The list of arguments for the missing method.
85
+ # @param args [Array] The list of positional arguments for the missing method.
86
+ # @param kwargs [Hash] The list of arguments for the missing method.
85
87
  # @param block [Proc] Any block given to the missing method.
86
- def method_missing(method_name, *args, &block)
88
+ def method_missing(method_name, *args, **kwargs, &block)
87
89
  if adapter.respond_to?(method_name)
88
- adapter.send(method_name, *args, &block)
90
+ adapter.send(method_name, *args, **kwargs, &block)
89
91
  else
90
92
  super
91
93
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ErpIntegration
4
- VERSION = '0.26.0'
4
+ VERSION = '0.27.0'
5
5
  end
@@ -3,6 +3,7 @@
3
3
  require 'active_support'
4
4
  require 'active_support/core_ext/string/inflections'
5
5
  require 'active_support/core_ext/module/delegation' # Allows using `delegate`
6
+ require 'active_support/core_ext/object/blank'
6
7
  require 'faraday'
7
8
  require 'faraday_middleware'
8
9
  require 'json'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: erp_integration
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.26.0
4
+ version: 0.27.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stefan Vermaas
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-03-23 00:00:00.000000000 Z
11
+ date: 2023-03-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport