Aug 25 - Implement new function allow Director (internal & customer) to assign and inspection to another inspector
This commit is contained in:
@@ -302,6 +302,12 @@ struct APIInspectionSummary: Decodable, Identifiable, Hashable, Sendable {
|
|||||||
let followUpRequired: Bool
|
let followUpRequired: Bool
|
||||||
let followUpNote: String?
|
let followUpNote: String?
|
||||||
let parentInspectionId: Int?
|
let parentInspectionId: Int?
|
||||||
|
/// phase53 — who was asked to perform the follow-up. nil means it belongs
|
||||||
|
/// to the inspection's own inspector, which is what it always meant.
|
||||||
|
/// The list endpoint already returns only follow-ups this user OWNS, so
|
||||||
|
/// these are for display, not filtering.
|
||||||
|
let followUpAssignedTo: Int?
|
||||||
|
let followUpAssignedToName: String?
|
||||||
|
|
||||||
/// Form field values as [fieldId: stringValue] for the grid renderer.
|
/// Form field values as [fieldId: stringValue] for the grid renderer.
|
||||||
var formValues: [String: String] {
|
var formValues: [String: String] {
|
||||||
@@ -368,6 +374,8 @@ struct APIInspectionSummary: Decodable, Identifiable, Hashable, Sendable {
|
|||||||
followUpRequired = (try? c.decode(Bool.self, forKey: .followUpRequired)) ?? false
|
followUpRequired = (try? c.decode(Bool.self, forKey: .followUpRequired)) ?? false
|
||||||
followUpNote = try? c.decode(String.self, forKey: .followUpNote)
|
followUpNote = try? c.decode(String.self, forKey: .followUpNote)
|
||||||
parentInspectionId = try? c.decode(Int.self, forKey: .parentInspectionId)
|
parentInspectionId = try? c.decode(Int.self, forKey: .parentInspectionId)
|
||||||
|
followUpAssignedTo = try? c.decode(Int.self, forKey: .followUpAssignedTo)
|
||||||
|
followUpAssignedToName = try? c.decode(String.self, forKey: .followUpAssignedToName)
|
||||||
}
|
}
|
||||||
private enum CodingKeys: String, CodingKey {
|
private enum CodingKeys: String, CodingKey {
|
||||||
case id, templateId, templateName, facilityId, facilityName
|
case id, templateId, templateName, facilityId, facilityName
|
||||||
@@ -376,6 +384,7 @@ struct APIInspectionSummary: Decodable, Identifiable, Hashable, Sendable {
|
|||||||
case formData, formSchema
|
case formData, formSchema
|
||||||
case formMedia
|
case formMedia
|
||||||
case followUpRequired, followUpNote, parentInspectionId
|
case followUpRequired, followUpNote, parentInspectionId
|
||||||
|
case followUpAssignedTo, followUpAssignedToName
|
||||||
}
|
}
|
||||||
|
|
||||||
// Explicit Hashable — formDataRaw/formSchemaRaw contain JSONValue which
|
// Explicit Hashable — formDataRaw/formSchemaRaw contain JSONValue which
|
||||||
|
|||||||
@@ -49,6 +49,15 @@ final class LocalFollowUpRequest {
|
|||||||
/// Stored raw; read through `note` for the normalised form.
|
/// Stored raw; read through `note` for the normalised form.
|
||||||
var followUpNote: String?
|
var followUpNote: String?
|
||||||
|
|
||||||
|
/// Display name of the inspector this follow-up was handed to, when it was
|
||||||
|
/// assigned to somebody other than whoever performed the original
|
||||||
|
/// inspection (phase53). nil = it belongs to the original inspector.
|
||||||
|
///
|
||||||
|
/// Purely for display — the server only ever returns follow-ups this user
|
||||||
|
/// owns, so nothing here decides what is shown. Optional so existing
|
||||||
|
/// SwiftData stores migrate lightweight (rule 8).
|
||||||
|
var assignedToName: String?
|
||||||
|
|
||||||
/// Set on device the moment a re-inspection of this request is submitted, so
|
/// Set on device the moment a re-inspection of this request is submitted, so
|
||||||
/// the FOLLOW-UP REQUESTED lists hide the row immediately — online or
|
/// the FOLLOW-UP REQUESTED lists hide the row immediately — online or
|
||||||
/// offline — without waiting for the round trip.
|
/// offline — without waiting for the round trip.
|
||||||
@@ -128,6 +137,7 @@ final class LocalFollowUpRequest {
|
|||||||
self.overallScore = api.overallScore
|
self.overallScore = api.overallScore
|
||||||
self.inspectionDateString = api.inspectionDate ?? ""
|
self.inspectionDateString = api.inspectionDate ?? ""
|
||||||
self.followUpNote = api.followUpNote
|
self.followUpNote = api.followUpNote
|
||||||
|
self.assignedToName = api.followUpAssignedToName
|
||||||
self.fulfilledLocally = false
|
self.fulfilledLocally = false
|
||||||
self.parentFormDataJSON = Self.encode(api)
|
self.parentFormDataJSON = Self.encode(api)
|
||||||
self.updatedAt = Date()
|
self.updatedAt = Date()
|
||||||
@@ -170,6 +180,7 @@ final class LocalFollowUpRequest {
|
|||||||
self.overallScore = api.overallScore
|
self.overallScore = api.overallScore
|
||||||
self.inspectionDateString = api.inspectionDate ?? ""
|
self.inspectionDateString = api.inspectionDate ?? ""
|
||||||
self.followUpNote = api.followUpNote
|
self.followUpNote = api.followUpNote
|
||||||
|
self.assignedToName = api.followUpAssignedToName
|
||||||
self.parentFormDataJSON = Self.encode(api)
|
self.parentFormDataJSON = Self.encode(api)
|
||||||
// The server is authoritative. Being returned by the pull at all means
|
// The server is authoritative. Being returned by the pull at all means
|
||||||
// the follow-up is still outstanding, so any local "just did it" flag is
|
// the follow-up is still outstanding, so any local "just did it" flag is
|
||||||
|
|||||||
@@ -111,6 +111,22 @@ struct FollowUpRow: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Assigned to somebody other than whoever ran the original
|
||||||
|
// inspection (phase53). The endpoint only returns follow-ups
|
||||||
|
// this user owns, so seeing this badge means "you were given
|
||||||
|
// this one" — worth calling out, because it is NOT the usual
|
||||||
|
// case of re-inspecting your own work.
|
||||||
|
if request.assignedToName != nil {
|
||||||
|
HStack(spacing: 4) {
|
||||||
|
Image(systemName: "person.crop.circle.badge.checkmark")
|
||||||
|
.font(.caption2)
|
||||||
|
Text("Assigned to you")
|
||||||
|
.font(.caption2.weight(.semibold))
|
||||||
|
}
|
||||||
|
.foregroundStyle(.orange)
|
||||||
|
.padding(.top, 1)
|
||||||
|
}
|
||||||
|
|
||||||
// Note preview — so the inspector can see there is something to
|
// Note preview — so the inspector can see there is something to
|
||||||
// read before committing to the tap. Truncated to one line; the
|
// read before committing to the tap. Truncated to one line; the
|
||||||
// full text is shown on the start screen. Mirrors the
|
// full text is shown on the start screen. Mirrors the
|
||||||
|
|||||||
Reference in New Issue
Block a user