from flask import Blueprint, render_template, redirect, url_for, request
|
|
from app import db
|
|
from app.models import Account, Transaction
|
|
from app.forms import AccountForm, TransactionForm
|
|
from flask_table import Table, Col
|
|
|
|
bp = Blueprint('main', __name__)
|
|
|
|
@bp.route('/')
|
|
def index():
|
|
accounts = Account.query.all()
|
|
return render_template('index.html', accounts=accounts)
|
|
|
|
@bp.route('/add_account', methods=['GET', 'POST'])
|
|
def add_account():
|
|
form = AccountForm()
|
|
if form.validate_on_submit():
|
|
print("Nombre: "+form.name.data)
|
|
account = Account(name=form.name.data, account_type=form.account_type.data, balance=form.balance.data)
|
|
db.session.add(account)
|
|
db.session.commit()
|
|
return redirect(url_for('main.index'))
|
|
return render_template('add_account.html', form=form)
|
|
|
|
@bp.route('/add_transaction', methods=['GET', 'POST'])
|
|
def add_transaction():
|
|
form = TransactionForm()
|
|
if form.validate_on_submit():
|
|
transaction = Transaction(
|
|
amount=form.amount.data,
|
|
type=form.type.data,
|
|
source_account_id=form.source_account.data,
|
|
destination_account_id=form.destination_account.data,
|
|
concept=form.concept.data
|
|
)
|
|
|
|
source_account = Account.query.get(form.source_account.data)
|
|
destination_account = Account.query.get(form.destination_account.data)
|
|
|
|
source_account.balance -= transaction.amount
|
|
destination_account.balance += transaction.amount
|
|
|
|
db.session.add(transaction)
|
|
db.session.commit()
|
|
|
|
return redirect(url_for('main.index'))
|
|
return render_template('add_transaction.html', form=form)
|
|
|
|
@bp.route('/accounts', methods=['GET'])
|
|
def accounts():
|
|
search = request.args.get('search')
|
|
sort_by = request.args.get('sort_by', 'name')
|
|
sort_order = request.args.get('sort_order', 'asc')
|
|
|
|
query = Account.query
|
|
if search:
|
|
query = query.filter(Account.name.like(f'%{search}%'))
|
|
|
|
if sort_order == 'asc':
|
|
query = query.order_by(sort_by)
|
|
else:
|
|
query = query.order_by(db.desc(sort_by))
|
|
|
|
accounts = query.all()
|
|
table = AccountsTable(accounts)
|
|
return render_template('accounts_list.html', table=table, search=search, sort_by=sort_by, sort_order=sort_order)
|
|
|
|
class AccountsTable(Table):
|
|
date = Col('Name')
|
|
amount = Col('Account Type')
|
|
type = Col('Amount')
|
|
|
|
def sort_url(self, col_id, reverse=False):
|
|
if reverse:
|
|
return url_for('main.accounts', sort_by=col_id, sort_order='desc')
|
|
else:
|
|
return url_for('main.accounts', sort_by=col_id, sort_order='asc')
|
|
|
|
@bp.route('/transactions', methods=['GET'])
|
|
def transactions():
|
|
search = request.args.get('search')
|
|
sort_by = request.args.get('sort_by', 'date')
|
|
sort_order = request.args.get('sort_order', 'asc')
|
|
|
|
query = Transaction.query
|
|
if search:
|
|
query = query.filter(Transaction.concept.like(f'%{search}%'))
|
|
|
|
if sort_order == 'asc':
|
|
query = query.order_by(sort_by)
|
|
else:
|
|
query = query.order_by(db.desc(sort_by))
|
|
|
|
transactions = query.all()
|
|
table = TransactionTable(transactions)
|
|
return render_template('transaction_list.html', table=table, search=search, sort_by=sort_by, sort_order=sort_order)
|
|
|
|
class TransactionTable(Table):
|
|
date = Col('Date')
|
|
amount = Col('Amount')
|
|
type = Col('Type')
|
|
source_account = Col('Source Account')
|
|
destination_account = Col('Destination Account')
|
|
concept = Col('Concept')
|
|
|
|
def sort_url(self, col_id, reverse=False):
|
|
if reverse:
|
|
return url_for('main.transactions', sort_by=col_id, sort_order='desc')
|
|
else:
|
|
return url_for('main.transactions', sort_by=col_id, sort_order='asc')
|