Determination+helper.swift 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import CoreData
  2. import Foundation
  3. extension OrefDetermination {
  4. static func fetch(_ predicate: NSPredicate = .predicateForOneDayAgo) -> NSFetchRequest<OrefDetermination> {
  5. let request = OrefDetermination.fetchRequest()
  6. request.sortDescriptors = [NSSortDescriptor(keyPath: \OrefDetermination.deliverAt, ascending: false)]
  7. request.predicate = predicate
  8. request.fetchLimit = 1
  9. return request
  10. }
  11. }
  12. extension OrefDetermination {
  13. var reasonParts: [String] {
  14. reason?.components(separatedBy: "; ").first?.components(separatedBy: ", ") ?? []
  15. }
  16. var reasonConclusion: String {
  17. reason?.components(separatedBy: "; ").last ?? ""
  18. }
  19. var minPredBGFromReason: Decimal? {
  20. // Find the part that contains "minPredBG"
  21. if let minPredBGPart = reasonParts.first(where: { $0.contains("minPredBG") }) {
  22. // Extract the number after "minPredBG"
  23. let components = minPredBGPart.components(separatedBy: "minPredBG ")
  24. if let valueComponent = components.dropFirst().first {
  25. // Get everything after "minPredBG " and convert to Decimal
  26. let valueString = valueComponent.trimmingCharacters(in: CharacterSet(charactersIn: "0123456789.-").inverted)
  27. return Decimal(string: valueString)
  28. }
  29. }
  30. return nil
  31. }
  32. }
  33. extension NSPredicate {
  34. static var enactedDetermination: NSPredicate {
  35. let date = Date.halfHourAgo
  36. return NSPredicate(format: "enacted == %@ AND timestamp >= %@", true as NSNumber, date as NSDate)
  37. }
  38. static var determinationsForCobIobCharts: NSPredicate {
  39. let date = Date.oneDayAgo
  40. return NSPredicate(format: "deliverAt >= %@", date as NSDate)
  41. }
  42. static var enactedDeterminationsNotYetUploadedToNightscout: NSPredicate {
  43. NSPredicate(
  44. format: "deliverAt >= %@ AND isUploadedToNS == %@ AND enacted == %@",
  45. Date.oneDayAgo as NSDate,
  46. false as NSNumber,
  47. true as NSNumber
  48. )
  49. }
  50. static var suggestedDeterminationsNotYetUploadedToNightscout: NSPredicate {
  51. NSPredicate(
  52. format: "deliverAt >= %@ AND isUploadedToNS == %@ AND (enacted == %@ OR enacted == nil OR enacted != %@)",
  53. Date.oneDayAgo as NSDate,
  54. false as NSNumber,
  55. true as NSNumber,
  56. true as NSNumber
  57. )
  58. }
  59. static var determinationsForStats: NSPredicate {
  60. let date = Date.threeMonthsAgo
  61. return NSPredicate(format: "deliverAt >= %@", date as NSDate)
  62. }
  63. }