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
@@ -3,9 +3,10 @@ module LedgerSync
3
3
  module QuickBooksOnline
4
4
  module Deposit
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)
9
10
  required(:ledger_id).filled(:string)
10
11
  required(:account).hash(Types::Reference)
11
12
  required(:currency).maybe(:string)
@@ -15,19 +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
- return failure(nil) if resource.ledger_id.nil?
23
-
24
- response = adaptor.find(
25
- resource: 'deposit',
26
- id: resource.ledger_id
27
- )
28
-
29
- success(response: response)
30
- end
31
19
  end
32
20
  end
33
21
  end
@@ -1,11 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module LedgerSync
2
4
  module Adaptors
3
5
  module QuickBooksOnline
4
6
  module Deposit
5
7
  module Operations
6
- class Update < Operation::Update
8
+ class Update < QuickBooksOnline::Operation::FullUpdate
7
9
  class Contract < LedgerSync::Adaptors::Contract
8
10
  schema do
11
+ required(:external_id).maybe(:string)
9
12
  required(:ledger_id).filled(:string)
10
13
  required(:account).hash(Types::Reference)
11
14
  required(:currency).filled(:string)
@@ -15,48 +18,6 @@ module LedgerSync
15
18
  required(:line_items).array(Types::Reference)
16
19
  end
17
20
  end
18
-
19
- private
20
-
21
- def operate
22
- ledger_resource_data = adaptor.find(
23
- resource: 'deposit',
24
- id: resource.ledger_id
25
- )
26
- response = adaptor.post(
27
- resource: 'deposit',
28
- payload: merge_into(from: local_resource_data, to: ledger_resource_data)
29
- )
30
-
31
- resource.ledger_id = response.dig('Id')
32
- success(response: response)
33
- end
34
-
35
- def local_resource_data
36
- {
37
- 'CurrencyRef' => {
38
- 'value' => resource.currency,
39
- },
40
- 'TxnDate' => resource.transaction_date.to_s, # Format: YYYY-MM-DD
41
- 'PrivateNote' => resource.memo,
42
- 'ExchangeRate' => resource.exchange_rate,
43
- 'DepositToAccountRef' => {
44
- 'value' => resource.account.ledger_id
45
- },
46
- 'Line' => resource.line_items.map do |line_item|
47
- {
48
- 'DetailType' => 'DepositLineDetail',
49
- 'DepositLineDetail' => {
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
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LedgerSync
4
+ module Adaptors
5
+ module QuickBooksOnline
6
+ module DepositLineItem
7
+ class LedgerSerializer < QuickBooksOnline::LedgerSerializer
8
+ id
9
+
10
+ attribute ledger_attribute: 'DetailType' do
11
+ 'DepositLineDetail'
12
+ end
13
+
14
+ attribute ledger_attribute: 'DepositLineDetail.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,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../expense_line_item/ledger_serializer'
4
+
5
+ module LedgerSync
6
+ module Adaptors
7
+ module QuickBooksOnline
8
+ module Expense
9
+ class LedgerSerializer < QuickBooksOnline::LedgerSerializer
10
+ quickbooks_online_resource_type :purchase
11
+
12
+ id ledger_attribute: 'Id',
13
+ resource_attribute: :ledger_id
14
+
15
+ attribute ledger_attribute: 'CurrencyRef.value',
16
+ resource_attribute: :currency
17
+
18
+ attribute ledger_attribute: 'PaymentType',
19
+ resource_attribute: :payment_type,
20
+ type: LedgerSerializerType::PaymentType
21
+
22
+ attribute ledger_attribute: 'TxnDate',
23
+ resource_attribute: :transaction_date,
24
+ type: LedgerSerializerType::DateType
25
+
26
+ attribute ledger_attribute: 'PrivateNote',
27
+ resource_attribute: :memo
28
+
29
+ attribute ledger_attribute: 'ExchangeRate',
30
+ resource_attribute: :exchange_rate
31
+
32
+ attribute ledger_attribute: 'EntityRef.value',
33
+ resource_attribute: 'vendor.ledger_id'
34
+
35
+ attribute ledger_attribute: 'DocNumber',
36
+ resource_attribute: :reference_number
37
+
38
+ attribute ledger_attribute: 'AccountRef.value',
39
+ resource_attribute: 'account.ledger_id'
40
+
41
+ references_many ledger_attribute: 'Line',
42
+ resource_attribute: :line_items,
43
+ serializer: ExpenseLineItem::LedgerSerializer
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -3,63 +3,22 @@ module LedgerSync
3
3
  module QuickBooksOnline
4
4
  module Expense
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(:ledger_id).value(:nil)
10
- required(:vendor).hash(Types::Reference)
9
+ required(:external_id).maybe(:string)
11
10
  required(:account).hash(Types::Reference)
12
- required(:amount).filled(:integer)
13
- required(:currency).filled(:string)
14
- required(:memo).filled(:string)
15
- required(:payment_type).filled(:string)
16
- required(:transaction_date).filled(:date?)
17
- required(:exchange_rate).maybe(:float)
11
+ optional(:currency).filled(:string)
12
+ optional(:exchange_rate).maybe(:float)
13
+ optional(:ledger_id).value(:nil)
18
14
  required(:line_items).array(Types::Reference)
15
+ optional(:memo).filled(:string)
16
+ required(:payment_type).filled(:string)
17
+ optional(:reference_number).maybe(:string)
18
+ optional(:transaction_date).filled(:date?)
19
+ optional(:vendor).hash(Types::Reference)
19
20
  end
20
21
  end
21
-
22
- private
23
-
24
- def operate
25
- response = adaptor.post(
26
- resource: 'purchase',
27
- payload: local_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
- 'CurrencyRef' => {
37
- 'value' => resource.currency,
38
- },
39
- 'PaymentType' => Mapping::PAYMENT_TYPES[resource.payment_type],
40
- 'TxnDate' => resource.transaction_date.to_s, # Format: YYYY-MM-DD
41
- 'PrivateNote' => resource.memo,
42
- 'ExchangeRate' => resource.exchange_rate,
43
- 'EntityRef' => {
44
- 'value' => resource.vendor.ledger_id,
45
- },
46
- 'AccountRef' => {
47
- 'value' => resource.account.ledger_id
48
- },
49
- 'Line' => resource.line_items.map do |line_item|
50
- {
51
- 'DetailType' => 'AccountBasedExpenseLineDetail',
52
- 'AccountBasedExpenseLineDetail' => {
53
- 'AccountRef' => {
54
- 'value' => line_item.account&.ledger_id
55
- }
56
- },
57
- 'Amount' => line_item.amount / 100.0,
58
- 'Description' => line_item.description
59
- }
60
- end
61
- }
62
- end
63
22
  end
64
23
  end
65
24
  end
@@ -6,31 +6,19 @@ module LedgerSync
6
6
  class Find < 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(:exchange_rate).maybe(:float)
9
13
  required(:ledger_id).filled(:string)
10
- required(:account).hash(Types::Reference)
11
- required(:vendor).hash(Types::Reference)
12
- required(:amount).maybe(:integer)
13
- required(:currency).maybe(:string)
14
- required(:memo).maybe(:string)
15
- required(:payment_type).maybe(:string)
16
- required(:transaction_date).filled(:date?)
17
- required(:exchange_rate).maybe(:float)
18
- required(:line_items).array(Types::Reference)
14
+ optional(:line_items).array(Types::Reference)
15
+ optional(:memo).maybe(:string)
16
+ optional(:payment_type).maybe(:string)
17
+ optional(:reference_number).maybe(:string)
18
+ optional(:transaction_date).filled(:date?)
19
+ optional(:vendor).hash(Types::Reference)
19
20
  end
20
21
  end
21
-
22
- private
23
-
24
- def operate
25
- return failure(nil) if resource.ledger_id.nil?
26
-
27
- response = adaptor.find(
28
- resource: 'purchase',
29
- id: resource.ledger_id
30
- )
31
-
32
- success(response: response)
33
- end
34
22
  end
35
23
  end
36
24
  end
@@ -3,67 +3,22 @@ module LedgerSync
3
3
  module QuickBooksOnline
4
4
  module Expense
5
5
  module Operations
6
- class Update < Operation::Update
6
+ class Update < Operation::FullUpdate
7
7
  class Contract < LedgerSync::Adaptors::Contract
8
8
  schema do
9
- required(:ledger_id).filled(:string)
9
+ required(:external_id).maybe(:string)
10
10
  required(:account).hash(Types::Reference)
11
- required(:vendor).hash(Types::Reference)
12
- required(:amount).filled(:integer)
13
- required(:currency).filled(:string)
14
- required(:memo).filled(:string)
15
- required(:payment_type).filled(:string)
16
- required(:transaction_date).filled(:date?)
17
- required(:exchange_rate).maybe(:float)
11
+ optional(:currency).filled(:string)
12
+ optional(:exchange_rate).maybe(:float)
13
+ required(:ledger_id).filled(:string)
18
14
  required(:line_items).array(Types::Reference)
15
+ optional(:memo).filled(:string)
16
+ required(:payment_type).filled(:string)
17
+ optional(:reference_number).maybe(:string)
18
+ optional(:transaction_date).filled(:date?)
19
+ optional(:vendor).hash(Types::Reference)
19
20
  end
20
21
  end
21
-
22
- private
23
-
24
- def operate
25
- ledger_resource_data = adaptor.find(
26
- resource: 'purchase',
27
- id: resource.ledger_id
28
- )
29
- response = adaptor.post(
30
- resource: 'purchase',
31
- payload: merge_into(from: local_resource_data, to: ledger_resource_data)
32
- )
33
-
34
- resource.ledger_id = response.dig('Id')
35
- success(response: response)
36
- end
37
-
38
- def local_resource_data
39
- {
40
- 'CurrencyRef' => {
41
- 'value' => resource.currency,
42
- },
43
- 'PaymentType' => Mapping::PAYMENT_TYPES[resource.payment_type],
44
- 'TxnDate' => resource.transaction_date.to_s, # Format: YYYY-MM-DD
45
- 'PrivateNote' => resource.memo,
46
- 'ExchangeRate' => resource.exchange_rate,
47
- 'EntityRef' => {
48
- 'value' => resource.vendor.ledger_id,
49
- },
50
- 'AccountRef' => {
51
- 'value' => resource.account.ledger_id
52
- },
53
- 'Line' => resource.line_items.map do |line_item|
54
- {
55
- 'DetailType' => 'AccountBasedExpenseLineDetail',
56
- 'AccountBasedExpenseLineDetail' => {
57
- 'AccountRef' => {
58
- 'value' => line_item.account&.ledger_id
59
- }
60
- },
61
- 'Amount' => line_item.amount / 100.0,
62
- 'Description' => line_item.description
63
- }
64
- end
65
- }
66
- end
67
22
  end
68
23
  end
69
24
  end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LedgerSync
4
+ module Adaptors
5
+ module QuickBooksOnline
6
+ module ExpenseLineItem
7
+ class LedgerSerializer < QuickBooksOnline::LedgerSerializer
8
+ attribute ledger_attribute: 'Id', resource_attribute: :ledger_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,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../journal_entry_line_item/ledger_serializer'
4
+
5
+ module LedgerSync
6
+ module Adaptors
7
+ module QuickBooksOnline
8
+ module JournalEntry
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: 'DocNumber',
23
+ resource_attribute: :reference_number
24
+
25
+ references_many ledger_attribute: 'Line',
26
+ resource_attribute: :line_items,
27
+ serializer: JournalEntryLineItem::LedgerSerializer
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -6,48 +6,15 @@ 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)
9
+ required(:external_id).maybe(:string)
10
10
  optional(:currency).filled(:string)
11
+ required(:ledger_id).value(:nil)
12
+ optional(:line_items).array(Types::Reference)
11
13
  optional(:memo).filled(:string)
14
+ optional(:reference_number).filled(:string)
12
15
  optional(:transaction_date).filled(:date?)
13
- optional(:line_items).array(Types::Reference)
14
16
  end
15
17
  end
16
-
17
- private
18
-
19
- def operate
20
- response = adaptor.post(
21
- resource: 'journal_entry',
22
- payload: local_resource_data
23
- )
24
-
25
- resource.ledger_id = response.dig('Id')
26
- success(response: response)
27
- end
28
-
29
- def local_resource_data
30
- {
31
- 'CurrencyRef' => {
32
- 'value' => resource.currency,
33
- },
34
- 'TxnDate' => resource.transaction_date.to_s, # Format: YYYY-MM-DD
35
- 'PrivateNote' => resource.memo,
36
- 'Line' => resource.line_items.map do |line_item|
37
- {
38
- 'DetailType' => 'JournalEntryLineDetail',
39
- 'JournalEntryLineDetail' => {
40
- 'PostingType': Mapping::LINE_ITEM_TYPES[line_item.entry_type],
41
- 'AccountRef' => {
42
- 'value' => line_item.account&.ledger_id
43
- }
44
- },
45
- 'Amount' => line_item.amount / 100.0,
46
- 'Description' => line_item.description
47
- }
48
- end
49
- }
50
- end
51
18
  end
52
19
  end
53
20
  end