Beispiel #1
0
def give():
    '''Give a loan or pay someone back'''

    current_user_id = session.get('logged_in_user')

    our_accounts = Accounts(current_user_id)

    if request.method == 'POST':

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

        # 'heavier' checks
        if not error:
            # valid amount?
            if is_float(amount):
                # valid date?
                if is_date(date):
                    # valid account?
                    if our_accounts.is_account(account_id=deduct_from_account):

                        # add our loans entry
                        our_loans = Loans(current_user_id)
                        our_loan_id = our_loans.add_loan(other_user_id=to_user, date=date, account_id=deduct_from_account,
                                     description=description, amount=-float(amount))

                        # add their loans entry
                        their_loans = Loans(to_user)
                        their_loan_id = their_loans.add_loan(other_user_id=current_user_id, date=date,
                                                           account_id=deduct_from_account, description=description,
                                                           amount=amount)

                        # generate slugs for the new loans
                        our_slugs = Slugs(current_user_id)
                        slug = our_slugs.add_slug(type='loan', object_id=our_loan_id, description=description)
                        their_slugs = Slugs(to_user)
                        their_slugs.add_slug(type='loan', object_id=their_loan_id, slug=slug)

                        their_accounts = Accounts(to_user)

                        # transfer money from/to respective accounts
                        our_accounts.modify_user_balance(account_id=deduct_from_account, amount=-float(amount))
                        their_accounts.modify_user_balance(amount=amount)

                        # fudge loan 'account' monies
                        our_accounts.modify_loan_balance(amount=amount, with_user_id=to_user)
                        their_accounts.modify_loan_balance(amount=-float(amount), with_user_id=current_user_id)

                        flash('Loan given')

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

    # fetch users from connections from us
    our_users = Users(current_user_id)
    users = our_users.get_connections()
    accounts = our_accounts.get_accounts()

    return render_template('admin_give_loan.html', **locals())
Beispiel #2
0
def show_transfers(account=None, date=None, page=1, items_per_page=10):
    '''Show account transfers for a given user'''

    current_user_id = session.get('logged_in_user')

    acc = Accounts(current_user_id)

    # fetch account transfers
    transfers = acc.get_account_transfers()

    # provided a date range?
    date_range = translate_date_range(date)
    if date_range:
        transfers = acc.get_account_transfers(date_from=date_range['low'],
                                              date_to=date_range['high'])
    # date ranges for the template
    date_ranges = get_date_ranges()

    # fetch accounts
    accounts = acc.get_accounts()

    # provided an account?
    if account:
        # valid slug?
        if acc.is_account(account_slug=account):
            transfers = acc.get_account_transfers(account_slug=account)

    # build a paginator
    paginator = Pagination(
        transfers, page, items_per_page, transfers.count(),
        transfers.offset((page - 1) * items_per_page).limit(items_per_page))

    return render_template('admin_show_transfers.html', **locals())
Beispiel #3
0
def edit_account():
    '''Edit an account balance'''

    current_user_id = session.get('logged_in_user')

    acc = Accounts(current_user_id)

    if request.method == 'POST':
        error = None

        if 'balance' in request.form: balance = request.form['balance']
        else: error = 'You need to provide a balance'
        if 'account' in request.form: account = request.form['account']
        else: error = 'You need to provide an account'

        if not error:
            # valid amount?
            if is_float(balance):
                # valid account?
                if acc.is_account(account_id=account):

                    # modify accounts
                    acc.change_account_balance(account, balance)

                    flash('Balance modified')

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

    accounts = acc.get_accounts()

    return render_template('admin_edit_account.html', **locals())
Beispiel #4
0
def edit_account():
    '''Edit an account balance'''

    current_user_id = session.get('logged_in_user')

    acc = Accounts(current_user_id)

    if request.method == 'POST':
        error = None

        if 'balance' in request.form: balance = request.form['balance']
        else: error = 'You need to provide a balance'
        if 'account' in request.form: account = request.form['account']
        else: error = 'You need to provide an account'

        if not error:
            # valid amount?
            if is_float(balance):
                # valid account?
                if acc.is_account(account_id=account):

                    # modify accounts
                    acc.change_account_balance(account, balance)

                    flash('Balance modified')

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

    accounts = acc.get_accounts()

    return render_template('admin_edit_account.html', **locals())
Beispiel #5
0
def show_transfers(account=None, date=None, page=1, items_per_page=10):
    '''Show account transfers for a given user'''

    current_user_id = session.get('logged_in_user')

    acc = Accounts(current_user_id)

    # fetch account transfers
    transfers = acc.get_account_transfers()

    # provided a date range?
    date_range = translate_date_range(date)
    if date_range:
        transfers = acc.get_account_transfers(date_from=date_range['low'], date_to=date_range['high'])
    # date ranges for the template
    date_ranges = get_date_ranges()

    # fetch accounts
    accounts = acc.get_accounts()

    # provided an account?
    if account:
        # valid slug?
        if acc.is_account(account_slug=account):
            transfers = acc.get_account_transfers(account_slug=account)

    # build a paginator
    paginator = Pagination(transfers, page, items_per_page, transfers.count(),
                           transfers.offset((page - 1) * items_per_page).limit(items_per_page))

    return render_template('admin_show_transfers.html', **locals())
Beispiel #6
0
def add_transfer():
    '''Add an account transfer'''

    current_user_id = session.get('logged_in_user')

    acc = Accounts(current_user_id)

    if request.method == 'POST':
        dict = __validate_transfer_form()
        for key in dict.keys():
            exec(key + " = dict['" + key + "']")

        # 'heavier' checks
        if not error:
            # source and target the same?
            if not deduct_from_account == credit_to_account:
                # valid amount?
                if is_float(amount):
                    # is it a positive amount?
                    if float(amount) > 0:
                        # valid date?
                        if is_date(date):
                            # valid debit account?
                            if acc.is_account(account_id=deduct_from_account):
                                # valid credit account?
                                if acc.is_account(
                                        account_id=credit_to_account):

                                    # add a new transfer row
                                    acc.add_account_transfer(
                                        date=date,
                                        deduct_from_account=deduct_from_account,
                                        credit_to_account=credit_to_account,
                                        amount=amount)

                                    # modify accounts
                                    acc.modify_account_balance(
                                        deduct_from_account, -float(amount))
                                    acc.modify_account_balance(
                                        credit_to_account, amount)

                                    flash('Monies transferred')

                                else:
                                    error = 'Not a valid target account'
                            else:
                                error = 'Not a valid source account'
                        else:
                            error = 'Not a valid date'
                    else:
                        error = 'Provide a positive amount'
                else:
                    error = 'Not a valid amount'
            else:
                error = 'Source and target accounts cannot be the same'

    accounts = acc.get_accounts()

    return render_template('admin_add_transfer.html', **locals())
Beispiel #7
0
def add_transfer():
    """Add an account transfer"""

    current_user_id = session.get("logged_in_user")

    acc = Accounts(current_user_id)

    if request.method == "POST":
        dict = __validate_transfer_form()
        for key in dict.keys():
            exec(key + " = dict['" + key + "']")

        # 'heavier' checks
        if not error:
            # source and target the same?
            if not deduct_from_account == credit_to_account:
                # valid amount?
                if is_float(amount):
                    # is it a positive amount?
                    if float(amount) > 0:
                        # valid date?
                        if is_date(date):
                            # valid debit account?
                            if acc.is_account(account_id=deduct_from_account):
                                # valid credit account?
                                if acc.is_account(account_id=credit_to_account):

                                    # add a new transfer row
                                    acc.add_account_transfer(
                                        date=date,
                                        deduct_from_account=deduct_from_account,
                                        credit_to_account=credit_to_account,
                                        amount=amount,
                                    )

                                    # modify accounts
                                    acc.modify_account_balance(deduct_from_account, -float(amount))
                                    acc.modify_account_balance(credit_to_account, amount)

                                    flash("Monies transferred")

                                else:
                                    error = "Not a valid target account"
                            else:
                                error = "Not a valid source account"
                        else:
                            error = "Not a valid date"
                    else:
                        error = "Provide a positive amount"
                else:
                    error = "Not a valid amount"
            else:
                error = "Source and target accounts cannot be the same"

    accounts = acc.get_accounts()

    return render_template("admin_add_transfer.html", **locals())
Beispiel #8
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'))
Beispiel #9
0
def edit_transfer(transfer_id):
    '''Edit account transfer'''

    current_user_id = session.get('logged_in_user')

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

    # is it valid?
    transfer = acc.get_transfer(transfer_id)
    if transfer:

        if request.method == 'POST': # POST
            dict = __validate_transfer_form()
            for key in dict.keys(): exec(key + " = dict['" + key + "']")

            # 'heavier' checks
            if not error:
                # source and target the same?
                if not deduct_from_account == credit_to_account:
                    # valid amount?
                    if is_float(amount):
                        # valid date?
                        if is_date(date):
                            # valid debit account?
                            if acc.is_account(account_id=deduct_from_account):
                                # valid credit account?
                                if acc.is_account(account_id=credit_to_account):

                                    # modify accounts to original state
                                    acc.modify_account_balance(transfer.from_account, transfer.amount)
                                    acc.modify_account_balance(transfer.to_account, -float(transfer.amount))

                                    # new state
                                    acc.modify_account_balance(deduct_from_account, -float(amount))
                                    acc.modify_account_balance(credit_to_account, amount)

                                    # edit transfer row
                                    transfer = acc.edit_account_transfer(date=date, deduct_from_account=deduct_from_account,
                                                             credit_to_account=credit_to_account, amount=amount,
                                                             transfer_id=transfer_id)

                                    flash('Transfer edited')

                                else: error = 'Not a valid target account'
                            else: error = 'Not a valid source account'
                        else: error = 'Not a valid date'
                    else: error = 'Not a valid amount'
                else: error = 'Source and target accounts cannot be the same'

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

    else: return redirect(url_for('accounts.show_transfers'))
Beispiel #10
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())
Beispiel #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())
Beispiel #12
0
def edit_account():
    """Edit an account balance"""

    current_user_id = session.get("logged_in_user")

    acc = Accounts(current_user_id)

    if request.method == "POST":
        error = None

        if "balance" in request.form:
            balance = request.form["balance"]
        else:
            error = "You need to provide a balance"
        if "account" in request.form:
            account = request.form["account"]
        else:
            error = "You need to provide an account"

        if not error:
            # valid amount?
            if is_float(balance):
                # valid account?
                if acc.is_account(account_id=account):

                    # modify accounts
                    acc.change_account_balance(account, balance)

                    flash("Balance modified")

                else:
                    error = "Not a valid account"
            else:
                error = "Not a valid amount"

    accounts = acc.get_accounts()

    return render_template("admin_edit_account.html", **locals())
Beispiel #13
0
def __edit_give_loan(loan_id, our_loans, loan, current_user_id):
    '''Editing of loan entries where we were giving money'''

    our_accounts = Accounts(current_user_id)

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

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

        # 'heavier' checks
        if not error:
            # valid amount?
            if is_float(amount):
                # valid date?
                if is_date(date):
                    # valid account?
                    if our_accounts.is_account(account_id=deduct_from_account):

                        their_accounts = Accounts(loan.other_user)

                        # first roll back user balances
                        our_accounts.modify_user_balance(account_id=loan.account, amount=loan.amount)
                        their_accounts.modify_user_balance(amount=-float(loan.amount))

                        # now roll back loan account monies
                        our_accounts.modify_loan_balance(amount=-float(loan.amount), with_user_id=loan.other_user)
                        their_accounts.modify_loan_balance(amount=loan.amount, with_user_id=current_user_id)

                        # the user might have changed...
                        if loan.other_user != to_user:
                            their_accounts = Accounts(to_user)

                        # transfer money from/to respective accounts
                        our_accounts.modify_user_balance(account_id=deduct_from_account, amount=-float(amount))
                        their_accounts.modify_user_balance(amount=amount)

                        # fudge loan 'account' monies
                        our_accounts.modify_loan_balance(amount=amount, with_user_id=to_user)
                        their_accounts.modify_loan_balance(amount=-float(amount), with_user_id=current_user_id)

                        # get slug as a unique identifier
                        slug = our_loans.get_loan_slug(loan_id=loan_id)

                        # the user might have changed...
                        their_loans = Loans(loan.other_user)
                        if loan.other_user != to_user:
                            # delete their original loan entry (and its slug)
                            their_loans.delete_loan(slug=slug)

                            # new user
                            their_loans = Loans(to_user)
                            their_loan_id = their_loans.add_loan(other_user_id=current_user_id, date=date,
                                                                 description=description, amount=amount)

                            # save their new slug
                            their_slugs = Slugs(to_user)
                            their_slugs.add_slug(type='loan', object_id=their_loan_id, slug=slug)
                        else:
                            # update their loans entry
                            their_loans.edit_loan(other_user_id=current_user_id, date=date, description=description,
                                                  amount=amount, slug=slug)

                        # update our loans entry
                        our_loans.edit_loan(other_user_id=to_user, date=date, description=description,
                                            amount=-float(amount), account_id=deduct_from_account, loan_id=loan_id)

                        flash('Loan edited')

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

    our_users = Users(current_user_id)
    users = our_users.get_connections()
    accounts = our_accounts.get_accounts()

    return render_template('admin_edit_give_loan.html', **locals())
Beispiel #14
0
def edit_transfer(transfer_id):
    '''Edit account transfer'''

    current_user_id = session.get('logged_in_user')

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

    # is it valid?
    transfer = acc.get_transfer(transfer_id)
    if transfer:

        if request.method == 'POST':  # POST
            dict = __validate_transfer_form()
            for key in dict.keys():
                exec(key + " = dict['" + key + "']")

            # 'heavier' checks
            if not error:
                # source and target the same?
                if not deduct_from_account == credit_to_account:
                    # valid amount?
                    if is_float(amount):
                        # valid date?
                        if is_date(date):
                            # valid debit account?
                            if acc.is_account(account_id=deduct_from_account):
                                # valid credit account?
                                if acc.is_account(
                                        account_id=credit_to_account):

                                    # modify accounts to original state
                                    acc.modify_account_balance(
                                        transfer.from_account, transfer.amount)
                                    acc.modify_account_balance(
                                        transfer.to_account,
                                        -float(transfer.amount))

                                    # new state
                                    acc.modify_account_balance(
                                        deduct_from_account, -float(amount))
                                    acc.modify_account_balance(
                                        credit_to_account, amount)

                                    # edit transfer row
                                    transfer = acc.edit_account_transfer(
                                        date=date,
                                        deduct_from_account=deduct_from_account,
                                        credit_to_account=credit_to_account,
                                        amount=amount,
                                        transfer_id=transfer_id)

                                    flash('Transfer edited')

                                else:
                                    error = 'Not a valid target account'
                            else:
                                error = 'Not a valid source account'
                        else:
                            error = 'Not a valid date'
                    else:
                        error = 'Not a valid amount'
                else:
                    error = 'Source and target accounts cannot be the same'

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

    else:
        return redirect(url_for('accounts.show_transfers'))
Beispiel #15
0
def add_expense():
    '''Add an expense entry'''

    error = None
    current_user_id = session.get('logged_in_user')

    our_accounts = Accounts(current_user_id)
    our_expenses = Expenses(current_user_id)
    users = Users(current_user_id)

    if request.method == 'POST':
        dict = __validate_expense_form()
        for key in dict.keys():
            exec(key + " = dict['" + key + "']")

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

                            # is it a shared expense?
                            if 'is_shared' in request.form:
                                # fetch values and check they are actually provided
                                if 'split' in request.form:
                                    split = request.form['split']
                                else:
                                    error = 'You need to provide a % split'
                                if 'user' in request.form:
                                    shared_with_user = request.form['user']
                                else:
                                    error = 'You need to provide a user'

                                # 'heavier' checks
                                if not error:
                                    # valid percentage split?
                                    if is_percentage(split):
                                        # valid user sharing with?
                                        if users.is_connection(
                                                user_id=shared_with_user):

                                            # figure out percentage split
                                            loaned_amount = round(
                                                (float(amount) *
                                                 (100 - float(split))) / 100,
                                                2)

                                            # create loans
                                            our_loans = Loans(current_user_id)
                                            our_loan_id = our_loans.add_loan(
                                                other_user_id=shared_with_user,
                                                date=date,
                                                account_id=account_id,
                                                description=description,
                                                amount=-float(loaned_amount))

                                            our_loans = Loans(shared_with_user)
                                            their_loan_id = our_loans.add_loan(
                                                other_user_id=current_user_id,
                                                date=date,
                                                description=description,
                                                amount=loaned_amount)

                                            # generate slugs for the new loans
                                            our_slugs = Slugs(current_user_id)
                                            slug = our_slugs.add_slug(
                                                type='loan',
                                                object_id=our_loan_id,
                                                description=description)
                                            their_slugs = Slugs(
                                                shared_with_user)
                                            their_slugs.add_slug(
                                                type='loan',
                                                object_id=their_loan_id,
                                                slug=slug)

                                            flash('Loan given')

                                            # add new expense (loaner)
                                            our_expense_id = our_expenses.add_expense(
                                                date=date,
                                                category_id=category_id,
                                                account_id=account_id,
                                                amount=float(amount) -
                                                loaned_amount,
                                                description=description)

                                            # add new expenses (borrower)
                                            their_expenses = Expenses(
                                                shared_with_user)
                                            their_expense_id = their_expenses.add_expense(
                                                date=date,
                                                amount=loaned_amount,
                                                description=description,
                                                pass_thru=True)

                                            # fudge loan 'account' monies
                                            our_accounts.modify_loan_balance(
                                                amount=loaned_amount,
                                                with_user_id=shared_with_user)
                                            their_accounts = Accounts(
                                                shared_with_user)
                                            their_accounts.modify_loan_balance(
                                                amount=-float(loaned_amount),
                                                with_user_id=current_user_id)

                                            # link loan and the expenses (through us)
                                            our_expenses.link_to_loan(
                                                expense_id=our_expense_id,
                                                loan_id=our_loan_id,
                                                shared_with=shared_with_user,
                                                percentage=split,
                                                original_amount=amount)
                                            their_expenses.link_to_loan(
                                                expense_id=their_expense_id,
                                                loan_id=our_loan_id,
                                                shared_with=current_user_id,
                                                percentage=split,
                                                original_amount=amount)

                                        else:
                                            error = 'Not a valid user sharing with'
                                    else:
                                        error = 'Not a valid % split'

                            else:
                                # add new expense
                                our_expenses.add_expense(
                                    date=date,
                                    category_id=category_id,
                                    account_id=account_id,
                                    amount=amount,
                                    description=description)

                            if not error:
                                # debit from account
                                our_accounts.modify_user_balance(
                                    amount=-float(amount),
                                    account_id=account_id)

                                flash('Expense added')

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

    # fetch user's categories, accounts and users
    categories = our_expenses.get_categories()
    if not categories: error = 'You need to define at least one category'

    accounts = our_accounts.get_accounts()
    if not accounts: error = 'You need to define at least one account'

    # fetch users from connections from us
    users = users.get_connections()

    return render_template('admin_add_expense.html', **locals())
Beispiel #16
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'))
Beispiel #17
0
def add_expense():
    '''Add an expense entry'''

    error = None
    current_user_id = session.get('logged_in_user')

    our_accounts = Accounts(current_user_id)
    our_expenses = Expenses(current_user_id)
    users = Users(current_user_id)

    if request.method == 'POST':
        dict = __validate_expense_form()
        for key in dict.keys(): exec(key + " = dict['" + key + "']")

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

                            # is it a shared expense?
                            if 'is_shared' in request.form:
                                # fetch values and check they are actually provided
                                if 'split' in request.form: split = request.form['split']
                                else: error = 'You need to provide a % split'
                                if 'user' in request.form: shared_with_user = request.form['user']
                                else: error = 'You need to provide a user'

                                # 'heavier' checks
                                if not error:
                                    # valid percentage split?
                                    if is_percentage(split):
                                        # valid user sharing with?
                                        if users.is_connection(user_id=shared_with_user):

                                            # figure out percentage split
                                            loaned_amount = round((float(amount)*(100-float(split)))/100, 2)

                                            # create loans
                                            our_loans = Loans(current_user_id)
                                            our_loan_id = our_loans.add_loan(other_user_id=shared_with_user, date=date,
                                                         account_id=account_id, description=description,
                                                         amount=-float(loaned_amount))

                                            our_loans = Loans(shared_with_user)
                                            their_loan_id = our_loans.add_loan(other_user_id=current_user_id, date=date,
                                                         description=description, amount=loaned_amount)

                                            # generate slugs for the new loans
                                            our_slugs = Slugs(current_user_id)
                                            slug = our_slugs.add_slug(type='loan', object_id=our_loan_id,
                                                                      description=description)
                                            their_slugs = Slugs(shared_with_user)
                                            their_slugs.add_slug(type='loan', object_id=their_loan_id, slug=slug)

                                            flash('Loan given')

                                            # add new expense (loaner)
                                            our_expense_id = our_expenses.add_expense(date=date, category_id=category_id,
                                                                               account_id=account_id,
                                                                               amount=float(amount) - loaned_amount,
                                                                               description=description)

                                            # add new expenses (borrower)
                                            their_expenses = Expenses(shared_with_user)
                                            their_expense_id = their_expenses.add_expense(date=date, amount=loaned_amount,
                                                                                   description=description, pass_thru=True)

                                            # fudge loan 'account' monies
                                            our_accounts.modify_loan_balance(amount=loaned_amount,
                                                                             with_user_id=shared_with_user)
                                            their_accounts = Accounts(shared_with_user)
                                            their_accounts.modify_loan_balance(amount=-float(loaned_amount),
                                                                         with_user_id=current_user_id)

                                            # link loan and the expenses (through us)
                                            our_expenses.link_to_loan(expense_id=our_expense_id, loan_id=our_loan_id,
                                                                shared_with=shared_with_user, percentage=split,
                                                                original_amount=amount)
                                            their_expenses.link_to_loan(expense_id=their_expense_id, loan_id=our_loan_id,
                                                                shared_with=current_user_id, percentage=split,
                                                                original_amount=amount)

                                        else: error = 'Not a valid user sharing with'
                                    else: error = 'Not a valid % split'

                            else:
                                # add new expense
                                our_expenses.add_expense(date=date, category_id=category_id, account_id=account_id,
                                                   amount=amount, description=description)

                            if not error:
                                # debit from account
                                our_accounts.modify_user_balance(amount=-float(amount), account_id=account_id)

                                flash('Expense added')

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

    # fetch user's categories, accounts and users
    categories = our_expenses.get_categories()
    if not categories: error = 'You need to define at least one category'

    accounts = our_accounts.get_accounts()
    if not accounts: error = 'You need to define at least one account'

    # fetch users from connections from us
    users = users.get_connections()

    return render_template('admin_add_expense.html', **locals())
Beispiel #18
0
def edit_expense(expense_id):
    '''Edit expense entry'''

    current_user_id = session.get('logged_in_user')

    our_expenses = Expenses(current_user_id)

    # is it valid?
    expense = our_expenses.get_expense(expense_id)
    if expense:
        error = None

        # early exit for shared expenses from the perspective of the shared with user
        if (expense[0].pass_thru):
            return __edit_pass_thru_expense(**locals())

        our_accounts = Accounts(current_user_id)
        our_users = Users(current_user_id)

        # fetch user's categories, accounts and users
        categories = our_expenses.get_categories()
        if not categories: error = 'You need to define at least one category'

        accounts = our_accounts.get_accounts()
        if not accounts: error = 'You need to define at least one account'

        # fetch users from connections from us
        users = our_users.get_connections()

        # fudge the total for the expense if we have a shared expense
        if expense[1]: expense[0].amount = expense[4]

        if request.method == 'POST':
            dict = __validate_expense_form()
            for key in dict.keys(): exec(key + " = dict['" + key + "']")

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

                                if expense[1]:
                                    if 'is_shared' in request.form: # shared expense that will be shared
                                        return __edit_shared_expense_into_shared(**locals())
                                    else: # shared expense that will be simple
                                        return __edit_shared_expense_into_simple(**locals())
                                else:
                                    if 'is_shared' in request.form: # simple expense that will be shared
                                        return __edit_simple_expense_into_shared(**locals())
                                    else:  # simple expense that will be shared
                                        return __edit_simple_expense_into_simple(**locals())

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

        # show the form
        return render_template('admin_edit_expense.html', **locals())

    else: return redirect(url_for('expenses.index'))
Beispiel #19
0
def edit_expense(expense_id):
    '''Edit expense entry'''

    current_user_id = session.get('logged_in_user')

    our_expenses = Expenses(current_user_id)

    # is it valid?
    expense = our_expenses.get_expense(expense_id)
    if expense:
        error = None

        # early exit for shared expenses from the perspective of the shared with user
        if (expense[0].pass_thru):
            return __edit_pass_thru_expense(**locals())

        our_accounts = Accounts(current_user_id)
        our_users = Users(current_user_id)

        # fetch user's categories, accounts and users
        categories = our_expenses.get_categories()
        if not categories: error = 'You need to define at least one category'

        accounts = our_accounts.get_accounts()
        if not accounts: error = 'You need to define at least one account'

        # fetch users from connections from us
        users = our_users.get_connections()

        # fudge the total for the expense if we have a shared expense
        if expense[1]: expense[0].amount = expense[4]

        if request.method == 'POST':
            dict = __validate_expense_form()
            for key in dict.keys():
                exec(key + " = dict['" + key + "']")

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

                                if expense[1]:
                                    if 'is_shared' in request.form:  # shared expense that will be shared
                                        return __edit_shared_expense_into_shared(
                                            **locals())
                                    else:  # shared expense that will be simple
                                        return __edit_shared_expense_into_simple(
                                            **locals())
                                else:
                                    if 'is_shared' in request.form:  # simple expense that will be shared
                                        return __edit_simple_expense_into_shared(
                                            **locals())
                                    else:  # simple expense that will be shared
                                        return __edit_simple_expense_into_simple(
                                            **locals())

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

        # show the form
        return render_template('admin_edit_expense.html', **locals())

    else:
        return redirect(url_for('expenses.index'))