Skip to content

Instantly share code, notes, and snippets.

@koolfreak
Last active July 21, 2023 10:40
Show Gist options
  • Save koolfreak/f582ee14674436468fca80ba9028e9b1 to your computer and use it in GitHub Desktop.
Save koolfreak/f582ee14674436468fca80ba9028e9b1 to your computer and use it in GitHub Desktop.
RLMException, reason: 'Object has been deleted or invalidated.'
struct HomeUIView: View {
@StateObject var transactionModel = TransactionViewModel()
@ObservedResults(ExpenseData.self) var expensesList
@ObservedResults(ExpenseData.self) var expenseWithActiveCashAdvances
@ObservedResults(ExpenseData.self, filter: NSPredicate(format: "txnType == 'income' AND caStatus = 0")) var cashAdvances
var body: some View {
Vstack {
List(expensesList, id: \.uuid) { expense in
}
}
.confirmationDialog("", isPresented: $showDeleteExpenseWarning, actions: {
Button("OK"){
deleteTransaction()
}
}, message: {
Text(deleteExpenseWarming).nunito(17, .bold)
})
.onAppear {
expenseQuery(fromDate: startDate, toDate: endDate)
cashAdvanceQuery()
}
}
func expenseQuery(fromDate: Date, toDate: Date) {
let filterType = filterByCreatedAt ? 1 : 0
var columnFilter: String = "createdAtInteger"
var fromStart = fromDate.startInSeconds()
var toEnd = toDate.endInSeconds()
if filterType == 0 {
columnFilter = "dateTxnNumber"
fromStart = fromDate.startInMillis()
toEnd = toDate.endInMillis()
}
$expensesList.filter = NSPredicate(format: "txnType == 'expense' AND \(columnFilter) BETWEEN %@", [fromStart, toEnd])
$expensesList.sortDescriptor = SortDescriptor(keyPath: "createdAtInteger", ascending: false)
self.totalExpense = expensesList.reduce(0.0) { $0 + $1.amount }.formatCurrency()
}
func deleteTransaction() {
guard let expense = expToDelete else { return }
let _uuid = expense.uuid
$expensesList.remove(expense)
expenseQuery(fromDate: startDate, toDate: endDate)
cashAdvanceQuery()
transactionModel.deleteTxnToServer(uuid: _uuid)
}
func cashAdvanceQuery() {
let totalCashAdvances = cashAdvances.reduce(0.0) { $0 + $1.amount }
totalCashAdvance = totalCashAdvances.formatCurrency()
let activeCashAdvances = cashAdvances.map { $0.uuid }
$expenseWithActiveCashAdvances.filter = NSPredicate(format: "caRefTag IN %@", Array(activeCashAdvances))
let totalCashAdvanceInExpenses = expenseWithActiveCashAdvances.reduce(0.0) { $0 + $1.amount }
remainingCashAdvance = (totalCashAdvances - totalCashAdvanceInExpenses).formatCurrency()
}
func globalSearch(term: String) {
$expensesList.filter = NSPredicate(format: "merchant CONTAINS[cd] %@ OR caNameTag CONTAINS[cd] %@ OR remarks CONTAINS[cd] %@", term, term, term)
$expensesList.sortDescriptor = SortDescriptor(keyPath: "createdAtInteger", ascending: false)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment