printavo-ruby 0.12.0 → 0.14.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: 07267da7ecd92123f50dab320f34dd59d32ceeb43a22421d561ec9adb92f04cb
4
- data.tar.gz: b30f9770630423fca2c7ec5f5d632b5e87c48447d34f485e1c4ce9bdccf88bf4
3
+ metadata.gz: b0c6bbdd1f2e7dec2d40c9c5386385083049aa9f7fdd71d97ff2d8c91e0256b0
4
+ data.tar.gz: fca9352dae13007b7a319ec7414cf0699b2169040cd0ad94fe5683adc9506676
5
5
  SHA512:
6
- metadata.gz: 2b2421014c3991017e1ed9a626680ab685bfc182af243e690959190d0ee2ee7d08aef65c77cb9f209a77a62a8807af67b4e4da3138270b616ec4042ab78f9228
7
- data.tar.gz: 5ed669d1ef3f544e92033862894868d567b2e8b53004f8d0c71a967acf8a1955bdfbbe3086316209b37b803be82e8dcc84fd8144200250bb397b2e857d773624
6
+ metadata.gz: 81dc61d793eb316a7e98ef4d89338229504c3f7be1c104fb24685ff108d7dc495270635a5413795b981c5e2377c3f74eb0bfe5cf86db1ca19a11afd1a09d4460
7
+ data.tar.gz: 1ab1cb1bf5d4950c615e407ff4008db7e07e200869a2aac5859cbbb3f8380a8d19f7dab8ea83a0eafb6f8225901cf6ca62e661816c3fe185269eb1141fb5a8dd
data/docs/CHANGELOG.md CHANGED
@@ -6,6 +6,37 @@ 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.14.0] - 2026-04-01
10
+
11
+ ### Added
12
+ - `Contacts#delete(id)` — `contactDelete` mutation
13
+ - `Customers#delete(id)` — `customerDelete` mutation
14
+ - `Inquiries#delete(id)` — `inquiryDelete` mutation
15
+ - `Invoices#delete(id)` — `invoiceDelete` mutation
16
+ - `Invoices#duplicate(id)` — `invoiceDuplicate` mutation; returns a new `Printavo::Invoice`
17
+ - `Orders#delete(id)` — `quoteDelete` mutation
18
+ - `Orders#duplicate(id)` — `quoteDuplicate` mutation; returns a new `Printavo::Order`
19
+ - 7 new `.graphql` files under `lib/printavo/graphql/`
20
+
21
+ ## [0.13.0] - 2026-03-31
22
+
23
+ ### Added
24
+ - `Printavo::User` model (`id`, `first_name`, `last_name`, `email`, `full_name`)
25
+ - `Users` resource: `all`, `find(id)` — shop staff members
26
+ - `Printavo::Vendor` model (`id`, `name`, `email`, `phone`)
27
+ - `Vendors` resource: `all`, `find(id)` — read-only
28
+ - `Printavo::ContractorProfile` model (`id`, `name`, `email`)
29
+ - `ContractorProfiles` resource: `all`, `find(id)`
30
+ - `Printavo::DeliveryMethod` model (`id`, `name`)
31
+ - `DeliveryMethods` resource: `all`, `find(id)`, `create(**input)`, `update(id, **input)`, `archive(id)`
32
+ - `deliveryMethodCreate`, `deliveryMethodUpdate`, `deliveryMethodArchive` mutations
33
+ - `Printavo::TypeOfWork` model (`id`, `name`)
34
+ - `TypesOfWork` resource: `all` — reference data for order categorization
35
+ - `client.contractor_profiles`, `client.delivery_methods`, `client.types_of_work`,
36
+ `client.users`, `client.vendors` entry points on `Printavo::Client`
37
+ - 11 new `.graphql` files under `lib/printavo/graphql/`
38
+ - 1 new factory file: `spec/support/factories/people.rb`
39
+
9
40
  ## [0.12.0] - 2026-03-31
10
41
 
11
42
  ### Added
data/docs/TODO.md CHANGED
@@ -52,13 +52,13 @@ Full task list for `printavo-ruby` across all versions. Checked items are shippe
52
52
  - [x] `Inquiries#update(id, **input)` — `inquiryUpdate`
53
53
  - [x] `camelize_keys` — snake_case → camelCase input conversion
54
54
  - [x] `build_customer` / `build_order` — mutation response normalization helpers
55
- - [ ] `Contacts#delete(id)` — `contactDelete`
56
- - [ ] `Customers#delete(id)` — `customerDelete`
57
- - [ ] `Inquiries#delete(id)` — `inquiryDelete`
58
- - [ ] `Invoices#delete(id)` — `invoiceDelete`
59
- - [ ] `Invoices#duplicate(id)` — `invoiceDuplicate`
60
- - [ ] `Orders#delete(id)` — `quoteDelete`
61
- - [ ] `Orders#duplicate(id)` — `quoteDuplicate`
55
+ - [x] `Contacts#delete(id)` — `contactDelete`
56
+ - [x] `Customers#delete(id)` — `customerDelete`
57
+ - [x] `Inquiries#delete(id)` — `inquiryDelete`
58
+ - [x] `Invoices#delete(id)` — `invoiceDelete`
59
+ - [x] `Invoices#duplicate(id)` — `invoiceDuplicate`
60
+ - [x] `Orders#delete(id)` — `quoteDelete`
61
+ - [x] `Orders#duplicate(id)` — `quoteDuplicate`
62
62
 
63
63
  ---
64
64
 
@@ -161,10 +161,10 @@ return values — they are exposed via model field accessors, not separate resou
161
161
  - [x] `Printavo::Category` model (`id`, `name`)
162
162
  - [x] `Categories` resource: `all`, `find(id)` — reference data for products/line items
163
163
 
164
- ### Contractor Profiles
164
+ ### Contractor Profiles
165
165
 
166
- - [ ] `Printavo::ContractorProfile` model (`id`, `name`, `email`)
167
- - [ ] `ContractorProfiles` resource: `all`, `find(id)` — contractors assignable to invoices
166
+ - [x] `Printavo::ContractorProfile` model (`id`, `name`, `email`)
167
+ - [x] `ContractorProfiles` resource: `all`, `find(id)` — contractors assignable to invoices
168
168
 
169
169
  ### Custom Addresses ✅
170
170
 
@@ -174,11 +174,11 @@ return values — they are exposed via model field accessors, not separate resou
174
174
  - [x] `customAddressUpdate` / `customAddressUpdates` (bulk) mutations
175
175
  - [x] `customAddressDelete` / `customAddressDeletes` (bulk) mutations
176
176
 
177
- ### Delivery Methods
177
+ ### Delivery Methods
178
178
 
179
- - [ ] `Printavo::DeliveryMethod` model (`id`, `name`)
180
- - [ ] `DeliveryMethods` resource: `all`, `find(id)`, `create`, `update`, `archive`
181
- - [ ] `deliveryMethodCreate`, `deliveryMethodUpdate`, `deliveryMethodArchive` mutations
179
+ - [x] `Printavo::DeliveryMethod` model (`id`, `name`)
180
+ - [x] `DeliveryMethods` resource: `all`, `find(id)`, `create`, `update`, `archive`
181
+ - [x] `deliveryMethodCreate`, `deliveryMethodUpdate`, `deliveryMethodArchive` mutations
182
182
 
183
183
  ### Email Templates ✅
184
184
 
@@ -292,20 +292,20 @@ return values — they are exposed via model field accessors, not separate resou
292
292
  - [x] `TransactionPayments` resource: `create`, `update`, `delete`
293
293
  - [x] `transactionPaymentCreate`, `transactionPaymentUpdate`, `transactionPaymentDelete` mutations
294
294
 
295
- ### Types of Work
295
+ ### Types of Work
296
296
 
297
- - [ ] `Printavo::TypeOfWork` model (`id`, `name`)
298
- - [ ] `TypesOfWork` resource: `all` — reference data for order categorization
297
+ - [x] `Printavo::TypeOfWork` model (`id`, `name`)
298
+ - [x] `TypesOfWork` resource: `all` — reference data for order categorization
299
299
 
300
- ### Users
300
+ ### Users
301
301
 
302
- - [ ] `Printavo::User` model (`id`, `firstName`, `lastName`, `email`, `avatar`, `permissions`)
303
- - [ ] `Users` resource: `all`, `find(id)` — shop staff members
302
+ - [x] `Printavo::User` model (`id`, `first_name`, `last_name`, `email`, `full_name`)
303
+ - [x] `Users` resource: `all`, `find(id)` — shop staff members
304
304
 
305
- ### Vendors
305
+ ### Vendors
306
306
 
307
- - [ ] `Printavo::Vendor` model (`id`, `name`, `email`, `phone`)
308
- - [ ] `Vendors` resource: `all`, `find(id)` — read-only; no create/update/delete in V2 API
307
+ - [x] `Printavo::Vendor` model (`id`, `name`, `email`, `phone`)
308
+ - [x] `Vendors` resource: `all`, `find(id)` — read-only; no create/update/delete in V2 API
309
309
 
310
310
  ---
311
311
 
@@ -356,23 +356,23 @@ return values — they are exposed via model field accessors, not separate resou
356
356
  - [x] `EmailTemplates` resource (`all`, `find`)
357
357
  - [x] `CustomAddresses` resource (`all`, `find`, `create`/`creates`, `update`/`updates`, `delete`/`deletes`)
358
358
 
359
- ### v0.13.0 — People, Orgs & Reference Data
359
+ ### v0.13.0 — People, Orgs & Reference Data
360
360
 
361
- - [ ] `Users` resource (`all`, `find`)
362
- - [ ] `Vendors` resource (`all`, `find`) — read-only
363
- - [ ] `ContractorProfiles` resource (`all`, `find`)
364
- - [ ] `DeliveryMethods` resource (`all`, `find`, `create`, `update`, `archive`)
365
- - [ ] `TypesOfWork` resource (`all`)
361
+ - [x] `Users` resource (`all`, `find`)
362
+ - [x] `Vendors` resource (`all`, `find`) — read-only
363
+ - [x] `ContractorProfiles` resource (`all`, `find`)
364
+ - [x] `DeliveryMethods` resource (`all`, `find`, `create`, `update`, `archive`)
365
+ - [x] `TypesOfWork` resource (`all`)
366
366
 
367
- ### v0.14.0 — Delete & Duplicate Mutations for Shipped Resources
367
+ ### v0.14.0 — Delete & Duplicate Mutations for Shipped Resources
368
368
 
369
- - [ ] `Contacts#delete` — `contactDelete`
370
- - [ ] `Customers#delete` — `customerDelete`
371
- - [ ] `Inquiries#delete` — `inquiryDelete`
372
- - [ ] `Invoices#delete` — `invoiceDelete`
373
- - [ ] `Invoices#duplicate` — `invoiceDuplicate`
374
- - [ ] `Orders#delete` — `quoteDelete`
375
- - [ ] `Orders#duplicate` — `quoteDuplicate`
369
+ - [x] `Contacts#delete` — `contactDelete`
370
+ - [x] `Customers#delete` — `customerDelete`
371
+ - [x] `Inquiries#delete` — `inquiryDelete`
372
+ - [x] `Invoices#delete` — `invoiceDelete`
373
+ - [x] `Invoices#duplicate` — `invoiceDuplicate`
374
+ - [x] `Orders#delete` — `quoteDelete`
375
+ - [x] `Orders#duplicate` — `quoteDuplicate`
376
376
 
377
377
  ### v0.15.0 — Retry / Backoff & CLI
378
378
 
@@ -41,6 +41,10 @@ module Printavo
41
41
  Resources::Contacts.new(@graphql)
42
42
  end
43
43
 
44
+ def contractor_profiles
45
+ Resources::ContractorProfiles.new(@graphql)
46
+ end
47
+
44
48
  def custom_addresses
45
49
  Resources::CustomAddresses.new(@graphql)
46
50
  end
@@ -49,6 +53,10 @@ module Printavo
49
53
  Resources::Customers.new(@graphql)
50
54
  end
51
55
 
56
+ def delivery_methods
57
+ Resources::DeliveryMethods.new(@graphql)
58
+ end
59
+
52
60
  def email_templates
53
61
  Resources::EmailTemplates.new(@graphql)
54
62
  end
@@ -164,5 +172,17 @@ module Printavo
164
172
  def transactions
165
173
  Resources::Transactions.new(@graphql)
166
174
  end
175
+
176
+ def types_of_work
177
+ Resources::TypesOfWork.new(@graphql)
178
+ end
179
+
180
+ def users
181
+ Resources::Users.new(@graphql)
182
+ end
183
+
184
+ def vendors
185
+ Resources::Vendors.new(@graphql)
186
+ end
167
187
  end
168
188
  end
@@ -0,0 +1,10 @@
1
+ # lib/printavo/models/contractor_profile.rb
2
+ # frozen_string_literal: true
3
+
4
+ module Printavo
5
+ class ContractorProfile < Models::Base
6
+ def id = self['id']
7
+ def name = self['name']
8
+ def email = self['email']
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ # lib/printavo/models/delivery_method.rb
2
+ # frozen_string_literal: true
3
+
4
+ module Printavo
5
+ class DeliveryMethod < Models::Base
6
+ def id = self['id']
7
+ def name = self['name']
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ # lib/printavo/models/type_of_work.rb
2
+ # frozen_string_literal: true
3
+
4
+ module Printavo
5
+ class TypeOfWork < Models::Base
6
+ def id = self['id']
7
+ def name = self['name']
8
+ end
9
+ end
@@ -0,0 +1,12 @@
1
+ # lib/printavo/models/user.rb
2
+ # frozen_string_literal: true
3
+
4
+ module Printavo
5
+ class User < Models::Base
6
+ def id = self['id']
7
+ def first_name = self['firstName']
8
+ def last_name = self['lastName']
9
+ def email = self['email']
10
+ def full_name = "#{first_name} #{last_name}".strip
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ # lib/printavo/models/vendor.rb
2
+ # frozen_string_literal: true
3
+
4
+ module Printavo
5
+ class Vendor < Models::Base
6
+ def id = self['id']
7
+ def name = self['name']
8
+ def email = self['email']
9
+ def phone = self['phone']
10
+ end
11
+ end
@@ -6,6 +6,7 @@ module Printavo
6
6
  class Contacts < Base
7
7
  FIND_QUERY = File.read(File.join(__dir__, '../graphql/contacts/find.graphql')).freeze
8
8
  CREATE_MUTATION = File.read(File.join(__dir__, '../graphql/contacts/create.graphql')).freeze
9
+ DELETE_MUTATION = File.read(File.join(__dir__, '../graphql/contacts/delete.graphql')).freeze
9
10
  UPDATE_MUTATION = File.read(File.join(__dir__, '../graphql/contacts/update.graphql')).freeze
10
11
 
11
12
  # Finds a contact by ID.
@@ -44,6 +45,18 @@ module Printavo
44
45
  variables: { id: id.to_s, input: camelize_keys(input) })
45
46
  Printavo::Contact.new(data['contactUpdate'])
46
47
  end
48
+
49
+ # Permanently deletes a contact by ID.
50
+ #
51
+ # @param id [String, Integer]
52
+ # @return [nil]
53
+ #
54
+ # @example
55
+ # client.contacts.delete("123")
56
+ def delete(id)
57
+ @graphql.mutate(DELETE_MUTATION, variables: { id: id.to_s })
58
+ nil
59
+ end
47
60
  end
48
61
  end
49
62
  end
@@ -0,0 +1,33 @@
1
+ # lib/printavo/resources/contractor_profiles.rb
2
+ # frozen_string_literal: true
3
+
4
+ module Printavo
5
+ module Resources
6
+ class ContractorProfiles < Base
7
+ ALL_QUERY = File.read(File.join(__dir__, '../graphql/contractor_profiles/all.graphql')).freeze
8
+ FIND_QUERY = File.read(File.join(__dir__, '../graphql/contractor_profiles/find.graphql')).freeze
9
+
10
+ def all(first: 25, after: nil)
11
+ fetch_page(first: first, after: after).records
12
+ end
13
+
14
+ def find(id)
15
+ data = @graphql.query(FIND_QUERY, variables: { id: id.to_s })
16
+ Printavo::ContractorProfile.new(data['contractorProfile'])
17
+ end
18
+
19
+ private
20
+
21
+ def fetch_page(first: 25, after: nil, **)
22
+ data = @graphql.query(ALL_QUERY, variables: { first: first, after: after })
23
+ nodes = data['contractorProfiles']['nodes'].map { |attrs| Printavo::ContractorProfile.new(attrs) }
24
+ page_info = data['contractorProfiles']['pageInfo']
25
+ Printavo::Page.new(
26
+ records: nodes,
27
+ has_next_page: page_info['hasNextPage'],
28
+ end_cursor: page_info['endCursor']
29
+ )
30
+ end
31
+ end
32
+ end
33
+ end
@@ -4,9 +4,10 @@
4
4
  module Printavo
5
5
  module Resources
6
6
  class Customers < Base
7
- ALL_QUERY = File.read(File.join(__dir__, '../graphql/customers/all.graphql')).freeze
8
- FIND_QUERY = File.read(File.join(__dir__, '../graphql/customers/find.graphql')).freeze
7
+ ALL_QUERY = File.read(File.join(__dir__, '../graphql/customers/all.graphql')).freeze
8
+ FIND_QUERY = File.read(File.join(__dir__, '../graphql/customers/find.graphql')).freeze
9
9
  CREATE_MUTATION = File.read(File.join(__dir__, '../graphql/customers/create.graphql')).freeze
10
+ DELETE_MUTATION = File.read(File.join(__dir__, '../graphql/customers/delete.graphql')).freeze
10
11
  UPDATE_MUTATION = File.read(File.join(__dir__, '../graphql/customers/update.graphql')).freeze
11
12
 
12
13
  def all(first: 25, after: nil)
@@ -48,6 +49,18 @@ module Printavo
48
49
  build_customer(data['customerUpdate'])
49
50
  end
50
51
 
52
+ # Permanently deletes a customer by ID.
53
+ #
54
+ # @param id [String, Integer]
55
+ # @return [nil]
56
+ #
57
+ # @example
58
+ # client.customers.delete("42")
59
+ def delete(id)
60
+ @graphql.mutate(DELETE_MUTATION, variables: { id: id.to_s })
61
+ nil
62
+ end
63
+
51
64
  private
52
65
 
53
66
  def fetch_page(first: 25, after: nil, **)
@@ -0,0 +1,51 @@
1
+ # lib/printavo/resources/delivery_methods.rb
2
+ # frozen_string_literal: true
3
+
4
+ module Printavo
5
+ module Resources
6
+ class DeliveryMethods < Base
7
+ ALL_QUERY = File.read(File.join(__dir__, '../graphql/delivery_methods/all.graphql')).freeze
8
+ FIND_QUERY = File.read(File.join(__dir__, '../graphql/delivery_methods/find.graphql')).freeze
9
+ CREATE_MUTATION = File.read(File.join(__dir__, '../graphql/delivery_methods/create.graphql')).freeze
10
+ UPDATE_MUTATION = File.read(File.join(__dir__, '../graphql/delivery_methods/update.graphql')).freeze
11
+ ARCHIVE_MUTATION = File.read(File.join(__dir__, '../graphql/delivery_methods/archive.graphql')).freeze
12
+
13
+ def all(first: 25, after: nil)
14
+ fetch_page(first: first, after: after).records
15
+ end
16
+
17
+ def find(id)
18
+ data = @graphql.query(FIND_QUERY, variables: { id: id.to_s })
19
+ Printavo::DeliveryMethod.new(data['deliveryMethod'])
20
+ end
21
+
22
+ def create(**input)
23
+ data = @graphql.mutate(CREATE_MUTATION, variables: { input: camelize_keys(input) })
24
+ Printavo::DeliveryMethod.new(data['deliveryMethodCreate'])
25
+ end
26
+
27
+ def update(id, **input)
28
+ data = @graphql.mutate(UPDATE_MUTATION, variables: { id: id.to_s, input: camelize_keys(input) })
29
+ Printavo::DeliveryMethod.new(data['deliveryMethodUpdate'])
30
+ end
31
+
32
+ def archive(id)
33
+ @graphql.mutate(ARCHIVE_MUTATION, variables: { id: id.to_s })
34
+ nil
35
+ end
36
+
37
+ private
38
+
39
+ def fetch_page(first: 25, after: nil, **)
40
+ data = @graphql.query(ALL_QUERY, variables: { first: first, after: after })
41
+ nodes = data['deliveryMethods']['nodes'].map { |attrs| Printavo::DeliveryMethod.new(attrs) }
42
+ page_info = data['deliveryMethods']['pageInfo']
43
+ Printavo::Page.new(
44
+ records: nodes,
45
+ has_next_page: page_info['hasNextPage'],
46
+ end_cursor: page_info['endCursor']
47
+ )
48
+ end
49
+ end
50
+ end
51
+ end
@@ -7,6 +7,7 @@ module Printavo
7
7
  ALL_QUERY = File.read(File.join(__dir__, '../graphql/inquiries/all.graphql')).freeze
8
8
  FIND_QUERY = File.read(File.join(__dir__, '../graphql/inquiries/find.graphql')).freeze
9
9
  CREATE_MUTATION = File.read(File.join(__dir__, '../graphql/inquiries/create.graphql')).freeze
10
+ DELETE_MUTATION = File.read(File.join(__dir__, '../graphql/inquiries/delete.graphql')).freeze
10
11
  UPDATE_MUTATION = File.read(File.join(__dir__, '../graphql/inquiries/update.graphql')).freeze
11
12
 
12
13
  def all(first: 25, after: nil)
@@ -43,6 +44,18 @@ module Printavo
43
44
  Printavo::Inquiry.new(data['inquiryUpdate'])
44
45
  end
45
46
 
47
+ # Permanently deletes an inquiry by ID.
48
+ #
49
+ # @param id [String, Integer]
50
+ # @return [nil]
51
+ #
52
+ # @example
53
+ # client.inquiries.delete("55")
54
+ def delete(id)
55
+ @graphql.mutate(DELETE_MUTATION, variables: { id: id.to_s })
56
+ nil
57
+ end
58
+
46
59
  private
47
60
 
48
61
  def fetch_page(first: 25, after: nil, **)
@@ -4,9 +4,11 @@
4
4
  module Printavo
5
5
  module Resources
6
6
  class Invoices < Base
7
- ALL_QUERY = File.read(File.join(__dir__, '../graphql/invoices/all.graphql')).freeze
8
- FIND_QUERY = File.read(File.join(__dir__, '../graphql/invoices/find.graphql')).freeze
9
- UPDATE_MUTATION = File.read(File.join(__dir__, '../graphql/invoices/update.graphql')).freeze
7
+ ALL_QUERY = File.read(File.join(__dir__, '../graphql/invoices/all.graphql')).freeze
8
+ FIND_QUERY = File.read(File.join(__dir__, '../graphql/invoices/find.graphql')).freeze
9
+ DELETE_MUTATION = File.read(File.join(__dir__, '../graphql/invoices/delete.graphql')).freeze
10
+ DUPLICATE_MUTATION = File.read(File.join(__dir__, '../graphql/invoices/duplicate.graphql')).freeze
11
+ UPDATE_MUTATION = File.read(File.join(__dir__, '../graphql/invoices/update.graphql')).freeze
10
12
 
11
13
  def all(first: 25, after: nil)
12
14
  fetch_page(first: first, after: after).records
@@ -38,6 +40,31 @@ module Printavo
38
40
  Printavo::Invoice.new(data['invoiceUpdate'])
39
41
  end
40
42
 
43
+ # Permanently deletes an invoice by ID.
44
+ #
45
+ # @param id [String, Integer]
46
+ # @return [nil]
47
+ #
48
+ # @example
49
+ # client.invoices.delete("456")
50
+ def delete(id)
51
+ @graphql.mutate(DELETE_MUTATION, variables: { id: id.to_s })
52
+ nil
53
+ end
54
+
55
+ # Duplicates an invoice, returning a new invoice pre-populated with the
56
+ # same line items, customer, and settings as the original.
57
+ #
58
+ # @param id [String, Integer]
59
+ # @return [Printavo::Invoice]
60
+ #
61
+ # @example
62
+ # client.invoices.duplicate("456")
63
+ def duplicate(id)
64
+ data = @graphql.mutate(DUPLICATE_MUTATION, variables: { id: id.to_s })
65
+ Printavo::Invoice.new(data['invoiceDuplicate'])
66
+ end
67
+
41
68
  private
42
69
 
43
70
  def fetch_page(first: 25, after: nil, **)
@@ -8,6 +8,8 @@ module Printavo
8
8
  FIND_QUERY = File.read(File.join(__dir__, '../graphql/orders/find.graphql')).freeze
9
9
  # Printavo creates orders as quotes first; the mutation is quoteCreate.
10
10
  CREATE_MUTATION = File.read(File.join(__dir__, '../graphql/orders/create.graphql')).freeze
11
+ DELETE_MUTATION = File.read(File.join(__dir__, '../graphql/orders/delete.graphql')).freeze
12
+ DUPLICATE_MUTATION = File.read(File.join(__dir__, '../graphql/orders/duplicate.graphql')).freeze
11
13
  UPDATE_MUTATION = File.read(File.join(__dir__, '../graphql/orders/update.graphql')).freeze
12
14
  # statusUpdate returns an OrderUnion (Quote | Invoice) — requires fragments.
13
15
  UPDATE_STATUS_MUTATION = File.read(File.join(__dir__, '../graphql/orders/update_status.graphql')).freeze
@@ -65,6 +67,31 @@ module Printavo
65
67
  build_order(data['statusUpdate'])
66
68
  end
67
69
 
70
+ # Permanently deletes an order (quote) by ID.
71
+ #
72
+ # @param id [String, Integer]
73
+ # @return [nil]
74
+ #
75
+ # @example
76
+ # client.orders.delete("99")
77
+ def delete(id)
78
+ @graphql.mutate(DELETE_MUTATION, variables: { id: id.to_s })
79
+ nil
80
+ end
81
+
82
+ # Duplicates an order (quote), returning a new quote pre-populated with
83
+ # the same line items, customer, and settings as the original.
84
+ #
85
+ # @param id [String, Integer]
86
+ # @return [Printavo::Order]
87
+ #
88
+ # @example
89
+ # client.orders.duplicate("99")
90
+ def duplicate(id)
91
+ data = @graphql.mutate(DUPLICATE_MUTATION, variables: { id: id.to_s })
92
+ build_order(data['quoteDuplicate'])
93
+ end
94
+
68
95
  private
69
96
 
70
97
  def fetch_page(first: 25, after: nil, **)
@@ -0,0 +1,27 @@
1
+ # lib/printavo/resources/types_of_work.rb
2
+ # frozen_string_literal: true
3
+
4
+ module Printavo
5
+ module Resources
6
+ class TypesOfWork < Base
7
+ ALL_QUERY = File.read(File.join(__dir__, '../graphql/types_of_work/all.graphql')).freeze
8
+
9
+ def all(first: 25, after: nil)
10
+ fetch_page(first: first, after: after).records
11
+ end
12
+
13
+ private
14
+
15
+ def fetch_page(first: 25, after: nil, **)
16
+ data = @graphql.query(ALL_QUERY, variables: { first: first, after: after })
17
+ nodes = data['typesOfWork']['nodes'].map { |attrs| Printavo::TypeOfWork.new(attrs) }
18
+ page_info = data['typesOfWork']['pageInfo']
19
+ Printavo::Page.new(
20
+ records: nodes,
21
+ has_next_page: page_info['hasNextPage'],
22
+ end_cursor: page_info['endCursor']
23
+ )
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,33 @@
1
+ # lib/printavo/resources/users.rb
2
+ # frozen_string_literal: true
3
+
4
+ module Printavo
5
+ module Resources
6
+ class Users < Base
7
+ ALL_QUERY = File.read(File.join(__dir__, '../graphql/users/all.graphql')).freeze
8
+ FIND_QUERY = File.read(File.join(__dir__, '../graphql/users/find.graphql')).freeze
9
+
10
+ def all(first: 25, after: nil)
11
+ fetch_page(first: first, after: after).records
12
+ end
13
+
14
+ def find(id)
15
+ data = @graphql.query(FIND_QUERY, variables: { id: id.to_s })
16
+ Printavo::User.new(data['user'])
17
+ end
18
+
19
+ private
20
+
21
+ def fetch_page(first: 25, after: nil, **)
22
+ data = @graphql.query(ALL_QUERY, variables: { first: first, after: after })
23
+ nodes = data['users']['nodes'].map { |attrs| Printavo::User.new(attrs) }
24
+ page_info = data['users']['pageInfo']
25
+ Printavo::Page.new(
26
+ records: nodes,
27
+ has_next_page: page_info['hasNextPage'],
28
+ end_cursor: page_info['endCursor']
29
+ )
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,33 @@
1
+ # lib/printavo/resources/vendors.rb
2
+ # frozen_string_literal: true
3
+
4
+ module Printavo
5
+ module Resources
6
+ class Vendors < Base
7
+ ALL_QUERY = File.read(File.join(__dir__, '../graphql/vendors/all.graphql')).freeze
8
+ FIND_QUERY = File.read(File.join(__dir__, '../graphql/vendors/find.graphql')).freeze
9
+
10
+ def all(first: 25, after: nil)
11
+ fetch_page(first: first, after: after).records
12
+ end
13
+
14
+ def find(id)
15
+ data = @graphql.query(FIND_QUERY, variables: { id: id.to_s })
16
+ Printavo::Vendor.new(data['vendor'])
17
+ end
18
+
19
+ private
20
+
21
+ def fetch_page(first: 25, after: nil, **)
22
+ data = @graphql.query(ALL_QUERY, variables: { first: first, after: after })
23
+ nodes = data['vendors']['nodes'].map { |attrs| Printavo::Vendor.new(attrs) }
24
+ page_info = data['vendors']['pageInfo']
25
+ Printavo::Page.new(
26
+ records: nodes,
27
+ has_next_page: page_info['hasNextPage'],
28
+ end_cursor: page_info['endCursor']
29
+ )
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.12.0'
5
+ VERSION = '0.14.0'
6
6
  end
data/lib/printavo.rb CHANGED
@@ -16,8 +16,10 @@ require_relative 'printavo/models/account'
16
16
  require_relative 'printavo/models/approval_request'
17
17
  require_relative 'printavo/models/category'
18
18
  require_relative 'printavo/models/contact'
19
+ require_relative 'printavo/models/contractor_profile'
19
20
  require_relative 'printavo/models/custom_address'
20
21
  require_relative 'printavo/models/customer'
22
+ require_relative 'printavo/models/delivery_method'
21
23
  require_relative 'printavo/models/email_template'
22
24
  require_relative 'printavo/models/expense'
23
25
  require_relative 'printavo/models/fee'
@@ -44,13 +46,18 @@ require_relative 'printavo/models/task'
44
46
  require_relative 'printavo/models/thread'
45
47
  require_relative 'printavo/models/transaction'
46
48
  require_relative 'printavo/models/transaction_payment'
49
+ require_relative 'printavo/models/type_of_work'
50
+ require_relative 'printavo/models/user'
51
+ require_relative 'printavo/models/vendor'
47
52
  require_relative 'printavo/resources/base'
48
53
  require_relative 'printavo/resources/account'
49
54
  require_relative 'printavo/resources/approval_requests'
50
55
  require_relative 'printavo/resources/categories'
51
56
  require_relative 'printavo/resources/contacts'
57
+ require_relative 'printavo/resources/contractor_profiles'
52
58
  require_relative 'printavo/resources/custom_addresses'
53
59
  require_relative 'printavo/resources/customers'
60
+ require_relative 'printavo/resources/delivery_methods'
54
61
  require_relative 'printavo/resources/email_templates'
55
62
  require_relative 'printavo/resources/expenses'
56
63
  require_relative 'printavo/resources/fees'
@@ -77,6 +84,9 @@ require_relative 'printavo/resources/tasks'
77
84
  require_relative 'printavo/resources/threads'
78
85
  require_relative 'printavo/resources/transaction_payments'
79
86
  require_relative 'printavo/resources/transactions'
87
+ require_relative 'printavo/resources/types_of_work'
88
+ require_relative 'printavo/resources/users'
89
+ require_relative 'printavo/resources/vendors'
80
90
  require_relative 'printavo/webhooks'
81
91
  require_relative 'printavo/client'
82
92
 
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.12.0
4
+ version: 0.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stan Carver II
@@ -277,8 +277,10 @@ files:
277
277
  - lib/printavo/models/base.rb
278
278
  - lib/printavo/models/category.rb
279
279
  - lib/printavo/models/contact.rb
280
+ - lib/printavo/models/contractor_profile.rb
280
281
  - lib/printavo/models/custom_address.rb
281
282
  - lib/printavo/models/customer.rb
283
+ - lib/printavo/models/delivery_method.rb
282
284
  - lib/printavo/models/email_template.rb
283
285
  - lib/printavo/models/expense.rb
284
286
  - lib/printavo/models/fee.rb
@@ -305,14 +307,19 @@ files:
305
307
  - lib/printavo/models/thread.rb
306
308
  - lib/printavo/models/transaction.rb
307
309
  - lib/printavo/models/transaction_payment.rb
310
+ - lib/printavo/models/type_of_work.rb
311
+ - lib/printavo/models/user.rb
312
+ - lib/printavo/models/vendor.rb
308
313
  - lib/printavo/page.rb
309
314
  - lib/printavo/resources/account.rb
310
315
  - lib/printavo/resources/approval_requests.rb
311
316
  - lib/printavo/resources/base.rb
312
317
  - lib/printavo/resources/categories.rb
313
318
  - lib/printavo/resources/contacts.rb
319
+ - lib/printavo/resources/contractor_profiles.rb
314
320
  - lib/printavo/resources/custom_addresses.rb
315
321
  - lib/printavo/resources/customers.rb
322
+ - lib/printavo/resources/delivery_methods.rb
316
323
  - lib/printavo/resources/email_templates.rb
317
324
  - lib/printavo/resources/expenses.rb
318
325
  - lib/printavo/resources/fees.rb
@@ -339,6 +346,9 @@ files:
339
346
  - lib/printavo/resources/threads.rb
340
347
  - lib/printavo/resources/transaction_payments.rb
341
348
  - lib/printavo/resources/transactions.rb
349
+ - lib/printavo/resources/types_of_work.rb
350
+ - lib/printavo/resources/users.rb
351
+ - lib/printavo/resources/vendors.rb
342
352
  - lib/printavo/version.rb
343
353
  - lib/printavo/webhooks.rb
344
354
  homepage: https://github.com/scarver2/printavo-ruby