Determination+helper.swift 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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 Determination {
  13. var minPredBGFromReason: Decimal? {
  14. // Split reason into parts by semicolon and get first part
  15. let reasonParts = reason.components(separatedBy: "; ").first?.components(separatedBy: ", ") ?? []
  16. // Find the part that contains "minPredBG"
  17. if let minPredBGPart = reasonParts.first(where: { $0.contains("minPredBG") }) {
  18. // Extract the number after "minPredBG"
  19. let components = minPredBGPart.components(separatedBy: "minPredBG ")
  20. if let valueComponent = components.dropFirst().first {
  21. // Get everything after "minPredBG " and convert to Decimal
  22. let valueString = valueComponent.trimmingCharacters(in: CharacterSet(charactersIn: "0123456789.-").inverted)
  23. return Decimal(string: valueString)
  24. }
  25. }
  26. return nil
  27. }
  28. }
  29. extension OrefDetermination {
  30. var reasonParts: [String] {
  31. reason?.components(separatedBy: "; ").first?.components(separatedBy: ", ") ?? []
  32. }
  33. var reasonConclusion: String {
  34. reason?.components(separatedBy: "; ").last ?? ""
  35. }
  36. var minPredBGFromReason: Decimal? {
  37. // Find the part that contains "minPredBG"
  38. if let minPredBGPart = reasonParts.first(where: { $0.contains("minPredBG") }) {
  39. // Extract the number after "minPredBG"
  40. let components = minPredBGPart.components(separatedBy: "minPredBG ")
  41. if let valueComponent = components.dropFirst().first {
  42. // Get everything after "minPredBG " and convert to Decimal
  43. let valueString = valueComponent.trimmingCharacters(in: CharacterSet(charactersIn: "0123456789.-").inverted)
  44. return Decimal(string: valueString)
  45. }
  46. }
  47. return nil
  48. }
  49. }
  50. extension NSPredicate {
  51. static var enactedDetermination: NSPredicate {
  52. let date = Date.halfHourAgo
  53. return NSPredicate(format: "enacted == %@ AND timestamp >= %@", true as NSNumber, date as NSDate)
  54. }
  55. static var determinationsForCobIobCharts: NSPredicate {
  56. let date = Date.oneDayAgo
  57. return NSPredicate(format: "deliverAt >= %@", date as NSDate)
  58. }
  59. static var enactedDeterminationsNotYetUploadedToNightscout: NSPredicate {
  60. NSPredicate(
  61. format: "deliverAt >= %@ AND isUploadedToNS == %@ AND enacted == %@",
  62. Date.oneDayAgo as NSDate,
  63. false as NSNumber,
  64. true as NSNumber
  65. )
  66. }
  67. static var suggestedDeterminationsNotYetUploadedToNightscout: NSPredicate {
  68. NSPredicate(
  69. format: "deliverAt >= %@ AND isUploadedToNS == %@ AND (enacted == %@ OR enacted == nil OR enacted != %@)",
  70. Date.oneDayAgo as NSDate,
  71. false as NSNumber,
  72. true as NSNumber,
  73. true as NSNumber
  74. )
  75. }
  76. static var determinationsForStats: NSPredicate {
  77. let date = Date.threeMonthsAgo
  78. return NSPredicate(format: "deliverAt >= %@", date as NSDate)
  79. }
  80. }