Beispiel #1
0
        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));
        }
Beispiel #4
0
        //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()
            });
        }