printavo-ruby 0.10.0 → 0.11.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: 5c7c947ef3f0582fd5c30b1aa44f69cfdc2ba135ac4b5b616db3fc5c63615322
4
- data.tar.gz: 664d2cafd355a83630af29c9902cf89dc2af838694cb91cc6ba182603d115a92
3
+ metadata.gz: 61a636be4f585024b3fab02968db29676052b9228c952c936ebcf67249349258
4
+ data.tar.gz: d12592575eaf1d5b9a88babc9dfc4bc86474222c54a9cc5c394e6e8c8b91143e
5
5
  SHA512:
6
- metadata.gz: 7e321c541a352c6ae3983682c03406ca80725499d2014bcfcc6cda1f8f2a8654f4aba9dc25452c7da7225a993ef205f0d698b23f5dfd68396b0f6add13070f27
7
- data.tar.gz: 3182ba400910bc9de615ce19944bbac0b027b80874e35a364e2c64c476d383e86bbed46b501cd0d602dd06c49aa3a20b242f7d510261c734c56649301475e301
6
+ metadata.gz: 6aa7d1e5b343728409ca0b3082c9ec9480865b69ecb5db3713cade7c9db897bf2d3bc02571eca4e1a31e4e7f98763955482726c426923f1692d380d972f0e511
7
+ data.tar.gz: 5a14a8ec04f1e8bff553540135077564d9c0e21c58c5e39a93454d70ef36a14512b2b2e75eacd0b068876ad5ca4491c70653b82c45ed205c9e59cd5c94ee49f8
data/docs/CHANGELOG.md CHANGED
@@ -6,6 +6,23 @@ All notable changes to this project will be documented in this file.
6
6
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
7
7
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
8
8
 
9
+ ## [0.11.0] - 2026-03-31
10
+
11
+ ### Added
12
+ - `Printavo::ApprovalRequest` model (`id`, `status`, `sent_at`, `expires_at`, `contact` — returns `Printavo::Contact`)
13
+ - `ApprovalRequests` resource: `all(order_id:)`, `find(id)`, `create(**input)`,
14
+ `approve(id)`, `revoke(id)`, `unapprove(id)` — action mutations return updated `ApprovalRequest`
15
+ - `Printavo::PresetTask` model (`id`, `body`, `due_offset_days`, `assignee`)
16
+ - `PresetTasks` resource: `find(id)`, `create(**input)`, `update(id, **input)`, `delete(id)` —
17
+ no standalone listing; preset tasks are accessed via `PresetTaskGroup#tasks`
18
+ - `Printavo::PresetTaskGroup` model (`id`, `name`, `tasks` — returns `[PresetTask]`)
19
+ - `PresetTaskGroups` resource: `all`, `find(id)`, `create(**input)`, `update(id, **input)`,
20
+ `delete(id)`, `apply(id, order_id:)` — `apply` returns `[Printavo::Task]` (live tasks created on the order)
21
+ - `client.approval_requests`, `client.preset_task_groups`, `client.preset_tasks`
22
+ entry points on `Printavo::Client`
23
+ - 16 new `.graphql` files under `lib/printavo/graphql/`
24
+ - 2 new factory files: `spec/support/factories/approval_request.rb`, `spec/support/factories/preset_task.rb`
25
+
9
26
  ## [0.10.0] - 2026-03-31
10
27
 
11
28
  ### Added
data/docs/TODO.md CHANGED
@@ -147,14 +147,14 @@ return values — they are exposed via model field accessors, not separate resou
147
147
 
148
148
  ---
149
149
 
150
- ### Approvals
150
+ ### Approvals
151
151
 
152
- - [ ] `Printavo::ApprovalRequest` model (`id`, `status`, `sentAt`, `expiresAt`, `contact`)
153
- - [ ] `ApprovalRequests` resource: `all(order_id:)`, `find(id)`
154
- - [ ] `approvalRequestCreate` mutation
155
- - [ ] `approvalRequestApprove(id:)` mutation
156
- - [ ] `approvalRequestRevoke(id:)` mutation
157
- - [ ] `approvalRequestUnapprove(id:)` mutation
152
+ - [x] `Printavo::ApprovalRequest` model (`id`, `status`, `sent_at`, `expires_at`, `contact`)
153
+ - [x] `ApprovalRequests` resource: `all(order_id:)`, `find(id)`
154
+ - [x] `approvalRequestCreate` mutation
155
+ - [x] `approvalRequestApprove(id:)` mutation
156
+ - [x] `approvalRequestRevoke(id:)` mutation
157
+ - [x] `approvalRequestUnapprove(id:)` mutation
158
158
 
159
159
  ### Categories ✅
160
160
 
@@ -254,15 +254,15 @@ return values — they are exposed via model field accessors, not separate resou
254
254
  - [x] `PaymentTerms` resource: `all`, `find(id)`, `create`, `update`, `archive`
255
255
  - [x] `paymentTermCreate`, `paymentTermUpdate`, `paymentTermArchive` mutations
256
256
 
257
- ### Preset Tasks
257
+ ### Preset Tasks
258
258
 
259
- - [ ] `Printavo::PresetTask` model (`id`, `body`, `dueOffsetDays`, `assignee`)
260
- - [ ] `Printavo::PresetTaskGroup` model (`id`, `name`, `tasks`)
261
- - [ ] `PresetTasks` resource: `find(id)`, `create`, `update`, `delete`
262
- - [ ] `presetTaskCreate`, `presetTaskUpdate`, `presetTaskDelete` mutations
263
- - [ ] `PresetTaskGroups` resource: `all`, `find(id)`, `create`, `update`, `delete`, `apply`
264
- - [ ] `presetTaskGroupCreate`, `presetTaskGroupUpdate`, `presetTaskGroupDelete` mutations
265
- - [ ] `presetTaskGroupApply(id:, order_id:)` mutation — applies a group to an order
259
+ - [x] `Printavo::PresetTask` model (`id`, `body`, `due_offset_days`, `assignee`)
260
+ - [x] `Printavo::PresetTaskGroup` model (`id`, `name`, `tasks`)
261
+ - [x] `PresetTasks` resource: `find(id)`, `create`, `update`, `delete`
262
+ - [x] `presetTaskCreate`, `presetTaskUpdate`, `presetTaskDelete` mutations
263
+ - [x] `PresetTaskGroups` resource: `all`, `find(id)`, `create`, `update`, `delete`, `apply`
264
+ - [x] `presetTaskGroupCreate`, `presetTaskGroupUpdate`, `presetTaskGroupDelete` mutations
265
+ - [x] `presetTaskGroupApply(id:, order_id:)` mutation — applies a group to an order
266
266
 
267
267
  ### Product Catalog & Pricing ✅
268
268
 
@@ -343,11 +343,11 @@ return values — they are exposed via model field accessors, not separate resou
343
343
  - [x] `PaymentRequests` resource (`all`, `find`, `create`, `delete`)
344
344
  - [x] `PaymentTerms` resource (`all`, `find`, `create`, `update`, `archive`)
345
345
 
346
- ### v0.11.0 — Workflow: Approvals & Preset Tasks
346
+ ### v0.11.0 — Workflow: Approvals & Preset Tasks
347
347
 
348
- - [ ] `ApprovalRequests` resource (`all`, `find`, `create`, `approve`, `revoke`, `unapprove`)
349
- - [ ] `PresetTasks` resource (`find`, `create`, `update`, `delete`)
350
- - [ ] `PresetTaskGroups` resource (`all`, `find`, `create`, `update`, `delete`, `apply`)
348
+ - [x] `ApprovalRequests` resource (`all`, `find`, `create`, `approve`, `revoke`, `unapprove`)
349
+ - [x] `PresetTasks` resource (`find`, `create`, `update`, `delete`)
350
+ - [x] `PresetTaskGroups` resource (`all`, `find`, `create`, `update`, `delete`, `apply`)
351
351
 
352
352
  ### v0.12.0 — Files, Media & Communication
353
353
 
@@ -29,6 +29,10 @@ module Printavo
29
29
  Resources::Account.new(@graphql)
30
30
  end
31
31
 
32
+ def approval_requests
33
+ Resources::ApprovalRequests.new(@graphql)
34
+ end
35
+
32
36
  def categories
33
37
  Resources::Categories.new(@graphql)
34
38
  end
@@ -109,6 +113,14 @@ module Printavo
109
113
  Resources::Payments.new(@graphql)
110
114
  end
111
115
 
116
+ def preset_task_groups
117
+ Resources::PresetTaskGroups.new(@graphql)
118
+ end
119
+
120
+ def preset_tasks
121
+ Resources::PresetTasks.new(@graphql)
122
+ end
123
+
112
124
  def pricing_matrices
113
125
  Resources::PricingMatrices.new(@graphql)
114
126
  end
@@ -0,0 +1,12 @@
1
+ # lib/printavo/models/approval_request.rb
2
+ # frozen_string_literal: true
3
+
4
+ module Printavo
5
+ class ApprovalRequest < Models::Base
6
+ def id = self['id']
7
+ def status = self['status']
8
+ def sent_at = self['sentAt']
9
+ def expires_at = self['expiresAt']
10
+ def contact = self['contact'] && Contact.new(self['contact'])
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ # lib/printavo/models/preset_task.rb
2
+ # frozen_string_literal: true
3
+
4
+ module Printavo
5
+ class PresetTask < Models::Base
6
+ def id = self['id']
7
+ def body = self['body']
8
+ def due_offset_days = self['dueOffsetDays']
9
+ def assignee = self['assignee']
10
+ end
11
+ end
@@ -0,0 +1,10 @@
1
+ # lib/printavo/models/preset_task_group.rb
2
+ # frozen_string_literal: true
3
+
4
+ module Printavo
5
+ class PresetTaskGroup < Models::Base
6
+ def id = self['id']
7
+ def name = self['name']
8
+ def tasks = Array(self['tasks']).map { |attrs| PresetTask.new(attrs) }
9
+ end
10
+ end
@@ -0,0 +1,60 @@
1
+ # lib/printavo/resources/approval_requests.rb
2
+ # frozen_string_literal: true
3
+
4
+ module Printavo
5
+ module Resources
6
+ class ApprovalRequests < Base
7
+ ALL_QUERY = File.read(File.join(__dir__, '../graphql/approval_requests/all.graphql')).freeze
8
+ FIND_QUERY = File.read(File.join(__dir__, '../graphql/approval_requests/find.graphql')).freeze
9
+ CREATE_MUTATION = File.read(File.join(__dir__, '../graphql/approval_requests/create.graphql')).freeze
10
+ APPROVE_MUTATION = File.read(File.join(__dir__, '../graphql/approval_requests/approve.graphql')).freeze
11
+ REVOKE_MUTATION = File.read(File.join(__dir__, '../graphql/approval_requests/revoke.graphql')).freeze
12
+ UNAPPROVE_MUTATION = File.read(File.join(__dir__, '../graphql/approval_requests/unapprove.graphql')).freeze
13
+
14
+ def all(order_id:, first: 25, after: nil)
15
+ fetch_page(order_id: order_id, first: first, after: after).records
16
+ end
17
+
18
+ def find(id)
19
+ data = @graphql.query(FIND_QUERY, variables: { id: id.to_s })
20
+ Printavo::ApprovalRequest.new(data['approvalRequest'])
21
+ end
22
+
23
+ def create(**input)
24
+ data = @graphql.mutate(CREATE_MUTATION, variables: { input: camelize_keys(input) })
25
+ Printavo::ApprovalRequest.new(data['approvalRequestCreate'])
26
+ end
27
+
28
+ def approve(id)
29
+ data = @graphql.mutate(APPROVE_MUTATION, variables: { id: id.to_s })
30
+ Printavo::ApprovalRequest.new(data['approvalRequestApprove'])
31
+ end
32
+
33
+ def revoke(id)
34
+ data = @graphql.mutate(REVOKE_MUTATION, variables: { id: id.to_s })
35
+ Printavo::ApprovalRequest.new(data['approvalRequestRevoke'])
36
+ end
37
+
38
+ def unapprove(id)
39
+ data = @graphql.mutate(UNAPPROVE_MUTATION, variables: { id: id.to_s })
40
+ Printavo::ApprovalRequest.new(data['approvalRequestUnapprove'])
41
+ end
42
+
43
+ private
44
+
45
+ def fetch_page(order_id:, first: 25, after: nil, **)
46
+ data = @graphql.query(
47
+ ALL_QUERY,
48
+ variables: { orderId: order_id.to_s, first: first, after: after }
49
+ )
50
+ nodes = data['order']['approvalRequests']['nodes'].map { |attrs| Printavo::ApprovalRequest.new(attrs) }
51
+ page_info = data['order']['approvalRequests']['pageInfo']
52
+ Printavo::Page.new(
53
+ records: nodes,
54
+ has_next_page: page_info['hasNextPage'],
55
+ end_cursor: page_info['endCursor']
56
+ )
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,57 @@
1
+ # lib/printavo/resources/preset_task_groups.rb
2
+ # frozen_string_literal: true
3
+
4
+ module Printavo
5
+ module Resources
6
+ class PresetTaskGroups < Base
7
+ ALL_QUERY = File.read(File.join(__dir__, '../graphql/preset_task_groups/all.graphql')).freeze
8
+ FIND_QUERY = File.read(File.join(__dir__, '../graphql/preset_task_groups/find.graphql')).freeze
9
+ CREATE_MUTATION = File.read(File.join(__dir__, '../graphql/preset_task_groups/create.graphql')).freeze
10
+ UPDATE_MUTATION = File.read(File.join(__dir__, '../graphql/preset_task_groups/update.graphql')).freeze
11
+ DELETE_MUTATION = File.read(File.join(__dir__, '../graphql/preset_task_groups/delete.graphql')).freeze
12
+ APPLY_MUTATION = File.read(File.join(__dir__, '../graphql/preset_task_groups/apply.graphql')).freeze
13
+
14
+ def all(first: 25, after: nil)
15
+ fetch_page(first: first, after: after).records
16
+ end
17
+
18
+ def find(id)
19
+ data = @graphql.query(FIND_QUERY, variables: { id: id.to_s })
20
+ Printavo::PresetTaskGroup.new(data['presetTaskGroup'])
21
+ end
22
+
23
+ def create(**input)
24
+ data = @graphql.mutate(CREATE_MUTATION, variables: { input: camelize_keys(input) })
25
+ Printavo::PresetTaskGroup.new(data['presetTaskGroupCreate'])
26
+ end
27
+
28
+ def update(id, **input)
29
+ data = @graphql.mutate(UPDATE_MUTATION, variables: { id: id.to_s, input: camelize_keys(input) })
30
+ Printavo::PresetTaskGroup.new(data['presetTaskGroupUpdate'])
31
+ end
32
+
33
+ def delete(id)
34
+ @graphql.mutate(DELETE_MUTATION, variables: { id: id.to_s })
35
+ nil
36
+ end
37
+
38
+ def apply(id, order_id:)
39
+ data = @graphql.mutate(APPLY_MUTATION, variables: { id: id.to_s, orderId: order_id.to_s })
40
+ data['presetTaskGroupApply'].map { |attrs| Printavo::Task.new(attrs) }
41
+ end
42
+
43
+ private
44
+
45
+ def fetch_page(first: 25, after: nil, **)
46
+ data = @graphql.query(ALL_QUERY, variables: { first: first, after: after })
47
+ nodes = data['presetTaskGroups']['nodes'].map { |attrs| Printavo::PresetTaskGroup.new(attrs) }
48
+ page_info = data['presetTaskGroups']['pageInfo']
49
+ Printavo::Page.new(
50
+ records: nodes,
51
+ has_next_page: page_info['hasNextPage'],
52
+ end_cursor: page_info['endCursor']
53
+ )
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,33 @@
1
+ # lib/printavo/resources/preset_tasks.rb
2
+ # frozen_string_literal: true
3
+
4
+ module Printavo
5
+ module Resources
6
+ class PresetTasks < Base
7
+ FIND_QUERY = File.read(File.join(__dir__, '../graphql/preset_tasks/find.graphql')).freeze
8
+ CREATE_MUTATION = File.read(File.join(__dir__, '../graphql/preset_tasks/create.graphql')).freeze
9
+ UPDATE_MUTATION = File.read(File.join(__dir__, '../graphql/preset_tasks/update.graphql')).freeze
10
+ DELETE_MUTATION = File.read(File.join(__dir__, '../graphql/preset_tasks/delete.graphql')).freeze
11
+
12
+ def find(id)
13
+ data = @graphql.query(FIND_QUERY, variables: { id: id.to_s })
14
+ Printavo::PresetTask.new(data['presetTask'])
15
+ end
16
+
17
+ def create(**input)
18
+ data = @graphql.mutate(CREATE_MUTATION, variables: { input: camelize_keys(input) })
19
+ Printavo::PresetTask.new(data['presetTaskCreate'])
20
+ end
21
+
22
+ def update(id, **input)
23
+ data = @graphql.mutate(UPDATE_MUTATION, variables: { id: id.to_s, input: camelize_keys(input) })
24
+ Printavo::PresetTask.new(data['presetTaskUpdate'])
25
+ end
26
+
27
+ def delete(id)
28
+ @graphql.mutate(DELETE_MUTATION, variables: { id: id.to_s })
29
+ nil
30
+ end
31
+ end
32
+ end
33
+ end
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Printavo
5
- VERSION = '0.10.0'
5
+ VERSION = '0.11.0'
6
6
  end
data/lib/printavo.rb CHANGED
@@ -13,6 +13,7 @@ require_relative 'printavo/graphql_client'
13
13
  require_relative 'printavo/page'
14
14
  require_relative 'printavo/models/base'
15
15
  require_relative 'printavo/models/account'
16
+ require_relative 'printavo/models/approval_request'
16
17
  require_relative 'printavo/models/category'
17
18
  require_relative 'printavo/models/contact'
18
19
  require_relative 'printavo/models/customer'
@@ -30,6 +31,8 @@ require_relative 'printavo/models/order'
30
31
  require_relative 'printavo/models/payment'
31
32
  require_relative 'printavo/models/payment_request'
32
33
  require_relative 'printavo/models/payment_term'
34
+ require_relative 'printavo/models/preset_task'
35
+ require_relative 'printavo/models/preset_task_group'
33
36
  require_relative 'printavo/models/pricing_matrix'
34
37
  require_relative 'printavo/models/product'
35
38
  require_relative 'printavo/models/status'
@@ -39,6 +42,7 @@ require_relative 'printavo/models/transaction'
39
42
  require_relative 'printavo/models/transaction_payment'
40
43
  require_relative 'printavo/resources/base'
41
44
  require_relative 'printavo/resources/account'
45
+ require_relative 'printavo/resources/approval_requests'
42
46
  require_relative 'printavo/resources/categories'
43
47
  require_relative 'printavo/resources/contacts'
44
48
  require_relative 'printavo/resources/customers'
@@ -56,6 +60,8 @@ require_relative 'printavo/resources/orders'
56
60
  require_relative 'printavo/resources/payment_requests'
57
61
  require_relative 'printavo/resources/payment_terms'
58
62
  require_relative 'printavo/resources/payments'
63
+ require_relative 'printavo/resources/preset_task_groups'
64
+ require_relative 'printavo/resources/preset_tasks'
59
65
  require_relative 'printavo/resources/pricing_matrices'
60
66
  require_relative 'printavo/resources/products'
61
67
  require_relative 'printavo/resources/statuses'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: printavo-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.0
4
+ version: 0.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stan Carver II
@@ -273,6 +273,7 @@ files:
273
273
  - lib/printavo/errors.rb
274
274
  - lib/printavo/graphql_client.rb
275
275
  - lib/printavo/models/account.rb
276
+ - lib/printavo/models/approval_request.rb
276
277
  - lib/printavo/models/base.rb
277
278
  - lib/printavo/models/category.rb
278
279
  - lib/printavo/models/contact.rb
@@ -291,6 +292,8 @@ files:
291
292
  - lib/printavo/models/payment.rb
292
293
  - lib/printavo/models/payment_request.rb
293
294
  - lib/printavo/models/payment_term.rb
295
+ - lib/printavo/models/preset_task.rb
296
+ - lib/printavo/models/preset_task_group.rb
294
297
  - lib/printavo/models/pricing_matrix.rb
295
298
  - lib/printavo/models/product.rb
296
299
  - lib/printavo/models/status.rb
@@ -300,6 +303,7 @@ files:
300
303
  - lib/printavo/models/transaction_payment.rb
301
304
  - lib/printavo/page.rb
302
305
  - lib/printavo/resources/account.rb
306
+ - lib/printavo/resources/approval_requests.rb
303
307
  - lib/printavo/resources/base.rb
304
308
  - lib/printavo/resources/categories.rb
305
309
  - lib/printavo/resources/contacts.rb
@@ -318,6 +322,8 @@ files:
318
322
  - lib/printavo/resources/payment_requests.rb
319
323
  - lib/printavo/resources/payment_terms.rb
320
324
  - lib/printavo/resources/payments.rb
325
+ - lib/printavo/resources/preset_task_groups.rb
326
+ - lib/printavo/resources/preset_tasks.rb
321
327
  - lib/printavo/resources/pricing_matrices.rb
322
328
  - lib/printavo/resources/products.rb
323
329
  - lib/printavo/resources/statuses.rb