lunchmoney 0.10.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/publish_gem.yml +1 -0
  3. data/Gemfile.lock +1 -1
  4. data/README.md +41 -4
  5. data/lib/lunchmoney/api.rb +34 -34
  6. data/lib/lunchmoney/calls/assets.rb +98 -0
  7. data/lib/lunchmoney/calls/base.rb +112 -0
  8. data/lib/lunchmoney/calls/budgets.rb +84 -0
  9. data/lib/lunchmoney/calls/categories.rb +196 -0
  10. data/lib/lunchmoney/calls/crypto.rb +50 -0
  11. data/lib/lunchmoney/calls/plaid_accounts.rb +40 -0
  12. data/lib/lunchmoney/calls/recurring_expenses.rb +29 -0
  13. data/lib/lunchmoney/calls/tags.rb +21 -0
  14. data/lib/lunchmoney/calls/transactions.rb +220 -0
  15. data/lib/lunchmoney/calls/users.rb +21 -0
  16. data/lib/lunchmoney/objects/asset.rb +91 -0
  17. data/lib/lunchmoney/objects/budget.rb +76 -0
  18. data/lib/lunchmoney/objects/category.rb +55 -0
  19. data/lib/lunchmoney/objects/child_category.rb +44 -0
  20. data/lib/lunchmoney/objects/child_transaction.rb +35 -0
  21. data/lib/lunchmoney/objects/config.rb +40 -0
  22. data/lib/lunchmoney/objects/crypto.rb +46 -0
  23. data/lib/lunchmoney/objects/crypto_base.rb +67 -0
  24. data/lib/lunchmoney/objects/data.rb +44 -0
  25. data/lib/lunchmoney/objects/object.rb +28 -0
  26. data/lib/lunchmoney/objects/plaid_account.rb +75 -0
  27. data/lib/lunchmoney/objects/recurring_expense.rb +68 -0
  28. data/lib/lunchmoney/objects/recurring_expense_base.rb +31 -0
  29. data/lib/lunchmoney/objects/split.rb +28 -0
  30. data/lib/lunchmoney/objects/tag.rb +24 -0
  31. data/lib/lunchmoney/objects/tag_base.rb +23 -0
  32. data/lib/lunchmoney/objects/transaction.rb +160 -0
  33. data/lib/lunchmoney/objects/transaction_base.rb +54 -0
  34. data/lib/lunchmoney/objects/transaction_modification_base.rb +32 -0
  35. data/lib/lunchmoney/objects/update_transaction.rb +47 -0
  36. data/lib/lunchmoney/objects/user.rb +38 -0
  37. data/lib/lunchmoney/version.rb +1 -1
  38. data/lunchmoney.gemspec +1 -0
  39. data/sorbet/rbi/gems/activesupport@7.1.3.rbi +122 -22
  40. metadata +33 -32
  41. data/lib/lunchmoney/api_call.rb +0 -109
  42. data/lib/lunchmoney/assets/asset.rb +0 -89
  43. data/lib/lunchmoney/assets/asset_calls.rb +0 -96
  44. data/lib/lunchmoney/budget/budget.rb +0 -74
  45. data/lib/lunchmoney/budget/budget_calls.rb +0 -82
  46. data/lib/lunchmoney/budget/config.rb +0 -38
  47. data/lib/lunchmoney/budget/data.rb +0 -42
  48. data/lib/lunchmoney/categories/category/category.rb +0 -52
  49. data/lib/lunchmoney/categories/category/child_category.rb +0 -42
  50. data/lib/lunchmoney/categories/category_calls.rb +0 -195
  51. data/lib/lunchmoney/crypto/crypto/crypto.rb +0 -43
  52. data/lib/lunchmoney/crypto/crypto/crypto_base.rb +0 -65
  53. data/lib/lunchmoney/crypto/crypto_calls.rb +0 -49
  54. data/lib/lunchmoney/data_object.rb +0 -25
  55. data/lib/lunchmoney/plaid_accounts/plaid_account.rb +0 -73
  56. data/lib/lunchmoney/plaid_accounts/plaid_account_calls.rb +0 -38
  57. data/lib/lunchmoney/recurring_expenses/recurring_expense/recurring_expense.rb +0 -65
  58. data/lib/lunchmoney/recurring_expenses/recurring_expense/recurring_expense_base.rb +0 -29
  59. data/lib/lunchmoney/recurring_expenses/recurring_expense_calls.rb +0 -28
  60. data/lib/lunchmoney/tags/tag/tag.rb +0 -20
  61. data/lib/lunchmoney/tags/tag/tag_base.rb +0 -21
  62. data/lib/lunchmoney/tags/tag_calls.rb +0 -20
  63. data/lib/lunchmoney/transactions/transaction/child_transaction.rb +0 -31
  64. data/lib/lunchmoney/transactions/transaction/split.rb +0 -24
  65. data/lib/lunchmoney/transactions/transaction/transaction.rb +0 -156
  66. data/lib/lunchmoney/transactions/transaction/transaction_base.rb +0 -52
  67. data/lib/lunchmoney/transactions/transaction/transaction_modification_base.rb +0 -30
  68. data/lib/lunchmoney/transactions/transaction/update_transaction.rb +0 -43
  69. data/lib/lunchmoney/transactions/transaction_calls.rb +0 -218
  70. data/lib/lunchmoney/user/user.rb +0 -36
  71. data/lib/lunchmoney/user/user_calls.rb +0 -19
@@ -1,20 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- require_relative "tag/tag_base"
5
- require_relative "tag/tag"
6
-
7
- module LunchMoney
8
- # https://lunchmoney.dev/#tags
9
- class TagCalls < ApiCall
10
- sig { returns(T.any(T::Array[LunchMoney::Tag], LunchMoney::Errors)) }
11
- def tags
12
- response = get("tags")
13
-
14
- api_errors = errors(response)
15
- return api_errors if api_errors.present?
16
-
17
- response.body.map { |tag| LunchMoney::Tag.new(**tag) }
18
- end
19
- end
20
- end
@@ -1,31 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- module LunchMoney
5
- # Slimmed down version of https://lunchmoney.dev/#transaction-object used in the
6
- # `children` field of a transaction object with an additional `formatted_date`` field
7
- class ChildTransaction < TransactionBase
8
- sig { returns(String) }
9
- attr_accessor :formatted_date
10
-
11
- sig do
12
- params(
13
- id: Integer,
14
- date: String,
15
- amount: String,
16
- currency: String,
17
- to_base: Number,
18
- payee: String,
19
- formatted_date: String,
20
- notes: T.nilable(String),
21
- asset_id: T.nilable(Integer),
22
- plaid_account_id: T.nilable(Integer),
23
- ).void
24
- end
25
- def initialize(id:, date:, amount:, currency:, to_base:, payee:, formatted_date:, notes: nil, asset_id: nil,
26
- plaid_account_id: nil)
27
- super(id:, date:, amount:, currency:, to_base:, payee:, notes:, asset_id:, plaid_account_id:)
28
- @formatted_date = formatted_date
29
- end
30
- end
31
- end
@@ -1,24 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- module LunchMoney
5
- # Object used to split a transaction when updating https://lunchmoney.dev/#update-transaction
6
- class Split < TransactionModificationBase
7
- sig { returns(T.any(Number, String)) }
8
- attr_accessor :amount
9
-
10
- sig do
11
- params(
12
- amount: T.any(Number, String),
13
- payee: T.nilable(String),
14
- date: T.nilable(String),
15
- category_id: T.nilable(Integer),
16
- notes: T.nilable(String),
17
- ).void
18
- end
19
- def initialize(amount:, payee: nil, date: nil, category_id: nil, notes: nil)
20
- super(payee:, date:, category_id:, notes:)
21
- @amount = amount
22
- end
23
- end
24
- end
@@ -1,156 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- module LunchMoney
5
- # https://lunchmoney.dev/#transaction-object
6
- class Transaction < TransactionBase
7
- sig { returns(T.nilable(Integer)) }
8
- attr_accessor :category_id,
9
- :category_group_id,
10
- :recurring_id,
11
- :parent_id,
12
- :group_id,
13
- :external_id
14
-
15
- sig { returns(String) }
16
- attr_accessor :created_at,
17
- :updated_at,
18
- :status,
19
- :source,
20
- :display_name,
21
- :account_display_name
22
-
23
- sig { returns(T.nilable(String)) }
24
- attr_accessor :category_name,
25
- :category_group_name,
26
- :original_name,
27
- :recurring_payee,
28
- :recurring_description,
29
- :recurring_cadence,
30
- :recurring_type,
31
- :recurring_amount,
32
- :recurring_currency,
33
- :asset_institution_name,
34
- :asset_name,
35
- :asset_display_name,
36
- :asset_status,
37
- :plaid_account_name,
38
- :plaid_account_mask,
39
- :institution_name,
40
- :plaid_account_display_name,
41
- :plaid_metadata,
42
- :display_notes
43
-
44
- sig { returns(T::Boolean) }
45
- attr_accessor :is_income, :exclude_from_budget, :exclude_from_totals, :is_pending, :has_children, :is_group
46
-
47
- sig { returns(T::Array[LunchMoney::TagBase]) }
48
- attr_accessor :tags
49
-
50
- sig { returns(T.nilable(T::Array[LunchMoney::ChildTransaction])) }
51
- attr_accessor :children
52
-
53
- sig do
54
- params(
55
- id: Integer,
56
- date: String,
57
- amount: String,
58
- currency: String,
59
- to_base: Number,
60
- payee: String,
61
- is_income: T::Boolean,
62
- exclude_from_budget: T::Boolean,
63
- exclude_from_totals: T::Boolean,
64
- created_at: String,
65
- updated_at: String,
66
- status: String,
67
- is_pending: T::Boolean,
68
- has_children: T::Boolean,
69
- is_group: T::Boolean,
70
- source: String,
71
- display_name: String,
72
- account_display_name: String,
73
- tags: T::Array[LunchMoney::TagBase],
74
- category_id: T.nilable(Integer),
75
- category_name: T.nilable(String),
76
- category_group_id: T.nilable(Integer),
77
- category_group_name: T.nilable(String),
78
- notes: T.nilable(String),
79
- original_name: T.nilable(String),
80
- recurring_id: T.nilable(Integer),
81
- recurring_payee: T.nilable(String),
82
- recurring_description: T.nilable(String),
83
- recurring_cadence: T.nilable(String),
84
- recurring_type: T.nilable(String),
85
- recurring_amount: T.nilable(String),
86
- recurring_currency: T.nilable(String),
87
- parent_id: T.nilable(Integer),
88
- group_id: T.nilable(Integer),
89
- asset_id: T.nilable(Integer),
90
- asset_institution_name: T.nilable(String),
91
- asset_name: T.nilable(String),
92
- asset_display_name: T.nilable(String),
93
- asset_status: T.nilable(String),
94
- plaid_account_id: T.nilable(Integer),
95
- plaid_account_name: T.nilable(String),
96
- plaid_account_mask: T.nilable(String),
97
- institution_name: T.nilable(String),
98
- plaid_account_display_name: T.nilable(String),
99
- plaid_metadata: T.nilable(String),
100
- display_notes: T.nilable(String),
101
- external_id: T.nilable(Integer),
102
- children: T.nilable(T::Array[LunchMoney::ChildTransaction]),
103
- ).void
104
- end
105
- def initialize(id:, date:, amount:, currency:, to_base:, payee:, is_income:, exclude_from_budget:,
106
- exclude_from_totals:, created_at:, updated_at:, status:, is_pending:, has_children:, is_group:, source:,
107
- display_name:, account_display_name:, tags:, category_id: nil, category_name: nil, category_group_id: nil,
108
- category_group_name: nil, notes: nil, original_name: nil, recurring_id: nil, recurring_payee: nil,
109
- recurring_description: nil, recurring_cadence: nil, recurring_type: nil, recurring_amount: nil,
110
- recurring_currency: nil, parent_id: nil, group_id: nil, asset_id: nil, asset_institution_name: nil,
111
- asset_name: nil, asset_display_name: nil, asset_status: nil, plaid_account_id: nil, plaid_account_name: nil,
112
- plaid_account_mask: nil, institution_name: nil, plaid_account_display_name: nil, plaid_metadata: nil,
113
- display_notes: nil, external_id: nil, children: nil)
114
- super(id:, date:, amount:, currency:, to_base:, payee:, notes:, asset_id:, plaid_account_id:)
115
- @is_income = is_income
116
- @exclude_from_budget = exclude_from_budget
117
- @exclude_from_totals = exclude_from_totals
118
- @created_at = created_at
119
- @updated_at = updated_at
120
- @status = status
121
- @is_pending = is_pending
122
- @has_children = has_children
123
- @is_group = is_group
124
- @source = source
125
- @display_name = display_name
126
- @account_display_name = account_display_name
127
- @tags = tags
128
- @category_id = category_id
129
- @category_name = category_name
130
- @category_group_id = category_group_id
131
- @category_group_name = category_group_name
132
- @original_name = original_name
133
- @recurring_id = recurring_id
134
- @recurring_payee = recurring_payee
135
- @recurring_description = recurring_description
136
- @recurring_cadence = recurring_cadence
137
- @recurring_type = recurring_type
138
- @recurring_amount = recurring_amount
139
- @recurring_currency = recurring_currency
140
- @parent_id = parent_id
141
- @group_id = group_id
142
- @asset_institution_name = asset_institution_name
143
- @asset_name = asset_name
144
- @asset_display_name = asset_display_name
145
- @asset_status = asset_status
146
- @plaid_account_name = plaid_account_name
147
- @plaid_account_mask = plaid_account_mask
148
- @institution_name = institution_name
149
- @plaid_account_display_name = plaid_account_display_name
150
- @plaid_metadata = plaid_metadata
151
- @display_notes = display_notes
152
- @children = children
153
- @external_id = external_id
154
- end
155
- end
156
- end
@@ -1,52 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- module LunchMoney
5
- # Slimmed down version of https://lunchmoney.dev/#transaction-object used as a base for other transaction objects
6
- class TransactionBase < LunchMoney::DataObject
7
- sig { returns(Integer) }
8
- attr_accessor :id
9
-
10
- sig { returns(Number) }
11
- attr_accessor :to_base
12
-
13
- sig { returns(T.nilable(Integer)) }
14
- attr_accessor :asset_id, :plaid_account_id
15
-
16
- sig { returns(String) }
17
- attr_accessor :date,
18
- :amount,
19
- :currency,
20
- :payee
21
-
22
- sig { returns(T.nilable(String)) }
23
- attr_accessor :notes
24
-
25
- sig do
26
- params(
27
- id: Integer,
28
- date: String,
29
- amount: String,
30
- currency: String,
31
- to_base: Number,
32
- payee: String,
33
- notes: T.nilable(String),
34
- asset_id: T.nilable(Integer),
35
- plaid_account_id: T.nilable(Integer),
36
- ).void
37
- end
38
- def initialize(id:, date:, amount:, currency:, to_base:, payee:, notes: nil, asset_id: nil,
39
- plaid_account_id: nil)
40
- super()
41
- @id = id
42
- @date = date
43
- @amount = amount
44
- @currency = currency
45
- @to_base = to_base
46
- @payee = payee
47
- @notes = notes
48
- @asset_id = asset_id
49
- @plaid_account_id = plaid_account_id
50
- end
51
- end
52
- end
@@ -1,30 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- module LunchMoney
5
- # Base object used for transaction objects that are used to update
6
- # transactions https://lunchmoney.dev/#update-transaction
7
- class TransactionModificationBase < LunchMoney::DataObject
8
- sig { returns(T.nilable(String)) }
9
- attr_accessor :payee, :date, :notes
10
-
11
- sig { returns(T.nilable(Integer)) }
12
- attr_accessor :category_id
13
-
14
- sig do
15
- params(
16
- payee: T.nilable(String),
17
- date: T.nilable(String),
18
- category_id: T.nilable(Integer),
19
- notes: T.nilable(String),
20
- ).void
21
- end
22
- def initialize(payee: nil, date: nil, category_id: nil, notes: nil)
23
- super()
24
- @payee = payee
25
- @date = date
26
- @category_id = category_id
27
- @notes = notes
28
- end
29
- end
30
- end
@@ -1,43 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- module LunchMoney
5
- # object used when updating a transaction https://lunchmoney.dev/#update-transaction
6
- class UpdateTransaction < TransactionModificationBase
7
- sig { returns(T.nilable(String)) }
8
- attr_accessor :amount, :currency, :status, :external_id
9
-
10
- sig { returns(T.nilable(Integer)) }
11
- attr_accessor :asset_id, :recurring_id
12
-
13
- sig { returns(T.nilable(T::Array[T.any(String, Integer)])) }
14
- attr_accessor :tags
15
-
16
- sig do
17
- params(
18
- tags: T.nilable(T::Array[T.any(String, Integer)]),
19
- category_id: T.nilable(Integer),
20
- payee: T.nilable(String),
21
- amount: T.nilable(String),
22
- currency: T.nilable(String),
23
- asset_id: T.nilable(Integer),
24
- recurring_id: T.nilable(Integer),
25
- notes: T.nilable(String),
26
- status: T.nilable(String),
27
- external_id: T.nilable(String),
28
- date: T.nilable(String),
29
- ).void
30
- end
31
- def initialize(tags: nil, category_id: nil, payee: nil, amount: nil, currency: nil, asset_id: nil,
32
- recurring_id: nil, notes: nil, status: nil, external_id: nil, date: nil)
33
- super(payee:, date:, category_id:, notes:)
34
- @amount = amount
35
- @tags = tags
36
- @currency = currency
37
- @asset_id = asset_id
38
- @recurring_id = recurring_id
39
- @status = status
40
- @external_id = external_id
41
- end
42
- end
43
- end
@@ -1,218 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- require_relative "transaction/transaction_base"
5
- require_relative "transaction/child_transaction"
6
- require_relative "transaction/transaction"
7
- require_relative "transaction/transaction_modification_base"
8
- require_relative "transaction/split"
9
- require_relative "transaction/update_transaction"
10
-
11
- module LunchMoney
12
- # https://lunchmoney.dev/#transactions
13
- class TransactionCalls < ApiCall
14
- sig do
15
- params(
16
- tag_id: T.nilable(Integer),
17
- recurring_id: T.nilable(Integer),
18
- plaid_account_id: T.nilable(Integer),
19
- category_id: T.nilable(Integer),
20
- asset_id: T.nilable(Integer),
21
- is_group: T.nilable(T::Boolean),
22
- status: T.nilable(String),
23
- start_date: T.nilable(String),
24
- end_date: T.nilable(String),
25
- debit_as_negative: T.nilable(T::Boolean),
26
- pending: T.nilable(T::Boolean),
27
- offset: T.nilable(Integer),
28
- limit: T.nilable(Integer),
29
- ).returns(T.any(T::Array[LunchMoney::Transaction], LunchMoney::Errors))
30
- end
31
- def transactions(
32
- tag_id: nil,
33
- recurring_id: nil,
34
- plaid_account_id: nil,
35
- category_id: nil,
36
- asset_id: nil,
37
- is_group: nil,
38
- status: nil,
39
- start_date: nil,
40
- end_date: nil,
41
- debit_as_negative: nil,
42
- pending: nil,
43
- offset: nil,
44
- limit: nil
45
- )
46
-
47
- params = clean_params({
48
- tag_id:,
49
- recurring_id:,
50
- plaid_account_id:,
51
- category_id:,
52
- asset_id:,
53
- is_group:,
54
- status:,
55
- start_date:,
56
- end_date:,
57
- debit_as_negative:,
58
- pending:,
59
- offset:,
60
- limit:,
61
- })
62
- response = get("transactions", query_params: params)
63
-
64
- api_errors = errors(response)
65
- return api_errors if api_errors.present?
66
-
67
- response.body[:transactions].map do |transaction|
68
- transaction[:tags].map! { |tag| LunchMoney::TagBase.new(**tag) }
69
-
70
- transaction[:children]&.map! { |child_transaction| LunchMoney::ChildTransaction.new(**child_transaction) }
71
-
72
- LunchMoney::Transaction.new(**transaction)
73
- end
74
- end
75
-
76
- sig do
77
- params(
78
- transaction_id: Integer,
79
- debit_as_negative: T.nilable(T::Boolean),
80
- ).returns(T.any(LunchMoney::Transaction, LunchMoney::Errors))
81
- end
82
- def transaction(transaction_id, debit_as_negative: nil)
83
- params = clean_params({ debit_as_negative: })
84
- response = get("transactions/#{transaction_id}", query_params: params)
85
-
86
- api_errors = errors(response)
87
- return api_errors if api_errors.present?
88
-
89
- LunchMoney::Transaction.new(**response.body)
90
- end
91
-
92
- sig do
93
- params(
94
- transactions: T::Array[LunchMoney::UpdateTransaction],
95
- apply_rules: T.nilable(T::Boolean),
96
- skip_duplicates: T.nilable(T::Boolean),
97
- check_for_recurring: T.nilable(T::Boolean),
98
- debit_as_negative: T.nilable(T::Boolean),
99
- skip_balance_update: T.nilable(T::Boolean),
100
- ).returns(T.any(T::Hash[Symbol, T::Array[Integer]], LunchMoney::Errors))
101
- end
102
- def insert_transactions(transactions, apply_rules: nil, skip_duplicates: nil,
103
- check_for_recurring: nil, debit_as_negative: nil, skip_balance_update: nil)
104
- params = clean_params({
105
- transactions: transactions.map(&:serialize),
106
- apply_rules:,
107
- skip_duplicates:,
108
- check_for_recurring:,
109
- debit_as_negative:,
110
- skip_balance_update:,
111
- })
112
- response = post("transactions", params)
113
-
114
- api_errors = errors(response)
115
- return api_errors if api_errors.present?
116
-
117
- response.body
118
- end
119
-
120
- sig do
121
- params(
122
- transaction_id: Integer,
123
- transaction: T.nilable(LunchMoney::UpdateTransaction),
124
- split: T.nilable(T::Array[LunchMoney::Split]),
125
- debit_as_negative: T.nilable(T::Boolean),
126
- skip_balance_update: T.nilable(T::Boolean),
127
- ).returns(T.any({ updated: T::Boolean, split: T.nilable(T::Array[Integer]) }, LunchMoney::Errors))
128
- end
129
- def update_transaction(transaction_id, transaction: nil, split: nil,
130
- debit_as_negative: nil, skip_balance_update: nil)
131
- raise(
132
- LunchMoney::MissingArgument,
133
- "Either a transaction or split must be provided",
134
- ) if transaction.nil? && split.nil?
135
-
136
- params = clean_params({
137
- transaction: transaction&.serialize,
138
- split: split&.map!(&:serialize),
139
- debit_as_negative:,
140
- skip_balance_update:,
141
- })
142
- response = put("transactions/#{transaction_id}", params)
143
-
144
- api_errors = errors(response)
145
- return api_errors if api_errors.present?
146
-
147
- response.body
148
- end
149
-
150
- sig do
151
- params(
152
- parent_ids: T::Array[Integer],
153
- remove_parents: T.nilable(T::Boolean),
154
- ).returns(T.any(T::Array[Integer], LunchMoney::Errors))
155
- end
156
- def unsplit_transaction(parent_ids, remove_parents: false)
157
- params = { parent_ids:, remove_parents: }
158
- response = post("transactions/unsplit", params)
159
-
160
- api_errors = errors(response)
161
- return api_errors if api_errors.present?
162
-
163
- response.body
164
- end
165
-
166
- sig { params(transaction_id: Integer).returns(T.any(LunchMoney::Transaction, LunchMoney::Errors)) }
167
- def transaction_group(transaction_id)
168
- response = get("transactions/group", query_params: { transaction_id: })
169
-
170
- api_errors = errors(response)
171
- return api_errors if api_errors.present?
172
-
173
- LunchMoney::Transaction.new(**response.body)
174
- end
175
-
176
- sig do
177
- params(
178
- date: String,
179
- payee: String,
180
- transactions: T::Array[T.any(Integer, String)],
181
- category_id: T.nilable(Integer),
182
- notes: T.nilable(String),
183
- tags: T.nilable(T::Array[T.any(Integer, String)]),
184
- ).returns(T.any(Integer, LunchMoney::Errors))
185
- end
186
- def create_transaction_group(date:, payee:, transactions:, category_id: nil, notes: nil, tags: nil)
187
- params = clean_params({
188
- date:,
189
- payee:,
190
- transactions:,
191
- category_id:,
192
- notes:,
193
- tags:,
194
- })
195
- response = post("transactions/group", params)
196
-
197
- api_errors = errors(response)
198
- return api_errors if api_errors.present?
199
-
200
- response.body
201
- end
202
-
203
- sig do
204
- params(transaction_id: T.any(
205
- String,
206
- Integer,
207
- )).returns(T.any(T::Hash[Symbol, T::Array[Integer]], LunchMoney::Errors))
208
- end
209
- def delete_transaction_group(transaction_id)
210
- response = delete("transactions/group/#{transaction_id}")
211
-
212
- api_errors = errors(response)
213
- return api_errors if api_errors.present?
214
-
215
- response.body
216
- end
217
- end
218
- end
@@ -1,36 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- module LunchMoney
5
- # https://lunchmoney.dev/#user-object
6
- class User < LunchMoney::DataObject
7
- sig { returns(Integer) }
8
- attr_accessor :user_id, :account_id
9
-
10
- sig { returns(String) }
11
- attr_accessor :user_name, :user_email, :budget_name
12
-
13
- sig { returns(T.nilable(String)) }
14
- attr_accessor :api_key_label
15
-
16
- sig do
17
- params(
18
- user_id: Integer,
19
- user_name: String,
20
- user_email: String,
21
- account_id: Integer,
22
- budget_name: String,
23
- api_key_label: T.nilable(String),
24
- ).void
25
- end
26
- def initialize(user_id:, user_name:, user_email:, account_id:, budget_name:, api_key_label: nil)
27
- super()
28
- @user_id = user_id
29
- @user_name = user_name
30
- @user_email = user_email
31
- @account_id = account_id
32
- @budget_name = budget_name
33
- @api_key_label = api_key_label
34
- end
35
- end
36
- end
@@ -1,19 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- require_relative "user"
5
-
6
- module LunchMoney
7
- # https://lunchmoney.dev/#user
8
- class UserCalls < ApiCall
9
- sig { returns(T.any(LunchMoney::User, LunchMoney::Errors)) }
10
- def me
11
- response = get("me")
12
-
13
- api_errors = errors(response)
14
- return api_errors if api_errors.present?
15
-
16
- LunchMoney::User.new(**response.body)
17
- end
18
- end
19
- end