monopyly 1.4.8__py3-none-any.whl → 1.5.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.
- monopyly/CHANGELOG.md +18 -0
- monopyly/__init__.py +2 -2
- monopyly/_version.py +14 -2
- monopyly/auth/actions.py +12 -0
- monopyly/auth/routes.py +30 -21
- monopyly/auth/tools.py +1 -2
- monopyly/cli/apps.py +1 -1
- monopyly/cli/launch.py +3 -0
- monopyly/common/forms/_forms.py +56 -2
- monopyly/common/forms/utils.py +1 -2
- monopyly/common/transactions.py +162 -0
- monopyly/core/routes.py +0 -6
- monopyly/credit/actions.py +29 -0
- monopyly/credit/forms.py +25 -0
- monopyly/credit/routes.py +115 -7
- monopyly/credit/transactions/_transactions.py +15 -0
- monopyly/credit/transactions/activity/__init__.py +3 -0
- monopyly/credit/transactions/activity/data.py +161 -0
- monopyly/credit/transactions/activity/parser.py +282 -0
- monopyly/credit/transactions/activity/reconciliation.py +456 -0
- monopyly/database/models.py +6 -0
- monopyly/static/css/style.css +1328 -270
- monopyly/static/img/icons/statement-pair.png +0 -0
- monopyly/static/img/icons/statement-thick.png +0 -0
- monopyly/static/img/icons/statement.png +0 -0
- monopyly/static/js/bind-tag-actions.js +1 -1
- monopyly/static/js/create-balance-chart.js +1 -1
- monopyly/static/js/create-category-chart.js +27 -0
- monopyly/static/js/define-filter.js +1 -1
- monopyly/static/js/expand-transaction.js +10 -0
- monopyly/static/js/highlight-discrepant-transactions.js +124 -0
- monopyly/static/js/modules/expand-transaction.js +12 -3
- monopyly/static/js/modules/form-suggestions.js +60 -0
- monopyly/static/js/modules/manage-overlays.js +1 -3
- monopyly/static/js/show-credit-activity-loader.js +29 -0
- monopyly/static/js/toggle-navigation.js +35 -0
- monopyly/static/js/update-card-status.js +1 -1
- monopyly/static/js/use-suggested-amount.js +11 -0
- monopyly/static/js/use-suggested-merchant.js +11 -0
- monopyly/templates/auth/change_password.html +21 -0
- monopyly/templates/auth/login.html +3 -1
- monopyly/templates/auth/register.html +17 -7
- monopyly/templates/banking/account_page.html +3 -1
- monopyly/templates/banking/account_summaries.html +1 -1
- monopyly/templates/banking/accounts_page.html +11 -15
- monopyly/templates/banking/transactions_table/expanded_row_content.html +18 -20
- monopyly/templates/common/transaction_form/subtransaction_subform.html +10 -1
- monopyly/templates/common/transactions_table/linked_bank_transaction.html +1 -1
- monopyly/templates/common/transactions_table/linked_credit_transaction.html +1 -1
- monopyly/templates/common/transactions_table/transaction_condensed.html +2 -2
- monopyly/templates/common/transactions_table/transaction_expanded.html +3 -3
- monopyly/templates/common/transactions_table/transactions.html +1 -1
- monopyly/templates/core/credits.html +10 -8
- monopyly/templates/core/index.html +10 -0
- monopyly/templates/core/profile.html +3 -3
- monopyly/templates/credit/statement_page.html +33 -0
- monopyly/templates/credit/statement_reconciliation/discrepant_records.html +25 -0
- monopyly/templates/credit/statement_reconciliation/statement_reconciliation_inquiry.html +23 -0
- monopyly/templates/credit/statement_reconciliation/statement_reconciliation_page.html +86 -0
- monopyly/templates/credit/statement_reconciliation/summary.html +45 -0
- monopyly/templates/credit/statement_reconciliation/unrecorded_activities.html +24 -0
- monopyly/templates/credit/statement_summary.html +2 -2
- monopyly/templates/credit/statements.html +1 -1
- monopyly/templates/credit/transaction_form/transaction_form.html +9 -1
- monopyly/templates/credit/transaction_form/transaction_form_page.html +2 -0
- monopyly/templates/credit/transaction_form/transaction_form_page_update.html +9 -0
- monopyly/templates/credit/transaction_submission_page.html +64 -63
- monopyly/templates/credit/transactions_table/expanded_row_content.html +18 -12
- monopyly/templates/layout.html +37 -29
- {monopyly-1.4.8.dist-info → monopyly-1.5.1.dist-info}/METADATA +8 -7
- {monopyly-1.4.8.dist-info → monopyly-1.5.1.dist-info}/RECORD +75 -58
- {monopyly-1.4.8.dist-info → monopyly-1.5.1.dist-info}/WHEEL +1 -1
- monopyly/static/img/icons/statement-pair.svg +0 -281
- monopyly/static/img/icons/statement.svg +0 -294
- {monopyly-1.4.8.dist-info → monopyly-1.5.1.dist-info}/entry_points.txt +0 -0
- {monopyly-1.4.8.dist-info → monopyly-1.5.1.dist-info}/licenses/COPYING +0 -0
- {monopyly-1.4.8.dist-info → monopyly-1.5.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<div class="expanded">
|
|
2
|
-
<div class="row">
|
|
2
|
+
<div class="row-content">
|
|
3
3
|
|
|
4
|
-
<div class="
|
|
4
|
+
<div class="transaction-info">
|
|
5
5
|
{% include expanded_row_content_template %}
|
|
6
6
|
</div>
|
|
7
7
|
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
{% if 'statement_id' in transaction.__dict__.keys() %}
|
|
13
13
|
<a class="button" href="{{ url_for('credit.load_statement_details', statement_id=transaction.statement_id) }}">
|
|
14
|
-
<img class="icon" src="{{ url_for('static', filename='img/icons/statement.png') }}" />
|
|
14
|
+
<img class="icon" src="{{ url_for('static', filename='img/icons/statement-thick.png') }}" />
|
|
15
15
|
</a>
|
|
16
16
|
{% endif %}
|
|
17
17
|
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
{% set future = ' future' %}
|
|
9
9
|
{% endif %}
|
|
10
10
|
|
|
11
|
-
<div id="transaction-{{ transaction.id }}" class="transaction{{ future }}" data-transaction-id="{{ transaction.id }}">
|
|
11
|
+
<div id="transaction-{{ transaction.id }}" class="transaction{{ future }} row" data-transaction-id="{{ transaction.id }}">
|
|
12
12
|
{% include 'common/transactions_table/transaction_condensed.html' %}
|
|
13
13
|
{% include 'common/transactions_table/transaction_expanded.html' %}
|
|
14
14
|
</div>
|
|
@@ -10,22 +10,24 @@
|
|
|
10
10
|
|
|
11
11
|
{% block content %}
|
|
12
12
|
|
|
13
|
-
<div
|
|
13
|
+
<div id="credits" class="about">
|
|
14
14
|
|
|
15
15
|
<h3>Image Credits</h3>
|
|
16
|
+
<p>
|
|
17
|
+
The mobile navigation menu toggle button was adapted from <a href="https://www.sliderrevolution.com/resources/css-hamburger-menu/">"Flippin' burgers"</a> by Mikael Ainalem.
|
|
18
|
+
</p>
|
|
16
19
|
<p>
|
|
17
20
|
The chain link icon was adapted from <a href="https://commons.wikimedia.org/wiki/File:Chain_link_icon.png">Wikipedia Commons</a>.
|
|
18
21
|
The original image was created by user Mdowdell and published under the <a href="https://creativecommons.org/licenses/by-sa/3.0/legalcode">CC BY-SA 3.0 License</a>.
|
|
19
22
|
</p>
|
|
20
23
|
|
|
21
|
-
</div>
|
|
22
|
-
|
|
23
|
-
<div class="affiliation-disclaimer">
|
|
24
24
|
|
|
25
|
-
<
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
25
|
+
<div class="affiliation-disclaimer">
|
|
26
|
+
<h3>Disclaimer</h3>
|
|
27
|
+
<p>
|
|
28
|
+
At risk of stating the obvious, given that this is a <b>homemade personal finance manager</b>, the <i>Monopyly</i> app is in no way affiliated, associated, authorized, endorsed by, or in any way officially connected with Hasbro, the present publisher and trademark holder of the board game MONOPOLY.
|
|
29
|
+
</p>
|
|
30
|
+
</div>
|
|
29
31
|
|
|
30
32
|
</div>
|
|
31
33
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{% extends "layout.html" %}
|
|
2
2
|
|
|
3
3
|
{% block content %}
|
|
4
|
+
|
|
4
5
|
{% if session["show_homepage_block"] %}
|
|
5
6
|
<div id="homepage-block">
|
|
6
7
|
<div class="buttons">
|
|
@@ -147,7 +148,16 @@
|
|
|
147
148
|
</div>
|
|
148
149
|
|
|
149
150
|
</div>
|
|
151
|
+
{% else %}
|
|
152
|
+
<div id="homepage-suggestion">
|
|
153
|
+
<p class="login">
|
|
154
|
+
<a href="{{ url_for('auth.login') }}">Login</a> to get started.
|
|
155
|
+
</p>
|
|
156
|
+
<p class="register">
|
|
157
|
+
Not yet registered? <a href="{{ url_for('auth.register') }}">Create an account</a> to begin using the app.
|
|
158
|
+
</p>
|
|
150
159
|
{% endif %}
|
|
160
|
+
|
|
151
161
|
{% endblock %}
|
|
152
162
|
|
|
153
163
|
{% block javascript %}
|
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
<div class=user-settings">
|
|
26
26
|
|
|
27
27
|
<div class="password">
|
|
28
|
-
<a style="color: gray;" href="{{ url_for('
|
|
29
|
-
Change password
|
|
28
|
+
<a style="color: gray;" href="{{ url_for('auth.change_password') }}">
|
|
29
|
+
Change password
|
|
30
30
|
</a>
|
|
31
31
|
</div>
|
|
32
32
|
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
<div class="bank-list box-table">
|
|
42
42
|
{% for bank in banks %}
|
|
43
43
|
|
|
44
|
-
<div class="bank-block box-row update-db-widget" data-bank-id="{{ bank.id }}">
|
|
44
|
+
<div class="bank-block box-row action update-db-widget" data-bank-id="{{ bank.id }}">
|
|
45
45
|
|
|
46
46
|
<div class="widget-text">
|
|
47
47
|
<div class="bank widget-display">{{ bank.bank_name }}</div>
|
|
@@ -28,8 +28,13 @@
|
|
|
28
28
|
{% endwith %}
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
|
+
<div id="category-chart-container">
|
|
32
|
+
<div id="category-chart" class="ct-chart ct-octave"></div>
|
|
33
|
+
</div>
|
|
34
|
+
|
|
31
35
|
</div>
|
|
32
36
|
|
|
37
|
+
|
|
33
38
|
</div>
|
|
34
39
|
|
|
35
40
|
{% endblock %}
|
|
@@ -44,6 +49,11 @@
|
|
|
44
49
|
<img class="icon" src="{{ url_for('static', filename='img/icons/plus.png') }}" />
|
|
45
50
|
</a>
|
|
46
51
|
</div>
|
|
52
|
+
<div class="button">
|
|
53
|
+
<div class="action">
|
|
54
|
+
<img id="reconciliation-button" class="icon" src="{{ url_for('static', filename='img/icons/statement-pair.png') }}" />
|
|
55
|
+
</div>
|
|
56
|
+
</div>
|
|
47
57
|
|
|
48
58
|
</div>
|
|
49
59
|
|
|
@@ -53,11 +63,32 @@
|
|
|
53
63
|
{% block javascript %}
|
|
54
64
|
|
|
55
65
|
<script>
|
|
66
|
+
const CREDIT_ACTIVITY_RECONCILIATION_ENDPOINT = "{{ url_for('credit.reconcile_activity', statement_id=statement.id) }}";
|
|
56
67
|
const UPDATE_STATEMENT_DUE_DATE_ENDPOINT = "{{ url_for('credit.update_statement_due_date', statement_id=statement.id) }}";
|
|
57
68
|
const MAKE_PAYMENT_ENDPOINT = "{{ url_for('credit.pay_credit_card', card_id=statement.card_id, statement_id=statement.id) }}";
|
|
58
69
|
const EXPAND_TRANSACTION_ENDPOINT = "{{ url_for('credit.expand_transaction') }}";
|
|
59
70
|
const LINKED_TRANSACTION_ENDPOINT = "{{ url_for('credit.show_linked_transaction') }}";
|
|
60
71
|
</script>
|
|
72
|
+
<script>
|
|
73
|
+
const CATEGORY_CHART_DATA = {
|
|
74
|
+
labels: [
|
|
75
|
+
{% for label in chart_data['labels'] %}
|
|
76
|
+
{% if label == '' %}
|
|
77
|
+
"Other",
|
|
78
|
+
{% else %}
|
|
79
|
+
"{{ label }}",
|
|
80
|
+
{% endif %}
|
|
81
|
+
{% endfor %}
|
|
82
|
+
],
|
|
83
|
+
series: [
|
|
84
|
+
{% for subtotal in chart_data['subtotals'] %}
|
|
85
|
+
{{ subtotal }},
|
|
86
|
+
{% endfor %}
|
|
87
|
+
],
|
|
88
|
+
};
|
|
89
|
+
</script>
|
|
90
|
+
<script type="module" src="{{ url_for('static', filename='js/show-credit-activity-loader.js') }}">
|
|
91
|
+
</script>
|
|
61
92
|
<script type="module" src="{{ url_for('static', filename='js/update-statement-parameters.js') }}">
|
|
62
93
|
</script>
|
|
63
94
|
<script type="module" src="{{ url_for('static', filename='js/make-payment.js') }}">
|
|
@@ -66,6 +97,8 @@
|
|
|
66
97
|
</script>
|
|
67
98
|
<script type="module" src="{{ url_for('static', filename='js/show-linked-transaction.js') }}">
|
|
68
99
|
</script>
|
|
100
|
+
<script type="module" src="{{ url_for('static', filename='js/create-category-chart.js') }}">
|
|
101
|
+
</script>
|
|
69
102
|
|
|
70
103
|
{% endblock %}
|
|
71
104
|
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<div class="discrepant-activities transactions-table">
|
|
2
|
+
|
|
3
|
+
{% for transaction, activity in discrepant_records.items() %}
|
|
4
|
+
|
|
5
|
+
<div class="reconciliation-activity discrepant-activity" data-transaction-id="{{ transaction.id }}">
|
|
6
|
+
|
|
7
|
+
<div class="activity-info">
|
|
8
|
+
<div class="date">{{ activity.transaction_date }}</div>
|
|
9
|
+
<div class="text">{{ activity.description }}</div>
|
|
10
|
+
<div class="amount">
|
|
11
|
+
<span class="dollar-sign">$</span>
|
|
12
|
+
{{ activity.total|currency }}
|
|
13
|
+
</div>
|
|
14
|
+
</div>
|
|
15
|
+
|
|
16
|
+
<a class="button" href="{{ url_for('credit.update_transaction', transaction_id=transaction.id, transaction_date=activity.transaction_date, total=activity.total) }}">
|
|
17
|
+
<img class="icon" src="{{ url_for('static', filename='img/icons/edit.png') }}" />
|
|
18
|
+
</a>
|
|
19
|
+
|
|
20
|
+
</div>
|
|
21
|
+
|
|
22
|
+
{% endfor %}
|
|
23
|
+
|
|
24
|
+
</div>
|
|
25
|
+
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<div class="overlay">
|
|
2
|
+
<div id="statement-reconciliation" class="modal">
|
|
3
|
+
|
|
4
|
+
<div class="modal-box">
|
|
5
|
+
|
|
6
|
+
<div class="buttons">
|
|
7
|
+
<img class="close button" src="/static/img/icons/x-thick.png">
|
|
8
|
+
</div>
|
|
9
|
+
|
|
10
|
+
<p class="instructions">
|
|
11
|
+
Load a CSV file containing credit activity for comparison against this statement. The CSV file must be located in the <code>Downloads</code> directory on the machine running the Monopyly app.
|
|
12
|
+
</p>
|
|
13
|
+
|
|
14
|
+
<form action="{{ url_for('credit.load_statement_reconciliation_details', statement_id=statement_id) }}" method="post" enctype="multipart/form-data">
|
|
15
|
+
<label for="activity-file-upload">Activity Filename</label>
|
|
16
|
+
<input id="activity-file-upload" type="file" name="activity-file" accept="text/csv" />
|
|
17
|
+
<input class="button" type="submit" value="Reconcile Activity" />
|
|
18
|
+
</form>
|
|
19
|
+
|
|
20
|
+
</div>
|
|
21
|
+
|
|
22
|
+
</div>
|
|
23
|
+
</div>
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
{% extends 'layout.html' %}
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
{% block header %}
|
|
5
|
+
|
|
6
|
+
<h1>
|
|
7
|
+
{% block title %}
|
|
8
|
+
Statement Reconciliation
|
|
9
|
+
{% endblock %}
|
|
10
|
+
</h1>
|
|
11
|
+
|
|
12
|
+
{% endblock %}
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
{% block content %}
|
|
16
|
+
{% set highlighted_transactions = statement_transactions|selectattr("highlight")|first %}
|
|
17
|
+
|
|
18
|
+
<div id="credit-statement-reconciliation-details" class="details">
|
|
19
|
+
|
|
20
|
+
<div id="credit-statement-reconciliation-info" class="primary-info">
|
|
21
|
+
|
|
22
|
+
<div id="statement-reconciliation-summary-container" class="summary-container">
|
|
23
|
+
{% include 'credit/statement_reconciliation/summary.html' %}
|
|
24
|
+
</div>
|
|
25
|
+
|
|
26
|
+
<div id="statement-transactions-container" class="transactions-container">
|
|
27
|
+
{% if highlighted_transactions %}
|
|
28
|
+
<p class="note">
|
|
29
|
+
<span class="highlight">Highlighted</span> transactions indicate that the transaction was not identified in the reported activity file.
|
|
30
|
+
</p>
|
|
31
|
+
{% endif %}
|
|
32
|
+
|
|
33
|
+
{% with transactions = statement_transactions, full_view = False %}
|
|
34
|
+
{% include 'credit/transactions_table/transactions.html' %}
|
|
35
|
+
{% endwith %}
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
</div>
|
|
39
|
+
|
|
40
|
+
</div>
|
|
41
|
+
|
|
42
|
+
{% endblock %}
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
{% block right_sidebar %}
|
|
46
|
+
|
|
47
|
+
<div class="sidebar-menu">
|
|
48
|
+
|
|
49
|
+
<div class="button">
|
|
50
|
+
<a class="action" href="{{ url_for('credit.add_transaction', card_id=statement.card_id, statement_id=statement.id) }}">
|
|
51
|
+
<img class="icon" src="{{ url_for('static', filename='img/icons/plus.png') }}" />
|
|
52
|
+
</a>
|
|
53
|
+
</div>
|
|
54
|
+
<div class="button">
|
|
55
|
+
<a class="action" href="{{ url_for('credit.load_statement_details', statement_id=statement.id) }}">
|
|
56
|
+
<img class="icon" src="{{ url_for('static', filename='img/icons/statement.png') }}" />
|
|
57
|
+
</a>
|
|
58
|
+
</div>
|
|
59
|
+
<div class="button">
|
|
60
|
+
<div class="action">
|
|
61
|
+
<img id="reconciliation-button" class="icon" src="{{ url_for('static', filename='img/icons/statement-pair.png') }}" />
|
|
62
|
+
</div>
|
|
63
|
+
</div>
|
|
64
|
+
|
|
65
|
+
</div>
|
|
66
|
+
|
|
67
|
+
{% 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 %}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
<div id="statement-reconciliation-summary" class="summary-box">
|
|
2
|
+
|
|
3
|
+
{% if not (highlighted_transactions or discrepant_records or unrecorded_activities) %}
|
|
4
|
+
|
|
5
|
+
<img class="reconciliation-indicator" src="{{ url_for('static', filename='img/icons/checkmark.png') }}" />
|
|
6
|
+
|
|
7
|
+
{% else %}
|
|
8
|
+
|
|
9
|
+
{% if highlighted_transactions or discrepant_records or unrecorded_activities %}
|
|
10
|
+
<div id="statement-discrepancies-container">
|
|
11
|
+
<h2>Discrepancies</h3>
|
|
12
|
+
|
|
13
|
+
<div class="balance">
|
|
14
|
+
<div class="dollar-sign">$</div>
|
|
15
|
+
<div>{{ discrepant_amount|currency }}</div>
|
|
16
|
+
</div>
|
|
17
|
+
|
|
18
|
+
{% if discrepant_records %}
|
|
19
|
+
<div class="discrepancy-category">
|
|
20
|
+
<h3>Discrepant Records</h3>
|
|
21
|
+
<p class="note">
|
|
22
|
+
{% set plural = discrepant_records|length != 1 %}
|
|
23
|
+
The following {% if plural %}activities were{% else %}activity was{% endif %} reported in the credit activity file and matched in the database, but the charge amount{%if plural %}s do{% else %} does{% endif %} not match:
|
|
24
|
+
</p>
|
|
25
|
+
{% include 'credit/statement_reconciliation/discrepant_records.html' %}
|
|
26
|
+
</div>
|
|
27
|
+
{% endif %}
|
|
28
|
+
|
|
29
|
+
{% if unrecorded_activities %}
|
|
30
|
+
<div class="discrepancy-category">
|
|
31
|
+
<h3>Unrecorded Activity</h3>
|
|
32
|
+
<p class="note">
|
|
33
|
+
{% set plural = unrecorded_activities|length != 1 %}
|
|
34
|
+
The following {% if plural %}activities were{% else %}activity was{% endif %} reported in the credit activity file, but {% if plural %}do{% else %}does{% endif %} not exist in the Monopyly database:
|
|
35
|
+
</p>
|
|
36
|
+
{% include 'credit/statement_reconciliation/unrecorded_activities.html' %}
|
|
37
|
+
</div>
|
|
38
|
+
{% endif %}
|
|
39
|
+
|
|
40
|
+
</div>
|
|
41
|
+
{% endif %}
|
|
42
|
+
|
|
43
|
+
{% endif %}
|
|
44
|
+
|
|
45
|
+
</div>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<div class="unrecorded-activities transactions-table">
|
|
2
|
+
|
|
3
|
+
{% for activity in unrecorded_activities %}
|
|
4
|
+
|
|
5
|
+
<div class="reconciliation-activity unrecorded-activity">
|
|
6
|
+
|
|
7
|
+
<div class=" activity-info">
|
|
8
|
+
<div class="date">{{ activity.transaction_date }}</div>
|
|
9
|
+
<div class="text">{{ activity.description }}</div>
|
|
10
|
+
<div class="amount">
|
|
11
|
+
<span class="dollar-sign">$</span>
|
|
12
|
+
{{ activity.total|currency }}
|
|
13
|
+
</div>
|
|
14
|
+
</div>
|
|
15
|
+
|
|
16
|
+
<a class="button" href="{{ url_for('credit.add_transaction', card_id=statement.card.id, statement_id=statement.id, transaction_date=activity.transaction_date, total=activity.total, description=activity.description) }}">
|
|
17
|
+
<img class="icon" src="{{ url_for('static', filename='img/icons/plus-thick.png') }}" />
|
|
18
|
+
</a>
|
|
19
|
+
|
|
20
|
+
</div>
|
|
21
|
+
|
|
22
|
+
{% endfor %}
|
|
23
|
+
|
|
24
|
+
</div>
|
|
@@ -52,8 +52,8 @@
|
|
|
52
52
|
|
|
53
53
|
<div class="form-line">
|
|
54
54
|
<div class="dollar-sign">$</div>
|
|
55
|
-
<input id="pay-amount" type="
|
|
56
|
-
<input id="pay-date" type="
|
|
55
|
+
<input id="pay-amount" type="number" name="pay_amount" value="{{ statement.balance }}" />
|
|
56
|
+
<input id="pay-date" type="date" name="pay_date" value="{{ date_today }}" />
|
|
57
57
|
</div>
|
|
58
58
|
|
|
59
59
|
<div class="form-line">
|
|
@@ -23,9 +23,17 @@
|
|
|
23
23
|
{{ form.transaction_date }}
|
|
24
24
|
</div>
|
|
25
25
|
|
|
26
|
-
<div class="form-field merchant-field autocomplete">
|
|
26
|
+
<div class="form-field merchant-field autocomplete suggestable">
|
|
27
27
|
{{ form.merchant.label }}
|
|
28
28
|
{{ form.merchant }}
|
|
29
|
+
|
|
30
|
+
{% if form.suggestions.get('merchant') %}
|
|
31
|
+
<div class="form-suggestion merchant-suggestion">
|
|
32
|
+
<span>Suggested: </span>
|
|
33
|
+
<span class="suggested-value merchant">{{ form.suggestions['merchant'] }}</span>
|
|
34
|
+
</div>
|
|
35
|
+
{% endif %}
|
|
36
|
+
|
|
29
37
|
</div>
|
|
30
38
|
|
|
31
39
|
</div>
|
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
</script>
|
|
14
14
|
<script type="module" src="{{ url_for('static', filename='js/infer-statement.js') }}">
|
|
15
15
|
</script>
|
|
16
|
+
<script type="module" src="{{ url_for('static', filename='js/use-suggested-merchant.js') }}">
|
|
17
|
+
</script>
|
|
16
18
|
{{ super() }}
|
|
17
19
|
|
|
18
20
|
{% endblock %}
|
|
@@ -12,75 +12,76 @@
|
|
|
12
12
|
|
|
13
13
|
{% block content %}
|
|
14
14
|
|
|
15
|
-
<div id="
|
|
15
|
+
<div id="submission">
|
|
16
16
|
|
|
17
|
-
<p id="
|
|
17
|
+
<p id="submission-title">
|
|
18
18
|
The transaction was saved successfully.
|
|
19
19
|
</p>
|
|
20
|
-
<br>
|
|
21
20
|
|
|
22
|
-
<
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
<p>
|
|
59
|
-
<b>Statement Date: </b>
|
|
60
|
-
{{ transaction.statement.issue_date }}
|
|
61
|
-
</p>
|
|
21
|
+
<div id="receipt">
|
|
22
|
+
|
|
23
|
+
<div id="receipt-header">
|
|
24
|
+
<h2 id="receipt-title">Transaction Submission</h2>
|
|
25
|
+
<h3 id="receipt-merchant" class="receipt-item">{{ transaction.merchant }}</h3>
|
|
26
|
+
<h4 id="receipt-date" class="receipt-item">{{ transaction.transaction_date }}</h4>
|
|
27
|
+
</div>
|
|
28
|
+
|
|
29
|
+
{% for subtransaction in subtransactions %}
|
|
30
|
+
<div class="receipt-subtransaction">
|
|
31
|
+
<div class="note">{{ subtransaction['note'] }}</div>
|
|
32
|
+
<div class="amount">${{ subtransaction['subtotal']|currency }}</div>
|
|
33
|
+
</div>
|
|
34
|
+
{% endfor %}
|
|
35
|
+
|
|
36
|
+
{% if subtransactions|length > 1 %}
|
|
37
|
+
<div id="receipt-total" class="receipt-item">
|
|
38
|
+
<div class="total receipt-key">Total:</div>
|
|
39
|
+
<div class="amount">${{ transaction.total|currency }}</div>
|
|
40
|
+
</div>
|
|
41
|
+
{% endif %}
|
|
42
|
+
|
|
43
|
+
<div id="receipt-card">
|
|
44
|
+
<div class="receipt-item">
|
|
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>
|
|
47
|
+
</div>
|
|
48
|
+
<div class="receipt-item">
|
|
49
|
+
<div class="receipt-key">Statement Date:</div>
|
|
50
|
+
<div class="receipt-value">{{ transaction.statement.issue_date }}</div>
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
</div>
|
|
62
56
|
|
|
63
57
|
{% if g.user %}
|
|
64
|
-
<
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
58
|
+
<div id="submission-actions">
|
|
59
|
+
<a class="submission button" href="{{ url_for('credit.update_transaction', transaction_id=transaction.id) }}">
|
|
60
|
+
Update this transaction
|
|
61
|
+
</a>
|
|
62
|
+
<a class="submission button" href="{{ url_for('credit.add_transaction') }}">
|
|
63
|
+
Create a new transaction
|
|
64
|
+
</a>
|
|
65
|
+
<a class="submission button" href="{{ url_for('credit.add_transaction', card_id=transaction.statement.card_id, statement_id=transaction.statement_id) }}">
|
|
66
|
+
Create a new transaction on this statement
|
|
67
|
+
</a>
|
|
68
|
+
<a class="submission button" href="{{ url_for('credit.load_statement_details', statement_id=transaction.statement_id) }}">
|
|
69
|
+
See the statement for this transaction
|
|
70
|
+
</a>
|
|
71
|
+
<a class="submission button" href="{{ url_for('credit.load_statements') }}">
|
|
72
|
+
See statement history
|
|
73
|
+
</a>
|
|
74
|
+
<a class="submission button" href="{{ url_for('credit.load_transactions') }}">
|
|
75
|
+
See transaction history
|
|
76
|
+
</a>
|
|
77
|
+
{% with reconciliation_info = session.get('reconciliation_info', None) %}
|
|
78
|
+
{% if reconciliation_info %}
|
|
79
|
+
<a class="submission button" href="{{ url_for('credit.load_statement_reconciliation_details', statement_id=reconciliation_info[0]) }}">
|
|
80
|
+
Return to the in-progress statement reconciliation
|
|
81
|
+
</a>
|
|
82
|
+
{% endif %}
|
|
83
|
+
{% endwith %}
|
|
84
|
+
</div>
|
|
84
85
|
{% endif %}
|
|
85
86
|
|
|
86
87
|
</div>
|
|
@@ -1,21 +1,25 @@
|
|
|
1
|
-
<div class="setting">
|
|
1
|
+
<div class="setting column">
|
|
2
2
|
|
|
3
3
|
<div class="date column">
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
4
|
+
|
|
5
|
+
<div class="stacked-date">
|
|
6
|
+
<div class="month">
|
|
7
|
+
{{ transaction.transaction_date.strftime('%b')|upper }}
|
|
8
|
+
</div>
|
|
9
|
+
<div class="day">
|
|
10
|
+
{{ transaction.transaction_date.strftime('%d')|upper }}
|
|
11
|
+
</div>
|
|
12
|
+
<div class="year">
|
|
13
|
+
{{ transaction.transaction_date.year }}
|
|
14
|
+
</div>
|
|
12
15
|
</div>
|
|
13
|
-
<div class="full">
|
|
16
|
+
<div class="full-date">
|
|
14
17
|
{{ transaction.transaction_date }}
|
|
15
18
|
</div>
|
|
19
|
+
|
|
16
20
|
</div>
|
|
17
21
|
|
|
18
|
-
<div class="description">
|
|
22
|
+
<div class="description column">
|
|
19
23
|
|
|
20
24
|
<div class="description-header">
|
|
21
25
|
<div class="merchant">
|
|
@@ -31,9 +35,11 @@
|
|
|
31
35
|
</div>
|
|
32
36
|
|
|
33
37
|
</div>
|
|
38
|
+
|
|
34
39
|
</div>
|
|
35
40
|
|
|
36
|
-
|
|
41
|
+
|
|
42
|
+
<div class="payment column">
|
|
37
43
|
|
|
38
44
|
{% if full_view %}
|
|
39
45
|
<div class="statement">
|