async Task ExecuteLoadUsersCommand() { if (IsBusy) { return; } IsBusy = true; try { UserDebts.Clear(); var userDebts = await App.Database.GetUserDebtsAsync(); foreach (var debt in userDebts) { UserDebts.Add(debt); } } catch (Exception e) { Debug.WriteLine(e); } finally { IsBusy = false; } }
private List <Debt> ResolveDebts(UserDebts userDebts) { List <Debt> resolvedList = new List <Debt>(); foreach (var item in userDebts) { if (resolvedList.Any(x => x.Borrower == item.Debtor && x.Debtor == item.Borrower)) { continue; } var debts = userDebts.GetDebts().Where(x => x.Borrower == item.Debtor && x.Debtor == item.Borrower).ToList(); if (debts.Count > 0) { if (debts.First().Amount > item.Amount) { debts.First().Amount -= item.Amount; resolvedList.Add(debts.First()); } else if (debts.First().Amount < item.Amount) { item.Amount -= debts.First().Amount; resolvedList.Add(item); } } else { resolvedList.Add(item); } } return(resolvedList); }
public List <Debt> GetUserDebtsByGroupPerUrersAsync(GroupDTO group) { var userDebts = new UserDebts(); var users = group.Users.ToList(); foreach (var u in users) { var userPayments = group.Operations.Where(x => x.Owner.Id == u.Id) .Sum(x => x.Amount); if ((userPayments / users.Count) > 0) { var debtors = users.Where(x => x.Id != u.Id); foreach (var d in debtors) { userDebts.Add(u.Name, Math.Round((userPayments / users.Count), 2), d.Name); } } } return(ResolveDebts(userDebts)); }
//public async Task<DatabaseResult> UpdateUser(GroupUser user) //{ // try // { // var userTo = await GetGroupUserById(bill.UserIdTo); // var userFrom = await GetGroupUserById(bill.UserIdFrom); // userTo.Bills[userTo.Bills.FindIndex(i => i.Id == bill.Id)] = bill; // userFrom.Bills[userFrom.Bills.FindIndex(i => i.Id == bill.Id)] = bill; // await Database.UpdateAsync(bill); // await Database.UpdateWithChildrenAsync(userTo); // await Database.UpdateWithChildrenAsync(userFrom); // } // catch (Exception e) // { // return new DatabaseResult() // { // Success = false, // StatusMessage = e.Message, // Exception = e // }; // } // return new DatabaseResult() // { // Success = true, // StatusMessage = $"Bill {user.Name} has been successfully updated" // }; //} public async Task <DatabaseResult> AddBillAsync(Bill bill) { try { bill.Id = Guid.NewGuid().ToString(); await Database.InsertAsync(bill); var userTo = await GetGroupUserByIdAsync(bill.UserIdTo); var userFrom = await GetGroupUserByIdAsync(bill.UserIdFrom); if (userTo == null || userFrom == null) { throw new Exception("One or more selected users don't exist"); } userTo.Bills.Add(bill); userFrom.Bills.Add(bill); await Database.UpdateWithChildrenAsync(userTo); await Database.UpdateWithChildrenAsync(userFrom); var userDebts = await Database.Table <UserDebts>().ToListAsync(); //From the current user to another user if (bill.UserIdFrom == App.User.Id) { var debt = userDebts.Where(d => d.UserId == bill.UserIdTo).SingleOrDefault(); if (debt == null) { debt = new UserDebts() { UserId = bill.UserIdTo, OwedFromUser = 0, OwedToUser = 0, Username = userTo.Name }; await Database.InsertAsync(debt); } debt.OwedFromUser = debt.OwedFromUser + bill.Amount; await Database.UpdateAsync(debt); } //From another user to the current user else if (bill.UserIdTo == App.User.Id) { var debt = userDebts.Where(d => d.UserId == bill.UserIdFrom).SingleOrDefault(); if (debt == null) { debt = new UserDebts() { UserId = bill.UserIdFrom, OwedFromUser = 0, OwedToUser = 0, Username = userTo.Name }; await Database.InsertAsync(debt); } debt.OwedToUser = debt.OwedToUser + bill.Amount; await Database.UpdateAsync(debt); } } catch (Exception e) { return(new DatabaseResult() { Success = false, StatusMessage = e.Message, Exception = e }); } return(new DatabaseResult() { Success = true, StatusMessage = $"Bill {bill.Id} has been successfully submitted", ObjectId = bill.Id.ToString() }); }