diff --git a/packages/desktop-client/e2e/data/ynab5-demo-budget.json b/packages/desktop-client/e2e/data/ynab5-demo-budget.json new file mode 100644 index 0000000000000000000000000000000000000000..2f31164d64cd8fb3569d59f7c75448fb8574be87 --- /dev/null +++ b/packages/desktop-client/e2e/data/ynab5-demo-budget.json @@ -0,0 +1,1681 @@ +{ + "budget": { + "id": "d116f49f-0060-4132-91b9-7dfae4c26239", + "name": "Test", + "last_modified_on": "2023-08-04T22:40:25+00:00", + "date_format": { + "format": "YYYY-MM-DD" + }, + "currency_format": { + "iso_code": "USD", + "example_format": "123,456.78", + "decimal_digits": 2, + "decimal_separator": ".", + "symbol_first": true, + "group_separator": ",", + "currency_symbol": "$", + "display_symbol": true + }, + "first_month": "2023-08-01", + "last_month": "2023-08-01", + "accounts": [ + { + "id": "bc1d862f-bab0-41c3-bd1e-6cee8c688e32", + "name": "Checking", + "type": "checking", + "on_budget": true, + "closed": false, + "note": null, + "balance": 700000, + "cleared_balance": 700000, + "uncleared_balance": 0, + "transfer_payee_id": "9105e6a6-966b-4d31-818b-062365a839b6", + "direct_import_linked": false, + "direct_import_in_error": false, + "last_reconciled_at": null, + "debt_original_balance": null, + "debt_interest_rates": {}, + "debt_minimum_payments": {}, + "debt_escrow_amounts": {}, + "deleted": false + }, + { + "id": "125f339b-2a63-481e-84c0-f04d898905d2", + "name": "Saving", + "type": "savings", + "on_budget": true, + "closed": false, + "note": null, + "balance": 200000, + "cleared_balance": 0, + "uncleared_balance": 200000, + "transfer_payee_id": "8d3017e0-2aa6-4fe2-b011-c53c9f147eb6", + "direct_import_linked": false, + "direct_import_in_error": false, + "last_reconciled_at": null, + "debt_original_balance": null, + "debt_interest_rates": {}, + "debt_minimum_payments": {}, + "debt_escrow_amounts": {}, + "deleted": false + } + ], + "payees": [ + { + "id": "c843e030-5a77-4dc5-9b93-f8acc64b74f8", + "name": "Starting Balance", + "transfer_account_id": null, + "deleted": false + }, + { + "id": "f8a083ed-aa95-4784-8bc1-a2f26a4f7602", + "name": "Manual Balance Adjustment", + "transfer_account_id": null, + "deleted": false + }, + { + "id": "0fcfe6c4-7863-489f-8fb8-af7fb1fc879c", + "name": "Reconciliation Balance Adjustment", + "transfer_account_id": null, + "deleted": false + }, + { + "id": "9d3af671-9c88-4d95-b12b-600e1375df85", + "name": "Salary", + "transfer_account_id": null, + "deleted": false + }, + { + "id": "9105e6a6-966b-4d31-818b-062365a839b6", + "name": "Transfer : Checking", + "transfer_account_id": "bc1d862f-bab0-41c3-bd1e-6cee8c688e32", + "deleted": false + }, + { + "id": "8d3017e0-2aa6-4fe2-b011-c53c9f147eb6", + "name": "Transfer : Saving", + "transfer_account_id": "125f339b-2a63-481e-84c0-f04d898905d2", + "deleted": false + }, + { + "id": "2a20470a-634f-4efa-a7f6-f1c0b0bdda41", + "name": "Store", + "transfer_account_id": null, + "deleted": false + } + ], + "payee_locations": [], + "category_groups": [ + { + "id": "d5c355c2-3b77-4a7f-b8b3-c832b10cfec9", + "name": "Internal Master Category", + "hidden": false, + "deleted": false + }, + { + "id": "412540e8-e8f2-47a9-8c74-3a0a7c9a586b", + "name": "Credit Card Payments", + "hidden": false, + "deleted": false + }, + { + "id": "53c9d1fc-dc5b-4021-8255-463fa19065e4", + "name": "Bills", + "hidden": false, + "deleted": false + }, + { + "id": "0632d11d-c20e-401d-97cf-f4f727b16aea", + "name": "Frequent", + "hidden": false, + "deleted": false + }, + { + "id": "857f9218-ddaa-495e-814d-0d72291a1d89", + "name": "Non-Monthly", + "hidden": false, + "deleted": false + }, + { + "id": "bbbba6fe-afcd-4c3a-909e-37db448d554f", + "name": "Goals", + "hidden": false, + "deleted": false + }, + { + "id": "ce2bff41-c8a3-4845-b14d-3f72f48075ed", + "name": "Quality of Life", + "hidden": false, + "deleted": false + }, + { + "id": "51a99904-1601-49f4-ae8d-2e2893e7f4a5", + "name": "Hidden Categories", + "hidden": false, + "deleted": false + } + ], + "categories": [ + { + "id": "36120d44-6c61-4402-985a-891a8d267858", + "category_group_id": "d5c355c2-3b77-4a7f-b8b3-c832b10cfec9", + "name": "Inflow: Ready to Assign", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 1000000, + "balance": 1000000, + "goal_type": null, + "goal_day": null, + "goal_cadence": null, + "goal_cadence_frequency": null, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "e7e1bfdb-9104-4c2f-a479-79058bef9b3a", + "category_group_id": "d5c355c2-3b77-4a7f-b8b3-c832b10cfec9", + "name": "Uncategorized", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": null, + "goal_day": null, + "goal_cadence": null, + "goal_cadence_frequency": null, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "5428b0b1-b567-4cff-8a94-d9d65491990f", + "category_group_id": "53c9d1fc-dc5b-4021-8255-463fa19065e4", + "name": "Rent/Mortgage", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": null, + "goal_cadence": 1, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "ca7f02c3-7801-4a5a-a07d-ab90ca1e6360", + "category_group_id": "53c9d1fc-dc5b-4021-8255-463fa19065e4", + "name": "Electric", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": 15, + "goal_cadence": 1, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "0834b483-dff7-4e5c-8b7f-8aeca44df1d1", + "category_group_id": "53c9d1fc-dc5b-4021-8255-463fa19065e4", + "name": "Water", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": 23, + "goal_cadence": 1, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "ef9a2031-8e19-47fe-97da-80d81a8f2499", + "category_group_id": "53c9d1fc-dc5b-4021-8255-463fa19065e4", + "name": "Internet", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": 22, + "goal_cadence": 1, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "e9e7c589-9e38-461e-bdda-252bf85f3bc7", + "category_group_id": "53c9d1fc-dc5b-4021-8255-463fa19065e4", + "name": "Cellphone", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": 22, + "goal_cadence": 1, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "225be370-37da-4cf8-8b6b-4c6d61a0dd95", + "category_group_id": "0632d11d-c20e-401d-97cf-f4f727b16aea", + "name": "Groceries", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 100000, + "activity": -100000, + "balance": 0, + "goal_type": "NEED", + "goal_day": 6, + "goal_cadence": 2, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "a188f2d2-a1ab-4b29-b0f6-8fac9eccfad4", + "category_group_id": "0632d11d-c20e-401d-97cf-f4f727b16aea", + "name": "Eating Out", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": 6, + "goal_cadence": 2, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "c22bbf52-7f46-4403-a1be-94a7cfbdb5c3", + "category_group_id": "0632d11d-c20e-401d-97cf-f4f727b16aea", + "name": "Transportation", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": 6, + "goal_cadence": 2, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "e986134b-400d-4a03-8805-3cfbbad1e04e", + "category_group_id": "857f9218-ddaa-495e-814d-0d72291a1d89", + "name": "Home Maintenance", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "TB", + "goal_day": null, + "goal_cadence": null, + "goal_cadence_frequency": null, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "00ef54e0-fc17-455e-8d67-efb6327dc9d7", + "category_group_id": "857f9218-ddaa-495e-814d-0d72291a1d89", + "name": "Auto Maintenance", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "TB", + "goal_day": null, + "goal_cadence": null, + "goal_cadence_frequency": null, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "6bfc863c-e7e7-4d11-a713-f0b1f614f18d", + "category_group_id": "857f9218-ddaa-495e-814d-0d72291a1d89", + "name": "Gifts", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": null, + "goal_cadence": 13, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": "2023-12-10", + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "e2ad2170-166a-4186-ac38-af31006f2c44", + "category_group_id": "bbbba6fe-afcd-4c3a-909e-37db448d554f", + "name": "Vacation", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "TB", + "goal_day": null, + "goal_cadence": null, + "goal_cadence_frequency": null, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "9bab474b-23fe-45e8-880d-5ee16b7fd826", + "category_group_id": "bbbba6fe-afcd-4c3a-909e-37db448d554f", + "name": "Education", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "TB", + "goal_day": null, + "goal_cadence": null, + "goal_cadence_frequency": null, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "0a2e4126-f6b1-46cd-8600-69acd46fb543", + "category_group_id": "bbbba6fe-afcd-4c3a-909e-37db448d554f", + "name": "Home Improvement", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "TB", + "goal_day": null, + "goal_cadence": null, + "goal_cadence_frequency": null, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "6a45b7c5-0624-4673-a705-830732976846", + "category_group_id": "ce2bff41-c8a3-4845-b14d-3f72f48075ed", + "name": "Hobbies", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": null, + "goal_cadence": 1, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "0431a8df-183f-4820-acc4-255138918710", + "category_group_id": "ce2bff41-c8a3-4845-b14d-3f72f48075ed", + "name": "Entertainment", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": 6, + "goal_cadence": 2, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "8779f287-50aa-49d8-a89c-752cbd167d6c", + "category_group_id": "ce2bff41-c8a3-4845-b14d-3f72f48075ed", + "name": "Health & Wellness", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": null, + "goal_cadence": 1, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + } + ], + "months": [ + { + "month": "2023-09-01", + "note": null, + "income": 0, + "budgeted": 0, + "activity": 0, + "to_be_budgeted": 900000, + "age_of_money": null, + "deleted": false, + "categories": [ + { + "id": "00ef54e0-fc17-455e-8d67-efb6327dc9d7", + "category_group_id": "857f9218-ddaa-495e-814d-0d72291a1d89", + "name": "Auto Maintenance", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "TB", + "goal_day": null, + "goal_cadence": null, + "goal_cadence_frequency": null, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "0431a8df-183f-4820-acc4-255138918710", + "category_group_id": "ce2bff41-c8a3-4845-b14d-3f72f48075ed", + "name": "Entertainment", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": 6, + "goal_cadence": 2, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "0834b483-dff7-4e5c-8b7f-8aeca44df1d1", + "category_group_id": "53c9d1fc-dc5b-4021-8255-463fa19065e4", + "name": "Water", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": 23, + "goal_cadence": 1, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "0a2e4126-f6b1-46cd-8600-69acd46fb543", + "category_group_id": "bbbba6fe-afcd-4c3a-909e-37db448d554f", + "name": "Home Improvement", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "TB", + "goal_day": null, + "goal_cadence": null, + "goal_cadence_frequency": null, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "225be370-37da-4cf8-8b6b-4c6d61a0dd95", + "category_group_id": "0632d11d-c20e-401d-97cf-f4f727b16aea", + "name": "Groceries", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": 6, + "goal_cadence": 2, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "36120d44-6c61-4402-985a-891a8d267858", + "category_group_id": "d5c355c2-3b77-4a7f-b8b3-c832b10cfec9", + "name": "Inflow: Ready to Assign", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 1000000, + "goal_type": null, + "goal_day": null, + "goal_cadence": null, + "goal_cadence_frequency": null, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "5428b0b1-b567-4cff-8a94-d9d65491990f", + "category_group_id": "53c9d1fc-dc5b-4021-8255-463fa19065e4", + "name": "Rent/Mortgage", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": null, + "goal_cadence": 1, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "6a45b7c5-0624-4673-a705-830732976846", + "category_group_id": "ce2bff41-c8a3-4845-b14d-3f72f48075ed", + "name": "Hobbies", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": null, + "goal_cadence": 1, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "6bfc863c-e7e7-4d11-a713-f0b1f614f18d", + "category_group_id": "857f9218-ddaa-495e-814d-0d72291a1d89", + "name": "Gifts", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": null, + "goal_cadence": 13, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": "2023-12-10", + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "8779f287-50aa-49d8-a89c-752cbd167d6c", + "category_group_id": "ce2bff41-c8a3-4845-b14d-3f72f48075ed", + "name": "Health & Wellness", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": null, + "goal_cadence": 1, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "9bab474b-23fe-45e8-880d-5ee16b7fd826", + "category_group_id": "bbbba6fe-afcd-4c3a-909e-37db448d554f", + "name": "Education", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "TB", + "goal_day": null, + "goal_cadence": null, + "goal_cadence_frequency": null, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "a188f2d2-a1ab-4b29-b0f6-8fac9eccfad4", + "category_group_id": "0632d11d-c20e-401d-97cf-f4f727b16aea", + "name": "Eating Out", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": 6, + "goal_cadence": 2, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "c22bbf52-7f46-4403-a1be-94a7cfbdb5c3", + "category_group_id": "0632d11d-c20e-401d-97cf-f4f727b16aea", + "name": "Transportation", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": 6, + "goal_cadence": 2, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "ca7f02c3-7801-4a5a-a07d-ab90ca1e6360", + "category_group_id": "53c9d1fc-dc5b-4021-8255-463fa19065e4", + "name": "Electric", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": 15, + "goal_cadence": 1, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "e2ad2170-166a-4186-ac38-af31006f2c44", + "category_group_id": "bbbba6fe-afcd-4c3a-909e-37db448d554f", + "name": "Vacation", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "TB", + "goal_day": null, + "goal_cadence": null, + "goal_cadence_frequency": null, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "e7e1bfdb-9104-4c2f-a479-79058bef9b3a", + "category_group_id": "d5c355c2-3b77-4a7f-b8b3-c832b10cfec9", + "name": "Uncategorized", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": null, + "goal_day": null, + "goal_cadence": null, + "goal_cadence_frequency": null, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "e986134b-400d-4a03-8805-3cfbbad1e04e", + "category_group_id": "857f9218-ddaa-495e-814d-0d72291a1d89", + "name": "Home Maintenance", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "TB", + "goal_day": null, + "goal_cadence": null, + "goal_cadence_frequency": null, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "e9e7c589-9e38-461e-bdda-252bf85f3bc7", + "category_group_id": "53c9d1fc-dc5b-4021-8255-463fa19065e4", + "name": "Cellphone", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": 22, + "goal_cadence": 1, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "ef9a2031-8e19-47fe-97da-80d81a8f2499", + "category_group_id": "53c9d1fc-dc5b-4021-8255-463fa19065e4", + "name": "Internet", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": 22, + "goal_cadence": 1, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + } + ] + }, + { + "month": "2023-08-01", + "note": null, + "income": 1000000, + "budgeted": 100000, + "activity": -100000, + "to_be_budgeted": 900000, + "age_of_money": null, + "deleted": false, + "categories": [ + { + "id": "00ef54e0-fc17-455e-8d67-efb6327dc9d7", + "category_group_id": "857f9218-ddaa-495e-814d-0d72291a1d89", + "name": "Auto Maintenance", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "TB", + "goal_day": null, + "goal_cadence": null, + "goal_cadence_frequency": null, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "0431a8df-183f-4820-acc4-255138918710", + "category_group_id": "ce2bff41-c8a3-4845-b14d-3f72f48075ed", + "name": "Entertainment", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": 6, + "goal_cadence": 2, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "0834b483-dff7-4e5c-8b7f-8aeca44df1d1", + "category_group_id": "53c9d1fc-dc5b-4021-8255-463fa19065e4", + "name": "Water", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": 23, + "goal_cadence": 1, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "0a2e4126-f6b1-46cd-8600-69acd46fb543", + "category_group_id": "bbbba6fe-afcd-4c3a-909e-37db448d554f", + "name": "Home Improvement", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "TB", + "goal_day": null, + "goal_cadence": null, + "goal_cadence_frequency": null, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "36120d44-6c61-4402-985a-891a8d267858", + "category_group_id": "d5c355c2-3b77-4a7f-b8b3-c832b10cfec9", + "name": "Inflow: Ready to Assign", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 1000000, + "balance": 1000000, + "goal_type": null, + "goal_day": null, + "goal_cadence": null, + "goal_cadence_frequency": null, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "5428b0b1-b567-4cff-8a94-d9d65491990f", + "category_group_id": "53c9d1fc-dc5b-4021-8255-463fa19065e4", + "name": "Rent/Mortgage", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": null, + "goal_cadence": 1, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "6a45b7c5-0624-4673-a705-830732976846", + "category_group_id": "ce2bff41-c8a3-4845-b14d-3f72f48075ed", + "name": "Hobbies", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": null, + "goal_cadence": 1, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "6bfc863c-e7e7-4d11-a713-f0b1f614f18d", + "category_group_id": "857f9218-ddaa-495e-814d-0d72291a1d89", + "name": "Gifts", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": null, + "goal_cadence": 13, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": "2023-12-10", + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "8779f287-50aa-49d8-a89c-752cbd167d6c", + "category_group_id": "ce2bff41-c8a3-4845-b14d-3f72f48075ed", + "name": "Health & Wellness", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": null, + "goal_cadence": 1, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "9bab474b-23fe-45e8-880d-5ee16b7fd826", + "category_group_id": "bbbba6fe-afcd-4c3a-909e-37db448d554f", + "name": "Education", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "TB", + "goal_day": null, + "goal_cadence": null, + "goal_cadence_frequency": null, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "a188f2d2-a1ab-4b29-b0f6-8fac9eccfad4", + "category_group_id": "0632d11d-c20e-401d-97cf-f4f727b16aea", + "name": "Eating Out", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": 6, + "goal_cadence": 2, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "c22bbf52-7f46-4403-a1be-94a7cfbdb5c3", + "category_group_id": "0632d11d-c20e-401d-97cf-f4f727b16aea", + "name": "Transportation", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": 6, + "goal_cadence": 2, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "ca7f02c3-7801-4a5a-a07d-ab90ca1e6360", + "category_group_id": "53c9d1fc-dc5b-4021-8255-463fa19065e4", + "name": "Electric", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": 15, + "goal_cadence": 1, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "e2ad2170-166a-4186-ac38-af31006f2c44", + "category_group_id": "bbbba6fe-afcd-4c3a-909e-37db448d554f", + "name": "Vacation", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "TB", + "goal_day": null, + "goal_cadence": null, + "goal_cadence_frequency": null, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "e7e1bfdb-9104-4c2f-a479-79058bef9b3a", + "category_group_id": "d5c355c2-3b77-4a7f-b8b3-c832b10cfec9", + "name": "Uncategorized", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": null, + "goal_day": null, + "goal_cadence": null, + "goal_cadence_frequency": null, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "e986134b-400d-4a03-8805-3cfbbad1e04e", + "category_group_id": "857f9218-ddaa-495e-814d-0d72291a1d89", + "name": "Home Maintenance", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "TB", + "goal_day": null, + "goal_cadence": null, + "goal_cadence_frequency": null, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "e9e7c589-9e38-461e-bdda-252bf85f3bc7", + "category_group_id": "53c9d1fc-dc5b-4021-8255-463fa19065e4", + "name": "Cellphone", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": 22, + "goal_cadence": 1, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "ef9a2031-8e19-47fe-97da-80d81a8f2499", + "category_group_id": "53c9d1fc-dc5b-4021-8255-463fa19065e4", + "name": "Internet", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 0, + "activity": 0, + "balance": 0, + "goal_type": "NEED", + "goal_day": 22, + "goal_cadence": 1, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + }, + { + "id": "225be370-37da-4cf8-8b6b-4c6d61a0dd95", + "category_group_id": "0632d11d-c20e-401d-97cf-f4f727b16aea", + "name": "Groceries", + "hidden": false, + "original_category_group_id": null, + "note": null, + "budgeted": 100000, + "activity": -100000, + "balance": 0, + "goal_type": "NEED", + "goal_day": 6, + "goal_cadence": 2, + "goal_cadence_frequency": 1, + "goal_creation_month": null, + "goal_target": 0, + "goal_target_month": null, + "goal_percentage_complete": null, + "goal_months_to_budget": null, + "goal_under_funded": null, + "goal_overall_funded": null, + "goal_overall_left": null, + "deleted": false + } + ] + } + ], + "transactions": [ + { + "id": "357b5aea-60c2-49d4-bbd6-1bcd1c84f975", + "date": "2023-08-04", + "amount": -200000, + "memo": "sending to savings", + "cleared": "cleared", + "approved": true, + "flag_color": null, + "account_id": "bc1d862f-bab0-41c3-bd1e-6cee8c688e32", + "payee_id": "8d3017e0-2aa6-4fe2-b011-c53c9f147eb6", + "category_id": null, + "transfer_account_id": "125f339b-2a63-481e-84c0-f04d898905d2", + "transfer_transaction_id": "85991e35-bad1-4aad-9efb-bfc7fd177701", + "matched_transaction_id": null, + "import_id": null, + "import_payee_name": null, + "import_payee_name_original": null, + "debt_transaction_type": null, + "deleted": false + }, + { + "id": "a86c1bbd-cb62-4c3c-b14e-492a25e8d171", + "date": "2023-08-04", + "amount": -100000, + "memo": null, + "cleared": "cleared", + "approved": true, + "flag_color": null, + "account_id": "bc1d862f-bab0-41c3-bd1e-6cee8c688e32", + "payee_id": "2a20470a-634f-4efa-a7f6-f1c0b0bdda41", + "category_id": "225be370-37da-4cf8-8b6b-4c6d61a0dd95", + "transfer_account_id": null, + "transfer_transaction_id": null, + "matched_transaction_id": null, + "import_id": null, + "import_payee_name": null, + "import_payee_name_original": null, + "debt_transaction_type": null, + "deleted": false + }, + { + "id": "b691fc2b-cf7f-41b3-9db9-bd36d21d20a9", + "date": "2023-08-04", + "amount": 0, + "memo": "getting paid", + "cleared": "cleared", + "approved": true, + "flag_color": null, + "account_id": "bc1d862f-bab0-41c3-bd1e-6cee8c688e32", + "payee_id": "c843e030-5a77-4dc5-9b93-f8acc64b74f8", + "category_id": "36120d44-6c61-4402-985a-891a8d267858", + "transfer_account_id": null, + "transfer_transaction_id": null, + "matched_transaction_id": null, + "import_id": null, + "import_payee_name": null, + "import_payee_name_original": null, + "debt_transaction_type": null, + "deleted": false + }, + { + "id": "1000662e-28de-409c-ba65-cc8263395dcc", + "date": "2023-08-04", + "amount": 0, + "memo": null, + "cleared": "cleared", + "approved": true, + "flag_color": null, + "account_id": "125f339b-2a63-481e-84c0-f04d898905d2", + "payee_id": "c843e030-5a77-4dc5-9b93-f8acc64b74f8", + "category_id": "36120d44-6c61-4402-985a-891a8d267858", + "transfer_account_id": null, + "transfer_transaction_id": null, + "matched_transaction_id": null, + "import_id": null, + "import_payee_name": null, + "import_payee_name_original": null, + "debt_transaction_type": null, + "deleted": false + }, + { + "id": "85991e35-bad1-4aad-9efb-bfc7fd177701", + "date": "2023-08-04", + "amount": 200000, + "memo": "sending to savings", + "cleared": "uncleared", + "approved": true, + "flag_color": null, + "account_id": "125f339b-2a63-481e-84c0-f04d898905d2", + "payee_id": "9105e6a6-966b-4d31-818b-062365a839b6", + "category_id": null, + "transfer_account_id": "bc1d862f-bab0-41c3-bd1e-6cee8c688e32", + "transfer_transaction_id": "357b5aea-60c2-49d4-bbd6-1bcd1c84f975", + "matched_transaction_id": null, + "import_id": null, + "import_payee_name": null, + "import_payee_name_original": null, + "debt_transaction_type": null, + "deleted": false + }, + { + "id": "4156137c-694d-4c35-b523-597a6ef82199", + "date": "2023-08-04", + "amount": 1000000, + "memo": "", + "cleared": "cleared", + "approved": true, + "flag_color": null, + "account_id": "bc1d862f-bab0-41c3-bd1e-6cee8c688e32", + "payee_id": "9d3af671-9c88-4d95-b12b-600e1375df85", + "category_id": "36120d44-6c61-4402-985a-891a8d267858", + "transfer_account_id": null, + "transfer_transaction_id": null, + "matched_transaction_id": null, + "import_id": null, + "import_payee_name": null, + "import_payee_name_original": null, + "debt_transaction_type": null, + "deleted": false + } + ], + "subtransactions": [], + "scheduled_transactions": [], + "scheduled_subtransactions": [] + }, + "server_knowledge": 58 +} diff --git a/packages/desktop-client/e2e/onboarding.test.js b/packages/desktop-client/e2e/onboarding.test.js index 92c6b0846909b638a3b040077cd784eb3c3ae8bc..db512c42fff98113e3040cf621c737bbbfcfff18 100644 --- a/packages/desktop-client/e2e/onboarding.test.js +++ b/packages/desktop-client/e2e/onboarding.test.js @@ -41,8 +41,21 @@ test.describe('Onboarding', () => { await expect(accountPage.accountBalance).toHaveText('2,607.00'); }); - // TODO: implement this test once we have an example nYNAB file - // test('creates a new budget file by importing nYNAB budget'); + test('creates a new budget file by importing nYNAB budget', async () => { + await configurationPage.clickOnNoServer(); + const budgetPage = await configurationPage.importBudget( + 'nYNAB', + path.resolve(__dirname, 'data/ynab5-demo-budget.json'), + ); + + await expect(budgetPage.budgetTable).toBeVisible({ timeout: 30000 }); + + const accountPage = await navigation.goToAccountPage('Checking'); + await expect(accountPage.accountBalance).toHaveText('700.00'); + + await navigation.goToAccountPage('Saving'); + await expect(accountPage.accountBalance).toHaveText('200.00'); + }); test('creates a new budget file by importing Actual budget', async () => { await configurationPage.clickOnNoServer(); diff --git a/packages/desktop-client/src/components/manager/ImportActual.js b/packages/desktop-client/src/components/manager/ImportActual.tsx similarity index 90% rename from packages/desktop-client/src/components/manager/ImportActual.js rename to packages/desktop-client/src/components/manager/ImportActual.tsx index e9720afde1d9148d1b85d9424222bf09bc1a3a99..153b938e393ca400e55e4385922593d4660ba0f5 100644 --- a/packages/desktop-client/src/components/manager/ImportActual.js +++ b/packages/desktop-client/src/components/manager/ImportActual.tsx @@ -6,11 +6,11 @@ import { importBudget } from 'loot-core/src/client/actions/budgets'; import { styles, colors } from '../../style'; import Block from '../common/Block'; import { ButtonWithLoading } from '../common/Button'; -import Modal from '../common/Modal'; +import Modal, { type ModalProps } from '../common/Modal'; import Paragraph from '../common/Paragraph'; import View from '../common/View'; -function getErrorMessage(error) { +function getErrorMessage(error: string): string { switch (error) { case 'parse-error': return 'Unable to parse file. Please select a JSON file exported from nYNAB.'; @@ -27,9 +27,13 @@ function getErrorMessage(error) { } } -function Import({ modalProps }) { +type ImportProps = { + modalProps?: ModalProps; +}; + +function Import({ modalProps }: ImportProps) { const dispatch = useDispatch(); - const [error, setError] = useState(false); + const [error, setError] = useState<string | null>(null); const [importing, setImporting] = useState(false); async function onImport() { @@ -39,7 +43,7 @@ function Import({ modalProps }) { }); if (res) { setImporting(true); - setError(false); + setError(null); try { await dispatch(importBudget(res[0], 'actual')); } catch (err) { diff --git a/packages/desktop-client/src/components/manager/ImportYNAB4.js b/packages/desktop-client/src/components/manager/ImportYNAB4.tsx similarity index 89% rename from packages/desktop-client/src/components/manager/ImportYNAB4.js rename to packages/desktop-client/src/components/manager/ImportYNAB4.tsx index ddde7e37bccecdfdbb9006ed60872b6b00de1b25..7ad1a64a9a88e1bc615f0e9898cddbd8920e1d7e 100644 --- a/packages/desktop-client/src/components/manager/ImportYNAB4.js +++ b/packages/desktop-client/src/components/manager/ImportYNAB4.tsx @@ -6,11 +6,11 @@ import { importBudget } from 'loot-core/src/client/actions/budgets'; import { styles, colors } from '../../style'; import Block from '../common/Block'; import { ButtonWithLoading } from '../common/Button'; -import Modal from '../common/Modal'; +import Modal, { type ModalProps } from '../common/Modal'; import Paragraph from '../common/Paragraph'; import View from '../common/View'; -function getErrorMessage(error) { +function getErrorMessage(error: string): string { switch (error) { case 'not-ynab4': return 'This file is not valid. Please select a compressed ynab4 zip file.'; @@ -19,9 +19,13 @@ function getErrorMessage(error) { } } -function Import({ modalProps }) { +type ImportProps = { + modalProps?: ModalProps; +}; + +function Import({ modalProps }: ImportProps) { const dispatch = useDispatch(); - const [error, setError] = useState(false); + const [error, setError] = useState<string | null>(null); const [importing, setImporting] = useState(false); async function onImport() { @@ -31,7 +35,7 @@ function Import({ modalProps }) { }); if (res) { setImporting(true); - setError(false); + setError(null); try { await dispatch(importBudget(res[0], 'ynab4')); } catch (err) { diff --git a/packages/desktop-client/src/components/manager/ImportYNAB5.js b/packages/desktop-client/src/components/manager/ImportYNAB5.tsx similarity index 90% rename from packages/desktop-client/src/components/manager/ImportYNAB5.js rename to packages/desktop-client/src/components/manager/ImportYNAB5.tsx index b302574027642dcc98b287de578bad0c1a98d900..a7b5ddadf9715206ee99a208f1d076df0b5da8be 100644 --- a/packages/desktop-client/src/components/manager/ImportYNAB5.js +++ b/packages/desktop-client/src/components/manager/ImportYNAB5.tsx @@ -7,11 +7,11 @@ import { styles, colors } from '../../style'; import Block from '../common/Block'; import { ButtonWithLoading } from '../common/Button'; import ExternalLink from '../common/ExternalLink'; -import Modal from '../common/Modal'; +import Modal, { type ModalProps } from '../common/Modal'; import Paragraph from '../common/Paragraph'; import View from '../common/View'; -function getErrorMessage(error) { +function getErrorMessage(error: string): string { switch (error) { case 'parse-error': return 'Unable to parse file. Please select a JSON file exported from nYNAB.'; @@ -22,9 +22,13 @@ function getErrorMessage(error) { } } -function Import({ modalProps }) { +type ImportProps = { + modalProps?: ModalProps; +}; + +function Import({ modalProps }: ImportProps) { const dispatch = useDispatch(); - const [error, setError] = useState(false); + const [error, setError] = useState<string | null>(null); const [importing, setImporting] = useState(false); async function onImport() { @@ -34,7 +38,7 @@ function Import({ modalProps }) { }); if (res) { setImporting(true); - setError(false); + setError(null); try { await dispatch(importBudget(res[0], 'ynab5')); } catch (err) { diff --git a/packages/desktop-client/src/global-events.js b/packages/desktop-client/src/global-events.js index 64a08d7929c586bb883019082dc46ffede5d6bd8..b6e533b01dd2920ef48c29dd7d297e8fe0d6c75b 100644 --- a/packages/desktop-client/src/global-events.js +++ b/packages/desktop-client/src/global-events.js @@ -147,7 +147,6 @@ export function handleGlobalEvents(actions, store) { listen('start-import', () => { actions.closeBudgetUI(); - actions.setAppState({ loadingText: 'Importing...' }); }); listen('finish-import', () => { diff --git a/packages/loot-core/src/server/importers/ynab5-types.d.ts b/packages/loot-core/src/server/importers/ynab5-types.d.ts index 6b1a59f0251ef1e97818a2836e210cecbb849b70..2b363248bbbbc331e02d11149093bd949d42542e 100644 --- a/packages/loot-core/src/server/importers/ynab5-types.d.ts +++ b/packages/loot-core/src/server/importers/ynab5-types.d.ts @@ -2,7 +2,8 @@ export namespace YNAB5 { export interface Budget { - budget_name: string; + name?: string; + budget_name?: string; accounts: Account[]; payees: Payee[]; category_groups: CategoryGroup[]; diff --git a/packages/loot-core/src/server/importers/ynab5.ts b/packages/loot-core/src/server/importers/ynab5.ts index eddee853d01abd9787110ab14d9813c36a718bbd..b5ad715583c6aeb8067830fe14d3529f9f74278e 100644 --- a/packages/loot-core/src/server/importers/ynab5.ts +++ b/packages/loot-core/src/server/importers/ynab5.ts @@ -294,10 +294,13 @@ export function parseFile(buffer: Buffer): YNAB5.Budget { if (data.data) { data = data.data; } + if (data.budget) { + data = data.budget; + } return data; } export function getBudgetName(_filepath: string, data: YNAB5.Budget) { - return data.budget_name; + return data.budget_name || data.name; } diff --git a/packages/loot-core/src/server/main.ts b/packages/loot-core/src/server/main.ts index 83e8e6f961894dbab258ef99f4b19683f1552878..e15d87f4ccce808e73a6d11b5629339864e772b1 100644 --- a/packages/loot-core/src/server/main.ts +++ b/packages/loot-core/src/server/main.ts @@ -2053,14 +2053,13 @@ handlers['import-budget'] = async function ({ filepath, type }) { } let buffer = Buffer.from(await fs.readFile(filepath, 'binary')); - await handleBudgetImport(type, filepath, buffer); + let results = await handleBudgetImport(type, filepath, buffer); + return results || {}; } catch (err) { err.message = 'Error importing budget: ' + err.message; captureException(err); return { error: 'internal-error' }; } - - return {}; }; handlers['export-budget'] = async function () { diff --git a/upcoming-release-notes/1462.md b/upcoming-release-notes/1462.md new file mode 100644 index 0000000000000000000000000000000000000000..038c762b0d2fff8fdb9b153efccb948ff4aefe5b --- /dev/null +++ b/upcoming-release-notes/1462.md @@ -0,0 +1,6 @@ +--- +category: Bugfix +authors: [MatissJanis] +--- + +Fix import from nYNAB and error-handling of other importers