lunchmoney 1.0.0 → 1.1.0

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 (68) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/publish_gem.yml +1 -0
  3. data/Gemfile.lock +1 -1
  4. data/lib/lunchmoney/api.rb +34 -34
  5. data/lib/lunchmoney/calls/assets.rb +98 -0
  6. data/lib/lunchmoney/calls/base.rb +112 -0
  7. data/lib/lunchmoney/calls/budgets.rb +84 -0
  8. data/lib/lunchmoney/calls/categories.rb +196 -0
  9. data/lib/lunchmoney/calls/crypto.rb +50 -0
  10. data/lib/lunchmoney/calls/plaid_accounts.rb +40 -0
  11. data/lib/lunchmoney/calls/recurring_expenses.rb +29 -0
  12. data/lib/lunchmoney/calls/tags.rb +21 -0
  13. data/lib/lunchmoney/calls/transactions.rb +220 -0
  14. data/lib/lunchmoney/calls/users.rb +21 -0
  15. data/lib/lunchmoney/objects/asset.rb +91 -0
  16. data/lib/lunchmoney/objects/budget.rb +76 -0
  17. data/lib/lunchmoney/objects/category.rb +55 -0
  18. data/lib/lunchmoney/objects/child_category.rb +44 -0
  19. data/lib/lunchmoney/objects/child_transaction.rb +35 -0
  20. data/lib/lunchmoney/objects/config.rb +40 -0
  21. data/lib/lunchmoney/objects/crypto.rb +46 -0
  22. data/lib/lunchmoney/objects/crypto_base.rb +67 -0
  23. data/lib/lunchmoney/objects/data.rb +44 -0
  24. data/lib/lunchmoney/objects/object.rb +28 -0
  25. data/lib/lunchmoney/objects/plaid_account.rb +75 -0
  26. data/lib/lunchmoney/objects/recurring_expense.rb +68 -0
  27. data/lib/lunchmoney/objects/recurring_expense_base.rb +31 -0
  28. data/lib/lunchmoney/objects/split.rb +28 -0
  29. data/lib/lunchmoney/objects/tag.rb +24 -0
  30. data/lib/lunchmoney/objects/tag_base.rb +23 -0
  31. data/lib/lunchmoney/objects/transaction.rb +160 -0
  32. data/lib/lunchmoney/objects/transaction_base.rb +54 -0
  33. data/lib/lunchmoney/objects/transaction_modification_base.rb +32 -0
  34. data/lib/lunchmoney/objects/update_transaction.rb +47 -0
  35. data/lib/lunchmoney/objects/user.rb +38 -0
  36. data/lib/lunchmoney/version.rb +1 -1
  37. metadata +32 -32
  38. data/lib/lunchmoney/api_call.rb +0 -109
  39. data/lib/lunchmoney/assets/asset.rb +0 -89
  40. data/lib/lunchmoney/assets/asset_calls.rb +0 -96
  41. data/lib/lunchmoney/budget/budget.rb +0 -74
  42. data/lib/lunchmoney/budget/budget_calls.rb +0 -82
  43. data/lib/lunchmoney/budget/config.rb +0 -38
  44. data/lib/lunchmoney/budget/data.rb +0 -42
  45. data/lib/lunchmoney/categories/category/category.rb +0 -52
  46. data/lib/lunchmoney/categories/category/child_category.rb +0 -42
  47. data/lib/lunchmoney/categories/category_calls.rb +0 -195
  48. data/lib/lunchmoney/crypto/crypto/crypto.rb +0 -43
  49. data/lib/lunchmoney/crypto/crypto/crypto_base.rb +0 -65
  50. data/lib/lunchmoney/crypto/crypto_calls.rb +0 -49
  51. data/lib/lunchmoney/data_object.rb +0 -25
  52. data/lib/lunchmoney/plaid_accounts/plaid_account.rb +0 -73
  53. data/lib/lunchmoney/plaid_accounts/plaid_account_calls.rb +0 -38
  54. data/lib/lunchmoney/recurring_expenses/recurring_expense/recurring_expense.rb +0 -65
  55. data/lib/lunchmoney/recurring_expenses/recurring_expense/recurring_expense_base.rb +0 -29
  56. data/lib/lunchmoney/recurring_expenses/recurring_expense_calls.rb +0 -28
  57. data/lib/lunchmoney/tags/tag/tag.rb +0 -20
  58. data/lib/lunchmoney/tags/tag/tag_base.rb +0 -21
  59. data/lib/lunchmoney/tags/tag_calls.rb +0 -20
  60. data/lib/lunchmoney/transactions/transaction/child_transaction.rb +0 -31
  61. data/lib/lunchmoney/transactions/transaction/split.rb +0 -24
  62. data/lib/lunchmoney/transactions/transaction/transaction.rb +0 -156
  63. data/lib/lunchmoney/transactions/transaction/transaction_base.rb +0 -52
  64. data/lib/lunchmoney/transactions/transaction/transaction_modification_base.rb +0 -30
  65. data/lib/lunchmoney/transactions/transaction/update_transaction.rb +0 -43
  66. data/lib/lunchmoney/transactions/transaction_calls.rb +0 -218
  67. data/lib/lunchmoney/user/user.rb +0 -36
  68. data/lib/lunchmoney/user/user_calls.rb +0 -19
@@ -1,38 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- module LunchMoney
5
- # https://lunchmoney.dev/#config-object
6
- class Config < LunchMoney::DataObject
7
- # API object reference documentation: https://lunchmoney.dev/#config-object
8
-
9
- sig { returns(Integer) }
10
- attr_accessor :config_id
11
-
12
- sig { returns(Number) }
13
- attr_accessor :amount, :to_base
14
-
15
- sig { returns(String) }
16
- attr_accessor :cadence, :currency, :auto_suggest
17
-
18
- sig do
19
- params(
20
- config_id: Integer,
21
- cadence: String,
22
- amount: Number,
23
- currency: String,
24
- to_base: Number,
25
- auto_suggest: String,
26
- ).void
27
- end
28
- def initialize(config_id:, cadence:, amount:, currency:, to_base:, auto_suggest:)
29
- super()
30
- @config_id = config_id
31
- @cadence = cadence
32
- @amount = amount
33
- @currency = currency
34
- @to_base = to_base
35
- @auto_suggest = auto_suggest
36
- end
37
- end
38
- end
@@ -1,42 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- module LunchMoney
5
- # https://lunchmoney.dev/#data-object
6
- class Data < LunchMoney::DataObject
7
- # API object reference documentation: https://lunchmoney.dev/#data-object
8
-
9
- sig { returns(T.nilable(Integer)) }
10
- attr_accessor :num_transactions
11
-
12
- sig { returns(T.nilable(Number)) }
13
- attr_accessor :budget_amount, :budget_to_base, :spending_to_base
14
-
15
- sig { returns(T.nilable(String)) }
16
- attr_accessor :budget_currency
17
-
18
- sig { returns(T.nilable(T::Boolean)) }
19
- attr_accessor :is_automated
20
-
21
- sig do
22
- params(
23
- spending_to_base: T.nilable(Number),
24
- num_transactions: T.nilable(Integer),
25
- budget_amount: T.nilable(Number),
26
- budget_currency: T.nilable(String),
27
- budget_to_base: T.nilable(Number),
28
- is_automated: T.nilable(T::Boolean),
29
- ).void
30
- end
31
- def initialize(spending_to_base: nil, num_transactions: nil, budget_amount: nil, budget_currency: nil,
32
- budget_to_base: nil, is_automated: nil)
33
- super()
34
- @budget_amount = budget_amount
35
- @budget_currency = budget_currency
36
- @budget_to_base = budget_to_base
37
- @spending_to_base = spending_to_base
38
- @num_transactions = num_transactions
39
- @is_automated = is_automated
40
- end
41
- end
42
- end
@@ -1,52 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- module LunchMoney
5
- # https://lunchmoney.dev/#categories-object
6
- class Category < ChildCategory
7
- sig { returns(T.nilable(String)) }
8
- attr_accessor :group_category_name
9
-
10
- sig { returns(T::Boolean) }
11
- attr_accessor :is_income, :exclude_from_budget, :exclude_from_totals, :is_group
12
-
13
- sig { returns(T.nilable(Integer)) }
14
- attr_accessor :group_id, :order
15
-
16
- sig { returns(T.nilable(T::Array[T.any(LunchMoney::Category, LunchMoney::ChildCategory)])) }
17
- attr_accessor :children
18
-
19
- sig do
20
- params(
21
- id: Integer,
22
- name: String,
23
- is_income: T::Boolean,
24
- exclude_from_budget: T::Boolean,
25
- exclude_from_totals: T::Boolean,
26
- is_group: T::Boolean,
27
- archived: T.nilable(T::Boolean),
28
- archived_on: T.nilable(String),
29
- updated_at: T.nilable(String),
30
- created_at: T.nilable(String),
31
- group_id: T.nilable(Integer),
32
- order: T.nilable(Integer),
33
- description: T.nilable(String),
34
- children: T.nilable(T::Array[T.any(LunchMoney::Category, LunchMoney::ChildCategory)]),
35
- group_category_name: T.nilable(String),
36
- ).void
37
- end
38
- def initialize(id:, name:, is_income:, exclude_from_budget:, exclude_from_totals:, is_group:, archived: nil,
39
- archived_on: nil, updated_at: nil, created_at: nil, group_id: nil, order: nil, description: nil, children: nil,
40
- group_category_name: nil)
41
- super(id:, name:, archived:, archived_on:, updated_at:, created_at:, description:)
42
- @is_income = is_income
43
- @exclude_from_budget = exclude_from_budget
44
- @exclude_from_totals = exclude_from_totals
45
- @is_group = is_group
46
- @group_id = group_id
47
- @order = order
48
- @children = children
49
- @group_category_name = group_category_name
50
- end
51
- end
52
- end
@@ -1,42 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- module LunchMoney
5
- # A slimmed down version of https://lunchmoney.dev/#categories-object used in the
6
- # `children` field of some category calls
7
- class ChildCategory < LunchMoney::DataObject
8
- sig { returns(Integer) }
9
- attr_accessor :id
10
-
11
- sig { returns(String) }
12
- attr_accessor :name
13
-
14
- sig { returns(T.nilable(String)) }
15
- attr_accessor :description, :archived_on, :updated_at, :created_at
16
-
17
- sig { returns(T.nilable(T::Boolean)) }
18
- attr_accessor :archived
19
-
20
- sig do
21
- params(
22
- id: Integer,
23
- name: String,
24
- archived: T.nilable(T::Boolean),
25
- archived_on: T.nilable(String),
26
- updated_at: T.nilable(String),
27
- created_at: T.nilable(String),
28
- description: T.nilable(String),
29
- ).void
30
- end
31
- def initialize(id:, name:, archived: nil, archived_on: nil, updated_at: nil, created_at: nil, description: nil)
32
- super()
33
- @id = id
34
- @name = name
35
- @archived = archived
36
- @archived_on = archived_on
37
- @updated_at = updated_at
38
- @created_at = created_at
39
- @description = description
40
- end
41
- end
42
- end
@@ -1,195 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- require_relative "category/child_category"
5
- require_relative "category/category"
6
-
7
- module LunchMoney
8
- # https://lunchmoney.dev/#categories
9
- class CategoryCalls < ApiCall
10
- # Valid query parameter formets for categories
11
- VALID_FORMATS = T.let(
12
- [
13
- "flattened",
14
- "nested",
15
- ],
16
- T::Array[String],
17
- )
18
-
19
- sig do
20
- params(
21
- format: T.nilable(T.any(String, Symbol)),
22
- ).returns(T.any(T::Array[LunchMoney::Category], LunchMoney::Errors))
23
- end
24
- def categories(format: nil)
25
- response = get("categories", query_params: categories_params(format:))
26
-
27
- api_errors = errors(response)
28
- return api_errors if api_errors.present?
29
-
30
- response.body[:categories].map do |category|
31
- category[:children]&.map! { |child_category| LunchMoney::Category.new(**child_category) }
32
-
33
- LunchMoney::Category.new(**category)
34
- end
35
- end
36
-
37
- sig { params(category_id: Integer).returns(T.any(LunchMoney::Category, LunchMoney::Errors)) }
38
- def category(category_id)
39
- response = get("categories/#{category_id}")
40
-
41
- api_errors = errors(response)
42
- return api_errors if api_errors.present?
43
-
44
- response.body[:children]&.map! { |child_category| LunchMoney::ChildCategory.new(**child_category) }
45
-
46
- LunchMoney::Category.new(**response.body)
47
- end
48
-
49
- sig do
50
- params(
51
- name: String,
52
- description: T.nilable(String),
53
- is_income: T::Boolean,
54
- exclude_from_budget: T::Boolean,
55
- exclude_from_totals: T::Boolean,
56
- archived: T::Boolean,
57
- group_id: T.nilable(Integer),
58
- ).returns(T.any(T::Hash[Symbol, Integer], LunchMoney::Errors))
59
- end
60
- def create_category(name:, description: nil, is_income: false, exclude_from_budget: false,
61
- exclude_from_totals: false, archived: false, group_id: nil)
62
- params = clean_params({
63
- name:,
64
- description:,
65
- is_income:,
66
- exclude_from_budget:,
67
- exclude_from_totals:,
68
- archived:,
69
- group_id:,
70
- })
71
- response = post("categories", params)
72
-
73
- api_errors = errors(response)
74
- return api_errors if api_errors.present?
75
-
76
- response.body
77
- end
78
-
79
- sig do
80
- params(
81
- name: String,
82
- description: T.nilable(String),
83
- is_income: T::Boolean,
84
- exclude_from_budget: T::Boolean,
85
- exclude_from_totals: T::Boolean,
86
- category_ids: T::Array[Integer],
87
- new_categories: T::Array[String],
88
- ).returns(T.any(T::Hash[Symbol, Integer], LunchMoney::Errors))
89
- end
90
- def create_category_group(name:, description: nil, is_income: false, exclude_from_budget: false,
91
- exclude_from_totals: false, category_ids: [], new_categories: [])
92
-
93
- params = {
94
- name:,
95
- description:,
96
- is_income:,
97
- exclude_from_budget:,
98
- exclude_from_totals:,
99
- category_ids:,
100
- new_categories:,
101
- }
102
-
103
- response = post("categories/group", params)
104
-
105
- api_errors = errors(response)
106
- return api_errors if api_errors.present?
107
-
108
- response.body
109
- end
110
-
111
- sig do
112
- params(
113
- category_id: Integer,
114
- name: T.nilable(String),
115
- description: T.nilable(String),
116
- is_income: T.nilable(T::Boolean),
117
- exclude_from_budget: T.nilable(T::Boolean),
118
- exclude_from_totals: T.nilable(T::Boolean),
119
- archived: T.nilable(T::Boolean),
120
- group_id: T.nilable(Integer),
121
- ).returns(T.any(T::Boolean, LunchMoney::Errors))
122
- end
123
- def update_category(category_id, name: nil, description: nil, is_income: nil, exclude_from_budget: nil,
124
- exclude_from_totals: nil, archived: nil, group_id: nil)
125
-
126
- params = clean_params({
127
- name:,
128
- description:,
129
- is_income:,
130
- exclude_from_budget:,
131
- exclude_from_totals:,
132
- archived:,
133
- group_id:,
134
- })
135
- response = put("categories/#{category_id}", params)
136
-
137
- api_errors = errors(response)
138
- return api_errors if api_errors.present?
139
-
140
- response.body
141
- end
142
-
143
- sig do
144
- params(
145
- group_id: Integer,
146
- category_ids: T::Array[Integer],
147
- new_categories: T::Array[String],
148
- ).returns(T.any(LunchMoney::Category, LunchMoney::Errors))
149
- end
150
- def add_to_category_group(group_id, category_ids: [], new_categories: [])
151
- params = {
152
- category_ids:,
153
- new_categories:,
154
- }
155
-
156
- response = post("categories/group/#{group_id}/add", params)
157
-
158
- api_errors = errors(response)
159
- return api_errors if api_errors.present?
160
-
161
- LunchMoney::Category.new(**response.body)
162
- end
163
-
164
- sig { params(category_id: Integer).returns(T.any(T::Boolean, LunchMoney::Errors)) }
165
- def delete_category(category_id)
166
- response = delete("categories/#{category_id}")
167
-
168
- api_errors = errors(response)
169
- return api_errors if api_errors.present?
170
-
171
- response.body
172
- end
173
-
174
- sig { params(category_id: Integer).returns(T.any(T::Boolean, LunchMoney::Errors)) }
175
- def force_delete_category(category_id)
176
- response = delete("categories/#{category_id}/force")
177
-
178
- api_errors = errors(response)
179
- return api_errors if api_errors.present?
180
-
181
- response.body
182
- end
183
-
184
- private
185
-
186
- sig { params(format: T.nilable(T.any(String, Symbol))).returns(T.nilable(T::Hash[Symbol, String])) }
187
- def categories_params(format:)
188
- return unless format
189
-
190
- raise(InvalidQueryParameter, "format must be either flattened or nested") if VALID_FORMATS.exclude?(format.to_s)
191
-
192
- { format: format.to_s }
193
- end
194
- end
195
- end
@@ -1,43 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- module LunchMoney
5
- # https://lunchmoney.dev/#crypto-object
6
- class Crypto < CryptoBase
7
- include LunchMoney::Validators
8
-
9
- sig { returns(String) }
10
- attr_reader :balance_as_of
11
-
12
- sig { returns(String) }
13
- attr_accessor :currency, :status
14
-
15
- sig do
16
- params(
17
- created_at: String,
18
- source: String,
19
- name: String,
20
- balance: String,
21
- balance_as_of: String,
22
- currency: String,
23
- status: String,
24
- institution_name: T.nilable(String),
25
- id: T.nilable(Integer),
26
- zabo_account_id: T.nilable(Integer),
27
- display_name: T.nilable(String),
28
- ).void
29
- end
30
- def initialize(created_at:, source:, name:, balance:, balance_as_of:, currency:,
31
- status:, institution_name: nil, id: nil, zabo_account_id: nil, display_name: nil)
32
- super(created_at:, source:, name:, balance:, institution_name:, id:, zabo_account_id:, display_name:)
33
- @balance_as_of = T.let(validate_iso8601!(balance_as_of), String)
34
- @currency = currency
35
- @status = status
36
- end
37
-
38
- sig { params(time: String).void }
39
- def balance_as_of=(time)
40
- @balance_as_of = validate_iso8601!(time)
41
- end
42
- end
43
- end
@@ -1,65 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- module LunchMoney
5
- # https://lunchmoney.dev/#crypto-object
6
- class CryptoBase < LunchMoney::DataObject
7
- include LunchMoney::Validators
8
-
9
- sig { returns(T.nilable(Integer)) }
10
- attr_accessor :id, :zabo_account_id
11
-
12
- sig { returns(String) }
13
- attr_reader :source, :created_at
14
-
15
- sig { returns(String) }
16
- attr_accessor :name, :balance
17
-
18
- sig { returns(T.nilable(String)) }
19
- attr_accessor :display_name, :institution_name
20
-
21
- # Valid crypto source types
22
- VALID_SOURCES = T.let(
23
- [
24
- "synced",
25
- "manual",
26
- ],
27
- T::Array[String],
28
- )
29
-
30
- sig do
31
- params(
32
- created_at: String,
33
- source: String,
34
- name: String,
35
- balance: String,
36
- institution_name: T.nilable(String),
37
- id: T.nilable(Integer),
38
- zabo_account_id: T.nilable(Integer),
39
- display_name: T.nilable(String),
40
- ).void
41
- end
42
- def initialize(created_at:, source:, name:, balance:, institution_name: nil, id: nil, zabo_account_id: nil,
43
- display_name: nil)
44
- super()
45
- @created_at = T.let(validate_iso8601!(created_at), String)
46
- @source = T.let(validate_one_of!(source, VALID_SOURCES), String)
47
- @name = name
48
- @balance = balance
49
- @institution_name = institution_name
50
- @id = id
51
- @zabo_account_id = zabo_account_id
52
- @display_name = display_name
53
- end
54
-
55
- sig { params(name: String).void }
56
- def source=(name)
57
- @source = validate_one_of!(name, VALID_SOURCES)
58
- end
59
-
60
- sig { params(time: String).void }
61
- def created_at=(time)
62
- @created_at = validate_iso8601!(time)
63
- end
64
- end
65
- end
@@ -1,49 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- require_relative "crypto/crypto_base"
5
- require_relative "crypto/crypto"
6
-
7
- module LunchMoney
8
- # https://lunchmoney.dev/#crypto
9
- class CryptoCalls < ApiCall
10
- sig { returns(T.any(T::Array[LunchMoney::Crypto], LunchMoney::Errors)) }
11
- def crypto
12
- response = get("crypto")
13
-
14
- api_errors = errors(response)
15
- return api_errors if api_errors.present?
16
-
17
- response.body[:crypto].map do |crypto|
18
- LunchMoney::Crypto.new(**crypto)
19
- end
20
- end
21
-
22
- sig do
23
- params(
24
- crypto_id: Integer,
25
- name: T.nilable(String),
26
- display_name: T.nilable(String),
27
- institution_name: T.nilable(String),
28
- balance: T.nilable(String),
29
- currency: T.nilable(String),
30
- ).returns(T.any(LunchMoney::CryptoBase, LunchMoney::Errors))
31
- end
32
- def update_crypto(crypto_id, name: nil, display_name: nil, institution_name: nil, balance: nil, currency: nil)
33
- params = clean_params({
34
- name:,
35
- display_name:,
36
- institution_name:,
37
- balance:,
38
- currency:,
39
- })
40
-
41
- response = put("crypto/manual/#{crypto_id}", params)
42
-
43
- api_errors = errors(response)
44
- return api_errors if api_errors.present?
45
-
46
- LunchMoney::CryptoBase.new(**response.body)
47
- end
48
- end
49
- end
@@ -1,25 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- module LunchMoney
5
- # Base data object for the objects returned and used when calling the LunchMoney API
6
- class DataObject
7
- sig { params(symbolize_keys: T::Boolean).returns(T::Hash[String, T.untyped]) }
8
- def serialize(symbolize_keys: false)
9
- ivars = instance_variables
10
-
11
- output = {}
12
-
13
- ivars.each do |ivar|
14
- key = ivar.to_s.gsub("@", "")
15
- key = key.to_sym if symbolize_keys
16
-
17
- value = instance_variable_get(ivar)
18
-
19
- output[key] = value
20
- end
21
-
22
- output
23
- end
24
- end
25
- end
@@ -1,73 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- module LunchMoney
5
- # https://lunchmoney.dev/#plaid-accounts-object
6
- class PlaidAccount < LunchMoney::DataObject
7
- sig { returns(Integer) }
8
- attr_accessor :id
9
-
10
- sig { returns(String) }
11
- attr_accessor :date_linked,
12
- :name,
13
- :type,
14
- :mask,
15
- :institution_name,
16
- :status,
17
- :balance,
18
- :currency,
19
- :balance_last_update,
20
- :display_name,
21
- :plaid_last_successful_update
22
-
23
- sig { returns(T.nilable(String)) }
24
- attr_accessor :subtype, :import_start_date, :last_fetch, :last_import
25
-
26
- sig { returns(T.nilable(Integer)) }
27
- attr_accessor :limit
28
-
29
- sig do
30
- params(
31
- date_linked: String,
32
- name: String,
33
- type: String,
34
- mask: String,
35
- institution_name: String,
36
- status: String,
37
- balance: String,
38
- currency: String,
39
- balance_last_update: String,
40
- display_name: String,
41
- id: Integer,
42
- plaid_last_successful_update: String,
43
- last_import: T.nilable(String),
44
- limit: T.nilable(Integer),
45
- subtype: T.nilable(String),
46
- import_start_date: T.nilable(String),
47
- last_fetch: T.nilable(String),
48
- ).void
49
- end
50
- def initialize(date_linked:, name:, type:, mask:, institution_name:, status:, balance:, currency:,
51
- balance_last_update:, display_name:, id:, plaid_last_successful_update:, last_import: nil, limit: nil,
52
- subtype: nil, import_start_date: nil, last_fetch: nil)
53
- super()
54
- @id = id
55
- @date_linked = date_linked
56
- @name = name
57
- @display_name = display_name
58
- @type = type
59
- @subtype = subtype
60
- @mask = mask
61
- @institution_name = institution_name
62
- @status = status
63
- @limit = limit
64
- @balance = balance
65
- @currency = currency
66
- @balance_last_update = balance_last_update
67
- @import_start_date = import_start_date
68
- @last_import = last_import
69
- @last_fetch = last_fetch
70
- @plaid_last_successful_update = plaid_last_successful_update
71
- end
72
- end
73
- end
@@ -1,38 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- require_relative "plaid_account"
5
-
6
- module LunchMoney
7
- # https://lunchmoney.dev/#plaid-accounts
8
- class PlaidAccountCalls < ApiCall
9
- sig { returns(T.any(T::Array[LunchMoney::PlaidAccount], LunchMoney::Errors)) }
10
- def plaid_accounts
11
- response = get("plaid_accounts")
12
-
13
- api_errors = errors(response)
14
- return api_errors if api_errors.present?
15
-
16
- response.body[:plaid_accounts].map do |plaid_account|
17
- LunchMoney::PlaidAccount.new(**plaid_account)
18
- end
19
- end
20
-
21
- sig do
22
- params(
23
- start_date: T.nilable(String),
24
- end_date: T.nilable(String),
25
- plaid_account_id: T.nilable(Integer),
26
- ).returns(T.any(T::Boolean, LunchMoney::Errors))
27
- end
28
- def plaid_accounts_fetch(start_date: nil, end_date: nil, plaid_account_id: nil)
29
- params = clean_params({ start_date:, end_date:, plaid_account_id: })
30
- response = post("plaid_accounts/fetch", params)
31
-
32
- api_errors = errors(response)
33
- return api_errors if api_errors.present?
34
-
35
- response.body
36
- end
37
- end
38
- end