ynab-cli 0.3.0__py3-none-any.whl

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 (206) hide show
  1. ynab_cli/__init__.py +0 -0
  2. ynab_cli/adapters/__init__.py +0 -0
  3. ynab_cli/adapters/rich/__init__.py +0 -0
  4. ynab_cli/adapters/rich/io.py +38 -0
  5. ynab_cli/adapters/textual/__init__.py +0 -0
  6. ynab_cli/adapters/textual/io.py +62 -0
  7. ynab_cli/adapters/ynab/__init__.py +8 -0
  8. ynab_cli/adapters/ynab/api/__init__.py +1 -0
  9. ynab_cli/adapters/ynab/api/accounts/__init__.py +1 -0
  10. ynab_cli/adapters/ynab/api/accounts/create_account.py +186 -0
  11. ynab_cli/adapters/ynab/api/accounts/get_account_by_id.py +177 -0
  12. ynab_cli/adapters/ynab/api/accounts/get_accounts.py +184 -0
  13. ynab_cli/adapters/ynab/api/budgets/__init__.py +1 -0
  14. ynab_cli/adapters/ynab/api/budgets/get_budget_by_id.py +188 -0
  15. ynab_cli/adapters/ynab/api/budgets/get_budget_settings_by_id.py +163 -0
  16. ynab_cli/adapters/ynab/api/budgets/get_budgets.py +171 -0
  17. ynab_cli/adapters/ynab/api/categories/__init__.py +1 -0
  18. ynab_cli/adapters/ynab/api/categories/get_categories.py +188 -0
  19. ynab_cli/adapters/ynab/api/categories/get_category_by_id.py +180 -0
  20. ynab_cli/adapters/ynab/api/categories/get_month_category_by_id.py +194 -0
  21. ynab_cli/adapters/ynab/api/categories/update_category.py +199 -0
  22. ynab_cli/adapters/ynab/api/categories/update_month_category.py +213 -0
  23. ynab_cli/adapters/ynab/api/months/__init__.py +1 -0
  24. ynab_cli/adapters/ynab/api/months/get_budget_month.py +177 -0
  25. ynab_cli/adapters/ynab/api/months/get_budget_months.py +184 -0
  26. ynab_cli/adapters/ynab/api/payee_locations/__init__.py +1 -0
  27. ynab_cli/adapters/ynab/api/payee_locations/get_payee_location_by_id.py +176 -0
  28. ynab_cli/adapters/ynab/api/payee_locations/get_payee_locations.py +163 -0
  29. ynab_cli/adapters/ynab/api/payee_locations/get_payee_locations_by_payee.py +176 -0
  30. ynab_cli/adapters/ynab/api/payees/__init__.py +1 -0
  31. ynab_cli/adapters/ynab/api/payees/get_payee_by_id.py +176 -0
  32. ynab_cli/adapters/ynab/api/payees/get_payees.py +184 -0
  33. ynab_cli/adapters/ynab/api/payees/update_payee.py +199 -0
  34. ynab_cli/adapters/ynab/api/scheduled_transactions/__init__.py +1 -0
  35. ynab_cli/adapters/ynab/api/scheduled_transactions/create_scheduled_transaction.py +186 -0
  36. ynab_cli/adapters/ynab/api/scheduled_transactions/delete_scheduled_transaction.py +176 -0
  37. ynab_cli/adapters/ynab/api/scheduled_transactions/get_scheduled_transaction_by_id.py +176 -0
  38. ynab_cli/adapters/ynab/api/scheduled_transactions/get_scheduled_transactions.py +184 -0
  39. ynab_cli/adapters/ynab/api/scheduled_transactions/update_scheduled_transaction.py +199 -0
  40. ynab_cli/adapters/ynab/api/transactions/__init__.py +1 -0
  41. ynab_cli/adapters/ynab/api/transactions/create_transaction.py +202 -0
  42. ynab_cli/adapters/ynab/api/transactions/delete_transaction.py +176 -0
  43. ynab_cli/adapters/ynab/api/transactions/get_transaction_by_id.py +176 -0
  44. ynab_cli/adapters/ynab/api/transactions/get_transactions.py +227 -0
  45. ynab_cli/adapters/ynab/api/transactions/get_transactions_by_account.py +236 -0
  46. ynab_cli/adapters/ynab/api/transactions/get_transactions_by_category.py +236 -0
  47. ynab_cli/adapters/ynab/api/transactions/get_transactions_by_month.py +236 -0
  48. ynab_cli/adapters/ynab/api/transactions/get_transactions_by_payee.py +236 -0
  49. ynab_cli/adapters/ynab/api/transactions/import_transactions.py +183 -0
  50. ynab_cli/adapters/ynab/api/transactions/update_transaction.py +199 -0
  51. ynab_cli/adapters/ynab/api/transactions/update_transactions.py +177 -0
  52. ynab_cli/adapters/ynab/api/user/__init__.py +1 -0
  53. ynab_cli/adapters/ynab/api/user/get_user.py +130 -0
  54. ynab_cli/adapters/ynab/client.py +268 -0
  55. ynab_cli/adapters/ynab/errors.py +16 -0
  56. ynab_cli/adapters/ynab/models/__init__.py +229 -0
  57. ynab_cli/adapters/ynab/models/account.py +345 -0
  58. ynab_cli/adapters/ynab/models/account_response.py +65 -0
  59. ynab_cli/adapters/ynab/models/account_response_data.py +65 -0
  60. ynab_cli/adapters/ynab/models/account_type.py +23 -0
  61. ynab_cli/adapters/ynab/models/accounts_response.py +65 -0
  62. ynab_cli/adapters/ynab/models/accounts_response_data.py +81 -0
  63. ynab_cli/adapters/ynab/models/budget_detail.py +405 -0
  64. ynab_cli/adapters/ynab/models/budget_detail_response.py +65 -0
  65. ynab_cli/adapters/ynab/models/budget_detail_response_data.py +73 -0
  66. ynab_cli/adapters/ynab/models/budget_settings.py +115 -0
  67. ynab_cli/adapters/ynab/models/budget_settings_response.py +65 -0
  68. ynab_cli/adapters/ynab/models/budget_settings_response_data.py +65 -0
  69. ynab_cli/adapters/ynab/models/budget_summary.py +216 -0
  70. ynab_cli/adapters/ynab/models/budget_summary_response.py +65 -0
  71. ynab_cli/adapters/ynab/models/budget_summary_response_data.py +91 -0
  72. ynab_cli/adapters/ynab/models/bulk_response.py +65 -0
  73. ynab_cli/adapters/ynab/models/bulk_response_data.py +65 -0
  74. ynab_cli/adapters/ynab/models/bulk_response_data_bulk.py +68 -0
  75. ynab_cli/adapters/ynab/models/bulk_transactions.py +75 -0
  76. ynab_cli/adapters/ynab/models/categories_response.py +65 -0
  77. ynab_cli/adapters/ynab/models/categories_response_data.py +81 -0
  78. ynab_cli/adapters/ynab/models/category.py +519 -0
  79. ynab_cli/adapters/ynab/models/category_goal_type_type_1.py +15 -0
  80. ynab_cli/adapters/ynab/models/category_goal_type_type_2_type_1.py +15 -0
  81. ynab_cli/adapters/ynab/models/category_goal_type_type_3_type_1.py +15 -0
  82. ynab_cli/adapters/ynab/models/category_group.py +85 -0
  83. ynab_cli/adapters/ynab/models/category_group_with_categories.py +108 -0
  84. ynab_cli/adapters/ynab/models/category_response.py +65 -0
  85. ynab_cli/adapters/ynab/models/category_response_data.py +65 -0
  86. ynab_cli/adapters/ynab/models/currency_format_type_0.py +117 -0
  87. ynab_cli/adapters/ynab/models/date_format_type_0.py +61 -0
  88. ynab_cli/adapters/ynab/models/error_detail.py +75 -0
  89. ynab_cli/adapters/ynab/models/error_response.py +65 -0
  90. ynab_cli/adapters/ynab/models/existing_transaction.py +322 -0
  91. ynab_cli/adapters/ynab/models/get_transactions_by_account_type.py +12 -0
  92. ynab_cli/adapters/ynab/models/get_transactions_by_category_type.py +12 -0
  93. ynab_cli/adapters/ynab/models/get_transactions_by_month_type.py +12 -0
  94. ynab_cli/adapters/ynab/models/get_transactions_by_payee_type.py +12 -0
  95. ynab_cli/adapters/ynab/models/get_transactions_type.py +12 -0
  96. ynab_cli/adapters/ynab/models/hybrid_transaction.py +567 -0
  97. ynab_cli/adapters/ynab/models/hybrid_transaction_type.py +12 -0
  98. ynab_cli/adapters/ynab/models/hybrid_transactions_response.py +65 -0
  99. ynab_cli/adapters/ynab/models/hybrid_transactions_response_data.py +84 -0
  100. ynab_cli/adapters/ynab/models/loan_account_periodic_value_type_0.py +44 -0
  101. ynab_cli/adapters/ynab/models/month_detail.py +168 -0
  102. ynab_cli/adapters/ynab/models/month_detail_response.py +65 -0
  103. ynab_cli/adapters/ynab/models/month_detail_response_data.py +65 -0
  104. ynab_cli/adapters/ynab/models/month_summaries_response.py +65 -0
  105. ynab_cli/adapters/ynab/models/month_summaries_response_data.py +81 -0
  106. ynab_cli/adapters/ynab/models/month_summary.py +145 -0
  107. ynab_cli/adapters/ynab/models/new_transaction.py +352 -0
  108. ynab_cli/adapters/ynab/models/patch_category_wrapper.py +65 -0
  109. ynab_cli/adapters/ynab/models/patch_month_category_wrapper.py +65 -0
  110. ynab_cli/adapters/ynab/models/patch_payee_wrapper.py +65 -0
  111. ynab_cli/adapters/ynab/models/patch_transactions_wrapper.py +73 -0
  112. ynab_cli/adapters/ynab/models/payee.py +100 -0
  113. ynab_cli/adapters/ynab/models/payee_location.py +93 -0
  114. ynab_cli/adapters/ynab/models/payee_location_response.py +65 -0
  115. ynab_cli/adapters/ynab/models/payee_location_response_data.py +65 -0
  116. ynab_cli/adapters/ynab/models/payee_locations_response.py +65 -0
  117. ynab_cli/adapters/ynab/models/payee_locations_response_data.py +73 -0
  118. ynab_cli/adapters/ynab/models/payee_response.py +65 -0
  119. ynab_cli/adapters/ynab/models/payee_response_data.py +65 -0
  120. ynab_cli/adapters/ynab/models/payees_response.py +65 -0
  121. ynab_cli/adapters/ynab/models/payees_response_data.py +81 -0
  122. ynab_cli/adapters/ynab/models/post_account_wrapper.py +65 -0
  123. ynab_cli/adapters/ynab/models/post_scheduled_transaction_wrapper.py +65 -0
  124. ynab_cli/adapters/ynab/models/post_transactions_wrapper.py +91 -0
  125. ynab_cli/adapters/ynab/models/put_scheduled_transaction_wrapper.py +65 -0
  126. ynab_cli/adapters/ynab/models/put_transaction_wrapper.py +65 -0
  127. ynab_cli/adapters/ynab/models/save_account.py +77 -0
  128. ynab_cli/adapters/ynab/models/save_category.py +129 -0
  129. ynab_cli/adapters/ynab/models/save_category_response.py +65 -0
  130. ynab_cli/adapters/ynab/models/save_category_response_data.py +73 -0
  131. ynab_cli/adapters/ynab/models/save_month_category.py +59 -0
  132. ynab_cli/adapters/ynab/models/save_payee.py +59 -0
  133. ynab_cli/adapters/ynab/models/save_payee_response.py +65 -0
  134. ynab_cli/adapters/ynab/models/save_payee_response_data.py +73 -0
  135. ynab_cli/adapters/ynab/models/save_scheduled_transaction.py +269 -0
  136. ynab_cli/adapters/ynab/models/save_sub_transaction.py +166 -0
  137. ynab_cli/adapters/ynab/models/save_transaction_with_id_or_import_id.py +366 -0
  138. ynab_cli/adapters/ynab/models/save_transaction_with_optional_fields.py +322 -0
  139. ynab_cli/adapters/ynab/models/save_transactions_response.py +65 -0
  140. ynab_cli/adapters/ynab/models/save_transactions_response_data.py +123 -0
  141. ynab_cli/adapters/ynab/models/scheduled_sub_transaction.py +238 -0
  142. ynab_cli/adapters/ynab/models/scheduled_transaction_detail.py +381 -0
  143. ynab_cli/adapters/ynab/models/scheduled_transaction_frequency.py +23 -0
  144. ynab_cli/adapters/ynab/models/scheduled_transaction_response.py +65 -0
  145. ynab_cli/adapters/ynab/models/scheduled_transaction_response_data.py +65 -0
  146. ynab_cli/adapters/ynab/models/scheduled_transaction_summary.py +310 -0
  147. ynab_cli/adapters/ynab/models/scheduled_transaction_summary_frequency.py +23 -0
  148. ynab_cli/adapters/ynab/models/scheduled_transactions_response.py +65 -0
  149. ynab_cli/adapters/ynab/models/scheduled_transactions_response_data.py +81 -0
  150. ynab_cli/adapters/ynab/models/sub_transaction.py +259 -0
  151. ynab_cli/adapters/ynab/models/transaction_cleared_status.py +13 -0
  152. ynab_cli/adapters/ynab/models/transaction_detail.py +570 -0
  153. ynab_cli/adapters/ynab/models/transaction_flag_color_type_1.py +16 -0
  154. ynab_cli/adapters/ynab/models/transaction_flag_color_type_2_type_1.py +16 -0
  155. ynab_cli/adapters/ynab/models/transaction_flag_color_type_3_type_1.py +16 -0
  156. ynab_cli/adapters/ynab/models/transaction_response.py +65 -0
  157. ynab_cli/adapters/ynab/models/transaction_response_data.py +65 -0
  158. ynab_cli/adapters/ynab/models/transaction_summary.py +499 -0
  159. ynab_cli/adapters/ynab/models/transaction_summary_debt_transaction_type_type_1.py +18 -0
  160. ynab_cli/adapters/ynab/models/transaction_summary_debt_transaction_type_type_2_type_1.py +18 -0
  161. ynab_cli/adapters/ynab/models/transaction_summary_debt_transaction_type_type_3_type_1.py +18 -0
  162. ynab_cli/adapters/ynab/models/transactions_import_response.py +65 -0
  163. ynab_cli/adapters/ynab/models/transactions_import_response_data.py +59 -0
  164. ynab_cli/adapters/ynab/models/transactions_response.py +65 -0
  165. ynab_cli/adapters/ynab/models/transactions_response_data.py +81 -0
  166. ynab_cli/adapters/ynab/models/user.py +60 -0
  167. ynab_cli/adapters/ynab/models/user_response.py +65 -0
  168. ynab_cli/adapters/ynab/models/user_response_data.py +65 -0
  169. ynab_cli/adapters/ynab/types.py +46 -0
  170. ynab_cli/adapters/ynab/util.py +78 -0
  171. ynab_cli/domain/__init__.py +0 -0
  172. ynab_cli/domain/constants.py +3 -0
  173. ynab_cli/domain/models/__init__.py +0 -0
  174. ynab_cli/domain/models/rules.py +37 -0
  175. ynab_cli/domain/ports/__init__.py +5 -0
  176. ynab_cli/domain/ports/io.py +63 -0
  177. ynab_cli/domain/settings.py +16 -0
  178. ynab_cli/domain/use_cases/__init__.py +0 -0
  179. ynab_cli/domain/use_cases/categories.py +105 -0
  180. ynab_cli/domain/use_cases/payees.py +232 -0
  181. ynab_cli/domain/use_cases/transactions.py +93 -0
  182. ynab_cli/host/__init__.py +14 -0
  183. ynab_cli/host/cli.py +37 -0
  184. ynab_cli/host/click/__init__.py +0 -0
  185. ynab_cli/host/click/cli.py +44 -0
  186. ynab_cli/host/click/commands/__init__.py +0 -0
  187. ynab_cli/host/click/commands/categories.py +92 -0
  188. ynab_cli/host/click/commands/payees.py +157 -0
  189. ynab_cli/host/click/commands/rich/__init__.py +0 -0
  190. ynab_cli/host/click/commands/rich/progress_table.py +37 -0
  191. ynab_cli/host/click/commands/transactions.py +76 -0
  192. ynab_cli/host/constants.py +3 -0
  193. ynab_cli/host/textual/__init__.py +0 -0
  194. ynab_cli/host/textual/app.py +98 -0
  195. ynab_cli/host/textual/app.tcss +47 -0
  196. ynab_cli/host/textual/cli.py +42 -0
  197. ynab_cli/host/textual/widgets/__init__.py +58 -0
  198. ynab_cli/host/textual/widgets/categories.py +90 -0
  199. ynab_cli/host/textual/widgets/payees.py +154 -0
  200. ynab_cli/host/textual/widgets/transactions.py +89 -0
  201. ynab_cli/py.typed +0 -0
  202. ynab_cli-0.3.0.dist-info/METADATA +102 -0
  203. ynab_cli-0.3.0.dist-info/RECORD +206 -0
  204. ynab_cli-0.3.0.dist-info/WHEEL +4 -0
  205. ynab_cli-0.3.0.dist-info/entry_points.txt +2 -0
  206. ynab_cli-0.3.0.dist-info/licenses/LICENSE.md +21 -0
@@ -0,0 +1,269 @@
1
+ import datetime
2
+ from collections.abc import Mapping
3
+ from typing import Any, TypeVar, cast
4
+ from uuid import UUID
5
+
6
+ from attrs import define as _attrs_define
7
+ from attrs import field as _attrs_field
8
+ from dateutil.parser import isoparse
9
+
10
+ from ynab_cli.adapters.ynab.models.scheduled_transaction_frequency import ScheduledTransactionFrequency
11
+ from ynab_cli.adapters.ynab.models.transaction_flag_color_type_1 import TransactionFlagColorType1
12
+ from ynab_cli.adapters.ynab.models.transaction_flag_color_type_2_type_1 import TransactionFlagColorType2Type1
13
+ from ynab_cli.adapters.ynab.models.transaction_flag_color_type_3_type_1 import TransactionFlagColorType3Type1
14
+ from ynab_cli.adapters.ynab.types import UNSET, Unset
15
+
16
+ T = TypeVar("T", bound="SaveScheduledTransaction")
17
+
18
+
19
+ @_attrs_define
20
+ class SaveScheduledTransaction:
21
+ """
22
+ Attributes:
23
+ account_id (UUID):
24
+ date (datetime.date): The scheduled transaction date in ISO format (e.g. 2016-12-01). This should be a future
25
+ date no more than 5 years into the future.
26
+ amount (Union[Unset, int]): The scheduled transaction amount in milliunits format.
27
+ payee_id (Union[None, UUID, Unset]): The payee for the scheduled transaction. To create a transfer between two
28
+ accounts, use the account transfer payee pointing to the target account. Account transfer payees are specified
29
+ as `transfer_payee_id` on the account resource.
30
+ payee_name (Union[None, Unset, str]): The payee name for the the scheduled transaction. If a `payee_name` value
31
+ is provided and `payee_id` has a null value, the `payee_name` value will be used to resolve the payee by either
32
+ (1) a payee with the same name or (2) creation of a new payee.
33
+ category_id (Union[None, UUID, Unset]): The category for the scheduled transaction. Credit Card Payment
34
+ categories are not permitted. Creating a split scheduled transaction is not currently supported.
35
+ memo (Union[None, Unset, str]):
36
+ flag_color (Union[None, TransactionFlagColorType1, TransactionFlagColorType2Type1,
37
+ TransactionFlagColorType3Type1, Unset]): The transaction flag
38
+ frequency (Union[Unset, ScheduledTransactionFrequency]): The scheduled transaction frequency
39
+ """
40
+
41
+ account_id: UUID
42
+ date: datetime.date
43
+ amount: Unset | int = UNSET
44
+ payee_id: None | UUID | Unset = UNSET
45
+ payee_name: None | Unset | str = UNSET
46
+ category_id: None | UUID | Unset = UNSET
47
+ memo: None | Unset | str = UNSET
48
+ flag_color: (
49
+ None | TransactionFlagColorType1 | TransactionFlagColorType2Type1 | TransactionFlagColorType3Type1 | Unset
50
+ ) = UNSET
51
+ frequency: Unset | ScheduledTransactionFrequency = UNSET
52
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
53
+
54
+ def to_dict(self) -> dict[str, Any]:
55
+ account_id = str(self.account_id)
56
+
57
+ date = self.date.isoformat()
58
+
59
+ amount = self.amount
60
+
61
+ payee_id: None | Unset | str
62
+ if isinstance(self.payee_id, Unset):
63
+ payee_id = UNSET
64
+ elif isinstance(self.payee_id, UUID):
65
+ payee_id = str(self.payee_id)
66
+ else:
67
+ payee_id = self.payee_id
68
+
69
+ payee_name: None | Unset | str
70
+ if isinstance(self.payee_name, Unset):
71
+ payee_name = UNSET
72
+ else:
73
+ payee_name = self.payee_name
74
+
75
+ category_id: None | Unset | str
76
+ if isinstance(self.category_id, Unset):
77
+ category_id = UNSET
78
+ elif isinstance(self.category_id, UUID):
79
+ category_id = str(self.category_id)
80
+ else:
81
+ category_id = self.category_id
82
+
83
+ memo: None | Unset | str
84
+ if isinstance(self.memo, Unset):
85
+ memo = UNSET
86
+ else:
87
+ memo = self.memo
88
+
89
+ flag_color: None | Unset | str
90
+ if isinstance(self.flag_color, Unset):
91
+ flag_color = UNSET
92
+ elif isinstance(self.flag_color, TransactionFlagColorType1):
93
+ flag_color = self.flag_color.value
94
+ elif isinstance(self.flag_color, TransactionFlagColorType2Type1):
95
+ flag_color = self.flag_color.value
96
+ elif isinstance(self.flag_color, TransactionFlagColorType3Type1):
97
+ flag_color = self.flag_color.value
98
+ else:
99
+ flag_color = self.flag_color
100
+
101
+ frequency: Unset | str = UNSET
102
+ if not isinstance(self.frequency, Unset):
103
+ frequency = self.frequency.value
104
+
105
+ field_dict: dict[str, Any] = {}
106
+ field_dict.update(self.additional_properties)
107
+ field_dict.update(
108
+ {
109
+ "account_id": account_id,
110
+ "date": date,
111
+ }
112
+ )
113
+ if amount is not UNSET:
114
+ field_dict["amount"] = amount
115
+ if payee_id is not UNSET:
116
+ field_dict["payee_id"] = payee_id
117
+ if payee_name is not UNSET:
118
+ field_dict["payee_name"] = payee_name
119
+ if category_id is not UNSET:
120
+ field_dict["category_id"] = category_id
121
+ if memo is not UNSET:
122
+ field_dict["memo"] = memo
123
+ if flag_color is not UNSET:
124
+ field_dict["flag_color"] = flag_color
125
+ if frequency is not UNSET:
126
+ field_dict["frequency"] = frequency
127
+
128
+ return field_dict
129
+
130
+ @classmethod
131
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
132
+ d = dict(src_dict)
133
+ account_id = UUID(d.pop("account_id"))
134
+
135
+ date = isoparse(d.pop("date")).date()
136
+
137
+ amount = d.pop("amount", UNSET)
138
+
139
+ def _parse_payee_id(data: object) -> None | UUID | Unset:
140
+ if data is None:
141
+ return data
142
+ if isinstance(data, Unset):
143
+ return data
144
+ try:
145
+ if not isinstance(data, str):
146
+ raise TypeError()
147
+ payee_id_type_0 = UUID(data)
148
+
149
+ return payee_id_type_0
150
+ except: # noqa: E722
151
+ pass
152
+ return cast(None | UUID | Unset, data)
153
+
154
+ payee_id = _parse_payee_id(d.pop("payee_id", UNSET))
155
+
156
+ def _parse_payee_name(data: object) -> None | Unset | str:
157
+ if data is None:
158
+ return data
159
+ if isinstance(data, Unset):
160
+ return data
161
+ return cast(None | Unset | str, data)
162
+
163
+ payee_name = _parse_payee_name(d.pop("payee_name", UNSET))
164
+
165
+ def _parse_category_id(data: object) -> None | UUID | Unset:
166
+ if data is None:
167
+ return data
168
+ if isinstance(data, Unset):
169
+ return data
170
+ try:
171
+ if not isinstance(data, str):
172
+ raise TypeError()
173
+ category_id_type_0 = UUID(data)
174
+
175
+ return category_id_type_0
176
+ except: # noqa: E722
177
+ pass
178
+ return cast(None | UUID | Unset, data)
179
+
180
+ category_id = _parse_category_id(d.pop("category_id", UNSET))
181
+
182
+ def _parse_memo(data: object) -> None | Unset | str:
183
+ if data is None:
184
+ return data
185
+ if isinstance(data, Unset):
186
+ return data
187
+ return cast(None | Unset | str, data)
188
+
189
+ memo = _parse_memo(d.pop("memo", UNSET))
190
+
191
+ def _parse_flag_color(
192
+ data: object,
193
+ ) -> None | TransactionFlagColorType1 | TransactionFlagColorType2Type1 | TransactionFlagColorType3Type1 | Unset:
194
+ if data is None:
195
+ return data
196
+ if isinstance(data, Unset):
197
+ return data
198
+ try:
199
+ if not isinstance(data, str):
200
+ raise TypeError()
201
+ componentsschemas_transaction_flag_color_type_1 = TransactionFlagColorType1(data)
202
+
203
+ return componentsschemas_transaction_flag_color_type_1
204
+ except: # noqa: E722
205
+ pass
206
+ try:
207
+ if not isinstance(data, str):
208
+ raise TypeError()
209
+ componentsschemas_transaction_flag_color_type_2_type_1 = TransactionFlagColorType2Type1(data)
210
+
211
+ return componentsschemas_transaction_flag_color_type_2_type_1
212
+ except: # noqa: E722
213
+ pass
214
+ try:
215
+ if not isinstance(data, str):
216
+ raise TypeError()
217
+ componentsschemas_transaction_flag_color_type_3_type_1 = TransactionFlagColorType3Type1(data)
218
+
219
+ return componentsschemas_transaction_flag_color_type_3_type_1
220
+ except: # noqa: E722
221
+ pass
222
+ return cast(
223
+ None
224
+ | TransactionFlagColorType1
225
+ | TransactionFlagColorType2Type1
226
+ | TransactionFlagColorType3Type1
227
+ | Unset,
228
+ data,
229
+ )
230
+
231
+ flag_color = _parse_flag_color(d.pop("flag_color", UNSET))
232
+
233
+ _frequency = d.pop("frequency", UNSET)
234
+ frequency: Unset | ScheduledTransactionFrequency
235
+ if isinstance(_frequency, Unset):
236
+ frequency = UNSET
237
+ else:
238
+ frequency = ScheduledTransactionFrequency(_frequency)
239
+
240
+ save_scheduled_transaction = cls(
241
+ account_id=account_id,
242
+ date=date,
243
+ amount=amount,
244
+ payee_id=payee_id,
245
+ payee_name=payee_name,
246
+ category_id=category_id,
247
+ memo=memo,
248
+ flag_color=flag_color,
249
+ frequency=frequency,
250
+ )
251
+
252
+ save_scheduled_transaction.additional_properties = d
253
+ return save_scheduled_transaction
254
+
255
+ @property
256
+ def additional_keys(self) -> list[str]:
257
+ return list(self.additional_properties.keys())
258
+
259
+ def __getitem__(self, key: str) -> Any:
260
+ return self.additional_properties[key]
261
+
262
+ def __setitem__(self, key: str, value: Any) -> None:
263
+ self.additional_properties[key] = value
264
+
265
+ def __delitem__(self, key: str) -> None:
266
+ del self.additional_properties[key]
267
+
268
+ def __contains__(self, key: str) -> bool:
269
+ return key in self.additional_properties
@@ -0,0 +1,166 @@
1
+ from collections.abc import Mapping
2
+ from typing import Any, TypeVar, cast
3
+ from uuid import UUID
4
+
5
+ from attrs import define as _attrs_define
6
+ from attrs import field as _attrs_field
7
+
8
+ from ynab_cli.adapters.ynab.types import UNSET, Unset
9
+
10
+ T = TypeVar("T", bound="SaveSubTransaction")
11
+
12
+
13
+ @_attrs_define
14
+ class SaveSubTransaction:
15
+ """
16
+ Attributes:
17
+ amount (int): The subtransaction amount in milliunits format.
18
+ payee_id (Union[None, UUID, Unset]): The payee for the subtransaction.
19
+ payee_name (Union[None, Unset, str]): The payee name. If a `payee_name` value is provided and `payee_id` has a
20
+ null value, the `payee_name` value will be used to resolve the payee by either (1) a matching payee rename rule
21
+ (only if import_id is also specified on parent transaction) or (2) a payee with the same name or (3) creation of
22
+ a new payee.
23
+ category_id (Union[None, UUID, Unset]): The category for the subtransaction. Credit Card Payment categories are
24
+ not permitted and will be ignored if supplied.
25
+ memo (Union[None, Unset, str]):
26
+ """
27
+
28
+ amount: int
29
+ payee_id: None | UUID | Unset = UNSET
30
+ payee_name: None | Unset | str = UNSET
31
+ category_id: None | UUID | Unset = UNSET
32
+ memo: None | Unset | str = UNSET
33
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
34
+
35
+ def to_dict(self) -> dict[str, Any]:
36
+ amount = self.amount
37
+
38
+ payee_id: None | Unset | str
39
+ if isinstance(self.payee_id, Unset):
40
+ payee_id = UNSET
41
+ elif isinstance(self.payee_id, UUID):
42
+ payee_id = str(self.payee_id)
43
+ else:
44
+ payee_id = self.payee_id
45
+
46
+ payee_name: None | Unset | str
47
+ if isinstance(self.payee_name, Unset):
48
+ payee_name = UNSET
49
+ else:
50
+ payee_name = self.payee_name
51
+
52
+ category_id: None | Unset | str
53
+ if isinstance(self.category_id, Unset):
54
+ category_id = UNSET
55
+ elif isinstance(self.category_id, UUID):
56
+ category_id = str(self.category_id)
57
+ else:
58
+ category_id = self.category_id
59
+
60
+ memo: None | Unset | str
61
+ if isinstance(self.memo, Unset):
62
+ memo = UNSET
63
+ else:
64
+ memo = self.memo
65
+
66
+ field_dict: dict[str, Any] = {}
67
+ field_dict.update(self.additional_properties)
68
+ field_dict.update(
69
+ {
70
+ "amount": amount,
71
+ }
72
+ )
73
+ if payee_id is not UNSET:
74
+ field_dict["payee_id"] = payee_id
75
+ if payee_name is not UNSET:
76
+ field_dict["payee_name"] = payee_name
77
+ if category_id is not UNSET:
78
+ field_dict["category_id"] = category_id
79
+ if memo is not UNSET:
80
+ field_dict["memo"] = memo
81
+
82
+ return field_dict
83
+
84
+ @classmethod
85
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
86
+ d = dict(src_dict)
87
+ amount = d.pop("amount")
88
+
89
+ def _parse_payee_id(data: object) -> None | UUID | Unset:
90
+ if data is None:
91
+ return data
92
+ if isinstance(data, Unset):
93
+ return data
94
+ try:
95
+ if not isinstance(data, str):
96
+ raise TypeError()
97
+ payee_id_type_0 = UUID(data)
98
+
99
+ return payee_id_type_0
100
+ except: # noqa: E722
101
+ pass
102
+ return cast(None | UUID | Unset, data)
103
+
104
+ payee_id = _parse_payee_id(d.pop("payee_id", UNSET))
105
+
106
+ def _parse_payee_name(data: object) -> None | Unset | str:
107
+ if data is None:
108
+ return data
109
+ if isinstance(data, Unset):
110
+ return data
111
+ return cast(None | Unset | str, data)
112
+
113
+ payee_name = _parse_payee_name(d.pop("payee_name", UNSET))
114
+
115
+ def _parse_category_id(data: object) -> None | UUID | Unset:
116
+ if data is None:
117
+ return data
118
+ if isinstance(data, Unset):
119
+ return data
120
+ try:
121
+ if not isinstance(data, str):
122
+ raise TypeError()
123
+ category_id_type_0 = UUID(data)
124
+
125
+ return category_id_type_0
126
+ except: # noqa: E722
127
+ pass
128
+ return cast(None | UUID | Unset, data)
129
+
130
+ category_id = _parse_category_id(d.pop("category_id", UNSET))
131
+
132
+ def _parse_memo(data: object) -> None | Unset | str:
133
+ if data is None:
134
+ return data
135
+ if isinstance(data, Unset):
136
+ return data
137
+ return cast(None | Unset | str, data)
138
+
139
+ memo = _parse_memo(d.pop("memo", UNSET))
140
+
141
+ save_sub_transaction = cls(
142
+ amount=amount,
143
+ payee_id=payee_id,
144
+ payee_name=payee_name,
145
+ category_id=category_id,
146
+ memo=memo,
147
+ )
148
+
149
+ save_sub_transaction.additional_properties = d
150
+ return save_sub_transaction
151
+
152
+ @property
153
+ def additional_keys(self) -> list[str]:
154
+ return list(self.additional_properties.keys())
155
+
156
+ def __getitem__(self, key: str) -> Any:
157
+ return self.additional_properties[key]
158
+
159
+ def __setitem__(self, key: str, value: Any) -> None:
160
+ self.additional_properties[key] = value
161
+
162
+ def __delitem__(self, key: str) -> None:
163
+ del self.additional_properties[key]
164
+
165
+ def __contains__(self, key: str) -> bool:
166
+ return key in self.additional_properties