Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix settle up calculation #40

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Data/Data/Router/AppRoute.swift
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public enum AppRoute: Hashable {
case JoinMemberView
case GroupSettingView(groupId: String)
case GroupSettleUpView(groupId: String)
case GroupWhoIsPayingView(groupId: String, isPaymentSettled: Bool)
case GroupWhoIsPayingView(groupId: String)
case GroupWhoGettingPaidView(groupId: String, selectedMemberId: String)
case GroupPaymentView(transactionId: String?, groupId: String, payerId: String, receiverId: String, amount: Double)
case TransactionListView(groupId: String)
Expand Down
4 changes: 0 additions & 4 deletions Splito.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
0BF8F99614F85846D78DE106 /* Pods_Splito_SplitoUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C2B9BBF3F71277A6AA5329CB /* Pods_Splito_SplitoUITests.framework */; };
213BA0602C0F465000116130 /* GroupSettleUpRouteView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 213BA05F2C0F465000116130 /* GroupSettleUpRouteView.swift */; };
213BA0662C11B70F00116130 /* HomeRouteViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 213BA0652C11B70F00116130 /* HomeRouteViewModel.swift */; };
214CF8492C2977E10044C188 /* CalculateExpensesFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 214CF8482C2977E10044C188 /* CalculateExpensesFunctions.swift */; };
2156A8B02C24069800CFAB64 /* GroupTransactionsRouteView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2156A8AF2C24069800CFAB64 /* GroupTransactionsRouteView.swift */; };
2177692B2C203160009B3B37 /* GroupTransactionDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2177692A2C203160009B3B37 /* GroupTransactionDetailView.swift */; };
2177692D2C20316B009B3B37 /* GroupTransactionDetailViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2177692C2C20316B009B3B37 /* GroupTransactionDetailViewModel.swift */; };
Expand Down Expand Up @@ -140,7 +139,6 @@
038CCD15E82A4E16A4AD213C /* Pods-Splito-SplitoUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Splito-SplitoUITests.release.xcconfig"; path = "Target Support Files/Pods-Splito-SplitoUITests/Pods-Splito-SplitoUITests.release.xcconfig"; sourceTree = "<group>"; };
213BA05F2C0F465000116130 /* GroupSettleUpRouteView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupSettleUpRouteView.swift; sourceTree = "<group>"; };
213BA0652C11B70F00116130 /* HomeRouteViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeRouteViewModel.swift; sourceTree = "<group>"; };
214CF8482C2977E10044C188 /* CalculateExpensesFunctions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalculateExpensesFunctions.swift; sourceTree = "<group>"; };
2156A8AF2C24069800CFAB64 /* GroupTransactionsRouteView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupTransactionsRouteView.swift; sourceTree = "<group>"; };
2177692A2C203160009B3B37 /* GroupTransactionDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupTransactionDetailView.swift; sourceTree = "<group>"; };
2177692C2C20316B009B3B37 /* GroupTransactionDetailViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupTransactionDetailViewModel.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -577,7 +575,6 @@
D89DBE552B8DE8C600E5F1BD /* Groups */ = {
isa = PBXGroup;
children = (
214CF8482C2977E10044C188 /* CalculateExpensesFunctions.swift */,
D89DBE5A2B8DE97000E5F1BD /* GroupRouteView.swift */,
D88721442B9B2C78009DC5BE /* GroupListView.swift */,
D88721462B9B2C97009DC5BE /* GroupListViewModel.swift */,
Expand Down Expand Up @@ -1012,7 +1009,6 @@
D8302DA02B9F282F005ACA13 /* InviteMemberView.swift in Sources */,
D89684452B722D3400D5F721 /* SplitoApp.swift in Sources */,
21B1C09C2C1C5A050098B4FD /* GroupTransactionListViewModel.swift in Sources */,
214CF8492C2977E10044C188 /* CalculateExpensesFunctions.swift in Sources */,
213BA0602C0F465000116130 /* GroupSettleUpRouteView.swift in Sources */,
D8AC26F72B84B12800CEAAD3 /* LoginView.swift in Sources */,
D8CD952E2BD65F4500407B47 /* ExpenseSplitOptionsViewModel.swift in Sources */,
Expand Down
3 changes: 0 additions & 3 deletions Splito/Localization/Localizable.xcstrings
Original file line number Diff line number Diff line change
Expand Up @@ -473,9 +473,6 @@
},
"you are owed" : {

},
"You are settled up overall." : {

},
"you borrowed" : {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,9 +116,9 @@ public class UserProfileViewModel: BaseViewModel, ObservableObject {
guard let user = preference.user else { return }

var newUser = user
newUser.firstName = firstName.trimming(spaces: .leadingAndTrailing).capitalized
newUser.lastName = lastName.trimming(spaces: .leadingAndTrailing).capitalized
newUser.emailId = email.trimming(spaces: .leadingAndTrailing)
newUser.firstName = firstName.capitalized
newUser.lastName = lastName.capitalized
newUser.emailId = email
newUser.phoneNumber = phoneNumber

let resizedImage = profileImage?.aspectFittedToHeight(200)
Expand Down
4 changes: 2 additions & 2 deletions Splito/UI/Home/Expense/AddExpenseViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -209,15 +209,15 @@ extension AddExpenseViewModel {

if let expense {
var newExpense = expense
newExpense.name = expenseName.trimming(spaces: .leadingAndTrailing).capitalized
newExpense.name = expenseName.capitalized
newExpense.amount = expenseAmount
newExpense.date = Timestamp(date: expenseDate)
newExpense.paidBy = selectedPayer.id
newExpense.splitTo = selectedMembers

updateExpense(expense: newExpense)
} else {
let expense = Expense(name: expenseName.trimming(spaces: .leadingAndTrailing).capitalized, amount: expenseAmount,
let expense = Expense(name: expenseName.capitalized, amount: expenseAmount,
date: Timestamp(date: expenseDate), paidBy: selectedPayer.id,
addedBy: user.id, splitTo: selectedMembers, groupId: groupId)

Expand Down
164 changes: 0 additions & 164 deletions Splito/UI/Home/Groups/CalculateExpensesFunctions.swift

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ class CreateGroupViewModel: BaseViewModel, ObservableObject {
private func createGroup() {
currentState = .loading
let userId = preference.user?.id ?? ""
let group = Groups(name: groupName.trimming(spaces: .leadingAndTrailing).capitalized, createdBy: userId, members: [userId], imageUrl: nil, createdAt: Timestamp())
let group = Groups(name: groupName.capitalized, createdBy: userId, members: [userId], imageUrl: nil, createdAt: Timestamp())

let resizedImage = profileImage?.aspectFittedToHeight(200)
let imageData = resizedImage?.jpegData(compressionQuality: 0.2)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
//

import SwiftUI
import Data
import BaseStyle

struct GroupBalancesView: View {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,16 @@ import Foundation

class GroupBalancesViewModel: BaseViewModel, ObservableObject {

@Inject private var preference: SplitoPreference
@Inject private var groupRepository: GroupRepository
@Inject private var expenseRepository: ExpenseRepository
@Inject private var transactionRepository: TransactionRepository
@Inject var preference: SplitoPreference
@Inject var groupRepository: GroupRepository
@Inject var expenseRepository: ExpenseRepository

@Published var viewState: ViewState = .initial
@Published var memberBalances: [GroupMemberBalance] = []
@Published var memberOwingAmount: [String: Double] = [:]

private let groupId: String
private var groupMemberData: [AppUser] = []
private var transactions: [Transactions] = []

init(groupId: String) {
self.groupId = groupId
Expand Down Expand Up @@ -52,21 +50,10 @@ class GroupBalancesViewModel: BaseViewModel, ObservableObject {
}
} receiveValue: { [weak self] group in
guard let self, let group else { return }
self.fetchTransactions()
self.fetchExpenses(group: group)
}.store(in: &cancelable)
}

private func fetchTransactions() {
transactionRepository.fetchTransactionsBy(groupId: groupId).sink { [weak self] completion in
if case .failure(let error) = completion {
self?.showToastFor(error)
}
} receiveValue: { [weak self] transactions in
self?.transactions = transactions
}.store(in: &cancelable)
}

private func fetchExpenses(group: Groups) {
expenseRepository.fetchExpensesBy(groupId: groupId)
.sink { [weak self] completion in
Expand All @@ -85,7 +72,7 @@ class GroupBalancesViewModel: BaseViewModel, ObservableObject {
}

private func calculateExpenses(expenses: [Expense]) {
let groupMembers = Array(Set(groupMemberData.map { $0.id }))
let groupMembers = Array(Set(expenses.flatMap { $0.splitTo + [$0.paidBy] }))
var memberBalances = groupMembers.map { GroupMemberBalance(id: $0) }

for expense in expenses {
Expand All @@ -106,14 +93,13 @@ class GroupBalancesViewModel: BaseViewModel, ObservableObject {
}
}

memberBalances = processTransactions(transactions: transactions, memberBalances: memberBalances, isSimplify: false)
DispatchQueue.main.async {
self.sortMemberBalances(memberBalances: memberBalances)
}
}

private func calculateExpensesSimply(expenses: [Expense]) {
let groupMembers = Array(Set(groupMemberData.map { $0.id }))
let groupMembers = Array(Set(expenses.flatMap { $0.splitTo + [$0.paidBy] }))
var memberBalances = groupMembers.map { GroupMemberBalance(id: $0) }

for expense in expenses {
Expand All @@ -130,29 +116,10 @@ class GroupBalancesViewModel: BaseViewModel, ObservableObject {
}
}

memberBalances = processTransactions(transactions: transactions, memberBalances: memberBalances, isSimplify: true)
DispatchQueue.main.async { [self] in
sortMemberBalances(memberBalances: settleDebts(balances: memberBalances))
}
}

private func processTransactions(transactions: [Transactions], memberBalances: [GroupMemberBalance], isSimplify: Bool) -> [GroupMemberBalance] {
var memberBalances: [GroupMemberBalance] = memberBalances

for transaction in transactions {
if let payerIndex = memberBalances.firstIndex(where: { $0.id == transaction.payerId }),
let receiverIndex = memberBalances.firstIndex(where: { $0.id == transaction.receiverId }) {
memberBalances[payerIndex].totalOwedAmount += transaction.amount
memberBalances[receiverIndex].totalOwedAmount -= transaction.amount

if !(isSimplify) {
memberBalances[payerIndex].balances[transaction.receiverId, default: 0.0] += transaction.amount
memberBalances[receiverIndex].balances[transaction.payerId, default: 0.0] -= transaction.amount
}
}
DispatchQueue.main.async {
let debts = self.settleDebts(balances: memberBalances)
self.sortMemberBalances(memberBalances: debts)
}

return memberBalances
}

private func settleDebts(balances: [GroupMemberBalance]) -> [GroupMemberBalance] {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ struct GroupSettleUpRouteView: View {
case .GroupSettleUpView(let groupId):
GroupSettleUpView(viewModel: GroupSettleUpViewModel(router: appRoute, groupId: groupId))

case .GroupWhoIsPayingView(let groupId, let isPaymentSettled):
GroupWhoIsPayingView(viewModel: GroupWhoIsPayingViewModel(router: appRoute, groupId: groupId, isPaymentSettled: isPaymentSettled))
case .GroupWhoIsPayingView(let groupId):
GroupWhoIsPayingView(viewModel: GroupWhoIsPayingViewModel(router: appRoute, groupId: groupId))

case .GroupWhoGettingPaidView(let groupId, let selectedMemberId):
GroupWhoGettingPaidView(viewModel: GroupWhoGettingPaidViewModel(router: appRoute,
Expand Down
Loading
Loading