Skip to content

Commit

Permalink
adding account type, class and imports
Browse files Browse the repository at this point in the history
  • Loading branch information
caseybecking committed Nov 18, 2024
1 parent 18f782b commit cfc7711
Show file tree
Hide file tree
Showing 9 changed files with 159 additions and 14 deletions.
35 changes: 32 additions & 3 deletions api/institution_account/controllers.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,18 @@
from flask import g, request, jsonify, make_response
from flask import g, request, jsonify, make_response, session
from flask_restx import Resource, fields
from api.institution_account.models import InstitutionAccountModel
from api.transaction.models import TransactionModel

institution_account_model = g.api.model('InstitutionAccount', {
'institution_id': fields.String(required=True, description='Institution ID'),
'user_id': fields.String(required=True, description='User ID'),
'name': fields.String(required=True, description='Account Name'),
'number': fields.String(required=True, description='Account Number'),
'status': fields.String(enum=['active', 'inactive'], required=True, description='Account Status'),
'balance': fields.Float(required=True, description='Account Balance')
'balance': fields.Float(required=True, description='Account Balance'),
'starting_balance': fields.Float(required=False, description='Starting Balance'),
'account_type': fields.String(enum=['checking', 'savings', 'credit', 'loan', 'investment', 'other'], required=True, description='Account Type'),
'account_class': fields.String(enum=['asset', 'liability'], required=True, description='Account Class')
})

@g.api.route('/institution/account')
Expand All @@ -22,14 +26,20 @@ def post(self):
number = data.get('number')
status = data.get('status')
balance = data.get('balance')
starting_balance = data.get('starting_balance')
account_type = data.get('account_type')
account_class = data.get('account_class')

new_account = InstitutionAccountModel(
institution_id=institution_id,
user_id=user_id,
name=name,
number=number,
status=status,
balance=balance
balance=balance,
starting_balance=starting_balance,
account_type=account_type,
account_class=account_class
)
new_account.save()

Expand All @@ -39,3 +49,22 @@ def get(self):
accounts = InstitutionAccountModel.query.all()
_accounts = [account.to_dict() for account in accounts]
return make_response(jsonify({'accounts': _accounts}), 200)

@g.api.route('/institution/account/update_balance')
class InstitutionAccountUpdateBalance(Resource):
def get(self):
__accounts = []
user_id = session.get('_user_id')
accounts = InstitutionAccountModel.query.all()
for account in accounts:
# get the current account balance
starting_balance = account.starting_balance
# get all the transactions for that account
transactions = TransactionModel.query.filter_by(account_id=account.id, user_id=user_id).all()
# sum up all the transactions for the account
total = sum([transaction.amount for transaction in transactions])
# update the account balance
new_account_balance = starting_balance + total
# we need to offset the transactions
print(f'Updating account {account.name} balance from {account.balance} to {new_account_balance}')

19 changes: 14 additions & 5 deletions api/institution_account/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,23 @@ class InstitutionAccountModel(Base):
institution = db.relationship('InstitutionModel', backref='account')
user_id = db.Column('user_id', db.Text, db.ForeignKey('user.id'), nullable=False)
name = db.Column(db.String(255), nullable=False)
number = db.Column(db.String(255), nullable=False)
status = db.Column(db.Enum('active', 'inactive',name='status_enum'), nullable=False)
balance = db.Column(db.Float, nullable=False)
balance = db.Column(db.Float, nullable=True)
starting_balance = db.Column(db.Float, nullable=True)
account_type = db.Column(db.Enum('checking', 'savings', 'credit', 'loan', 'investment', 'other', name='account_type_enum'), nullable=True)
account_class = db.Column(db.Enum('asset','liability', name='account_class_enum'), nullable=True)
number = db.Column(db.String(255), nullable=True)

def __init__(self, institution_id, user_id, name, number, status, balance):
def __init__(self, institution_id, user_id, name, status, balance, starting_balance, account_type, account_class, number):
self.institution_id = institution_id
self.user_id = user_id
self.name = name
self.number = number
self.status = status
self.balance = balance
self.starting_balance = starting_balance
self.account_type = account_type
self.account_class = account_class
self.number = number

def __repr__(self):
return f'<Account {self.name!r}>'
Expand All @@ -29,9 +35,12 @@ def to_dict(self):
'institution': self.institution.to_dict(),
'user_id': self.user_id,
'name': self.name,
'number': self.number,
'status': self.status,
'balance': self.balance,
'starting_balance': self.starting_balance,
'account_type': self.account_type,
'account_class': self.account_class,
'number': self.number,
'created_at': self.created_at,
'updated_at': self.updated_at
}
Expand Down
2 changes: 1 addition & 1 deletion api/transaction/controllers.py
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ def ensure_account_exists(self,account_name, institution_id):
account = InstitutionAccountModel.query.filter_by(name=account_name,user_id=user_id).first()
if not account:
print(f"InstitutionAccountModel '{account_name}' does not exist. Creating...")
account = InstitutionAccountModel(name=account_name, institution_id=institution_id, user_id=user_id, number="Unknown", status='active', balance=0)
account = InstitutionAccountModel(name=account_name, institution_id=institution_id, user_id=user_id, number="Unknown", status='active', balance=0, starting_balance=0,account_type='other',account_class='asset')
db.session.add(account)
db.session.commit()
return account.id
Expand Down
1 change: 1 addition & 0 deletions app/institution_account/controllers.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,4 @@ def institution_account():
_istitutions = requests.get(url_for('institution', _external=True), timeout=15).json().get('institutions', [])

return render_template('institution_account/index.html', accounts=accounts, user_id=user_id, institutions=_istitutions)

2 changes: 2 additions & 0 deletions app/templates/institution_account/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@ <h5 class="modal-title" id="AccountModalgridLabel">Add
</th>
<th scope="col">Institution</th>
<th scope="col">Name</th>
<th scope="col">Account Balance</th>
<th scope="col">Last Updated</th>

<th scope="col" style="width: 150px;">Action</th>
Expand All @@ -150,6 +151,7 @@ <h5 class="modal-title" id="AccountModalgridLabel">Add
</td>
<td>{{ account.institution.name }}</td>
<td>{{ account.name }}</td>
<td>{{ account.balance }}</td>
<td>{{ account.updated_at }}</td>
<td>
<button type="button" class="btn btn-sm btn-light">Details</button>
Expand Down
3 changes: 3 additions & 0 deletions app/templates/partials/sidebar.html
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,9 @@ <h6 class="dropdown-header">Welcome {{current_user.username}}!</h6>
<li class="nav-item">
<a href="/transactions" class="nav-link" data-key="t-basic"> Transactions </a>
</li>
<li class="nav-item">
<a href="/transactions/import" class="nav-link" data-key="t-basic"> Import </a>
</li>
</ul>
</div>
</li>
Expand Down
91 changes: 91 additions & 0 deletions app/templates/transactions/import.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
{% extends "partials/base.html" %}
{% block title %}Import Transactions{% endblock title %}
{% block extra_css %}
<!-- dropzone css -->
<link rel="stylesheet" href="{{url_for('static' ,filename='libs/dropzone/dist/dropzone.css')}}" type="text/css" />
<!-- Filepond css -->
<link rel="stylesheet" href="{{url_for('static' ,filename='libs/filepond/dist/filepond.min.css')}}" type="text/css" />
<link rel="stylesheet" href="{{url_for('static' ,filename='libs/filepond-plugin-image-preview/dist/filepond-plugin-image-preview.min.css')}}">
{% endblock extra_css %}
{% block content %}
<div class="main-content">

<div class="page-content">
<div class="container-fluid">

<div class="row">
<div class="col-lg-12">
<div class="card">
<div class="card-header">
<h4 class="card-title mb-0">Multiple File Upload</h4>
</div><!-- end card header -->

<div class="card-body">
<div class="dropzone">
<div class="fallback">
<input name="file" type="file" multiple="multiple">
</div>
<div class="dz-message needsclick">
<div class="mb-3">
<i class="display-4 text-muted ri-upload-cloud-2-fill"></i>
</div>

<h4>Drop files here or click to upload.</h4>
</div>
</div>
<ul class="list-unstyled mb-0" id="dropzone-preview">
<li class="mt-2" id="dropzone-preview-list">
<!-- This is used as the file preview template -->
<div class="border rounded">
<div class="d-flex p-2">
<div class="flex-shrink-0 me-3">
<div class="avatar-sm bg-light rounded">
<img data-dz-thumbnail class="img-fluid rounded d-block" src="{{url_for('static' ,filename='images/new-document.png')}}" alt="Dropzone-Image" />
</div>
</div>
<div class="flex-grow-1">
<div class="pt-1">
<h5 class="fs-14 mb-1" data-dz-name>&nbsp;</h5>
<p class="fs-13 text-muted mb-0" data-dz-size></p>
<strong class="error text-danger" data-dz-errormessage></strong>
</div>
</div>
<div class="flex-shrink-0 ms-3">
<button data-dz-remove class="btn btn-sm btn-danger">Delete</button>
</div>
</div>
</div>
</li>
</ul>
<button id="upload-button" class="btn btn-primary mt-3">Upload</button>
</div>
<!-- end card body -->
</div>
<!-- end card -->
</div> <!-- end col -->
</div>
<!-- end row -->
</div>
<!-- end col -->
</div>
</div>
<!-- container-fluid -->
</div>

{% block footer %}
{% include "partials/footer.html" %}
{% endblock footer %}
</div>
<!-- end main content-->
{% endblock content %}
{% block extra_js %}
<!-- dropzone min -->
<script src="{{url_for('static' ,filename='libs/dropzone/dist/dropzone-min.js')}}"></script>
<!-- filepond js -->
<script src="{{url_for('static' ,filename='libs/filepond/dist/filepond.min.js')}}"></script>
<script src="{{url_for('static' ,filename='libs/filepond-plugin-image-preview/dist/filepond-plugin-image-preview.min.js')}}"></script>
<script src="{{url_for('static' ,filename='libs/filepond-plugin-file-validate-size/dist/filepond-plugin-file-validate-size.min.js')}}"></script>
<script src="{{url_for('static' ,filename='libs/filepond-plugin-image-exif-orientation/dist/filepond-plugin-image-exif-orientation.min.js')}}"></script>
<script src="{{url_for('static' ,filename='libs/filepond-plugin-file-encode/dist/filepond-plugin-file-encode.min.js')}}"></script>
<script src="{{ url_for('static', filename='js/transactions/transactions.js') }}"></script>
{% endblock extra_js %}
5 changes: 0 additions & 5 deletions app/templates/transactions/index.html
Original file line number Diff line number Diff line change
@@ -1,11 +1,6 @@
{% extends "partials/base.html" %}
{% block title %}Transactions{% endblock title %}
{% block extra_css %}
<!-- dropzone css -->
<link rel="stylesheet" href="{{url_for('static' ,filename='libs/dropzone/dist/dropzone.css')}}" type="text/css" />
<!-- Filepond css -->
<link rel="stylesheet" href="{{url_for('static' ,filename='libs/filepond/dist/filepond.min.css')}}" type="text/css" />
<link rel="stylesheet" href="{{url_for('static' ,filename='libs/filepond-plugin-image-preview/dist/filepond-plugin-image-preview.min.css')}}">
{% endblock extra_css %}
{% block content %}
<div class="main-content">
Expand Down
15 changes: 15 additions & 0 deletions app/transactions/controllers.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,18 @@ def transactions():
_transactions = requests.get(api_url, timeout=15).json().get('transactions', [])
user_id = session.get('_user_id')
return render_template('transactions/index.html', transactions=_transactions, user_id=user_id)

@transactions_blueprint.route('/transactions/import')
@login_required
def import_transactions():
"""
Render the import transactions page.
This view function renders the transactions/import.html template with the user ID
from the session.
Returns:
str: Rendered HTML template for the import transactions page.
"""
user_id = session.get('_user_id')
return render_template('transactions/import.html', user_id=user_id)

0 comments on commit cfc7711

Please sign in to comment.