ledger_sync-netsuite 0.1.1

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.
Files changed (140) hide show
  1. checksums.yaml +7 -0
  2. data/.env.test +14 -0
  3. data/.github/workflows/gem-workflow.yml +63 -0
  4. data/.gitignore +20 -0
  5. data/.overcommit.yml +29 -0
  6. data/.rubocop.yml +78 -0
  7. data/.rubocop_todo.yml +25 -0
  8. data/Gemfile +8 -0
  9. data/Gemfile.lock +203 -0
  10. data/README.md +19 -0
  11. data/Rakefile +8 -0
  12. data/bin/console +15 -0
  13. data/bin/setup +8 -0
  14. data/ledger_sync-netsuite.gemspec +44 -0
  15. data/lib/ledger_sync/netsuite.rb +13 -0
  16. data/lib/ledger_sync/netsuite/account/deserializer.rb +21 -0
  17. data/lib/ledger_sync/netsuite/account/operations/create.rb +26 -0
  18. data/lib/ledger_sync/netsuite/account/operations/find.rb +26 -0
  19. data/lib/ledger_sync/netsuite/account/searcher.rb +10 -0
  20. data/lib/ledger_sync/netsuite/account/searcher_deserializer.rb +27 -0
  21. data/lib/ledger_sync/netsuite/account/serializer.rb +19 -0
  22. data/lib/ledger_sync/netsuite/check/deserializer.rb +27 -0
  23. data/lib/ledger_sync/netsuite/check/operations/create.rb +25 -0
  24. data/lib/ledger_sync/netsuite/check/operations/delete.rb +25 -0
  25. data/lib/ledger_sync/netsuite/check/operations/find.rb +25 -0
  26. data/lib/ledger_sync/netsuite/check/operations/update.rb +25 -0
  27. data/lib/ledger_sync/netsuite/check/searcher.rb +13 -0
  28. data/lib/ledger_sync/netsuite/check/searcher_deserializer.rb +14 -0
  29. data/lib/ledger_sync/netsuite/check/serializer.rb +49 -0
  30. data/lib/ledger_sync/netsuite/check_line_item/deserializer.rb +16 -0
  31. data/lib/ledger_sync/netsuite/check_line_item/serializer.rb +24 -0
  32. data/lib/ledger_sync/netsuite/client.rb +186 -0
  33. data/lib/ledger_sync/netsuite/config.rb +12 -0
  34. data/lib/ledger_sync/netsuite/currency/deserializer.rb +21 -0
  35. data/lib/ledger_sync/netsuite/currency/operations/create.rb +23 -0
  36. data/lib/ledger_sync/netsuite/currency/operations/delete.rb +21 -0
  37. data/lib/ledger_sync/netsuite/currency/operations/find.rb +25 -0
  38. data/lib/ledger_sync/netsuite/currency/operations/update.rb +21 -0
  39. data/lib/ledger_sync/netsuite/currency/serializer.rb +19 -0
  40. data/lib/ledger_sync/netsuite/customer/deserializer.rb +20 -0
  41. data/lib/ledger_sync/netsuite/customer/operations/create.rb +24 -0
  42. data/lib/ledger_sync/netsuite/customer/operations/delete.rb +24 -0
  43. data/lib/ledger_sync/netsuite/customer/operations/find.rb +24 -0
  44. data/lib/ledger_sync/netsuite/customer/operations/update.rb +24 -0
  45. data/lib/ledger_sync/netsuite/customer/searcher.rb +10 -0
  46. data/lib/ledger_sync/netsuite/customer/searcher_deserializer.rb +16 -0
  47. data/lib/ledger_sync/netsuite/customer/serializer.rb +27 -0
  48. data/lib/ledger_sync/netsuite/customer_deposit/deserializer.rb +18 -0
  49. data/lib/ledger_sync/netsuite/customer_deposit/operations/create.rb +22 -0
  50. data/lib/ledger_sync/netsuite/customer_deposit/operations/delete.rb +22 -0
  51. data/lib/ledger_sync/netsuite/customer_deposit/operations/find.rb +22 -0
  52. data/lib/ledger_sync/netsuite/customer_deposit/operations/update.rb +22 -0
  53. data/lib/ledger_sync/netsuite/customer_deposit/searcher.rb +10 -0
  54. data/lib/ledger_sync/netsuite/customer_deposit/searcher_deserializer.rb +14 -0
  55. data/lib/ledger_sync/netsuite/customer_deposit/serializer.rb +23 -0
  56. data/lib/ledger_sync/netsuite/dashboard_url_helper.rb +26 -0
  57. data/lib/ledger_sync/netsuite/department/deserializer.rb +13 -0
  58. data/lib/ledger_sync/netsuite/department/operations/create.rb +23 -0
  59. data/lib/ledger_sync/netsuite/department/operations/delete.rb +23 -0
  60. data/lib/ledger_sync/netsuite/department/operations/find.rb +23 -0
  61. data/lib/ledger_sync/netsuite/department/operations/update.rb +23 -0
  62. data/lib/ledger_sync/netsuite/department/searcher.rb +10 -0
  63. data/lib/ledger_sync/netsuite/department/searcher_deserializer.rb +17 -0
  64. data/lib/ledger_sync/netsuite/department/serializer.rb +11 -0
  65. data/lib/ledger_sync/netsuite/deserializer.rb +16 -0
  66. data/lib/ledger_sync/netsuite/error.rb +17 -0
  67. data/lib/ledger_sync/netsuite/journal_entry/deserializer.rb +29 -0
  68. data/lib/ledger_sync/netsuite/journal_entry/operations/create.rb +24 -0
  69. data/lib/ledger_sync/netsuite/journal_entry/operations/delete.rb +24 -0
  70. data/lib/ledger_sync/netsuite/journal_entry/operations/find.rb +24 -0
  71. data/lib/ledger_sync/netsuite/journal_entry/operations/update.rb +28 -0
  72. data/lib/ledger_sync/netsuite/journal_entry/serializer.rb +34 -0
  73. data/lib/ledger_sync/netsuite/journal_entry_line_item/deserializer.rb +18 -0
  74. data/lib/ledger_sync/netsuite/journal_entry_line_item/serializer.rb +18 -0
  75. data/lib/ledger_sync/netsuite/ledger_class/deserializer.rb +13 -0
  76. data/lib/ledger_sync/netsuite/ledger_class/operations/create.rb +23 -0
  77. data/lib/ledger_sync/netsuite/ledger_class/operations/delete.rb +23 -0
  78. data/lib/ledger_sync/netsuite/ledger_class/operations/find.rb +23 -0
  79. data/lib/ledger_sync/netsuite/ledger_class/operations/update.rb +23 -0
  80. data/lib/ledger_sync/netsuite/ledger_class/searcher.rb +10 -0
  81. data/lib/ledger_sync/netsuite/ledger_class/searcher_deserializer.rb +17 -0
  82. data/lib/ledger_sync/netsuite/ledger_class/serializer.rb +11 -0
  83. data/lib/ledger_sync/netsuite/location/deserializer.rb +13 -0
  84. data/lib/ledger_sync/netsuite/location/operations/create.rb +19 -0
  85. data/lib/ledger_sync/netsuite/location/operations/delete.rb +19 -0
  86. data/lib/ledger_sync/netsuite/location/operations/find.rb +19 -0
  87. data/lib/ledger_sync/netsuite/location/operations/update.rb +19 -0
  88. data/lib/ledger_sync/netsuite/location/searcher.rb +10 -0
  89. data/lib/ledger_sync/netsuite/location/serializer.rb +11 -0
  90. data/lib/ledger_sync/netsuite/operation.rb +38 -0
  91. data/lib/ledger_sync/netsuite/operation/create.rb +56 -0
  92. data/lib/ledger_sync/netsuite/operation/delete.rb +47 -0
  93. data/lib/ledger_sync/netsuite/operation/find.rb +68 -0
  94. data/lib/ledger_sync/netsuite/operation/update.rb +59 -0
  95. data/lib/ledger_sync/netsuite/record/http_method.rb +31 -0
  96. data/lib/ledger_sync/netsuite/record/metadata.rb +107 -0
  97. data/lib/ledger_sync/netsuite/record/parameter.rb +18 -0
  98. data/lib/ledger_sync/netsuite/record/property.rb +20 -0
  99. data/lib/ledger_sync/netsuite/reference/serializer.rb +11 -0
  100. data/lib/ledger_sync/netsuite/resource.rb +8 -0
  101. data/lib/ledger_sync/netsuite/resources/account.rb +41 -0
  102. data/lib/ledger_sync/netsuite/resources/check.rb +21 -0
  103. data/lib/ledger_sync/netsuite/resources/check_line_item.rb +13 -0
  104. data/lib/ledger_sync/netsuite/resources/currency.rb +11 -0
  105. data/lib/ledger_sync/netsuite/resources/customer.rb +17 -0
  106. data/lib/ledger_sync/netsuite/resources/customer_deposit.rb +13 -0
  107. data/lib/ledger_sync/netsuite/resources/department.rb +14 -0
  108. data/lib/ledger_sync/netsuite/resources/deposit.rb +26 -0
  109. data/lib/ledger_sync/netsuite/resources/deposit_line_item.rb +23 -0
  110. data/lib/ledger_sync/netsuite/resources/invoice.rb +26 -0
  111. data/lib/ledger_sync/netsuite/resources/invoice_line_item.rb +19 -0
  112. data/lib/ledger_sync/netsuite/resources/item.rb +9 -0
  113. data/lib/ledger_sync/netsuite/resources/journal_entry.rb +24 -0
  114. data/lib/ledger_sync/netsuite/resources/journal_entry_line_item.rb +22 -0
  115. data/lib/ledger_sync/netsuite/resources/ledger_class.rb +14 -0
  116. data/lib/ledger_sync/netsuite/resources/location.rb +9 -0
  117. data/lib/ledger_sync/netsuite/resources/subsidiary.rb +10 -0
  118. data/lib/ledger_sync/netsuite/resources/vendor.rb +21 -0
  119. data/lib/ledger_sync/netsuite/searcher.rb +64 -0
  120. data/lib/ledger_sync/netsuite/serializer.rb +11 -0
  121. data/lib/ledger_sync/netsuite/subsidiary/deserializer.rb +15 -0
  122. data/lib/ledger_sync/netsuite/subsidiary/searcher.rb +10 -0
  123. data/lib/ledger_sync/netsuite/subsidiary/searcher_deserializer.rb +13 -0
  124. data/lib/ledger_sync/netsuite/subsidiary/serializer.rb +13 -0
  125. data/lib/ledger_sync/netsuite/token.rb +156 -0
  126. data/lib/ledger_sync/netsuite/type/deserializer_active_type.rb +30 -0
  127. data/lib/ledger_sync/netsuite/type/deserializer_customer_type.rb +33 -0
  128. data/lib/ledger_sync/netsuite/type/deserializer_entity_type.rb +28 -0
  129. data/lib/ledger_sync/netsuite/type/deserializer_subsidiary_type.rb +33 -0
  130. data/lib/ledger_sync/netsuite/vendor/deserializer.rb +28 -0
  131. data/lib/ledger_sync/netsuite/vendor/operations/create.rb +25 -0
  132. data/lib/ledger_sync/netsuite/vendor/operations/delete.rb +25 -0
  133. data/lib/ledger_sync/netsuite/vendor/operations/find.rb +25 -0
  134. data/lib/ledger_sync/netsuite/vendor/operations/update.rb +25 -0
  135. data/lib/ledger_sync/netsuite/vendor/searcher.rb +10 -0
  136. data/lib/ledger_sync/netsuite/vendor/searcher_deserializer.rb +19 -0
  137. data/lib/ledger_sync/netsuite/vendor/serializer.rb +28 -0
  138. data/lib/ledger_sync/netsuite/version.rb +17 -0
  139. data/license.txt +4 -0
  140. metadata +392 -0
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LedgerSync
4
+ module NetSuite
5
+ class Location
6
+ module Operations
7
+ class Delete < NetSuite::Operation::Delete
8
+ class Contract < LedgerSync::Ledgers::Contract
9
+ params do
10
+ required(:external_id).maybe(:string)
11
+ required(:ledger_id).filled(:string)
12
+ required(:name).maybe(:string)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LedgerSync
4
+ module NetSuite
5
+ class Location
6
+ module Operations
7
+ class Find < NetSuite::Operation::Find
8
+ class Contract < LedgerSync::Ledgers::Contract
9
+ params do
10
+ required(:external_id).maybe(:string)
11
+ required(:ledger_id).filled(:string)
12
+ required(:name).maybe(:string)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LedgerSync
4
+ module NetSuite
5
+ class Location
6
+ module Operations
7
+ class Update < NetSuite::Operation::Update
8
+ class Contract < LedgerSync::Ledgers::Contract
9
+ params do
10
+ required(:external_id).maybe(:string)
11
+ required(:ledger_id).filled(:string)
12
+ required(:name).filled(:string)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LedgerSync
4
+ module NetSuite
5
+ class Location
6
+ class Searcher < Searcher
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LedgerSync
4
+ module NetSuite
5
+ class Location
6
+ class Serializer < NetSuite::Serializer
7
+ attribute :name
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LedgerSync
4
+ module NetSuite
5
+ class Operation
6
+ module Mixin
7
+ def self.included(base)
8
+ base.include Ledgers::Operation::Mixin
9
+ base.include InstanceMethods # To ensure these override parent methods
10
+ end
11
+
12
+ module InstanceMethods
13
+ def request_params
14
+ {}
15
+ end
16
+
17
+ def ledger_id
18
+ @ledger_id ||= Util::URLHelpers.id_from_url(url: response.headers['Location'])
19
+ end
20
+
21
+ def ledger_resource_path(args = {})
22
+ client.ledger_resource_path(
23
+ {
24
+ resource: resource
25
+ }.merge(
26
+ args.merge(
27
+ params: request_params.merge(
28
+ args.fetch(:params, {})
29
+ )
30
+ )
31
+ )
32
+ )
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../operation'
4
+
5
+ module LedgerSync
6
+ module NetSuite
7
+ class Operation
8
+ class Create
9
+ include NetSuite::Operation::Mixin
10
+
11
+ private
12
+
13
+ def create_in_ledger
14
+ return LedgerSync::Result.Success(response) if response.success?
15
+
16
+ failure(
17
+ Error::OperationError.new(
18
+ operation: self,
19
+ response: response
20
+ )
21
+ )
22
+ end
23
+
24
+ def find
25
+ resource.ledger_id = ledger_id
26
+
27
+ self.class.operations_module::Find.new(
28
+ client: client,
29
+ resource: resource
30
+ ).perform
31
+ end
32
+
33
+ def operate
34
+ create_in_ledger
35
+ .and_then { success }
36
+ end
37
+
38
+ def response
39
+ @response ||= client.post(
40
+ body: serializer.serialize(resource: resource),
41
+ path: ledger_resource_path(id: false)
42
+ )
43
+ end
44
+
45
+ def success
46
+ find.and_then do |find_result|
47
+ super(
48
+ resource: find_result.resource,
49
+ response: response
50
+ )
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../operation'
4
+
5
+ module LedgerSync
6
+ module NetSuite
7
+ class Operation
8
+ class Delete
9
+ include NetSuite::Operation::Mixin
10
+
11
+ private
12
+
13
+ def delete
14
+ case response.status
15
+ when 200..299
16
+ LedgerSync::Result.Success(response)
17
+ else
18
+ failure(
19
+ Error::OperationError.new(
20
+ operation: self,
21
+ response: response
22
+ )
23
+ )
24
+ end
25
+ end
26
+
27
+ def operate
28
+ delete
29
+ .and_then { success }
30
+ end
31
+
32
+ def response
33
+ @response ||= client.delete(
34
+ path: ledger_resource_path
35
+ )
36
+ end
37
+
38
+ def success
39
+ super(
40
+ resource: resource,
41
+ response: response
42
+ )
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../operation'
4
+
5
+ module LedgerSync
6
+ module NetSuite
7
+ class Operation
8
+ class Find
9
+ include NetSuite::Operation::Mixin
10
+
11
+ def request_params
12
+ return super unless expand_sub_resources?
13
+
14
+ super.merge({ expandSubResources: expand_sub_resources? })
15
+ end
16
+
17
+ def expand_sub_resources?
18
+ self.class.expand_sub_resources?
19
+ end
20
+
21
+ def self.expand_sub_resources?
22
+ true
23
+ end
24
+
25
+ private
26
+
27
+ def find_in_ledger
28
+ case response.status
29
+ when 200
30
+ LedgerSync::Result.Success(response)
31
+ when 404
32
+ failure(
33
+ Error::OperationError::NotFoundError.new(
34
+ operation: self,
35
+ response: response
36
+ )
37
+ )
38
+ else
39
+ failure(
40
+ Error::OperationError.new(
41
+ operation: self,
42
+ response: response
43
+ )
44
+ )
45
+ end
46
+ end
47
+
48
+ def operate
49
+ find_in_ledger
50
+ .and_then { success }
51
+ end
52
+
53
+ def response
54
+ @response ||= client.get(
55
+ path: ledger_resource_path
56
+ )
57
+ end
58
+
59
+ def success
60
+ super(
61
+ resource: deserializer.deserialize(hash: response.body, resource: resource),
62
+ response: response
63
+ )
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../operation'
4
+
5
+ module LedgerSync
6
+ module NetSuite
7
+ class Operation
8
+ class Update
9
+ include NetSuite::Operation::Mixin
10
+
11
+ private
12
+
13
+ def update_in_ledger
14
+ case response.status
15
+ when 200..299
16
+ LedgerSync::Result.Success(response)
17
+ else
18
+ failure(
19
+ Error::OperationError.new(
20
+ operation: self,
21
+ response: response
22
+ )
23
+ )
24
+ end
25
+ end
26
+
27
+ def find
28
+ resource.ledger_id = ledger_id
29
+
30
+ self.class.operations_module::Find.new(
31
+ client: client,
32
+ resource: resource
33
+ ).perform
34
+ end
35
+
36
+ def operate
37
+ update_in_ledger
38
+ .and_then { success }
39
+ end
40
+
41
+ def response
42
+ @response ||= client.patch(
43
+ body: serializer.serialize(resource: resource),
44
+ path: ledger_resource_path
45
+ )
46
+ end
47
+
48
+ def success
49
+ find.and_then do |find_result|
50
+ super(
51
+ resource: find_result.resource,
52
+ response: response
53
+ )
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Parser for OpenAPI 3.0 data for a given record method
5
+ #
6
+ module LedgerSync
7
+ module NetSuite
8
+ class Record
9
+ class HTTPMethod < Util::ReadOnlyObject
10
+ attribute :key
11
+ attribute :method
12
+ attribute :path
13
+ attribute :summary
14
+
15
+ def initialize(args = {})
16
+ super(
17
+ args.merge(
18
+ key: "#{args.fetch(:method)} #{args.fetch(:path)}".downcase
19
+ )
20
+ )
21
+ end
22
+
23
+ def parameters
24
+ Parameter.new_from_array(
25
+ raw[:parameters]
26
+ )
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,107 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LedgerSync
4
+ module NetSuite
5
+ class Record
6
+ #
7
+ # Helper class for retrieving record metadata:
8
+ # - available http_methods
9
+ # - record properties/attributes
10
+ #
11
+ class Metadata
12
+ BASE_PATH = 'metadata-catalog'
13
+
14
+ attr_reader :client,
15
+ :record
16
+
17
+ def initialize(client:, record:)
18
+ @client = client
19
+ @record = record
20
+ end
21
+
22
+ def create
23
+ @create ||= http_methods.find { |e| e.key == "post /#{record}" }
24
+ end
25
+
26
+ def delete
27
+ @delete ||= http_methods.find { |e| e.key == "delete /#{record}/{id}" }
28
+ end
29
+
30
+ def find
31
+ @find ||= show
32
+ end
33
+
34
+ def http_methods
35
+ @http_methods ||= begin
36
+ ret = []
37
+
38
+ metadata_response.body['paths'].each do |path, path_data|
39
+ path_data.each do |method, method_data|
40
+ ret << HTTPMethod.new_from_hash(
41
+ method_data.merge(
42
+ method: method,
43
+ path: path
44
+ )
45
+ )
46
+ end
47
+ end
48
+
49
+ ret
50
+ end
51
+ end
52
+
53
+ def index
54
+ @index ||= http_methods.find { |e| e.key == "get /#{record}" }
55
+ end
56
+
57
+ def metadata_response
58
+ @metadata_response = begin
59
+ client.get(
60
+ headers: {
61
+ 'Accept' => 'application/swagger+json'
62
+ },
63
+ path: "#{BASE_PATH}?select=#{record}"
64
+ )
65
+ end
66
+ end
67
+
68
+ def properties
69
+ @properties ||= begin
70
+ ret = []
71
+ props = metadata_response.body['components']['schemas'][record.to_s]['properties']
72
+ props.map do |key, prop|
73
+ next unless prop.key?('title')
74
+
75
+ ret << Property.new_from_hash(
76
+ prop.merge(
77
+ key: key
78
+ )
79
+ )
80
+ end
81
+ ret
82
+ end
83
+ end
84
+
85
+ def patch
86
+ @patch ||= http_methods.find { |e| e.key == "patch /#{record}/{id}" }
87
+ end
88
+
89
+ def show
90
+ @show ||= http_methods.find { |e| e.key == "get /#{record}/{id}" }
91
+ end
92
+
93
+ def update
94
+ @update ||= http_methods.find { |e| e.key == "patch /#{record}/{id}" }
95
+ end
96
+
97
+ def upsert
98
+ @upsert ||= http_methods.find { |e| e.key == "put /#{record}/{id}" }
99
+ end
100
+
101
+ def self.config
102
+ Client.config
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end