ledger_sync 1.0.10 → 1.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.
- checksums.yaml +4 -4
- data/Gemfile.lock +36 -20
- data/README.md +105 -66
- data/ledger_sync.gemspec +1 -0
- data/lib/ledger_sync.rb +23 -4
- data/lib/ledger_sync/adaptors/operation.rb +28 -28
- data/lib/ledger_sync/adaptors/quickbooks_online/account/mapping.rb +325 -0
- data/lib/ledger_sync/adaptors/quickbooks_online/account/operations/create.rb +54 -0
- data/lib/ledger_sync/adaptors/quickbooks_online/account/operations/find.rb +38 -0
- data/lib/ledger_sync/adaptors/quickbooks_online/account/operations/update.rb +61 -0
- data/lib/ledger_sync/adaptors/quickbooks_online/account/searcher.rb +67 -0
- data/lib/ledger_sync/adaptors/quickbooks_online/adaptor.rb +18 -16
- data/lib/ledger_sync/adaptors/quickbooks_online/bill/operations/create.rb +65 -0
- data/lib/ledger_sync/adaptors/quickbooks_online/bill/operations/find.rb +37 -0
- data/lib/ledger_sync/adaptors/quickbooks_online/bill/operations/update.rb +69 -0
- data/lib/ledger_sync/adaptors/quickbooks_online/bill/searcher.rb +28 -0
- data/lib/ledger_sync/adaptors/quickbooks_online/customer/operations/create.rb +6 -6
- data/lib/ledger_sync/adaptors/quickbooks_online/customer/operations/find.rb +1 -3
- data/lib/ledger_sync/adaptors/quickbooks_online/customer/operations/update.rb +6 -9
- data/lib/ledger_sync/adaptors/quickbooks_online/customer/searcher.rb +2 -38
- data/lib/ledger_sync/adaptors/quickbooks_online/deposit/operations/create.rb +61 -0
- data/lib/ledger_sync/adaptors/quickbooks_online/deposit/operations/find.rb +36 -0
- data/lib/ledger_sync/adaptors/quickbooks_online/deposit/operations/update.rb +65 -0
- data/lib/ledger_sync/adaptors/quickbooks_online/deposit/searcher.rb +28 -0
- data/lib/ledger_sync/adaptors/quickbooks_online/expense/mapping.rb +15 -0
- data/lib/ledger_sync/adaptors/quickbooks_online/expense/operations/create.rb +68 -0
- data/lib/ledger_sync/adaptors/quickbooks_online/expense/operations/find.rb +39 -0
- data/lib/ledger_sync/adaptors/quickbooks_online/expense/operations/update.rb +72 -0
- data/lib/ledger_sync/adaptors/quickbooks_online/expense/searcher.rb +28 -0
- data/lib/ledger_sync/adaptors/quickbooks_online/journal_entry/mapping.rb +14 -0
- data/lib/ledger_sync/adaptors/quickbooks_online/journal_entry/operations/create.rb +56 -0
- data/lib/ledger_sync/adaptors/quickbooks_online/journal_entry/operations/find.rb +34 -0
- data/lib/ledger_sync/adaptors/quickbooks_online/journal_entry/operations/update.rb +60 -0
- data/lib/ledger_sync/adaptors/quickbooks_online/journal_entry/searcher.rb +28 -0
- data/lib/ledger_sync/adaptors/quickbooks_online/operation.rb +30 -0
- data/lib/ledger_sync/adaptors/quickbooks_online/payment/operations/create.rb +8 -22
- data/lib/ledger_sync/adaptors/quickbooks_online/payment/operations/find.rb +0 -2
- data/lib/ledger_sync/adaptors/quickbooks_online/payment/operations/update.rb +6 -22
- data/lib/ledger_sync/adaptors/quickbooks_online/searcher.rb +45 -0
- data/lib/ledger_sync/adaptors/quickbooks_online/transfer/operations/create.rb +52 -0
- data/lib/ledger_sync/adaptors/quickbooks_online/transfer/operations/find.rb +36 -0
- data/lib/ledger_sync/adaptors/quickbooks_online/transfer/operations/update.rb +57 -0
- data/lib/ledger_sync/adaptors/quickbooks_online/vendor/operations/create.rb +46 -0
- data/lib/ledger_sync/adaptors/quickbooks_online/vendor/operations/find.rb +36 -0
- data/lib/ledger_sync/adaptors/quickbooks_online/vendor/operations/update.rb +51 -0
- data/lib/ledger_sync/adaptors/quickbooks_online/vendor/searcher.rb +64 -0
- data/lib/ledger_sync/adaptors/searcher.rb +3 -1
- data/lib/ledger_sync/adaptors/test/account/operations/create.rb +53 -0
- data/lib/ledger_sync/adaptors/test/account/operations/find.rb +38 -0
- data/lib/ledger_sync/adaptors/test/account/operations/invalid.rb +25 -0
- data/lib/ledger_sync/adaptors/test/account/operations/update.rb +50 -0
- data/lib/ledger_sync/adaptors/test/account/operations/valid.rb +31 -0
- data/lib/ledger_sync/adaptors/test/account/searcher.rb +40 -0
- data/lib/ledger_sync/adaptors/test/adaptor.rb +4 -4
- data/lib/ledger_sync/adaptors/test/customer/operations/create.rb +4 -6
- data/lib/ledger_sync/adaptors/test/customer/operations/find.rb +0 -2
- data/lib/ledger_sync/adaptors/test/customer/operations/update.rb +4 -6
- data/lib/ledger_sync/adaptors/test/customer/searcher.rb +2 -2
- data/lib/ledger_sync/adaptors/test/expense/operations/create.rb +54 -0
- data/lib/ledger_sync/adaptors/test/expense/operations/find.rb +39 -0
- data/lib/ledger_sync/adaptors/test/expense/operations/update.rb +57 -0
- data/lib/ledger_sync/adaptors/test/payment/operations/create.rb +4 -20
- data/lib/ledger_sync/adaptors/test/payment/operations/find.rb +0 -2
- data/lib/ledger_sync/adaptors/test/payment/operations/update.rb +4 -20
- data/lib/ledger_sync/adaptors/test/transfer/operations/create.rb +45 -0
- data/lib/ledger_sync/adaptors/test/transfer/operations/find.rb +36 -0
- data/lib/ledger_sync/adaptors/test/transfer/operations/update.rb +48 -0
- data/lib/ledger_sync/adaptors/test/vendor/operations/create.rb +47 -0
- data/lib/ledger_sync/adaptors/test/vendor/operations/find.rb +34 -0
- data/lib/ledger_sync/adaptors/test/vendor/operations/invalid.rb +21 -0
- data/lib/ledger_sync/adaptors/test/vendor/operations/update.rb +44 -0
- data/lib/ledger_sync/adaptors/test/vendor/operations/valid.rb +27 -0
- data/lib/ledger_sync/adaptors/test/vendor/searcher.rb +41 -0
- data/lib/ledger_sync/error/resource_errors.rb +24 -0
- data/lib/ledger_sync/resource.rb +24 -64
- data/lib/ledger_sync/resource_attribute.rb +50 -0
- data/lib/ledger_sync/resource_attribute/dirty_mixin.rb +49 -0
- data/lib/ledger_sync/resource_attribute/mixin.rb +90 -0
- data/lib/ledger_sync/resource_attribute/reference.rb +9 -0
- data/lib/ledger_sync/resource_attribute/reference/many.rb +34 -0
- data/lib/ledger_sync/resource_attribute/reference/one.rb +33 -0
- data/lib/ledger_sync/resource_attribute_set.rb +58 -0
- data/lib/ledger_sync/resources/account.rb +14 -0
- data/lib/ledger_sync/resources/bill.rb +17 -0
- data/lib/ledger_sync/resources/bill_line_item.rb +11 -0
- data/lib/ledger_sync/resources/customer.rb +5 -4
- data/lib/ledger_sync/resources/deposit.rb +16 -0
- data/lib/ledger_sync/resources/deposit_line_item.rb +11 -0
- data/lib/ledger_sync/resources/expense.rb +19 -0
- data/lib/ledger_sync/resources/expense_line_item.rb +11 -0
- data/lib/ledger_sync/resources/journal_entry.rb +13 -0
- data/lib/ledger_sync/resources/journal_entry_line_item.rb +12 -0
- data/lib/ledger_sync/resources/payment.rb +5 -3
- data/lib/ledger_sync/resources/transfer.rb +15 -0
- data/lib/ledger_sync/resources/vendor.rb +12 -0
- data/lib/ledger_sync/result.rb +0 -24
- data/lib/ledger_sync/type/boolean.rb +17 -0
- data/lib/ledger_sync/type/date.rb +17 -0
- data/lib/ledger_sync/type/float.rb +17 -0
- data/lib/ledger_sync/type/integer.rb +17 -0
- data/lib/ledger_sync/type/reference_many.rb +27 -0
- data/lib/ledger_sync/type/reference_one.rb +26 -0
- data/lib/ledger_sync/type/string.rb +17 -0
- data/lib/ledger_sync/type/value.rb +12 -0
- data/lib/ledger_sync/type/value_mixin.rb +19 -0
- data/lib/ledger_sync/util/hash_helpers.rb +16 -1
- data/lib/ledger_sync/util/resources_builder.rb +36 -9
- data/lib/ledger_sync/version.rb +1 -1
- metadata +92 -7
- data/lib/ledger_sync/adaptors/quickbooks_online/customer/operations/upsert.rb +0 -42
- data/lib/ledger_sync/adaptors/quickbooks_online/payment/operations/upsert.rb +0 -53
- data/lib/ledger_sync/adaptors/test/customer/operations/upsert.rb +0 -42
- data/lib/ledger_sync/adaptors/test/payment/operations/upsert.rb +0 -53
- data/lib/ledger_sync/sync.rb +0 -108
- data/lib/ledger_sync/util/coordinator.rb +0 -72
@@ -1,42 +0,0 @@
|
|
1
|
-
module LedgerSync
|
2
|
-
module Adaptors
|
3
|
-
module QuickBooksOnline
|
4
|
-
module Customer
|
5
|
-
module Operations
|
6
|
-
class Upsert < Operation::Upsert
|
7
|
-
class Contract < LedgerSync::Adaptors::Contract
|
8
|
-
params do
|
9
|
-
optional(:ledger_id).maybe(:string)
|
10
|
-
optional(:email).maybe(:string)
|
11
|
-
required(:name).filled(:string)
|
12
|
-
optional(:phone_number).maybe(:string)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
private
|
17
|
-
|
18
|
-
def build
|
19
|
-
op = if qbo_customer?
|
20
|
-
Update.new(adaptor: adaptor, resource: resource)
|
21
|
-
else
|
22
|
-
Create.new(adaptor: adaptor, resource: resource)
|
23
|
-
end
|
24
|
-
add_root_operation(op)
|
25
|
-
end
|
26
|
-
|
27
|
-
def find_result
|
28
|
-
@find_result ||= Find.new(
|
29
|
-
adaptor: adaptor,
|
30
|
-
resource: resource
|
31
|
-
).perform
|
32
|
-
end
|
33
|
-
|
34
|
-
def qbo_customer?
|
35
|
-
find_result.success?
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
@@ -1,53 +0,0 @@
|
|
1
|
-
module LedgerSync
|
2
|
-
module Adaptors
|
3
|
-
module QuickBooksOnline
|
4
|
-
module Payment
|
5
|
-
module Operations
|
6
|
-
class Upsert < Operation::Upsert
|
7
|
-
class Contract < LedgerSync::Adaptors::Contract
|
8
|
-
schema do
|
9
|
-
required(:ledger_id).maybe(:string)
|
10
|
-
required(:amount).filled(:integer)
|
11
|
-
required(:currency).filled(:string)
|
12
|
-
required(:customer).hash(Types::Reference)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
private
|
17
|
-
|
18
|
-
def build
|
19
|
-
op = if qbo_payment?
|
20
|
-
Update.new(adaptor: adaptor, resource: resource)
|
21
|
-
else
|
22
|
-
Create.new(adaptor: adaptor, resource: resource)
|
23
|
-
end
|
24
|
-
|
25
|
-
build_customer_operation
|
26
|
-
add_root_operation(op)
|
27
|
-
end
|
28
|
-
|
29
|
-
def build_customer_operation
|
30
|
-
customer = Customer::Operations::Upsert.new(
|
31
|
-
adaptor: adaptor,
|
32
|
-
resource: resource.customer
|
33
|
-
)
|
34
|
-
|
35
|
-
add_before_operation(customer)
|
36
|
-
end
|
37
|
-
|
38
|
-
def find_result
|
39
|
-
@find_result ||= Find.new(
|
40
|
-
adaptor: adaptor,
|
41
|
-
resource: resource
|
42
|
-
).perform
|
43
|
-
end
|
44
|
-
|
45
|
-
def qbo_payment?
|
46
|
-
find_result.success?
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
module LedgerSync
|
2
|
-
module Adaptors
|
3
|
-
module Test
|
4
|
-
module Customer
|
5
|
-
module Operations
|
6
|
-
class Upsert < Operation::Upsert
|
7
|
-
class Contract < LedgerSync::Adaptors::Contract
|
8
|
-
params do
|
9
|
-
required(:ledger_id).maybe(:string)
|
10
|
-
optional(:email).maybe(:string)
|
11
|
-
required(:name).filled(:string)
|
12
|
-
optional(:phone_number).maybe(:string)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
private
|
17
|
-
|
18
|
-
def build
|
19
|
-
op = if customer_exists_in_ledger?
|
20
|
-
Update.new(adaptor: adaptor, resource: resource)
|
21
|
-
else
|
22
|
-
Create.new(adaptor: adaptor, resource: resource)
|
23
|
-
end
|
24
|
-
add_root_operation(op)
|
25
|
-
end
|
26
|
-
|
27
|
-
def find_result
|
28
|
-
@find_result ||= Find.new(
|
29
|
-
adaptor: adaptor,
|
30
|
-
resource: resource
|
31
|
-
).perform
|
32
|
-
end
|
33
|
-
|
34
|
-
def customer_exists_in_ledger?
|
35
|
-
find_result.success?
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
@@ -1,53 +0,0 @@
|
|
1
|
-
module LedgerSync
|
2
|
-
module Adaptors
|
3
|
-
module Test
|
4
|
-
module Payment
|
5
|
-
module Operations
|
6
|
-
class Upsert < Operation::Upsert
|
7
|
-
class Contract < LedgerSync::Adaptors::Contract
|
8
|
-
schema do
|
9
|
-
required(:ledger_id).maybe(:string)
|
10
|
-
required(:amount).value(:integer)
|
11
|
-
required(:currency).value(:string)
|
12
|
-
required(:customer).value(Types::Reference)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
private
|
17
|
-
|
18
|
-
def build
|
19
|
-
op = if qbo_payment?
|
20
|
-
Update.new(adaptor: adaptor, resource: resource)
|
21
|
-
else
|
22
|
-
Create.new(adaptor: adaptor, resource: resource)
|
23
|
-
end
|
24
|
-
|
25
|
-
build_customer_operation
|
26
|
-
add_root_operation(op)
|
27
|
-
end
|
28
|
-
|
29
|
-
def build_customer_operation
|
30
|
-
customer = Customer::Operations::Upsert.new(
|
31
|
-
adaptor: adaptor,
|
32
|
-
resource: resource.customer
|
33
|
-
)
|
34
|
-
|
35
|
-
add_before_operation(customer)
|
36
|
-
end
|
37
|
-
|
38
|
-
def find_result
|
39
|
-
@find_result ||= Find.new(
|
40
|
-
adaptor: adaptor,
|
41
|
-
resource: resource
|
42
|
-
).perform
|
43
|
-
end
|
44
|
-
|
45
|
-
def qbo_payment?
|
46
|
-
find_result.success?
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
data/lib/ledger_sync/sync.rb
DELETED
@@ -1,108 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module LedgerSync
|
4
|
-
class Sync
|
5
|
-
include LedgerSync::Util::StringHelpers
|
6
|
-
include SimplySerializable::Mixin
|
7
|
-
include Validatable
|
8
|
-
|
9
|
-
attr_reader :adaptor,
|
10
|
-
:method,
|
11
|
-
:resources_data,
|
12
|
-
:resource_external_id,
|
13
|
-
:resource_type
|
14
|
-
|
15
|
-
serialize only: %i[
|
16
|
-
adaptor
|
17
|
-
method
|
18
|
-
operation
|
19
|
-
operations
|
20
|
-
resource
|
21
|
-
resource_external_id
|
22
|
-
resource_type
|
23
|
-
resources
|
24
|
-
resources_data
|
25
|
-
]
|
26
|
-
|
27
|
-
def initialize(
|
28
|
-
adaptor:,
|
29
|
-
method:,
|
30
|
-
resources_data:,
|
31
|
-
resource_external_id:,
|
32
|
-
resource_type:
|
33
|
-
)
|
34
|
-
@adaptor = adaptor
|
35
|
-
@resource_external_id = resource_external_id
|
36
|
-
@resource_type = resource_type
|
37
|
-
@method = method
|
38
|
-
@resources_data = Util::HashHelpers.deep_symbolize_keys(resources_data)
|
39
|
-
end
|
40
|
-
|
41
|
-
def perform
|
42
|
-
@perform ||= begin
|
43
|
-
raise 'Missing adaptor' if adaptor.nil?
|
44
|
-
raise 'Missing operation' if operation.nil?
|
45
|
-
|
46
|
-
@result = validate
|
47
|
-
.and_then { performer.perform }
|
48
|
-
.on_success { return SyncResult.Success(sync: self) }
|
49
|
-
.on_failure { return SyncResult.Failure(sync: self) }
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def coordinator
|
54
|
-
@coordinator ||= Util::Coordinator.new(
|
55
|
-
operation: operation
|
56
|
-
)
|
57
|
-
end
|
58
|
-
|
59
|
-
def operations
|
60
|
-
@operations ||= coordinator.operations
|
61
|
-
end
|
62
|
-
|
63
|
-
def operation
|
64
|
-
@operation ||= Adaptors::Operation.klass_from(
|
65
|
-
adaptor: adaptor,
|
66
|
-
method: method,
|
67
|
-
object: resource_type
|
68
|
-
).new(
|
69
|
-
adaptor: adaptor,
|
70
|
-
resource: resource
|
71
|
-
)
|
72
|
-
end
|
73
|
-
|
74
|
-
def performer
|
75
|
-
@performer ||= Util::Performer.new(operations: operations)
|
76
|
-
end
|
77
|
-
|
78
|
-
def resource
|
79
|
-
@resource ||= resources_builder.resource
|
80
|
-
end
|
81
|
-
|
82
|
-
def resources
|
83
|
-
@resources ||= resources_builder.resources
|
84
|
-
end
|
85
|
-
|
86
|
-
def resources_builder
|
87
|
-
@resources_builder ||= Util::ResourcesBuilder.new(
|
88
|
-
data: resources_data,
|
89
|
-
root_resource_external_id: resource_external_id,
|
90
|
-
root_resource_type: resource_type
|
91
|
-
)
|
92
|
-
end
|
93
|
-
|
94
|
-
def result
|
95
|
-
raise Error::SyncError::NotPerformedError.new(sync: self) unless @perform.present?
|
96
|
-
|
97
|
-
@result
|
98
|
-
end
|
99
|
-
|
100
|
-
private
|
101
|
-
|
102
|
-
def validate
|
103
|
-
operations.inject(Result.Success) do |result, op|
|
104
|
-
result.and_then { op.validate }
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
@@ -1,72 +0,0 @@
|
|
1
|
-
module LedgerSync
|
2
|
-
module Util
|
3
|
-
class Coordinator
|
4
|
-
attr_reader :operation
|
5
|
-
|
6
|
-
def initialize(operation:)
|
7
|
-
|
8
|
-
@operation = operation
|
9
|
-
end
|
10
|
-
|
11
|
-
def operations
|
12
|
-
@operations ||= begin
|
13
|
-
flattened_operation = self.class.flatten_operation(
|
14
|
-
operation
|
15
|
-
)
|
16
|
-
|
17
|
-
converted_operations = self.class.convert_downstream_creates_to_upserts(
|
18
|
-
flattened_operation
|
19
|
-
)
|
20
|
-
|
21
|
-
de_duped = self.class.de_dup(converted_operations)
|
22
|
-
|
23
|
-
de_duped
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
# If we have already seen a create for the same object
|
28
|
-
def self.convert_downstream_creates_to_upserts(ops)
|
29
|
-
cache = {}
|
30
|
-
ops.flat_map do |op|
|
31
|
-
cache_key = "#{op.class.name}/#{op.resource.external_id}"
|
32
|
-
if op.create? && cache.key?(cache_key)
|
33
|
-
flatten_operation(op.convert_to_update)
|
34
|
-
else
|
35
|
-
cache[cache_key] = nil
|
36
|
-
op
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def self.de_dup(ops)
|
42
|
-
@de_dup_cache = {}
|
43
|
-
|
44
|
-
ops.select do |op|
|
45
|
-
cache_key = "#{op.class.name}/#{op.resource.external_id}/#{op.fingerprint}"
|
46
|
-
|
47
|
-
if @de_dup_cache.key?(cache_key)
|
48
|
-
false
|
49
|
-
else
|
50
|
-
@de_dup_cache[cache_key] = true
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
# To build the ordered operations, start at root operation,
|
56
|
-
# perform all before_operations in order, perform root,
|
57
|
-
# then perform all after_operations in order,
|
58
|
-
# recursively doing the same for all operations.
|
59
|
-
def self.flatten_operation(op)
|
60
|
-
op.prepare
|
61
|
-
|
62
|
-
raise "root_operation required: #{op.inspect}" if op.root_operation.nil?
|
63
|
-
|
64
|
-
[
|
65
|
-
op.before_operations.map { |e| flatten_operation(e) },
|
66
|
-
op.root_operation,
|
67
|
-
op.after_operations.map { |e| flatten_operation(e) }
|
68
|
-
].flatten
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|