ledger_sync 1.1.1 → 1.1.2

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 (124) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Gemfile.lock +1 -1
  4. data/README.md +2 -3
  5. data/lib/ledger_sync.rb +12 -6
  6. data/lib/ledger_sync/adaptors/ledger_serializer.rb +124 -0
  7. data/lib/ledger_sync/adaptors/ledger_serializer_attribute.rb +148 -0
  8. data/lib/ledger_sync/adaptors/ledger_serializer_attribute_set.rb +51 -0
  9. data/lib/ledger_sync/adaptors/ledger_serializer_type/mapping_type.rb +41 -0
  10. data/lib/ledger_sync/adaptors/ledger_serializer_type/references_many_type.rb +24 -0
  11. data/lib/ledger_sync/adaptors/ledger_serializer_type/value_type.rb +17 -0
  12. data/lib/ledger_sync/adaptors/operation.rb +15 -9
  13. data/lib/ledger_sync/adaptors/quickbooks_online/account/ledger_serializer.rb +21 -0
  14. data/lib/ledger_sync/adaptors/quickbooks_online/account/operations/create.rb +8 -36
  15. data/lib/ledger_sync/adaptors/quickbooks_online/account/operations/find.rb +1 -13
  16. data/lib/ledger_sync/adaptors/quickbooks_online/account/operations/update.rb +4 -35
  17. data/lib/ledger_sync/adaptors/quickbooks_online/account/searcher.rb +3 -44
  18. data/lib/ledger_sync/adaptors/quickbooks_online/adaptor.rb +75 -28
  19. data/lib/ledger_sync/adaptors/quickbooks_online/bill/ledger_serializer.rb +40 -0
  20. data/lib/ledger_sync/adaptors/quickbooks_online/bill/operations/create.rb +9 -48
  21. data/lib/ledger_sync/adaptors/quickbooks_online/bill/operations/find.rb +10 -21
  22. data/lib/ledger_sync/adaptors/quickbooks_online/bill/operations/update.rb +9 -52
  23. data/lib/ledger_sync/adaptors/quickbooks_online/bill_line_item/ledger_serializer.rb +27 -0
  24. data/lib/ledger_sync/adaptors/quickbooks_online/customer/ledger_serializer.rb +23 -0
  25. data/lib/ledger_sync/adaptors/quickbooks_online/customer/operations/create.rb +2 -25
  26. data/lib/ledger_sync/adaptors/quickbooks_online/customer/operations/find.rb +2 -14
  27. data/lib/ledger_sync/adaptors/quickbooks_online/customer/operations/update.rb +3 -30
  28. data/lib/ledger_sync/adaptors/quickbooks_online/deposit/ledger_serializer.rb +35 -0
  29. data/lib/ledger_sync/adaptors/quickbooks_online/deposit/operations/create.rb +2 -39
  30. data/lib/ledger_sync/adaptors/quickbooks_online/deposit/operations/find.rb +2 -14
  31. data/lib/ledger_sync/adaptors/quickbooks_online/deposit/operations/update.rb +4 -43
  32. data/lib/ledger_sync/adaptors/quickbooks_online/deposit_line_item/ledger_serializer.rb +27 -0
  33. data/lib/ledger_sync/adaptors/quickbooks_online/expense/ledger_serializer.rb +48 -0
  34. data/lib/ledger_sync/adaptors/quickbooks_online/expense/operations/create.rb +10 -51
  35. data/lib/ledger_sync/adaptors/quickbooks_online/expense/operations/find.rb +10 -22
  36. data/lib/ledger_sync/adaptors/quickbooks_online/expense/operations/update.rb +10 -55
  37. data/lib/ledger_sync/adaptors/quickbooks_online/expense_line_item/ledger_serializer.rb +27 -0
  38. data/lib/ledger_sync/adaptors/quickbooks_online/journal_entry/ledger_serializer.rb +32 -0
  39. data/lib/ledger_sync/adaptors/quickbooks_online/journal_entry/operations/create.rb +4 -37
  40. data/lib/ledger_sync/adaptors/quickbooks_online/journal_entry/operations/find.rb +4 -15
  41. data/lib/ledger_sync/adaptors/quickbooks_online/journal_entry/operations/update.rb +5 -42
  42. data/lib/ledger_sync/adaptors/quickbooks_online/journal_entry_line_item/ledger_serializer.rb +31 -0
  43. data/lib/ledger_sync/adaptors/quickbooks_online/ledger_serializer.rb +103 -0
  44. data/lib/ledger_sync/adaptors/quickbooks_online/{account/mapping.rb → ledger_serializer_type/account_sub_type.rb} +128 -148
  45. data/lib/ledger_sync/adaptors/quickbooks_online/ledger_serializer_type/account_type.rb +51 -0
  46. data/lib/ledger_sync/adaptors/quickbooks_online/ledger_serializer_type/amount_type.rb +23 -0
  47. data/lib/ledger_sync/adaptors/quickbooks_online/ledger_serializer_type/classification_type.rb +23 -0
  48. data/lib/ledger_sync/adaptors/quickbooks_online/ledger_serializer_type/date_type.rb +23 -0
  49. data/lib/ledger_sync/adaptors/quickbooks_online/ledger_serializer_type/journal_entry_line_item_type.rb +20 -0
  50. data/lib/ledger_sync/adaptors/quickbooks_online/ledger_serializer_type/payment_type.rb +21 -0
  51. data/lib/ledger_sync/adaptors/quickbooks_online/operation.rb +2 -7
  52. data/lib/ledger_sync/adaptors/quickbooks_online/operation/create.rb +29 -0
  53. data/lib/ledger_sync/adaptors/quickbooks_online/operation/find.rb +31 -0
  54. data/lib/ledger_sync/adaptors/quickbooks_online/operation/full_update.rb +43 -0
  55. data/lib/ledger_sync/adaptors/quickbooks_online/operation/sparse_update.rb +29 -0
  56. data/lib/ledger_sync/adaptors/quickbooks_online/payment/ledger_serializer.rb +23 -0
  57. data/lib/ledger_sync/adaptors/quickbooks_online/payment/operations/create.rb +1 -24
  58. data/lib/ledger_sync/adaptors/quickbooks_online/payment/operations/find.rb +1 -13
  59. data/lib/ledger_sync/adaptors/quickbooks_online/payment/operations/update.rb +2 -29
  60. data/lib/ledger_sync/adaptors/quickbooks_online/transfer/ledger_serializer.rb +33 -0
  61. data/lib/ledger_sync/adaptors/quickbooks_online/transfer/operations/create.rb +1 -29
  62. data/lib/ledger_sync/adaptors/quickbooks_online/transfer/operations/find.rb +1 -13
  63. data/lib/ledger_sync/adaptors/quickbooks_online/transfer/operations/update.rb +4 -35
  64. data/lib/ledger_sync/adaptors/quickbooks_online/util/adaptor_error_parser.rb +2 -1
  65. data/lib/ledger_sync/adaptors/quickbooks_online/util/operation_error_parser.rb +2 -1
  66. data/lib/ledger_sync/adaptors/quickbooks_online/vendor/ledger_serializer.rb +25 -0
  67. data/lib/ledger_sync/adaptors/quickbooks_online/vendor/operations/create.rb +1 -23
  68. data/lib/ledger_sync/adaptors/quickbooks_online/vendor/operations/find.rb +1 -13
  69. data/lib/ledger_sync/adaptors/quickbooks_online/vendor/operations/update.rb +2 -29
  70. data/lib/ledger_sync/adaptors/test/account/operations/create.rb +5 -1
  71. data/lib/ledger_sync/adaptors/test/account/operations/find.rb +5 -1
  72. data/lib/ledger_sync/adaptors/test/account/operations/invalid.rb +1 -0
  73. data/lib/ledger_sync/adaptors/test/account/operations/update.rb +8 -2
  74. data/lib/ledger_sync/adaptors/test/account/operations/valid.rb +1 -0
  75. data/lib/ledger_sync/adaptors/test/customer/operations/create.rb +5 -1
  76. data/lib/ledger_sync/adaptors/test/customer/operations/find.rb +5 -1
  77. data/lib/ledger_sync/adaptors/test/customer/operations/invalid.rb +1 -0
  78. data/lib/ledger_sync/adaptors/test/customer/operations/update.rb +1 -24
  79. data/lib/ledger_sync/adaptors/test/customer/operations/valid.rb +3 -6
  80. data/lib/ledger_sync/adaptors/test/expense/operations/create.rb +8 -3
  81. data/lib/ledger_sync/adaptors/test/expense/operations/find.rb +4 -14
  82. data/lib/ledger_sync/adaptors/test/expense/operations/update.rb +2 -32
  83. data/lib/ledger_sync/adaptors/test/ledger_serializer.rb +64 -0
  84. data/lib/ledger_sync/adaptors/test/operation/create.rb +27 -0
  85. data/lib/ledger_sync/adaptors/test/operation/find.rb +29 -0
  86. data/lib/ledger_sync/adaptors/test/operation/update.rb +34 -0
  87. data/lib/ledger_sync/adaptors/test/payment/operations/create.rb +5 -1
  88. data/lib/ledger_sync/adaptors/test/payment/operations/find.rb +5 -1
  89. data/lib/ledger_sync/adaptors/test/payment/operations/update.rb +1 -23
  90. data/lib/ledger_sync/adaptors/test/transfer/operations/create.rb +1 -22
  91. data/lib/ledger_sync/adaptors/test/transfer/operations/find.rb +1 -13
  92. data/lib/ledger_sync/adaptors/test/transfer/operations/update.rb +1 -25
  93. data/lib/ledger_sync/adaptors/test/vendor/operations/create.rb +5 -1
  94. data/lib/ledger_sync/adaptors/test/vendor/operations/find.rb +7 -1
  95. data/lib/ledger_sync/adaptors/test/vendor/operations/invalid.rb +1 -0
  96. data/lib/ledger_sync/adaptors/test/vendor/operations/update.rb +1 -23
  97. data/lib/ledger_sync/adaptors/test/vendor/operations/valid.rb +1 -0
  98. data/lib/ledger_sync/error/adaptor_errors.rb +17 -5
  99. data/lib/ledger_sync/error/operation_errors.rb +12 -5
  100. data/lib/ledger_sync/error/resource_errors.rb +5 -1
  101. data/lib/ledger_sync/resource.rb +33 -6
  102. data/lib/ledger_sync/resource_attribute.rb +4 -0
  103. data/lib/ledger_sync/resource_attribute/dirty_mixin.rb +16 -0
  104. data/lib/ledger_sync/resource_attribute/mixin.rb +19 -7
  105. data/lib/ledger_sync/resource_attribute/reference/many.rb +55 -1
  106. data/lib/ledger_sync/resource_attribute_set.rb +6 -7
  107. data/lib/ledger_sync/resources/account.rb +1 -1
  108. data/lib/ledger_sync/resources/bill.rb +1 -0
  109. data/lib/ledger_sync/resources/bill_line_item.rb +2 -0
  110. data/lib/ledger_sync/resources/expense.rb +5 -1
  111. data/lib/ledger_sync/resources/expense_line_item.rb +2 -0
  112. data/lib/ledger_sync/resources/journal_entry.rb +1 -0
  113. data/lib/ledger_sync/result.rb +4 -3
  114. data/lib/ledger_sync/type/id.rb +34 -0
  115. data/lib/ledger_sync/type/reference_many.rb +8 -2
  116. data/lib/ledger_sync/type/reference_one.rb +5 -0
  117. data/lib/ledger_sync/type/value_mixin.rb +12 -0
  118. data/lib/ledger_sync/util/hash_helpers.rb +16 -0
  119. data/lib/ledger_sync/version.rb +1 -1
  120. data/qa.rb +142 -0
  121. metadata +38 -5
  122. data/lib/ledger_sync/adaptors/quickbooks_online/expense/mapping.rb +0 -15
  123. data/lib/ledger_sync/adaptors/quickbooks_online/journal_entry/mapping.rb +0 -14
  124. data/lib/ledger_sync/error/sync_errors.rb +0 -22
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../bill_line_item/ledger_serializer'
4
+
5
+ module LedgerSync
6
+ module Adaptors
7
+ module QuickBooksOnline
8
+ module Bill
9
+ class LedgerSerializer < QuickBooksOnline::LedgerSerializer
10
+ id
11
+
12
+ attribute ledger_attribute: 'CurrencyRef.value', resource_attribute: :currency
13
+
14
+ attribute ledger_attribute: 'DueDate',
15
+ resource_attribute: :due_date,
16
+ type: LedgerSerializerType::DateType
17
+
18
+ attribute ledger_attribute: 'PrivateNote', resource_attribute: :memo
19
+
20
+ attribute ledger_attribute: 'TxnDate',
21
+ resource_attribute: :transaction_date,
22
+ type: LedgerSerializerType::DateType
23
+
24
+ attribute ledger_attribute: 'VendorRef.value',
25
+ resource_attribute: 'vendor.ledger_id'
26
+
27
+ attribute ledger_attribute: 'APAccountRef.value',
28
+ resource_attribute: 'account.ledger_id'
29
+
30
+ attribute ledger_attribute: 'DocNumber',
31
+ resource_attribute: :reference_number
32
+
33
+ references_many ledger_attribute: 'Line',
34
+ resource_attribute: :line_items,
35
+ serializer: BillLineItem::LedgerSerializer
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -6,57 +6,18 @@ module LedgerSync
6
6
  class Create < Operation::Create
7
7
  class Contract < LedgerSync::Adaptors::Contract
8
8
  params do
9
- required(:ledger_id).value(:nil)
10
- required(:vendor).hash(Types::Reference)
11
- required(:account).hash(Types::Reference)
12
- required(:currency).filled(:string)
13
- required(:memo).maybe(:string)
14
- required(:transaction_date).maybe(:date?)
15
- required(:due_date).maybe(:date?)
9
+ required(:external_id).maybe(:string)
10
+ optional(:account).hash(Types::Reference)
11
+ optional(:currency).filled(:string)
12
+ optional(:due_date).maybe(:date?)
13
+ optional(:ledger_id).value(:nil)
16
14
  required(:line_items).array(Types::Reference)
15
+ optional(:memo).maybe(:string)
16
+ optional(:reference_number).maybe(:string)
17
+ optional(:transaction_date).maybe(:date?)
18
+ required(:vendor).hash(Types::Reference)
17
19
  end
18
20
  end
19
-
20
- private
21
-
22
- def operate
23
- response = adaptor.post(
24
- resource: 'bill',
25
- payload: local_resource_data
26
- )
27
-
28
- resource.ledger_id = response.dig('Id')
29
- success(response: response)
30
- end
31
-
32
- def local_resource_data
33
- {
34
- 'CurrencyRef' => {
35
- 'value' => resource.currency,
36
- },
37
- 'TxnDate' => resource.transaction_date.to_s, # Format: YYYY-MM-DD
38
- 'DueDate' => resource.due_date.to_s, # Format: YYYY-MM-DD
39
- 'PrivateNote' => resource.memo,
40
- 'VendorRef' => {
41
- 'value' => resource.vendor.ledger_id,
42
- },
43
- 'APAccountRef' => {
44
- 'value' => resource.account.ledger_id
45
- },
46
- 'Line' => resource.line_items.map do |line_item|
47
- {
48
- 'DetailType' => 'AccountBasedExpenseLineDetail',
49
- 'AccountBasedExpenseLineDetail' => {
50
- 'AccountRef' => {
51
- 'value' => line_item.account&.ledger_id
52
- }
53
- },
54
- 'Amount' => line_item.amount / 100.0,
55
- 'Description' => line_item.description
56
- }
57
- end
58
- }
59
- end
60
21
  end
61
22
  end
62
23
  end
@@ -3,32 +3,21 @@ module LedgerSync
3
3
  module QuickBooksOnline
4
4
  module Bill
5
5
  module Operations
6
- class Find < Operation::Find
6
+ class Find < QuickBooksOnline::Operation::Find
7
7
  class Contract < LedgerSync::Adaptors::Contract
8
8
  schema do
9
+ required(:external_id).maybe(:string)
10
+ optional(:account).hash(Types::Reference)
11
+ optional(:currency).maybe(:string)
12
+ optional(:due_date).maybe(:date?)
13
+ optional(:line_items).array(Types::Reference)
9
14
  required(:ledger_id).filled(:string)
10
- required(:vendor).hash(Types::Reference)
11
- required(:account).hash(Types::Reference)
12
- required(:currency).maybe(:string)
13
- required(:memo).maybe(:string)
14
- required(:transaction_date).maybe(:date?)
15
- required(:due_date).maybe(:date?)
16
- required(:line_items).array(Types::Reference)
15
+ optional(:memo).maybe(:string)
16
+ optional(:reference_number).maybe(:string)
17
+ optional(:transaction_date).maybe(:date?)
18
+ optional(:vendor).hash(Types::Reference)
17
19
  end
18
20
  end
19
-
20
- private
21
-
22
- def operate
23
- return failure(nil) if resource.ledger_id.nil?
24
-
25
- response = adaptor.find(
26
- resource: 'bill',
27
- id: resource.ledger_id
28
- )
29
-
30
- success(response: response)
31
- end
32
21
  end
33
22
  end
34
23
  end
@@ -3,64 +3,21 @@ module LedgerSync
3
3
  module QuickBooksOnline
4
4
  module Bill
5
5
  module Operations
6
- class Update < Operation::Update
6
+ class Update < QuickBooksOnline::Operation::FullUpdate
7
7
  class Contract < LedgerSync::Adaptors::Contract
8
8
  schema do
9
+ required(:external_id).maybe(:string)
10
+ optional(:account).hash(Types::Reference)
11
+ optional(:currency).filled(:string)
12
+ optional(:due_date).maybe(:date?)
13
+ required(:line_items).array(Types::Reference)
9
14
  required(:ledger_id).filled(:string)
15
+ optional(:memo).maybe(:string)
16
+ optional(:reference_number).maybe(:string)
17
+ optional(:transaction_date).maybe(:date?)
10
18
  required(:vendor).hash(Types::Reference)
11
- required(:account).hash(Types::Reference)
12
- required(:currency).filled(:string)
13
- required(:memo).maybe(:string)
14
- required(:transaction_date).maybe(:date?)
15
- required(:due_date).maybe(:date?)
16
- required(:line_items).array(Types::Reference)
17
19
  end
18
20
  end
19
-
20
- private
21
-
22
- def operate
23
- ledger_resource_data = adaptor.find(
24
- resource: 'bill',
25
- id: resource.ledger_id
26
- )
27
- response = adaptor.post(
28
- resource: 'bill',
29
- payload: merge_into(from: local_resource_data, to: ledger_resource_data)
30
- )
31
-
32
- resource.ledger_id = response.dig('Id')
33
- success(response: response)
34
- end
35
-
36
- def local_resource_data
37
- {
38
- 'CurrencyRef' => {
39
- 'value' => resource.currency,
40
- },
41
- 'TxnDate' => resource.transaction_date.to_s, # Format: YYYY-MM-DD
42
- 'DueDate' => resource.due_date.to_s, # Format: YYYY-MM-DD
43
- 'PrivateNote' => resource.memo,
44
- 'VendorRef' => {
45
- 'value' => resource.vendor.ledger_id,
46
- },
47
- 'APAccountRef' => {
48
- 'value' => resource.account.ledger_id
49
- },
50
- 'Line' => resource.line_items.map do |line_item|
51
- {
52
- 'DetailType' => 'AccountBasedExpenseLineDetail',
53
- 'AccountBasedExpenseLineDetail' => {
54
- 'AccountRef' => {
55
- 'value' => line_item.account&.ledger_id
56
- }
57
- },
58
- 'Amount' => line_item.amount / 100.0,
59
- 'Description' => line_item.description
60
- }
61
- end
62
- }
63
- end
64
21
  end
65
22
  end
66
23
  end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LedgerSync
4
+ module Adaptors
5
+ module QuickBooksOnline
6
+ module BillLineItem
7
+ class LedgerSerializer < QuickBooksOnline::LedgerSerializer
8
+ id
9
+
10
+ attribute ledger_attribute: 'DetailType' do
11
+ 'AccountBasedExpenseLineDetail'
12
+ end
13
+
14
+ attribute ledger_attribute: 'AccountBasedExpenseLineDetail.AccountRef.value',
15
+ resource_attribute: 'account.ledger_id'
16
+
17
+ attribute ledger_attribute: 'Amount',
18
+ resource_attribute: :amount,
19
+ type: LedgerSerializerType::AmountType
20
+
21
+ attribute ledger_attribute: 'Description',
22
+ resource_attribute: :description
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LedgerSync
4
+ module Adaptors
5
+ module QuickBooksOnline
6
+ module Customer
7
+ class LedgerSerializer < QuickBooksOnline::LedgerSerializer
8
+ id ledger_attribute: 'Id',
9
+ resource_attribute: :ledger_id
10
+
11
+ attribute ledger_attribute: 'DisplayName',
12
+ resource_attribute: :name
13
+
14
+ attribute ledger_attribute: 'PrimaryPhone.FreeFormNumber',
15
+ resource_attribute: :phone_number
16
+
17
+ attribute ledger_attribute: 'PrimaryEmailAddr.Address',
18
+ resource_attribute: :email
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -3,39 +3,16 @@ module LedgerSync
3
3
  module QuickBooksOnline
4
4
  module Customer
5
5
  module Operations
6
- class Create < Operation::Create
6
+ class Create < QuickBooksOnline::Operation::Create
7
7
  class Contract < LedgerSync::Adaptors::Contract
8
8
  params do
9
+ required(:external_id).maybe(:string)
9
10
  required(:ledger_id).value(:nil)
10
11
  required(:email).maybe(:string)
11
12
  required(:name).filled(:string)
12
13
  required(:phone_number).maybe(:string)
13
14
  end
14
15
  end
15
-
16
- private
17
-
18
- def operate
19
- response = adaptor.post(
20
- resource: 'customer',
21
- payload: local_resource_data
22
- )
23
-
24
- resource.ledger_id = response.dig('Id')
25
- success(response: response)
26
- end
27
-
28
- def local_resource_data
29
- {
30
- 'DisplayName' => resource.name,
31
- 'PrimaryPhone' => {
32
- 'FreeFormNumber' => resource.phone_number
33
- },
34
- 'PrimaryEmailAddr' => {
35
- 'Address' => resource.email
36
- }
37
- }
38
- end
39
16
  end
40
17
  end
41
18
  end
@@ -3,28 +3,16 @@ module LedgerSync
3
3
  module QuickBooksOnline
4
4
  module Customer
5
5
  module Operations
6
- class Find < Operation::Find
6
+ class Find < QuickBooksOnline::Operation::Find
7
7
  class Contract < LedgerSync::Adaptors::Contract
8
8
  params do
9
+ required(:external_id).maybe(:string)
9
10
  required(:ledger_id).filled(:string)
10
11
  optional(:email).maybe(:string)
11
12
  optional(:name).maybe(:string)
12
13
  optional(:phone_number).maybe(:string)
13
14
  end
14
15
  end
15
-
16
- private
17
-
18
- def operate
19
- return failure(nil) if resource.ledger_id.nil?
20
-
21
- response = adaptor.find(
22
- resource: 'customer',
23
- id: resource.ledger_id
24
- )
25
-
26
- success(response: response)
27
- end
28
16
  end
29
17
  end
30
18
  end
@@ -5,46 +5,19 @@ module LedgerSync
5
5
  module QuickBooksOnline
6
6
  module Customer
7
7
  module Operations
8
- class Update < Operation::Update
8
+ class Update < QuickBooksOnline::Operation::FullUpdate
9
9
  class Contract < LedgerSync::Adaptors::Contract
10
10
  params do
11
+ required(:external_id).maybe(:string)
11
12
  required(:ledger_id).filled(:string)
12
13
  required(:email).maybe(:string)
13
14
  required(:name).filled(:string)
14
15
  required(:phone_number).maybe(:string)
15
16
  end
16
17
  end
17
-
18
- private
19
-
20
- def operate
21
- ledger_resource_data = adaptor.find(
22
- resource: 'customer',
23
- id: resource.ledger_id
24
- )
25
- response = adaptor.post(
26
- resource: 'customer',
27
- payload: merge_into(from: local_resource_data, to: ledger_resource_data)
28
- )
29
-
30
- resource.ledger_id = response.dig('Id')
31
- success(response: response)
32
- end
33
-
34
- def local_resource_data
35
- {
36
- 'DisplayName' => resource.name,
37
- "PrimaryPhone" => {
38
- "FreeFormNumber" => resource.phone_number
39
- },
40
- "PrimaryEmailAddr" => {
41
- "Address" => resource.email
42
- }
43
- }
44
- end
45
18
  end
46
19
  end
47
20
  end
48
21
  end
49
22
  end
50
- end
23
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../deposit_line_item/ledger_serializer'
4
+
5
+ module LedgerSync
6
+ module Adaptors
7
+ module QuickBooksOnline
8
+ module Deposit
9
+ class LedgerSerializer < QuickBooksOnline::LedgerSerializer
10
+ id
11
+
12
+ attribute ledger_attribute: 'CurrencyRef.value',
13
+ resource_attribute: :currency
14
+
15
+ attribute ledger_attribute: 'TxnDate',
16
+ resource_attribute: :transaction_date,
17
+ type: LedgerSerializerType::DateType
18
+
19
+ attribute ledger_attribute: 'PrivateNote',
20
+ resource_attribute: :memo
21
+
22
+ attribute ledger_attribute: 'ExchangeRate',
23
+ resource_attribute: :exchange_rate
24
+
25
+ attribute ledger_attribute: 'DepositToAccountRef.value',
26
+ resource_attribute: 'account.ledger_id'
27
+
28
+ references_many ledger_attribute: 'Line',
29
+ resource_attribute: :line_items,
30
+ serializer: DepositLineItem::LedgerSerializer
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -3,9 +3,10 @@ module LedgerSync
3
3
  module QuickBooksOnline
4
4
  module Deposit
5
5
  module Operations
6
- class Create < Operation::Create
6
+ class Create < QuickBooksOnline::Operation::Create
7
7
  class Contract < LedgerSync::Adaptors::Contract
8
8
  params do
9
+ required(:external_id).maybe(:string)
9
10
  required(:ledger_id).value(:nil)
10
11
  required(:account).hash(Types::Reference)
11
12
  required(:currency).filled(:string)
@@ -15,44 +16,6 @@ module LedgerSync
15
16
  required(:line_items).array(Types::Reference)
16
17
  end
17
18
  end
18
-
19
- private
20
-
21
- def operate
22
- response = adaptor.post(
23
- resource: 'deposit',
24
- payload: local_resource_data
25
- )
26
-
27
- resource.ledger_id = response.dig('Id')
28
- success(response: response)
29
- end
30
-
31
- def local_resource_data
32
- {
33
- 'CurrencyRef' => {
34
- 'value' => resource.currency,
35
- },
36
- 'TxnDate' => resource.transaction_date.to_s, # Format: YYYY-MM-DD
37
- 'PrivateNote' => resource.memo,
38
- 'ExchangeRate' => resource.exchange_rate,
39
- 'DepositToAccountRef' => {
40
- 'value' => resource.account.ledger_id
41
- },
42
- 'Line' => resource.line_items.map do |line_item|
43
- {
44
- 'DetailType' => 'DepositLineDetail',
45
- 'DepositLineDetail' => {
46
- 'AccountRef' => {
47
- 'value' => line_item.account&.ledger_id
48
- }
49
- },
50
- 'Amount' => line_item.amount / 100.0,
51
- 'Description' => line_item.description
52
- }
53
- end
54
- }
55
- end
56
19
  end
57
20
  end
58
21
  end