Esempio n. 1
0
def index():
    '''Budget dashboard'''

    current_user_id = session.get('logged_in_user')

    # get uncategorized expenses
    exp = Expenses(current_user_id)
    uncategorized_expenses = exp.get_entries(category_name="Uncategorized")

    # get latest expenses
    exp = Expenses(current_user_id)
    latest_expenses = exp.get_entries(limit=5)

    # get latest income
    inc = Income(current_user_id)
    latest_income = inc.get_entries(limit=5)

    # get accounts
    acc = Accounts(current_user_id)
    accounts = acc.get_accounts_and_loans()

    # split, get totals
    assets, liabilities, loans, assets_total, liabilities_total = [], [], [], 0, 0
    for a in accounts:
        if a[0].type == 'asset':
            assets.append(a)
            assets_total += float(a[0].balance)
        elif a[0].type == 'liability':
            liabilities.append(a)
            liabilities_total += float(a[0].balance)
        elif a[0].type == 'loan':
            # if we owe someone, it is our liability
            if float(a[0].balance) < 0:
                liabilities.append(a)
                liabilities_total += float(a[0].balance)
            else:
                assets.append(a)

    # monthly totals
    t, totals_list, highest_bar = Totals(current_user_id), [], 0.
    # object to dict
    for total in t.get_totals():
        bar = {}
        bar['month'] = total.month
        if (float(total.expenses) > 0): bar['expenses'] = float(total.expenses)
        if (float(total.income) > 0): bar['income'] = float(total.income)
        totals_list.append(bar)

        if (total.expenses > highest_bar): highest_bar = total.expenses
        if (total.income > highest_bar): highest_bar = total.income

    # calculate height for each bar
    for total in totals_list:
        if 'expenses' in total: total['expenses-height'] = (total['expenses'] / highest_bar) * 100
        if 'income' in total: total['income-height'] = (total['income'] / highest_bar) * 100

    return render_template('admin_dashboard.html', **locals())
Esempio n. 2
0
def index(date=None, category=None, page=1, items_per_page=10):
    '''List income entries for the user'''

    model = Income(session.get('logged_in_user'))

    dict = entries.index(**locals())
    for key in dict.keys():
        exec(key + " = dict['" + key + "']")

    return render_template('admin_show_income.html', **locals())
Esempio n. 3
0
def add_income():
    '''Add an income entry'''

    current_user_id = session.get('logged_in_user')

    inc = Income(current_user_id)
    acc = Accounts(current_user_id)

    if request.method == 'POST':

        dict = __validate_income_form()
        for key in dict.keys(): exec(key + " = dict['" + key + "']")

        # 'heavier' checks
        if not error:
            # valid date?
            if is_date(date):
                # valid amount?
                if is_float(amount):
                    # valid category?
                    if inc.is_category(id=category_id):
                        # valid account?
                        if acc.is_account(account_id=account_id):

                            # add new income
                            inc.add_income(account_id=account_id, amount=amount, category_id=category_id, date=date,
                                           description=description)

                            # credit to account
                            acc.modify_account_balance(account_id, amount)

                            flash('Income added')

                        else: error = 'Not a valid account'
                    else: error = 'Not a valid category'
                else: error = 'Not a valid amount'
            else: error = 'Not a valid date'

    # fetch user's categories and accounts
    categories = inc.get_categories()
    accounts = acc.get_accounts()

    return render_template('admin_add_income.html', **locals())
Esempio n. 4
0
def search():
    '''Search income'''

    model = Income(session.get('logged_in_user'))

    # query
    query = request.form['q'] if 'q' in request.form else ""

    # fetch entries
    entries = model.get_entries()

    # filter
    entries = entries.filter(IncomeTable.description.like("%" + query + "%"))

    # categories
    categories = model.get_categories()

    # date ranges for the template
    date_ranges = get_date_ranges()

    return render_template('admin_search_income.html', **locals())
Esempio n. 5
0
def delete_income(income_id):
    '''Delete income entry'''

    current_user_id = session.get('logged_in_user')
    incomes = Income(current_user_id)

    # is it valid?
    income = incomes.get_income(income_id)
    if income:
        # revert
        accounts = Accounts(current_user_id)
        accounts.modify_account_balance(amount=-float(income.amount),
                                        account_id=income.credit_to)

        incomes.delete_income(income_id)

        flash('Income deleted')
    else:
        flash('Not a valid income entry', 'error')

    return redirect(url_for('income.index'))
Esempio n. 6
0
def delete_income(income_id):
    '''Delete income entry'''

    current_user_id = session.get('logged_in_user')
    incomes = Income(current_user_id)

    # is it valid?
    income = incomes.get_income(income_id)
    if income:
        # revert
        accounts = Accounts(current_user_id)
        accounts.modify_account_balance(amount=-float(income.amount), account_id=income.credit_to)

        incomes.delete_income(income_id)

        flash('Income deleted')
    else:
        flash('Not a valid income entry', 'error')


    return redirect(url_for('income.index'))
Esempio n. 7
0
def search():
    '''Search income'''

    model = Income(session.get('logged_in_user'))

    # query
    query = request.form['q'] if 'q' in request.form else ""

    # fetch entries
    entries = model.get_entries()

    # filter
    entries = entries.filter(IncomeTable.description.like("%"+query+"%"))

    # categories
    categories = model.get_categories()

    # date ranges for the template
    date_ranges = get_date_ranges()

    return render_template('admin_search_income.html', **locals())
Esempio n. 8
0
def add_category():
    '''Add an income category'''

    error = None
    if request.method == 'POST':
        new_category_name, current_user_id = request.form['name'], session.get(
            'logged_in_user')

        inc = Income(current_user_id)

        error = entries.add_category(inc, new_category_name)
        if not error: flash('Income category added')

    return render_template('admin_add_income_category.html', error=error)
Esempio n. 9
0
def export(date=None, category=None, page=1, items_per_page=10):
    '''Export income entries on a filter'''

    model = Income(session.get('logged_in_user'))

    dict = entries.index(**locals())
    for key in dict.keys():
        exec(key + " = dict['" + key + "']")

    response = make_response(
        render_template('admin_export_income.html', **locals()))
    response.headers['Content-type'] = 'text/csv'
    response.headers[
        'Content-disposition'] = 'attachment;filename=' + 'income-' + str(
            today_date()) + '.csv'
    return response
Esempio n. 10
0
def edit_income(income_id):
    '''Edit income entry'''

    current_user_id = session.get('logged_in_user')

    inc = Income(current_user_id)

    # is it valid?
    income = inc.get_income(income_id)
    if income:
        # fetch user's categories and accounts
        categories = inc.get_categories()

        acc = Accounts(current_user_id)
        accounts = acc.get_accounts()

        if request.method == 'POST': # POST

            dict = __validate_income_form()
            for key in dict.keys(): exec(key + " = dict['" + key + "']")

            # 'heavier' checks
            if not error:
                # valid date?
                if is_date(date):
                    # valid amount?
                    if is_float(amount):
                        # valid category?
                        if inc.is_category(id=category_id):
                            # valid account?
                            if acc.is_account(account_id=account_id):

                                # debit the original account
                                acc.modify_account_balance(income.credit_to, -float(income.amount))

                                # credit the 'new' account
                                acc.modify_account_balance(account_id, amount)

                                # edit income entry
                                inc.edit_income(account_id=account_id, amount=amount, category_id=category_id,
                                                             date=date, description=description, income_id=income.id)

                                flash('Income edited')

                                return redirect(url_for('income.edit_income', income_id=income_id))

                            else: error = 'Not a valid account'
                        else: error = 'Not a valid category'
                    else: error = 'Not a valid amount'
                else: error = 'Not a valid date'

        return render_template('admin_edit_income.html', **locals())

    else: return redirect(url_for('income.index'))
Esempio n. 11
0
def add_income():
    '''Add an income entry'''

    current_user_id = session.get('logged_in_user')

    inc = Income(current_user_id)
    acc = Accounts(current_user_id)

    if request.method == 'POST':

        dict = __validate_income_form()
        for key in dict.keys():
            exec(key + " = dict['" + key + "']")

        # 'heavier' checks
        if not error:
            # valid date?
            if is_date(date):
                # valid amount?
                if is_float(amount):
                    # valid category?
                    if inc.is_category(id=category_id):
                        # valid account?
                        if acc.is_account(account_id=account_id):

                            # add new income
                            inc.add_income(account_id=account_id,
                                           amount=amount,
                                           category_id=category_id,
                                           date=date,
                                           description=description)

                            # credit to account
                            acc.modify_account_balance(account_id, amount)

                            flash('Income added')

                        else:
                            error = 'Not a valid account'
                    else:
                        error = 'Not a valid category'
                else:
                    error = 'Not a valid amount'
            else:
                error = 'Not a valid date'

    # fetch user's categories and accounts
    categories = inc.get_categories()
    accounts = acc.get_accounts()

    return render_template('admin_add_income.html', **locals())
Esempio n. 12
0
def edit_income(income_id):
    '''Edit income entry'''

    current_user_id = session.get('logged_in_user')

    inc = Income(current_user_id)

    # is it valid?
    income = inc.get_income(income_id)
    if income:
        # fetch user's categories and accounts
        categories = inc.get_categories()

        acc = Accounts(current_user_id)
        accounts = acc.get_accounts()

        if request.method == 'POST':  # POST

            dict = __validate_income_form()
            for key in dict.keys():
                exec(key + " = dict['" + key + "']")

            # 'heavier' checks
            if not error:
                # valid date?
                if is_date(date):
                    # valid amount?
                    if is_float(amount):
                        # valid category?
                        if inc.is_category(id=category_id):
                            # valid account?
                            if acc.is_account(account_id=account_id):

                                # debit the original account
                                acc.modify_account_balance(
                                    income.credit_to, -float(income.amount))

                                # credit the 'new' account
                                acc.modify_account_balance(account_id, amount)

                                # edit income entry
                                inc.edit_income(account_id=account_id,
                                                amount=amount,
                                                category_id=category_id,
                                                date=date,
                                                description=description,
                                                income_id=income.id)

                                flash('Income edited')

                                return redirect(
                                    url_for('income.edit_income',
                                            income_id=income_id))

                            else:
                                error = 'Not a valid account'
                        else:
                            error = 'Not a valid category'
                    else:
                        error = 'Not a valid amount'
                else:
                    error = 'Not a valid date'

        return render_template('admin_edit_income.html', **locals())

    else:
        return redirect(url_for('income.index'))
Esempio n. 13
0
def getWKYIncome(account):
    check_and_update_account(account.account_id)

    wky = WKYInterface()

    month_income = wky.getMonthIncome('0', account.sessionid, account.user_id)
    json_month_income = json.loads(month_income)

    coin_info = wky.getCoinInfo(account.sessionid, account.user_id)
    json_coin_info = json.loads(coin_info)

    if 'iRet' not in json_month_income:
        return
    if json_month_income['iRet'] != 0:
        return
    if 'iRet' not in json_coin_info:
        return
    if json_coin_info['iRet'] != 0:
        return

    data_month_income = json_month_income['data']
    data_coin_info = json_coin_info['data']

    if 'month' in data_month_income and data_month_income['month'] != "":
        last_month_income = wky.getMonthIncome(data_month_income['month'], account.sessionid,
                                               account.user_id)
        json_last_month_income = json.loads(last_month_income)

        if 'iRet' not in json_last_month_income:
            return

    if json_last_month_income['iRet'] != 0:
        return

    data_last_month_income = json_last_month_income['data']
    print data_last_month_income

    total_income = str(data_month_income['totalIncome'])
    total_outcome = str(data_coin_info['totalOutcome'])

    current_month_income = 0
    date_list = []
    income_list = []

    if len(data_month_income['incomeArr']) > 0:
        last_income = data_month_income['incomeArr'][0]['num']
        for kk in range(len(data_month_income['incomeArr'])):
            current_month_income += float(data_month_income['incomeArr'][kk]['num'])
    else:
        last_income = data_last_month_income['incomeArr'][0]['num']

    month_income = str(current_month_income)

    for k in range(7):
        current_len = len(data_month_income['incomeArr'])
        if k < current_len:
            date_list.append(data_month_income['incomeArr'][k]['date'][4:])
            income_list.append(data_month_income['incomeArr'][k]['num'])
        else:
            date_list.append(data_last_month_income['incomeArr'][k-current_len]['date'][4:])
            income_list.append(data_last_month_income['incomeArr'][k-current_len]['num'])

    income_list.reverse()
    date_list.reverse()

    income = Income(total_income=total_income,
                    total_outcome=total_outcome,
                    last_income=last_income,
                    month_income=month_income,
                    date_list=date_list,
                    income_list=income_list,
                    update_time=time.mktime(datetime.now().timetuple()))
    account = Account.objects(account_id=account.account_id).first()
    if account is None:
        return

    account.update(income=income,
                   update_time=time.mktime(datetime.now().timetuple()))
Esempio n. 14
0
 def insert(self, dto):
     reg = Income()
     reg.map(dto)
     return IncomeDb().insert(reg)
Esempio n. 15
0
 def update(self, id, dto):
     reg = Income()
     reg.map(dto)
     return IncomeDb().update(id, reg)
Esempio n. 16
0
from flask import Flask, jsonify, request

from models.expense import Expense, ExpenseSchema
from models.income import Income, IncomeSchema
from models.transaction_type import TransactionType

app = Flask(__name__)

transactions = [
    Income('Salary', 5000),
    Income('Dividends', 200),
    Expense('pizza', 50),
    Expense('Rock Concert', 100)
]


@app.route('/incomes')
def get_incomes():
    schema = IncomeSchema(many=True)
    incomes = schema.dump(
        filter(lambda t: t.type == TransactionType.INCOME, transactions))
    return jsonify(incomes.data)


@app.route('/incomes', methods=['POST'])
def add_income():
    income = IncomeSchema().load(request.get_json())
    transactions.append(income.data)
    return "", 204