TDDSetup.swift 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import CoreData
  2. import Foundation
  3. extension Stat.StateModel {
  4. func fetchAndMapDeterminations() async -> [TDD] {
  5. let results = await CoreDataStack.shared.fetchEntitiesAsync(
  6. ofType: OrefDetermination.self,
  7. onContext: determinationFetchContext,
  8. predicate: NSPredicate.determinationsForStats,
  9. key: "deliverAt",
  10. ascending: false,
  11. propertiesToFetch: ["objectID", "timestamp", "deliverAt", "totalDailyDose"]
  12. )
  13. return await determinationFetchContext.perform {
  14. guard let fetchedResults = results as? [[String: Any]] else { return [] }
  15. // Group determinations by day
  16. let calendar = Calendar.current
  17. let groupedByDay = Dictionary(grouping: fetchedResults) { result -> Date in
  18. guard let deliverAt = result["deliverAt"] as? Date else { return Date() }
  19. return calendar.startOfDay(for: deliverAt)
  20. }
  21. // Calculate total daily doses for each day
  22. return groupedByDay.map { date, determinations -> TDD in
  23. let totalDose = determinations.reduce(Decimal.zero) { sum, determination in
  24. sum + (determination["totalDailyDose"] as? Decimal ?? 0)
  25. }
  26. // Calculate average dose for the day
  27. let count = Decimal(determinations.count)
  28. let averageDose = count > 0 ? totalDose / count : 0
  29. return TDD(
  30. totalDailyDose: averageDose,
  31. timestamp: date
  32. )
  33. }
  34. .sorted { ($0.timestamp ?? Date()) > ($1.timestamp ?? Date()) }
  35. }
  36. }
  37. }