ledger_sync-netsuite 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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