Пример #1
0
def addExpense(**kwargs):
    """ Добавить позицию в таб. Expense """
    db.session.close()
    data = Expense(**kwargs)
    db.session.add(data)
    db.session.commit()
    return 'Add an Expense'
Пример #2
0
def handle_csv_file(csvfile):
    """
    stores the file information in the database and returns the expenses amount per-month
    in a chronological order
    """

    reader = csv.DictReader(csvfile, delimiter=',')

    # A dictionnary where we are going to collect expenses per month
    expense_per_month = {}
    for row in reader:
        # Category check, get it or add it to the database
        cat = Category.objects.get_or_create(name=row['category'])[0]

        # Employee check, get it or add it to the database
        emp = Employee.objects.get_or_create(
            name=row['employee name'], address=row['employee address'])[0]

        # Extract date
        date = datetime.strptime(row['date'], '%m/%d/%Y')

        # Calculating total expense after tax
        pretax_amount = Decimal(row['pre-tax amount'].replace(',', ''))
        tax_amount = Decimal(row['tax amount'].replace(',', ''))
        after_tax = pretax_amount + tax_amount

        # We will collect the total expenses(after tax) represented by every row in the uploaded file
        # and group them by month in a dictionnary: the keys will be integers that will be generated
        # based on the expense date while the values will be tuples. These tuples will contain a string
        # that represents the month in letters and a decimal that represnts the total expense
        year = date.strftime("%Y")
        month = date.strftime("%m")
        # These keys are generated in a way that will help us later on reorganize the expenses per month
        # chronologically
        key = generate_key(year, month)
        try:
            # Key already exists, retrieving the total to update it
            previous_total = expense_per_month[key][1]
        except KeyError:
            # Key doesn't exist, no total to update
            previous_total = 0
        finally:
            # Generating first element of the tuple
            month_year = date.strftime("%B %Y")
            # Updating the dictionnary
            expense_per_month.update(
                {key: (month_year, previous_total + after_tax)})

        # Creating a new expense and saving it to the database
        expense = Expense(date=date,
                          employee=emp,
                          description=row['expense description'],
                          pretax_amount=pretax_amount,
                          tax_name=row['tax name'],
                          tax_amount=tax_amount,
                          category=cat)
        expense.save()
    # Returning a sorted list of tuples
    return generate_sorted_list(expense_per_month)
Пример #3
0
def create_sample_data():
    """ 
        Creates sample data for testing.
        There should be 11 expenses totaling $101.00. All have the same category and date. 
    """
    
    # Creates a sample category and sample date that can be used to create sample expenses
    sample_category = Category(name='Test Category')
    sample_category.save()
    sample_date = datetime.date(2021, 1, 1)
    
    # Creates 11 sample expenses, last expense created has a lower amount so it can be tested to see if it is excluded in the top ten highest expenses graph
    for i in range(10):
        i += 1
        new_expense = Expense(name='Expense {}'.format(str(i)), category_id=sample_category.id, amount=10, date=sample_date)
        new_expense.save()
    new_expense = Expense(name='Expense 11', category_id=sample_category.id, amount=1, date=sample_date)
    new_expense.save()
Пример #4
0
 def createExpense(self, amount, note, date, cat):
     """
     Insert an Expense entry into the db
     """
     expense = Expense(amount=amount, note=note, date=date, category_id=cat)
     self.session.add(expense)
     self.session.flush()
     self.session.commit()
     return expense
Пример #5
0
def expense_create_alexa(amount, category):
    user = User.query.filter_by(id=1).first()
    amount = float(amount)
    description = category  # MAKE SURE THAT THIS IS CAPITAL
    print(user, file=sys.stderr)
    new_income_statement = Expense(str(1), amount, description)
    db_session.add(new_income_statement)
    db_session.commit()
    print('Created Expense Statement', file=sys.stderr)
    return '{"success": "200"}'
Пример #6
0
async def create_expense(expense_request: ExpenseRequest,
                         db: Session = Depends(get_db)):
    expense = Expense()
    expense.date = expense_request.date
    expense.description = expense_request.description
    expense.currency = expense_request.currency
    expense.amount = expense_request.amount
    db.add(expense)
    db.commit()
    return {'expense created!!'}
Пример #7
0
def add_user_expense_to_event(user, event, expenses):
    for expense in expenses:
        if expense["person_key"] == user.key.urlsafe():
            exp = Expense(parent=user.key, person=user.key, cost=float(expense["cost"]), to=event.payer)
            exp.put()
    
#     expense = Expense(parent=user.key, person=user.key, cost=0)
#     expense.put()
    
    event.expenses.append(exp.key)
    event.put()
Пример #8
0
def run_shuttle_expense():
    if not current_user.isSuperUser:
        abort(401)

    cost = float(request.args.get('cost'))

    if cost <= 0:
        abort(400)

    active_users = User.query.filter(or_(User.isSaturdayAbsent == False, User.isSundayAbsent == False))\
        .order_by(User.firstname.asc())

    if not active_users or active_users.count() < 1:
        abort(404)

    shuttle_cost_per_player = float("{0:.2f}".format(
        float(cost) / float(active_users.count())))
    """Add expense entry"""
    expenseEntry = Expense(cost, shuttle_cost_per_player, "Deduction_Shuttles",
                           active_users.count())
    db.session.add(expenseEntry)
    db.session.commit()
    """Insert a log"""
    description = 'Shuttle expense for $' + str(cost) + ' is run'
    log = Log(current_user.email, description)
    db.session.add(log)
    db.session.commit()

    bodyText = 'Hi everyone,\r\n\nA total of $' + str(cost) + ' is charged for shuttles and it is charged ' + \
               'equally among ' + str(active_users.count()) + ' active players.' + \
               '\r\n\nBalances of players are as follows after deduction:\r\n\n'

    email_ids = []
    for user in active_users:
        user.balance = float("{0:.2f}".format(user.balance -
                                              shuttle_cost_per_player))
        db.session.commit()

        transaction = Transaction(user.email, shuttle_cost_per_player,
                                  user.balance, "Deduct_Shuttle")
        db.session.add(transaction)
        db.session.commit()

        email_ids.append(user.email)
        bodyText += user.firstname + ' ' + user.lastname + ' : ' + '$' + str(
            user.balance) + '\r\n'

    bodyText += '\nThanks\r\nSydney Badminton Group'
    SendGrid.send_email(email_ids, "*****@*****.**",
                        "Badminton: Balances after Shuttles expenses",
                        bodyText)

    return "Success"
Пример #9
0
async def answer(event: CallbackQuery):
    chat_id = event.chat_id
    msg_id = event.message_id
    if event.data == b'Confirm':
        pending_expense = get_pending_expense(pending_expenses, msg_id, chat_id)
        expense = Expense(**pending_expense['expense'])
        original_msg_id = pending_expense['original_msg_id']
        group = get_group(expense_groups, chat_id)
        group.add_expense(expense)
        update_group(expense_groups, group)
        await event.answer(message='Expense added')
        await event.delete()
        await tg_client.send_message(chat_id, '**Expense Added**\n' + str(expense))

    elif event.data == b'Deny':
        pending_expense = get_pending_expense(pending_expenses, msg_id, chat_id)
        original_msg_id = pending_expense['original_msg_id']
        await event.answer(message='Expense not added')
        await event.delete()
        await tg_client.send_message(chat_id, '**Expense not Added**', reply_to=original_msg_id)

    elif event.data == b'Close':
        group = get_group(expense_groups, chat_id)
        group.close_group()
        update_group(expense_groups, group)
        await event.delete()
        await tg_client.send_message(chat_id, group.get_payments())
        for payment in group.payments:
            try:
                receiver = await tg_client.get_input_entity(payment.from_whom.username)
                receiver = await tg_client.get_entity(receiver)
                await tg_client.send_message(receiver,
                                         message='Hi {}! You should send a payment of {} {} to {} to settle the expenses of {}'.format(
                                             payment.from_whom.name,
                                             payment.amount,
                                             payment.currency,
                                             payment.to_whom.name,
                                             group.name
                                         ))
            except PeerIdInvalidError:
                continue
    elif event.data == b'Do not close':
        await tg_client.send_message(chat_id, '**Group not closed**')
        await event.delete()

    del_pending_expense(pending_expenses, msg_id, chat_id)
Пример #10
0
def add_expense():
    user = g.user
    form = ExpenseForm()
    if form.validate_on_submit():
        expense = Expense(date=form.date.data,
                          description=form.description.data.strip(),
                          cost=''.join(i for i in form.cost.data.strip()
                                       if i.isdigit()),
                          merchant=form.merchant.data,
                          category=form.category.data,
                          creator=user)
        db.session.add(expense)
        db.session.commit()
        flash(
            "The Expense from: '{}' was added".format(form.merchant.data.name),
            'success')
        return redirect(url_for('dashboard'))
    return render_template('add_expense.html', user=user, form=form)
Пример #11
0
	def post(self):
		c_per = memcache.get('current_person')
		
		if not c_per:
			return # ERROR! Invalid attempt to post schedules
		if not c_per.schedule:
			return # ERROR! Person don't have an schedule ... probably an invalid attempt
		
		## TODO: Do a nice data validation?? could be JScript too ...
		exp = Expense( belongs = c_per,
	                 name = self.request.get('name'), 
	                 value = self.request.get('cost'),
	                 when = self.request.get('date'),
	                 description = self.request.get('desc') )
		exp.put()		
		memcache.set('current_person',c_per,PERSON_EXPIRE_TIME)
		
		self.redirect('/')
Пример #12
0
def add_expense():

    if len(Category.objects()) < 1:
        return list_expenses(error='You cannot create an expense until you create at least one category.')

    form = ExpenseForm(request.form)
    if request.method == 'POST':
        if form.validate(): 
            if __get_expense_by_name(form.name.data) != None:
                return render_template('views/expense_form.html', page_name='edit_expense', page_title='Edit Expense', categories=Category.objects(), error='An expense with that name already exists.')

            expense = Expense(name=form.name.data, category_id=form.category_id.data, amount=form.amount.data, date=form.date.data)
            expense.save()

            return list_expenses(success='Created new expense "{}".'.format(form.name.data))
        else:
            return render_template('views/expense_form.html', page_name='add_expense', page_title='Add Expense', categories=Category.objects(), errors=parse_form_errors(form.errors.items()))

    return render_template('views/expense_form.html', page_name='add_expense', page_title='Add Expense', categories=Category.objects())
Пример #13
0
    def update_finance(finances, ftype):
        # Delete any finances which have been removed.
        new_finances = [finance['id'] for finance in finances if finance['id']]
        if ftype == 'revenues':
            entity.revenues = [
                revenue for revenue in entity.revenues
                if revenue.id in new_finances
            ]
        elif ftype == 'expenses':
            entity.expenses = [
                expense for expense in entity.expenses
                if expense.id in new_finances
            ]

        # Do this or else list comprehensions don't work as expected.
        db.commit()

        # Create or update.
        for finance in finances:
            if finance['id']:
                # Finance exists, update data.
                oldfinance = Finance.query.get(finance['id'])
                if oldfinance.amount != finance['amount']:
                    oldfinance.amount = finance['amount']
                    app.logger.debug('UPDATING ' + ftype + ' AMOUNT: ' +
                                     str(oldfinance.amount))
                if oldfinance.year != finance['year']:
                    oldfinance.year = finance['year']
                    app.logger.debug('UPDATING ' + ftype + ' YEAR: ' +
                                     str(oldfinance.year))
            else:
                # Finance doesn't exist, create it.
                if ftype is 'revenues':
                    revenue = Revenue(finance['amount'], finance['year'])
                    entity.revenues.append(revenue)
                    app.logger.debug('NEW REVENUE -- ' + str(revenue.year) +
                                     ': ' + str(revenue.amount))
                elif ftype is 'expenses':
                    expense = Expense(finance['amount'], finance['year'])
                    entity.expenses.append(expense)
                    app.logger.debug('NEW EXPENSE -- ' + str(expense.year) +
                                     ': ' + str(expense.amount))
        db.commit()
Пример #14
0
def expense_create():
    try:
        csrf = session.get('csrf', {})
        uid = csrf[csrf.index(":") + 2:len(csrf) - 1]
        print(uid, file=sys.stderr)
        if len(csrf) == 0:
            return render_template("index.html")
        else:
            user = User.query.filter_by(id=uid).first()
            amount = float(request.form["amount"])
            description = request.form["category"]
            print(user, file=sys.stderr)
            new_expense_statement = Expense(str(user.id), amount, description)
            db_session.add(new_expense_statement)
            db_session.commit()
            print('Created Expense Statement', file=sys.stderr)
            return redirect(url_for('.home_page'))
    except:
        print("ERROR OCCURED", file=sys.stderr)
        session.pop('csrf', None)
        return render_template("index.html")
Пример #15
0
    def post(self, trip_key):
        errors = []
        output = ""
        user = users.get_current_user()
        authz = Authz(user)
        self.response.headers["Content-type"] = "application/json"

        # check for authorization to create expenses for this trip & verify this
        # is in fact a request to create a new expense
        try:
            # get the trip
            trip = Trip.get(trip_key)

            # verify the user is authorized to create an expense on this trip
            authz.createExpense(trip)

        except PermissionError as e:
            # this permission error could have come from authz or locally
            errors.append({"message": e.args})
        except db.BadKeyError:
            errors.append({"message": "Invalid trip key"})
        except Exception as e:
            logging.exception(e)
            errors.append({"message": "Unexpected error loading trip"})

        # bail if we hit authz errors
        if len(errors) > 0:
            self.response.set_status(400)
            output = json.dumps({"error": errors})
            self.response.out.write(output)
            return

        # having passed authz, let's try creating the expense
        data = ExpenseUnpacker().unpack_post(self.request)

        if data['description'] == "" or data['value'] == "" or data[
                'payer'] == "":
            errors.append(
                {"message": "Description, value, and payer are required."})
        elif len(data['travelers']) == 0:
            errors.append({
                "message":
                "At least one person must be specified as a traveler."
            })
        else:
            try:
                expense = Expense(
                    parent=trip.key(),
                    creator=user,
                    description=data['description'],
                    value=int(data['value']),
                    currency="USD",
                )

                # get the expense date
                expense_date = dateparse(data['expense_date'])
                expense.expense_date = expense_date.date()

                # TODO: make sure these travelers are actually on the trip
                expense.travelers = data['travelers']

                # TODO: ensure the payer is actually a traveler
                expense.payer = data['payer']

                expense.put()

                output = GqlEncoder().encode({
                    "id": "%s" % expense.key(),
                    'modify_date': expense.modify_date,
                    'expense_date': expense.expense_date,
                    'value': expense.value,
                })
            except Exception as e:
                logging.exception(e)
                errors.append({"message": "Unexpected error creating expense"})

        if len(errors) > 0:
            self.response.set_status(400)
            output = json.dumps({"error": errors})

        self.response.out.write(output)
Пример #16
0
async def new_message(event: NewMessage):
    chat_id = event.chat_id
    bot_called = event.message.mentioned
    try:
        # Check if group exist ... if not, it is a one to one chat or an error!
        group = get_group(expense_groups, chat_id)
        if group:
            msg = event.message
            doc = nlp(msg.raw_text)
            matches = matcher(doc)
            for match_id, start, end in matches:
                string_id = nlp.vocab.strings[match_id]

                if string_id in {'add_expense', 'nuova_spesa'}:
                    # Create new expense
                    new_expense = crea_nuova_spesa(doc)

                    # find who_paid by name or by username
                    username_members = list(filter(lambda x: x.username == new_expense["who_paid"], group.members))
                    name_members = list(filter(lambda x: new_expense["who_paid"] == x.name, group.members))

                    if len(username_members) == 1 and len(name_members) == 0:
                        if username_members[0].active_groups[str(group.id)]:
                            who_paid = username_members[0]
                        else:
                            raise TelegramUserNotActive
                    elif len(name_members) == 1 and len(username_members) == 0:
                        if name_members[0].active_groups[str(group.id)]:
                            who_paid = name_members[0]
                        else:
                            raise TelegramUserNotActive
                    elif new_expense['who_paid'] == 'MSG_SENDER':
                        member = group.__get_member_from_id__(event.from_id)
                        who_paid = member
                    else:
                        raise MalformedMessage('Impossible to determine who paid')

                    # find list of for_whom by name or by username
                    for_whom = list()
                    for string_id in new_expense['for_whom']:
                        if string_id in {'everyone', 'everybody', 'tutti'}:
                            for_whom = list(filter(lambda x: x.active_groups[str(group.id)], group.members))
                            break
                        username_members = list(filter(lambda x: x.username == string_id, group.members))
                        name_members = list(filter(lambda x: x.name == string_id, group.members))

                        if len(username_members) == 1 and len(name_members) == 0:
                            if username_members[0].active_groups[str(group.id)]:
                                for_whom.append(username_members[0])
                            else:
                                raise TelegramUserNotActive
                        elif len(name_members) == 1 and len(username_members) == 0:
                            if name_members[0].active_groups[str(group.id)]:
                                for_whom.append(name_members[0])
                            else:
                                raise TelegramUserNotActive
                        else:
                            raise MalformedMessage('Impossible to determine for who it was paid')

                    expense = Expense(who_paid=who_paid,
                                      for_whom=for_whom,
                                      amount=new_expense['amount'],
                                      currency=new_expense['currency'],
                                      purpose=new_expense['purpose'])

                    # Confirm or Deny
                    chat = await event.get_input_chat()
                    cb_result = await tg_client.send_message(chat, str(expense), buttons=[
                        [Button.inline('Confirm', data=None), Button.inline('Deny', data=None)]
                    ])
                    # Global queue for pending msg
                    create_pending_expense(pending_expenses, expense, event.message.id, cb_result.id, chat_id)
                elif string_id == 'disable_member' and bot_called:
                    name_or_username = remove_member_from_group(doc)
                    member = find_user(name_or_username, group)
                    group.disable_chat_member(member.id)
                    update_group(expense_groups, group)
                    await event.reply('User disabled')
                elif string_id == 'enable_member' and bot_called:
                    name_or_username = add_member_to_group(doc[1:])
                    print(name_or_username)
                    member = find_user(name_or_username, group)
                    group.enable_chat_member(member.id)
                    update_group(expense_groups, group)
                    await event.reply('User enabled')
                elif string_id == 'get_balance' and bot_called:
                    await tg_client.send_message(chat_id, group.get_balance())
                    pass
                elif string_id == 'open_group' and bot_called:
                    group.open_group()
                    update_group(expense_groups, group)
                elif string_id == 'close_group' and bot_called:
                    chat = await event.get_input_chat()
                    cb_result = await tg_client.send_message(chat,
                                                             'Are you sure you want to close the expense group?',
                                                             buttons=[
                                                                 [Button.inline('Close', data=None),
                                                                  Button.inline('Do not close', data=None)]
                                                             ])
                elif string_id == 'get_payments' and bot_called:
                    #ToDo
                    pass

    except MalformedMessage:
        await tg_client.send_message(chat_id, "The message was malformed: retry")
    except TelegramUserNotActive:
        await tg_client.send_message(chat_id, "One of the involved user is not anymore active in this group")
    except ClosedGroup:
        await tg_client.send_message(chat_id, "The group is closed to new expenses")
    except KeyError:
        await tg_client.send_message(chat_id, "The message was malformed, retry")
Пример #17
0
def allow_connect_to_merchant(json):
    user = User.query.filter_by(id=int(json["user"])).first()
    new_income_statement = Expense(str(user.id), json["amount"], "Other")
    db_session.add(new_income_statement)
    db_session.commit()
    socketio.emit('transaction-complete', json)
Пример #18
0
def main():
    with app.app_context():
        db.metadata.create_all(db.engine)
        """User table"""
        with open('_User.json') as user_data_file:
            user_data = json.load(user_data_file)
        users = user_data["results"]
        for user in users:
            print 'Firstname = ' + user["firstname"]
            print 'Lastname = ' + user["lastname"]
            user_row = User(user["firstname"], user["lastname"], user["username"],
                            user["bcryptPassword"], user["balance"], user["group"],
                            bool(user["isGroupOwner"]), bool(user["isAdmin"]),
                            user["saturdayAbsentWeeks"], user["futureSaturdayAbsentWeeks"],
                            user["sundayAbsentWeeks"], user["futureSundayAbsentWeeks"],
                            parser.parse(user["createdAt"]), parser.parse(user["updatedAt"]))
            db.session.add(user_row)
            db.session.commit()

        """CourtsCost table"""
        with open('CourtsCost.json') as courts_cost_data_file:
            courts_cost_data = json.load(courts_cost_data_file)
        courts_costs = courts_cost_data["results"]
        for courts_cost in courts_costs:
            courts_cost_row = CourtsCost(courts_cost["cost"], courts_cost["day"],
                                         parser.parse(courts_cost["createdAt"]),
                                         parser.parse(courts_cost["updatedAt"]))
            db.session.add(courts_cost_row)
            db.session.commit()

        """Expenses table"""
        with open("Expenses.json") as expenses_data_file:
            expenses_data = json.load(expenses_data_file)
        expenses = expenses_data["results"]
        for expense in expenses:
            expense_row = Expense(expense["cost"], expense["costPerPerson"],
                                  expense["description"], expense["numberOfPlayers"],
                                  parser.parse(expense["createdAt"]),
                                  parser.parse(expense["updatedAt"]))
            db.session.add(expense_row)
            db.session.commit()

        """Transactions table"""
        with open("Transactions_Table.json") as transactions_data_file:
            transactions_data = json.load(transactions_data_file)
        transactions = transactions_data["results"]
        for transaction in transactions:
            transaction_row = Transaction(transaction["username"], transaction["Amount"],
                                          transaction["Total_Amount"], transaction["Transaction_Type"],
                                          parser.parse(transaction["Date"]["iso"]),
                                          parser.parse(transaction["createdAt"]),
                                          parser.parse(transaction["updatedAt"]))
            db.session.add(transaction_row)
            db.session.commit()

        """Logs table"""
        with open('Logs.json') as data_file:
            data = json.load(data_file)
        logs = data['results']
        for log in logs:
            log_row = Log(log["username"], log["description"], parser.parse(log["createdAt"]),
                          parser.parse(log["updatedAt"]))
            db.session.add(log_row)
            db.session.commit()
Пример #19
0
def run_expense(day):
    with app.app_context():
        if day != "Saturday" and day != "Sunday":
            return

        courts_cost = CourtsCost.query.filter_by(day=day).first()

        if day == "Saturday":
            players = User.query.filter_by(isSaturdayAbsent=False).order_by(User.firstname.asc())
            absent_players = User.query.filter_by(isSaturdayAbsent=True).order_by(User.firstname.asc())
        elif day == "Sunday":
            players = User.query.filter_by(isSundayAbsent=False).order_by(User.firstname.asc())
            absent_players = User.query.filter_by(isSundayAbsent=True).order_by(User.firstname.asc())
        db.session.close()

        email_ids = []
        body_text = ""
        if players.count() > 0:
            cost_per_player = float("{0:.2f}".format(float(courts_cost.cost) / float(players.count())))

            """Add expense entry"""
            expence_description = ("Deduction_Sunday", "Deduction_Saturday")[day == "Saturday"]
            expenseEntry = Expense(courts_cost.cost, cost_per_player, expence_description, players.count())
            db.session.add(expenseEntry)
            db.session.commit()

            body_text += 'Hi everyone,\r\n\nA total of ' + str(players.count()) + ' players attended the play on ' \
                        + day + ' and courts booking cost = $' + str(courts_cost.cost) + '. So cost per player = $' + \
                        str(cost_per_player) + ".\r\n\nBalances of played players are as follows:\r\n\n"

            for player in players:
                player.balance = float("{0:.2f}".format(player.balance - cost_per_player))

                transaction = Transaction(player.email, cost_per_player, player.balance,
                                          ("Deduct_Sun", "Deduct_Sat")[day == "Saturday"])
                db.session.add(transaction)
                db.session.commit()

                email_ids.append(player.email);
                body_text += player.firstname + ' ' + player.lastname + ' : ' + '$' + str(player.balance) + '\r\n'

        body_text += '\nBalances of absent players are as follows\r\n\n'

        for absent_player in absent_players:
            if day == "Saturday":
                absent_player.saturdayAbsentWeeks -= 1
                if absent_player.saturdayAbsentWeeks <= 0:
                    absent_player.saturdayAbsentWeeks = 0
                    absent_player.isSaturdayAbsent = False
            elif day == "Sunday":
                absent_player.sundayAbsentWeeks -= 1
                if absent_player.sundayAbsentWeeks <= 0:
                    absent_player.sundayAbsentWeeks = 0
                    absent_player.isSundayAbsent = False
            db.session.commit()

            email_ids.append(absent_player.email)
            body_text += absent_player.firstname + ' ' + absent_player.lastname + ' : ' + '$' + str(absent_player.balance) + '\r\n'

        """Check if user is absent in future, if so set the absent weeks, absent flag
            and set future absent weeks to zero"""
        for player in players:
            future_absent_weeks = (player.futureSundayAbsentWeeks,
                                   player.futureSaturdayAbsentWeeks)[day == "Saturday"]
            if future_absent_weeks > 0:
                if day == "Saturday":
                    player.futureSaturdayAbsentWeeks = 0
                    player.isSaturdayAbsent = True
                    player.saturdayAbsentWeeks = future_absent_weeks
                elif day == "Sunday":
                    player.futureSundayAbsentWeeks = 0
                    player.isSundayAbsent = True
                    player.sundayAbsentWeeks = future_absent_weeks
            db.session.commit()

        body_text += '\nThanks\r\nSydney Badminton Group'
        # SendGrid.send_email(email_ids, "*****@*****.**",
        #                     "Badminton: Balances after " + day + "'s play", body_text)

        return