def share_expense_with_group_members(sw: Splitwise, desc, cost, group_id, date): grp = sw.getGroup(group_id) current_user = sw.getCurrentUser() other_members = [m for m in grp.getMembers() if m.id != current_user.id] _debug(current_user) _debug(other_members) cost_per_user = round(cost / len(grp.members), 2) expense = Expense() expense.cost = f"{cost}" expense.description = f"{desc}" expense.group_id = f"{group_id}" expense.setDate(date.strftime("%Y/%m/%d")) users = [] for om in other_members: user = ExpenseUser() user.setId(om.id) user.setPaidShare(f"0") user.setOwedShare(f"{cost_per_user}") users.append(user) user = ExpenseUser() user.setId(current_user.id) user.setPaidShare(f"{cost}") user.setOwedShare(f"{cost - len(users) * cost_per_user}") users.append(user) expense.users = users sw.createExpense(expense)
def import_expenses(self): try: row = int(self.le_initial_row.text()) - 1 description_col = int(self.le_description_col.text()) - 1 date_col = int(self.le_date_col.text()) - 1 default_date = self.default_date.date() date_format = self.le_date_format.text() percent = 1.0 / len(list(self.current_group.getMembers())) while self.model.item(row) is not None: print("Row ", row) expense = Expense() expense.setDescription( self.model.item(row, description_col).text()) print("Expense: ", expense.getDescription()) date = QDate.fromString( self.model.item(row, date_col).text(), date_format) if not date.isValid(): date = default_date expense.setDate(date.toString(Qt.ISODate)) print("Date: ", expense.getDate()) cost = 0 users = [] for member in self.current_group.getMembers(): print("Processing member ", member.getFirstName()) member_column = int( self.member_widget_map[member.getId()].text()) - 1 paid = 0 try: paid = float( self.model.item(row, member_column).text()) print("Expense: ", self.model.item(row, member_column).text()) except: pass cost = cost + paid expense_user = ExpenseUser() expense_user.setId(member.getId()) expense_user.setPaidShare(str(paid)) users.append(expense_user) for expense_user in users: expense_user.setOwedShare(str(cost * percent)) if cost == 0: raise Exception( self.tr('No se ha introducido monto para el gasto')) expense.setCost(str(cost)) expense.setUsers(users) expense.setGroupId(self.current_group.id) self.sObj.createExpense(expense) row = row + 1 self.le_initial_row.setText(str(row + 1)) except Exception as inst: QMessageBox.critical( self, self.tr("Error"), self.tr("Se ha producido un error en la fila") + str(row + 1) + "\n" + str(inst)) traceback.print_exc()
def transaction(Description, Group, Payer, Price, Contributors): # price, date, description, group ID or this particular groups name, members sObj = Splitwise(consumer_key, secret_key) sObj.setAccessToken(session['access_token']) user = sObj.getCurrentUser() groups = sObj.getGroups() group_dict = {group.getName(): group for group in groups} importedData = {'Date': datetime.datetime.now(), 'Description': Description, 'Group': Group, 'Payer': Payer, 'Debit': Price} expense = Expense() price = float(importedData['Debit'] or 0) expense.setCost(price) expense.setDate(importedData['Date']) expense.setDescription(importedData['Description']) expense.setGroupId(group_dict[importedData['Group']].getId()) members = group_dict[importedData['Group']].getMembers() users = [] contributors = Contributors for member in members: if member.getFirstName() in contributors: user = ExpenseUser() user.setId(member.getId()) if member.getFirstName() == importedData['Payer']: user.setPaidShare(price) else: user.setPaidShare(0) users.append(user) paid = 0 share = round(price/len(users), 2) for user in users: user.setOwedShare(share) paid = paid + share diff = price - paid if diff != 0: user = random.choice(users) user.setOwedShare(share + diff) expense.setUsers(users) expense = sObj.createExpense(expense)
def submission(): global df # TODO: add checks beforehand whether the user has clicked on all checkboxes # print(request.form) sObj = Splitwise(Config.consumer_key,Config.consumer_secret) sObj.setAccessToken(session['access_token']) saleh = ExpenseUser() saleh.setId(2242086) paypal = ExpenseUser() paypal.setId(18572820) nuraini = ExpenseUser() nuraini.setId(2705458) for key in request.form: if not is_number(key): continue value = request.form[key] if value == 'Payment': continue # we dont handle payments yet print(key, value) amount = df.iloc[int(float(key))]['Amount'] users = [] users.append(saleh) users.append(paypal) users.append(nuraini) saleh.setPaidShare('0.00') nuraini.setPaidShare('0.00') paypal.setPaidShare('0.00') saleh.setOwedShare('0.00') nuraini.setOwedShare('0.00') paypal.setOwedShare('0.00') expense = Expense() expense.setUsers(users) expense.setGroupId(6456733) expense.setCost(str(abs(float(amount)))) expense.setDescription(df.iloc[int(float(key))]['Description']) try: expense.setDate(datetime.datetime.strptime(df.iloc[int(float(key))]['Trans Date'], '%m/%d/%Y').strftime('%d/%m/%Y')) except: expense.setDate(datetime.datetime.strptime(df.iloc[int(float(key))]['Trans Date'], '%m/%d/%y').strftime('%d/%m/%Y')) # case where a transaction is refunded if float(amount) > 0: if value == 'Saleh': paypal.setOwedShare(str(abs(float(amount)))) saleh.setPaidShare(str(abs(float(amount)))) elif value == 'Nuraini': paypal.setOwedShare(str(abs(float(amount)))) nuraini.setPaidShare(str(abs(float(amount)))) expense = sObj.createExpense(expense) continue # case for expenses if value == 'Saleh': saleh.setOwedShare(str(abs(float(amount)))) paypal.setPaidShare(str(abs(float(amount)))) expense = sObj.createExpense(expense) elif value == 'Nuraini': nuraini.setOwedShare(str(abs(float(amount)))) paypal.setPaidShare(str(abs(float(amount)))) expense = sObj.createExpense(expense) elif value == 'Half-Split': half = round(abs(float(amount))/2,2) other_half = abs(float(amount))-half nuraini.setOwedShare(half) saleh.setOwedShare(other_half) paypal.setPaidShare(str(abs(float(amount)))) expense = sObj.createExpense(expense) elif value == 'Share': continue return redirect(url_for("success"))
def main(): if 'access_token' in session: sObj.setAccessToken(session['access_token']) user = sObj.getCurrentUser() friends = sObj.getFriends() friends_dict = {friend.getFirstName():friend.getId() for friend in friends} groups = sObj.getGroups() group_list = [group.getName() for group in groups] group_id = [group.getId() for group in groups] group_dict = {group.getName():group for group in groups} with open(CSV_FILE_LOCATION, encoding='utf-8-sig') as data: importedData = list(csv.DictReader(data)) # print(importedData) ##### Vet csv before proceeding ##### for i, row in enumerate(importedData): if not (row.get('Debit') and row.get('Payer') and row.get('Group')): return f"Remove blanks on row {i+1} in your CSV and try again." with open(DB) as db_json: db = json.load(db_json) msg = [] # Begin loop reading the CSV for row in importedData: rowstring = f"{row.get('Date')}, {row.get('Debit')}, {row.get('Description')}, {row.get('Group')}, {row.get('Payer')}" rsbytes = bytes(rowstring, 'utf-8') hash_obj = hashlib.sha256(rsbytes) hex_dig = hash_obj.hexdigest() # print(hex_dig) if hex_dig in db: msg.append(f"{rowstring} looks like a duplicate, skipping") continue else: db[hex_dig] = "True" expense = Expense() price = float(row['Debit'] or 0) expense.setCost(price) expense.setDate(row['Date']) expense.setDescription(row['Description']) expense.setGroupId(group_dict[row['Group']].getId()) members = group_dict[row['Group']].getMembers() users = [] for member in members: user = ExpenseUser() user.setId(member.getId()) if member.getFirstName() == row['Payer']: user.setPaidShare(price) else: user.setPaidShare(0) users.append(user) paid = 0 share = round(price/len(users),2) for user in users: user.setOwedShare(share) paid = paid + share diff = price - paid if diff != 0: user = random.choice(users) user.setOwedShare(share + diff) expense.setUsers(users) expense = sObj.createExpense(expense) msg.append('Import successful!') with open(DB, 'w') as outfile: json.dump(db, outfile) msg.append('New entries recorded in db.') message = "<br>".join(msg) return message return 'User is not logged in'