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