erp_integration 0.17.0 → 0.19.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: 18ec55a600cfb88679e7c8ac4a8e397cd304312a5f85a7c2e54d63307d7c86ff
4
- data.tar.gz: 106c3c7f314668d09bb8589d1ea5243e4586a705871f891edf95efd0d9228028
3
+ metadata.gz: 07ca72811d7f1eb2659d9161890f3a43ce8b773e9637e55dea2e7c0f5b6d8d44
4
+ data.tar.gz: 7ab55ad7cf24cbbf761e344f5a8a4a91fca2110637f28112d47ce49a0b11e639
5
5
  SHA512:
6
- metadata.gz: 9b8cd54866c82420eed9237a40d8d668494763ed7ef15ac588a15d73260e163eb416a1fb8bc316cd4e08624dddfc70a99e99b3056b046ed4ebb0601298ae0728
7
- data.tar.gz: 90e3145efef13b1d5f6307dd75a74811604cc2766f643970847d3570ff7dcba62fa11c252590b94d9f43f46df2b42352e1de754cf3a55a17f2472ce89a8fc980
6
+ metadata.gz: cb0053f0c8d31c3e3fd003aa9c65e141be176f4f60c787a132ffd3dc16300ecdca01be39e2b2c4e7897f5120464957979ab052139e4a381033e5f1467860bedd
7
+ data.tar.gz: 9987a496c6ee7bbd02f5faa92f3fb93172544ee999444d9f2851bbc30cbb59b3fe1ca10b424187f27e553eb0fd947ebe6118190546e167679c0166e4f840f9e5
@@ -2,6 +2,7 @@
2
2
 
3
3
  require_relative 'context'
4
4
  require_relative 'finder_methods'
5
+ require_relative 'pagination_methods'
5
6
  require_relative 'persistence'
6
7
  require_relative 'query_methods'
7
8
 
@@ -11,6 +12,7 @@ module ErpIntegration
11
12
  include Context
12
13
  include Enumerable
13
14
  include FinderMethods
15
+ include PaginationMethods
14
16
  include Persistence
15
17
  include QueryMethods
16
18
 
@@ -63,10 +65,35 @@ module ErpIntegration
63
65
  @results =
64
66
  client.put(
65
67
  api_resource_path,
66
- Query.new(selected_fields, where_clauses, or_clauses)
68
+ Query.new(
69
+ fields: selected_fields,
70
+ filters: where_clauses,
71
+ alternative_filters: or_clauses,
72
+ offset: offset_clause,
73
+ limit: limit_clause
74
+ )
67
75
  ).map { |item| resource_klass.new(item) }
68
76
  end
69
77
 
78
+ # As with the `all` method, the `query methods` lazyly build a search/read
79
+ # or search/count query for Fulfil.
80
+ # By calling `count`, the prepared search/count will actually be executed and
81
+ # the result will be fetched
82
+ # @return [Integer] The count of records that match with the query in Fulfil
83
+ def count
84
+ return @count if defined?(@count)
85
+
86
+ @count =
87
+ client.put(
88
+ "model/#{model_name}/search_count",
89
+ Query.new(
90
+ fields: nil,
91
+ filters: where_clauses,
92
+ alternative_filters: or_clauses
93
+ ).to_h.except(:fields, :offset, :limit)
94
+ )
95
+ end
96
+
70
97
  # The `each` method turns the `ApiResource` instance into an enumerable object.
71
98
  # For more information, see https://ruby-doc.org/core-3.0.2/Enumerable.html
72
99
  def each(&block)
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ErpIntegration
4
+ module Fulfil
5
+ module PaginationMethods
6
+ DEFAULT_OFFSET = 0
7
+ MAX_LIMIT = 500 # Max limit set by FF
8
+
9
+ attr_accessor :offset_clause, :limit_clause
10
+
11
+ # Fulfil by default is returning us the first 500 records on every query that we made.
12
+ # The `offset` method, as the name sais, will allow us to move the offset of the results.
13
+ # @example
14
+ # $ ErpIntegration::SalesOrder.offset(10).all
15
+ # # => <ErpIntegration::Fulfil::Collection @items=[<ErpIntegration::SalesOrder @offset=10 />] />
16
+ def offset(offset)
17
+ self.offset_clause = offset
18
+
19
+ self
20
+ end
21
+
22
+ # Fulfil by default is returning us the first 500 records on every query that we made.
23
+ # The `limit` method will allow us to modify the amount of records that we want to receive.
24
+ # @example
25
+ # $ ErpIntegration::SalesOrder.limit(5).all
26
+ # # => <ErpIntegration::Fulfil::Collection @items=[<ErpIntegration::SalesOrder @limit=5 />] />
27
+ def limit(limit)
28
+ self.limit_clause = [limit, MAX_LIMIT].min
29
+
30
+ self
31
+ end
32
+ end
33
+ end
34
+ end
@@ -18,22 +18,32 @@ module ErpIntegration
18
18
  # @example
19
19
  # Faraday.post("/api-endpoint", Query.new([:id, 'product.id'], [WhereClause.new(key: :id, value: 100)]))
20
20
  class Query
21
- attr_reader :fields, :filters
21
+ delegate :to_json, to: :to_h
22
+
23
+ attr_reader :fields, :filters, :offset, :limit
24
+
22
25
  DEFAULT_FIELDS = %w[id].freeze
23
26
 
24
27
  # @param fields [Array<String|Symbol>] A list of fields for Fulfil.
25
28
  # @param filters [Array<WhereClause>] A list of where clauses for Fulfil.
26
- def initialize(fields, filters, alternative_filters = [])
29
+ # @param alternative_filters [Array<OrClause>] A list of or clauses for Fulfil.
30
+ # @param offset [Integer] Offset for pagination.
31
+ # @param limit [Integer] Limit for pagination.
32
+ def initialize(fields:, filters:, alternative_filters: [], offset: nil, limit: nil)
27
33
  @fields = (fields || DEFAULT_FIELDS).map(&:to_s).uniq
28
34
  @filters = (filters || []).map(&:to_filter).uniq
29
35
  @filters += alternative_filters.map(&:to_filter).uniq if alternative_filters&.any?
36
+ @offset = offset
37
+ @limit = limit
30
38
  end
31
39
 
32
- def to_json(*_object)
40
+ def to_h
33
41
  {
34
42
  fields: @fields,
35
- filters: @filters
36
- }.to_json
43
+ filters: @filters,
44
+ offset: @offset,
45
+ limit: @limit
46
+ }
37
47
  end
38
48
  end
39
49
  end
@@ -71,12 +71,13 @@ module ErpIntegration
71
71
  end
72
72
 
73
73
  def where!(args)
74
+ domain = args.delete(:domain)
74
75
  comparison_operator = args.delete(:comparison_operator)
75
76
 
76
77
  args.each_pair do |key, value|
77
78
  self.where_clauses =
78
79
  (where_clauses || []) << WhereClause.new(
79
- key: key, value: value, comparison_operator: comparison_operator
80
+ key: key, value: value, domain: domain, comparison_operator: comparison_operator
80
81
  )
81
82
  end
82
83
 
@@ -124,6 +125,24 @@ module ErpIntegration
124
125
  self
125
126
  end
126
127
 
128
+ # The `where_domain` method provides an interface for querying resources
129
+ # in Fulfil when filtered attributes require specifying
130
+ # the name of the domain model in which they are located.
131
+ #
132
+ # @example
133
+ # $ ErpIntegration::SalesOrder.where_domain('stock.shipment.out', 'shipment.state': 'done').all
134
+ # # => <ErpIntegration::Fulfil::Collection @items=[<ErpIntegration::SalesOrder @id=100 />] />
135
+ #
136
+ # Adds the domain model name as a fourth argument to each filers parameter
137
+ #
138
+ # @example
139
+ # :filters=>[
140
+ # ['shipment.state', '=', 'done', 'stock.shipment.out']
141
+ # ]
142
+ def where_domain(domain, args)
143
+ where(args.merge!(domain: domain))
144
+ end
145
+
127
146
  def where_ilike(args)
128
147
  where(args.merge(comparison_operator: 'ilike'))
129
148
  end
@@ -23,16 +23,21 @@ module ErpIntegration
23
23
 
24
24
  DEFAULT_COMPARISON_OPERATOR = '='
25
25
 
26
- def initialize(key:, value:, comparison_operator: DEFAULT_COMPARISON_OPERATOR)
26
+ # @param key [String] The name of filtered attribute.
27
+ # @param value [String] The value by filtering will be performed.
28
+ # @param domain [String] The domain model name to specify filtering attributes location.
29
+ # @param comparison_operator [String] The way the key and the value are compared.
30
+ def initialize(key:, value:, domain: nil, comparison_operator: DEFAULT_COMPARISON_OPERATOR)
27
31
  @comparison_operator = verify_comparison_operator(comparison_operator)
28
32
  @key = key.to_s
29
33
  @value = value
34
+ @domain = domain
30
35
  end
31
36
 
32
37
  # Transforms the `WhereClause` into a filter object for Fulfil.
33
38
  # @return [Array<String>] The formatted filter for Fulfil.
34
39
  def to_filter
35
- [@key, @comparison_operator, @value]
40
+ [@key, @comparison_operator, @value, @domain].compact
36
41
  end
37
42
 
38
43
  # The `===` allows comparing different WhereClause objects. Under the hood,
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ErpIntegration
4
- VERSION = '0.17.0'
4
+ VERSION = '0.19.0'
5
5
  end
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.17.0
4
+ version: 0.19.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stefan Vermaas
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-01-12 00:00:00.000000000 Z
11
+ date: 2023-01-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -224,7 +224,7 @@ dependencies:
224
224
  - - '='
225
225
  - !ruby/object:Gem::Version
226
226
  version: 1.19.2
227
- description:
227
+ description:
228
228
  email:
229
229
  - stefan@knowndecimal.com
230
230
  executables: []
@@ -272,6 +272,7 @@ files:
272
272
  - lib/erp_integration/fulfil/context.rb
273
273
  - lib/erp_integration/fulfil/finder_methods.rb
274
274
  - lib/erp_integration/fulfil/or_clause.rb
275
+ - lib/erp_integration/fulfil/pagination_methods.rb
275
276
  - lib/erp_integration/fulfil/persistence.rb
276
277
  - lib/erp_integration/fulfil/query.rb
277
278
  - lib/erp_integration/fulfil/query_methods.rb
@@ -320,7 +321,7 @@ metadata:
320
321
  homepage_uri: https://www.github.com/mejuri-inc/erp-integration
321
322
  source_code_uri: https://www.github.com/mejuri-inc/erp-integration
322
323
  changelog_uri: https://www.github.com/mejuri-inc/erp-integration/blob/main/CHANGELOG.md
323
- post_install_message:
324
+ post_install_message:
324
325
  rdoc_options: []
325
326
  require_paths:
326
327
  - lib
@@ -335,8 +336,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
335
336
  - !ruby/object:Gem::Version
336
337
  version: '0'
337
338
  requirements: []
338
- rubygems_version: 3.3.7
339
- signing_key:
339
+ rubyforge_project:
340
+ rubygems_version: 2.7.11
341
+ signing_key:
340
342
  specification_version: 4
341
343
  summary: Connects Mejuri with third-party ERP vendors
342
344
  test_files: []