monopyly 1.5.2__py3-none-any.whl → 1.6.1__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 (94) hide show
  1. monopyly/CHANGELOG.md +22 -0
  2. monopyly/README.md +1 -1
  3. monopyly/__init__.py +1 -1
  4. monopyly/_version.py +2 -2
  5. monopyly/auth/blueprint.py +2 -0
  6. monopyly/auth/routes.py +1 -2
  7. monopyly/banking/accounts.py +4 -4
  8. monopyly/banking/actions.py +20 -17
  9. monopyly/banking/blueprint.py +2 -0
  10. monopyly/banking/filters.py +6 -6
  11. monopyly/banking/forms.py +7 -5
  12. monopyly/banking/routes.py +71 -9
  13. monopyly/banking/transactions.py +2 -3
  14. monopyly/common/forms/__init__.py +8 -0
  15. monopyly/common/forms/_forms.py +6 -16
  16. monopyly/common/forms/fields.py +0 -11
  17. monopyly/common/forms/utils.py +4 -4
  18. monopyly/common/transactions.py +72 -7
  19. monopyly/core/actions.py +2 -1
  20. monopyly/core/blueprint.py +2 -0
  21. monopyly/core/context_processors.py +3 -21
  22. monopyly/core/filters.py +0 -2
  23. monopyly/core/routes.py +1 -1
  24. monopyly/credit/actions.py +4 -5
  25. monopyly/credit/blueprint.py +2 -0
  26. monopyly/credit/cards.py +1 -1
  27. monopyly/credit/forms.py +9 -7
  28. monopyly/credit/routes.py +37 -62
  29. monopyly/credit/transactions/__init__.py +2 -0
  30. monopyly/credit/transactions/_transactions.py +1 -4
  31. monopyly/credit/transactions/activity/__init__.py +6 -0
  32. monopyly/credit/transactions/activity/parser.py +0 -1
  33. monopyly/credit/transactions/activity/reconciliation.py +5 -3
  34. monopyly/database/__init__.py +0 -3
  35. monopyly/database/models.py +63 -49
  36. monopyly/database/preloads.sql +6 -1
  37. monopyly/scripts/screenshot_application.py +100 -0
  38. monopyly/static/chartist-1.5.0.min.js +8 -0
  39. monopyly/static/css/style.css +39 -14
  40. monopyly/static/img/about/bank-account-details.png +0 -0
  41. monopyly/static/img/about/bank-account-summaries.png +0 -0
  42. monopyly/static/img/about/bank-accounts.png +0 -0
  43. monopyly/static/img/about/credit-account-details.png +0 -0
  44. monopyly/static/img/about/credit-statement-details.png +0 -0
  45. monopyly/static/img/about/credit-transactions.png +0 -0
  46. monopyly/static/img/about/homepage-user.png +0 -0
  47. monopyly/static/img/about/homepage.png +0 -0
  48. monopyly/static/jquery-3.7.1.min.js +2 -0
  49. monopyly/static/js/add-transfer.js +8 -9
  50. monopyly/static/js/bind-tag-actions.js +6 -0
  51. monopyly/static/js/create-balance-chart.js +1 -1
  52. monopyly/static/js/create-category-chart.js +1 -1
  53. monopyly/static/js/load-more-transactions.js +27 -0
  54. monopyly/static/js/modules/expand-transaction.js +7 -6
  55. monopyly/static/js/modules/update-display-ajax.js +20 -1
  56. monopyly/static/js/update-transactions-display.js +8 -2
  57. monopyly/templates/banking/account_form/account_form_page_new.html +10 -8
  58. monopyly/templates/banking/account_page.html +32 -33
  59. monopyly/templates/banking/account_summaries.html +2 -2
  60. monopyly/templates/banking/account_summary.html +1 -1
  61. monopyly/templates/banking/accounts_page.html +10 -8
  62. monopyly/templates/banking/transactions_table/table.html +3 -0
  63. monopyly/templates/banking/transactions_table/transactions.html +0 -1
  64. monopyly/templates/common/tag_tree.html +25 -0
  65. monopyly/templates/{credit → common}/tags_page.html +17 -13
  66. monopyly/templates/common/transactions_table/linked_bank_transaction.html +2 -2
  67. monopyly/templates/common/transactions_table/table.html +6 -0
  68. monopyly/templates/common/transactions_table/transactions.html +9 -15
  69. monopyly/templates/core/index.html +124 -109
  70. monopyly/templates/core/profile.html +19 -20
  71. monopyly/templates/credit/account_page.html +17 -17
  72. monopyly/templates/credit/card_form/card_form_page_new.html +8 -5
  73. monopyly/templates/credit/statement_page.html +45 -46
  74. monopyly/templates/credit/statement_reconciliation/statement_reconciliation_page.html +22 -22
  75. monopyly/templates/credit/statement_summary.html +2 -2
  76. monopyly/templates/credit/statements_page.html +13 -13
  77. monopyly/templates/credit/transaction_form/transaction_form_page_update.html +9 -9
  78. monopyly/templates/credit/transaction_submission_page.html +3 -3
  79. monopyly/templates/credit/transactions_page.html +38 -22
  80. monopyly/templates/credit/transactions_table/condensed_row_content.html +2 -2
  81. monopyly/templates/credit/transactions_table/expanded_row_content.html +5 -5
  82. monopyly/templates/credit/transactions_table/table.html +3 -0
  83. monopyly/templates/credit/transactions_table/transactions.html +0 -1
  84. monopyly/templates/layout.html +16 -9
  85. {monopyly-1.5.2.dist-info → monopyly-1.6.1.dist-info}/METADATA +8 -8
  86. {monopyly-1.5.2.dist-info → monopyly-1.6.1.dist-info}/RECORD +90 -84
  87. monopyly-1.6.1.dist-info/entry_points.txt +3 -0
  88. monopyly/static/jquery-3.7.0.min.js +0 -2
  89. monopyly/templates/credit/tag_tree/subtag_tree.html +0 -22
  90. monopyly/templates/credit/tag_tree/tag_tree.html +0 -13
  91. monopyly-1.5.2.dist-info/entry_points.txt +0 -2
  92. {monopyly-1.5.2.dist-info → monopyly-1.6.1.dist-info}/WHEEL +0 -0
  93. {monopyly-1.5.2.dist-info → monopyly-1.6.1.dist-info}/licenses/COPYING +0 -0
  94. {monopyly-1.5.2.dist-info → monopyly-1.6.1.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,25 @@
1
1
  {% extends 'layout.html' %}
2
2
 
3
3
 
4
+ {% block javascript %}
5
+
6
+ <script>
7
+ const CREDIT_ACTIVITY_RECONCILIATION_ENDPOINT = "{{ url_for('credit.reconcile_activity', statement_id=statement.id) }}";
8
+ const EXPAND_TRANSACTION_ENDPOINT = "{{ url_for('credit.expand_transaction') }}";
9
+ const LINKED_TRANSACTION_ENDPOINT = "{{ url_for('credit.show_linked_transaction') }}";
10
+ </script>
11
+ <script type="module" src="{{ url_for('static', filename='js/show-credit-activity-loader.js') }}">
12
+ </script>
13
+ <script type="module" src="{{ url_for('static', filename='js/highlight-discrepant-transactions.js') }}">
14
+ </script>
15
+ <script type="module" src="{{ url_for('static', filename='js/expand-transaction.js') }}">
16
+ </script>
17
+ <script type="module" src="{{ url_for('static', filename='js/show-linked-transaction.js') }}">
18
+ </script>
19
+
20
+ {% endblock %}
21
+
22
+
4
23
  {% block header %}
5
24
 
6
25
  <h1>
@@ -13,7 +32,7 @@
13
32
 
14
33
 
15
34
  {% block content %}
16
- {% set highlighted_transactions = statement_transactions|selectattr("highlight")|first %}
35
+ {% set highlighted_transactions = transactions|selectattr("highlight")|first %}
17
36
 
18
37
  <div id="credit-statement-reconciliation-details" class="details">
19
38
 
@@ -30,8 +49,8 @@
30
49
  </p>
31
50
  {% endif %}
32
51
 
33
- {% with transactions = statement_transactions, full_view = False %}
34
- {% include 'credit/transactions_table/transactions.html' %}
52
+ {% with full_view = False %}
53
+ {% include 'credit/transactions_table/table.html' %}
35
54
  {% endwith %}
36
55
  </div>
37
56
 
@@ -65,22 +84,3 @@
65
84
  </div>
66
85
 
67
86
  {% endblock %}
68
-
69
-
70
- {% block javascript %}
71
-
72
- <script>
73
- const CREDIT_ACTIVITY_RECONCILIATION_ENDPOINT = "{{ url_for('credit.reconcile_activity', statement_id=statement.id) }}";
74
- const EXPAND_TRANSACTION_ENDPOINT = "{{ url_for('credit.expand_transaction') }}";
75
- const LINKED_TRANSACTION_ENDPOINT = "{{ url_for('credit.show_linked_transaction') }}";
76
- </script>
77
- <script type="module" src="{{ url_for('static', filename='js/show-credit-activity-loader.js') }}">
78
- </script>
79
- <script type="module" src="{{ url_for('static', filename='js/highlight-discrepant-transactions.js') }}">
80
- </script>
81
- <script type="module" src="{{ url_for('static', filename='js/expand-transaction.js') }}">
82
- </script>
83
- <script type="module" src="{{ url_for('static', filename='js/show-linked-transaction.js') }}">
84
- </script>
85
-
86
- {% endblock %}
@@ -52,7 +52,7 @@
52
52
 
53
53
  <div class="form-line">
54
54
  <div class="dollar-sign">$</div>
55
- <input id="pay-amount" type="number" name="pay_amount" value="{{ statement.balance }}" />
55
+ <input id="pay-amount" type="number" name="pay_amount" value="{{ statement.balance }}" step="0.01" />
56
56
  <input id="pay-date" type="date" name="pay_date" value="{{ date_today }}" />
57
57
  </div>
58
58
 
@@ -62,7 +62,7 @@
62
62
  <option value="0">Select a bank</option>
63
63
  {% for account in bank_accounts %}
64
64
  <option value="{{ account.id }}">
65
- {{ account.bank.bank_name }} {{ account.account_type.type_name }} ({{ account.last_four_digits }})
65
+ {{ account.bank.bank_name }} {{ account.account_type_view.type_name }} ({{ account.last_four_digits }})
66
66
  </option>
67
67
  {% endfor %}
68
68
  </optgroup>
@@ -1,6 +1,19 @@
1
1
  {% extends 'layout.html' %}
2
2
 
3
3
 
4
+ {% block javascript %}
5
+
6
+ <script src="{{ url_for('static', filename='js/define-filter.js') }}" defer>
7
+ </script>
8
+ <script>
9
+ const FILTER_ENDPOINT = "{{ url_for('credit.update_statements_display') }}";
10
+ </script>
11
+ <script type="module" src="{{ url_for('static', filename='js/update-statements-display.js') }}">
12
+ </script>
13
+
14
+ {% endblock %}
15
+
16
+
4
17
  {% block left_sidebar %}
5
18
 
6
19
  <nav id="sidebar-nav-menu">
@@ -54,16 +67,3 @@
54
67
  <a name="bottom"></a>
55
68
 
56
69
  {% endblock %}
57
-
58
-
59
- {% block javascript %}
60
-
61
- <script src="{{ url_for('static', filename='js/define-filter.js') }}">
62
- </script>
63
- <script>
64
- const FILTER_ENDPOINT = "{{ url_for('credit.update_statements_display') }}";
65
- </script>
66
- <script type="module" src="{{ url_for('static', filename='js/update-statements-display.js') }}">
67
- </script>
68
-
69
- {% endblock %}
@@ -1,6 +1,15 @@
1
1
  {% extends "credit/transaction_form/transaction_form_page.html" %}
2
2
 
3
3
 
4
+ {% block javascript %}
5
+
6
+ {{ super() }}
7
+ <script type="module" src="{{ url_for('static', filename='js/use-suggested-amount.js') }}">
8
+ </script>
9
+
10
+ {% endblock %}
11
+
12
+
4
13
  {% block title %}
5
14
  Update Credit Transaction
6
15
  {% endblock %}
@@ -13,12 +22,3 @@
13
22
  {% endwith %}
14
23
 
15
24
  {% endblock %}
16
-
17
-
18
- {% block javascript %}
19
-
20
- {{ super() }}
21
- <script type="module" src="{{ url_for('static', filename='js/use-suggested-amount.js') }}">
22
- </script>
23
-
24
- {% endblock %}
@@ -43,11 +43,11 @@
43
43
  <div id="receipt-card">
44
44
  <div class="receipt-item">
45
45
  <div class="receipt-key">Card:</div>
46
- <div class="receipt-value">{{ transaction.statement.card.account.bank.bank_name }} ****-{{ transaction.statement.card.last_four_digits }}</div>
46
+ <div class="receipt-value">{{ transaction.statement_view.card.account.bank.bank_name }} ****-{{ transaction.statement_view.card.last_four_digits }}</div>
47
47
  </div>
48
48
  <div class="receipt-item">
49
49
  <div class="receipt-key">Statement Date:</div>
50
- <div class="receipt-value">{{ transaction.statement.issue_date }}</div>
50
+ <div class="receipt-value">{{ transaction.statement_view.issue_date }}</div>
51
51
  </div>
52
52
  </div>
53
53
 
@@ -62,7 +62,7 @@
62
62
  <a class="submission button" href="{{ url_for('credit.add_transaction') }}">
63
63
  Create a new transaction
64
64
  </a>
65
- <a class="submission button" href="{{ url_for('credit.add_transaction', card_id=transaction.statement.card_id, statement_id=transaction.statement_id) }}">
65
+ <a class="submission button" href="{{ url_for('credit.add_transaction', card_id=transaction.statement_view.card_id, statement_id=transaction.statement_id) }}">
66
66
  Create a new transaction on this statement
67
67
  </a>
68
68
  <a class="submission button" href="{{ url_for('credit.load_statement_details', statement_id=transaction.statement_id) }}">
@@ -1,4 +1,33 @@
1
1
  {% extends 'layout.html' %}
2
+ {% set full_view = True %}
3
+
4
+
5
+ {% block javascript %}
6
+
7
+ <script src="{{ url_for('static', filename='js/define-filter.js') }}" defer>
8
+ </script>
9
+ <script>
10
+ const FILTER_ENDPOINT = "{{ url_for('credit.update_transactions_display') }}";
11
+ const EXPAND_TRANSACTION_ENDPOINT = "{{ url_for('credit.expand_transaction') }}";
12
+ const LINKED_TRANSACTION_ENDPOINT = "{{ url_for('credit.show_linked_transaction') }}";
13
+ const LOAD_TRANSACTIONS_ENDPOINT = "{{ url_for('credit.load_more_transactions') }}";
14
+ const LOAD_TRANSACTIONS_SELECTORS = {
15
+ "selected_card_ids": {{ selected_card_ids }},
16
+ "sort_order": "{{ sort_order }}",
17
+ "block_count": 1,
18
+ "full_view": {{ full_view|tojson }}
19
+ }
20
+ </script>
21
+ <script type="module" src="{{ url_for('static', filename='js/update-transactions-display.js') }}">
22
+ </script>
23
+ <script type="module" src="{{ url_for('static', filename='js/load-more-transactions.js') }}">
24
+ </script>
25
+ <script type="module" src="{{ url_for('static', filename='js/expand-transaction.js') }}">
26
+ </script>
27
+ <script type="module" src="{{ url_for('static', filename='js/show-linked-transaction.js') }}">
28
+ </script>
29
+
30
+ {% endblock %}
2
31
 
3
32
 
4
33
  {% block left_sidebar %}
@@ -60,30 +89,17 @@
60
89
  </div>
61
90
 
62
91
  <div class="transactions-container">
63
- {% with full_view = True %}
64
- {% include 'credit/transactions_table/transactions.html' %}
65
- {% endwith %}
92
+ {% include 'credit/transactions_table/table.html' %}
93
+
94
+ {% if transactions|length < total_transactions %}
95
+ <div id="more-transactions" class="button">
96
+ <img class="icon" src="{{ url_for('static', filename='img/icons/plus-thick.png') }}">
97
+ <div>Load more transactions</div>
98
+ </div>
99
+ {% endif %}
66
100
  </div>
67
101
 
68
- <a name="bottom"></a>
69
-
70
- {% endblock %}
71
-
72
-
73
- {% block javascript %}
74
102
 
75
- <script src="{{ url_for('static', filename='js/define-filter.js') }}">
76
- </script>
77
- <script>
78
- const FILTER_ENDPOINT = "{{ url_for('credit.update_transactions_display') }}";
79
- const EXPAND_TRANSACTION_ENDPOINT = "{{ url_for('credit.expand_transaction') }}";
80
- const LINKED_TRANSACTION_ENDPOINT = "{{ url_for('credit.show_linked_transaction') }}";
81
- </script>
82
- <script type="module" src="{{ url_for('static', filename='js/update-transactions-display.js') }}">
83
- </script>
84
- <script type="module" src="{{ url_for('static', filename='js/expand-transaction.js') }}">
85
- </script>
86
- <script type="module" src="{{ url_for('static', filename='js/show-linked-transaction.js') }}">
87
- </script>
103
+ <a name="bottom"></a>
88
104
 
89
105
  {% endblock %}
@@ -19,7 +19,7 @@
19
19
 
20
20
  {% if full_view %}
21
21
  <div class="card column">
22
- <span class="bank">{{ transaction.statement.card.account.bank.bank_name }}</span>
23
- -<span class="digits">{{ transaction.statement.card.last_four_digits }}</span>
22
+ <span class="bank">{{ transaction.statement_view.card.account.bank.bank_name }}</span>
23
+ -<span class="digits">{{ transaction.statement_view.card.last_four_digits }}</span>
24
24
  </div>
25
25
  {% endif %}
@@ -46,21 +46,21 @@
46
46
  <a href="{{ url_for('credit.load_statement_details', statement_id=transaction.statement_id) }}">
47
47
  <img src="{{ url_for('static', filename='img/statement.png') }}" />
48
48
  <div class="date">
49
- <div class="month">{{ transaction.statement.issue_date.strftime('%b')|upper }}</div>
50
- <div class="year">{{ transaction.statement.issue_date.year }}</div>
49
+ <div class="month">{{ transaction.statement_view.issue_date.strftime('%b')|upper }}</div>
50
+ <div class="year">{{ transaction.statement_view.issue_date.year }}</div>
51
51
  </div>
52
52
  </a>
53
53
  </div>
54
54
 
55
55
  <div class="card">
56
- <a href="{{ url_for('credit.load_account', account_id=transaction.statement.card.account_id) }}">
56
+ <a href="{{ url_for('credit.load_account', account_id=transaction.statement_view.card.account_id) }}">
57
57
  {% with %}
58
58
  {% set img_base = url_for('static', filename='img/cards/') %}
59
- {% set card_url = img_base + transaction.statement.card.account.bank.bank_name.lower() + '-card.png' %}
59
+ {% set card_url = img_base + transaction.statement_view.card.account.bank.bank_name.lower() + '-card.png' %}
60
60
  {% set template_url = img_base + 'template-card.png' %}
61
61
  <img class="card-background" src="{{ card_url }}" onerror="if (this.src != '{{ template_url }}') this.src = '{{ template_url }}'" />
62
62
  <div class="card-number">
63
- {{ transaction.statement.card.last_four_digits }}
63
+ {{ transaction.statement_view.card.last_four_digits }}
64
64
  </div>
65
65
  {% endwith %}
66
66
  </a>
@@ -0,0 +1,3 @@
1
+ {% set field_title_template = 'credit/transactions_table/transaction_field_titles.html' %}
2
+ {% set transactions_template = 'credit/transactions_table/transactions.html' %}
3
+ {% include 'common/transactions_table/table.html' %}
@@ -1,4 +1,3 @@
1
- {% set field_title_template = 'credit/transactions_table/transaction_field_titles.html' %}
2
1
  {% set condensed_row_content_template = 'credit/transactions_table/condensed_row_content.html' %}
3
2
  {% set expanded_row_content_template = 'credit/transactions_table/expanded_row_content.html' %}
4
3
  {% set update_transaction_function = 'credit.update_transaction' %}
@@ -33,12 +33,24 @@
33
33
  <meta name="msapplication-config" content="{{ url_for('static', filename='favicon/browserconfig.xml') }}" />
34
34
  <!-- ****** faviconit.com favicons ****** -->
35
35
  <!-- Use Google JQuery CDN -->
36
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.0/jquery.min.js"></script>
37
- <script>window.jQuery || document.write('<script src="{{ url_for('static', filename='jquery-3.7.0.min.js') }}"><\/script>')</script>
36
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
37
+ <script>
38
+ window.jQuery || document.write('<script src="{{ url_for('static', filename='jquery-3.7.1.min.js') }}"><\/script>')
39
+ </script>
38
40
  <!-- Use Chartist via CDN -->
39
- <link rel="stylesheet" href="//cdn.jsdelivr.net/chartist.js/latest/chartist.min.css" />
40
- <script src="//cdn.jsdelivr.net/chartist.js/latest/chartist.min.js"></script>
41
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/chartist@1.5.0/dist/index.min.css" />
42
+ <script src="https://cdn.jsdelivr.net/npm/chartist@1.5.0/dist/index.umd.min.js"></script>
43
+ <script>
44
+ window.Chartist || document.write('<script src="{{ url_for('static', filename='chartist-1.5.0.min.js') }}"><\/script>')
45
+ </script>
46
+ <!-- Custom application JavaScript -->
47
+ <script type="module" src="{{ url_for('static', filename='js/toggle-navigation.js') }}">
48
+ </script>
49
+ {% block javascript %}
50
+ {% endblock %}
51
+
41
52
  </head>
53
+
42
54
  <body>
43
55
 
44
56
  <header id="masthead">
@@ -112,10 +124,5 @@
112
124
  </p>
113
125
  </footer>
114
126
 
115
- <script type="module" src="{{ url_for('static', filename='js/toggle-navigation.js') }}">
116
- </script>
117
- {% block javascript %}
118
- {% endblock %}
119
-
120
127
  </body>
121
128
  </html>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: monopyly
3
- Version: 1.5.2
3
+ Version: 1.6.1
4
4
  Summary: A homemade personal finance manager.
5
5
  Project-URL: Download, https://pypi.org/project/monopyly
6
6
  Project-URL: Homepage, http://monopyly.com
@@ -22,16 +22,16 @@ Classifier: Programming Language :: Python
22
22
  Classifier: Topic :: Office/Business :: Financial
23
23
  Classifier: Topic :: Office/Business :: Financial :: Accounting
24
24
  Classifier: Topic :: Office/Business :: Financial :: Spreadsheet
25
- Requires-Python: <3.11,>=3.10
26
- Requires-Dist: dry-foundation==1.3.0
25
+ Requires-Python: >=3.10
26
+ Requires-Dist: dry-foundation==1.6.0
27
27
  Requires-Dist: flask-wtf==1.2.2
28
28
  Requires-Dist: flask==3.1.2
29
29
  Requires-Dist: gunicorn==23.0.0
30
- Requires-Dist: markdown==3.9
31
- Requires-Dist: nltk==3.9.1
30
+ Requires-Dist: markdown==3.10
31
+ Requires-Dist: nltk==3.9.2
32
32
  Requires-Dist: python-dateutil==2.9.0
33
- Requires-Dist: rich==14.1.0
34
- Requires-Dist: sqlalchemy==2.0.43
33
+ Requires-Dist: rich==14.2.0
34
+ Requires-Dist: sqlalchemy==2.0.45
35
35
  Description-Content-Type: text/markdown
36
36
 
37
37
  <div id="header">
@@ -159,7 +159,7 @@ Card balances are also visible by visiting the pages for individual statements.
159
159
  A full history of statements for each card is available off the homepage.
160
160
  Each statement's page gives the statement's balance, transactions, and due date.
161
161
 
162
- <img class="screenshot" src="https://raw.githubusercontent.com/mitchnegus/monopyly/main/monopyly/static/img/about/statement-details.png" alt="statement details" width="800px" />
162
+ <img class="screenshot" src="https://raw.githubusercontent.com/mitchnegus/monopyly/main/monopyly/static/img/about/credit-statement-details.png" alt="statement details" width="800px" />
163
163
 
164
164
  Payments can be made directly from a statement's page and can be linked to a bank account in the _Monopyly_ system for simplified tracking.
165
165
  (Note that even linked transactions must be edited independently, as there are times when a user may wish to have separate values for linked transactions. For example, a credit card payment may be processed on a given date while it is only registered as a bank account transaction several days later.)