{"openapi":"3.1.0","info":{"title":"Curcle Public API","version":"1.0.0","description":"Public REST API for Curcle. Authenticate with `Authorization: Bearer <api-key>` and obtain keys from your account admin."},"servers":[{"url":"/api/public/v1","description":"Public API v1 — bearer-authenticated REST endpoints"}],"tags":[{"name":"health","description":"Health operations"},{"name":"signup","description":"Public no-card trial signup and legacy checkout status"},{"name":"customer-portal","description":"Customer portal invitation management and activation"},{"name":"customers","description":"Customer management"},{"name":"sites","description":"Site management"},{"name":"jobs","description":"Service job management"},{"name":"appliances","description":"Appliance test records"},{"name":"reports","description":"Report generation and management"},{"name":"dashboard","description":"Dashboard and analytics"},{"name":"materials","description":"Materials and parts catalog"},{"name":"engineer-stock","description":"Engineer stock levels"},{"name":"job-materials","description":"Materials used on jobs"},{"name":"purchase-orders","description":"Purchase order management"},{"name":"suppliers","description":"Supplier management"},{"name":"Storage","description":"Object storage upload and serving endpoints."},{"name":"public-api","description":"Versioned bearer-authenticated API for external integrations."},{"name":"admin-imports","description":"Tenant-scoped administrator spreadsheet imports, saved drafts, and protected undo."}],"paths":{"/me":{"get":{"operationId":"getPublicApiKeyIdentity","tags":["public-api"],"summary":"Identify the calling API key","description":"Returns the non-secret identity, scope grants and optional customer restriction for the bearer token.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"API key identity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiIdentityResponse"}}}},"401":{"description":"Missing, invalid, revoked or expired bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}}}}},"/jobs":{"get":{"operationId":"listPublicApiJobs","tags":["public-api"],"summary":"List jobs visible to the calling API key","description":"Returns the latest jobs in reverse creation order. Customer-bound keys only see jobs for their bound customer.","security":[{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","description":"Number of records to return (defaults to 50 and is capped at 200).","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"offset","in":"query","description":"Number of records to skip.","schema":{"type":"integer","minimum":0,"default":0}},{"name":"status","in":"query","description":"Exact job status filter.","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated job summaries","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiJobListResponse"}}}},"400":{"description":"Invalid limit or offset","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, revoked or expired bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key does not have the read:jobs scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}}}}},"/jobs/{id}":{"get":{"operationId":"getPublicApiJob","tags":["public-api"],"summary":"Get one job and its appliance records","description":"Returns a job only when it belongs to the API key's tenant and, for customer-bound keys, its customer.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Job detail with appliances","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiJobDetail"}}}},"400":{"description":"Invalid job id","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, revoked or expired bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key does not have the read:jobs scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Job not found in the API key's visibility scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}}}}},"/invoices":{"get":{"operationId":"listPublicApiInvoices","tags":["public-api"],"summary":"List invoices visible to the calling API key","description":"Returns invoice records in reverse creation order. Customer-bound keys only see invoices for their bound customer.","security":[{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","description":"Number of records to return (defaults to 50 and is capped at 200).","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"offset","in":"query","description":"Number of records to skip.","schema":{"type":"integer","minimum":0,"default":0}},{"name":"status","in":"query","description":"Exact invoice status filter.","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated invoice records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiInvoiceListResponse"}}}},"400":{"description":"Invalid limit or offset","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, revoked or expired bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key does not have the read:invoices scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}}}}},"/certificates":{"get":{"operationId":"listPublicApiCertificates","tags":["public-api"],"summary":"List certificates (reports) visible to the calling API key","description":"Returns released certificate links for visible jobs. Customer-bound keys only see certificates for their bound customer.","security":[{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","description":"Number of records to return (defaults to 50 and is capped at 200).","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"offset","in":"query","description":"Number of records to skip.","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Paginated certificate links","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiCertificateListResponse"}}}},"400":{"description":"Invalid limit or offset","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, revoked or expired bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key does not have the read:certificates scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}}}}},"/customers":{"get":{"operationId":"listPublicApiCustomers","tags":["public-api"],"summary":"List customers visible to the calling API key","description":"Returns customers visible to an admin-scoped API key. Customer-bound keys receive their one customer record when it exists.","security":[{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","description":"Number of records to return for an admin key (defaults to 50 and is capped at 200).","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}}],"responses":{"200":{"description":"Customer list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiCustomerListResponse"}}}},"400":{"description":"Invalid limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, revoked or expired bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key does not have the read:customers scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}}}}},"/healthz":{"get":{"operationId":"publicApiHealthCheck","tags":["public-api"],"summary":"Public API health check","description":"Check the public API route without exposing tenant data. This endpoint still requires a valid bearer token.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Public API is available","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiHealthResponse"}}}},"401":{"description":"Missing, invalid, revoked or expired bearer token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API key","description":"Issue keys from Admin → API Keys."}},"headers":{"RateLimitLimit":{"description":"Maximum requests allowed in the current one-minute window.","schema":{"type":"integer","minimum":1}},"RateLimitRemaining":{"description":"Requests remaining in the current one-minute window.","schema":{"type":"integer","minimum":0}},"RateLimitReset":{"description":"Unix timestamp (seconds) when the current rate-limit window resets.","schema":{"type":"integer","minimum":0}},"RetryAfter":{"description":"Seconds to wait before retrying after a 429 response.","schema":{"type":"integer","minimum":1}}},"schemas":{"AssetServiceOverview":{"type":"object","required":["job","canReview","canWrite","visits","availableAssets","templates","proposals","submissions","history","summary"],"properties":{"job":{"type":"object","additionalProperties":true},"canReview":{"type":"boolean"},"canWrite":{"type":"boolean"},"visits":{"type":"array","items":{"type":"object","additionalProperties":true}},"availableAssets":{"type":"array","items":{"type":"object","additionalProperties":true}},"templates":{"type":"array","items":{"type":"object","additionalProperties":true}},"proposals":{"type":"array","items":{"type":"object","additionalProperties":true}},"submissions":{"type":"array","items":{"type":"object","additionalProperties":true}},"history":{"type":"array","items":{"type":"object","additionalProperties":true}},"summary":{"type":"object","additionalProperties":{"type":"integer"}}}},"ServiceAssetChanges":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"description":{"type":"string","minLength":1,"maxLength":300},"location":{"type":"string","nullable":true,"maxLength":200},"manufacturer":{"type":"string","nullable":true,"maxLength":200},"model":{"type":"string","nullable":true,"maxLength":200},"serialNumber":{"type":"string","nullable":true,"maxLength":200},"retestPeriodMonths":{"type":"integer","minimum":1,"maximum":120,"multipleOf":1}}},"PoReceiptReviewInput":{"type":"object","additionalProperties":false,"required":["requestId","reason","attachmentIds","stockAlreadyAccounted","outcome","lines"],"properties":{"requestId":{"type":"string","format":"uuid"},"reason":{"type":"string","minLength":10,"maxLength":2000},"attachmentIds":{"type":"array","minItems":1,"maxItems":10,"uniqueItems":true,"items":{"type":"integer","minimum":1}},"stockAlreadyAccounted":{"type":"boolean","enum":[true]},"outcome":{"type":"string","enum":["confirmed_received","outstanding"]},"snapshot":{"type":"string","pattern":"^[a-f0-9]{64}$"},"lines":{"type":"array","minItems":1,"maxItems":1000,"items":{"type":"object","additionalProperties":false,"required":["lineIndex","receivedQuantity"],"properties":{"lineIndex":{"type":"integer","minimum":0,"maximum":999},"receivedQuantity":{"type":"string","pattern":"^(0|[1-9][0-9]{0,6})(\\.[0-9]{1,4})?$"}}}}}},"PoReceiptReviewState":{"type":"object","required":["status","receivedDate","receiptDateVerified","lineItems"],"properties":{"status":{"type":"string"},"receivedDate":{"type":["string","null"]},"receiptDateVerified":{"type":"boolean"},"lineItems":{"type":"array","items":{"type":"object","required":["partNumber","description","quantity","unitPrice","total"],"properties":{"materialId":{"type":"integer"},"partNumber":{"type":"string"},"description":{"type":"string"},"quantity":{"type":"string"},"receivedQuantity":{"type":"string"},"unitPrice":{"type":"string"},"total":{"type":"string"}}}}}},"PoReceiptReviewEvidence":{"type":"object","required":["id","fileName","filePath","contentType","fileSize","createdAt","objectGeneration","contentHash"],"properties":{"id":{"type":"integer"},"fileName":{"type":"string"},"filePath":{"type":"string"},"contentType":{"type":["string","null"]},"fileSize":{"type":["integer","null"]},"objectGeneration":{"type":"string"},"contentHash":{"type":["string","null"]},"createdAt":{"type":"string"}}},"PoReceiptReviewPreview":{"type":"object","required":["snapshot","beforeState","afterState","evidence","stockEffect","dateEffect"],"properties":{"snapshot":{"type":"string"},"beforeState":{"$ref":"#/components/schemas/PoReceiptReviewState"},"afterState":{"$ref":"#/components/schemas/PoReceiptReviewState"},"evidence":{"type":"array","items":{"$ref":"#/components/schemas/PoReceiptReviewEvidence"}},"stockEffect":{"type":"string","enum":["none"]},"dateEffect":{"type":"string","enum":["unchanged_unverified"]}}},"PoReceiptReview":{"allOf":[{"$ref":"#/components/schemas/PoReceiptReviewPreview"},{"type":"object","required":["id","requestId","reason","actorId","actorName","createdAt"],"properties":{"id":{"type":"integer"},"requestId":{"type":"string"},"reason":{"type":"string"},"actorId":{"type":"integer"},"actorName":{"type":"string"},"createdAt":{"type":"string"}}}]},"IntelligenceMetricProvenance":{"type":"object","required":["from","to","auditThrough","workflowThrough","snapshot","auditSampled","workflowSampled","auditTruncated","workflowTruncated","sourceLimit"],"properties":{"from":{"type":"string"},"to":{"type":"string"},"auditThrough":{"type":"integer"},"workflowThrough":{"type":"integer"},"snapshot":{"type":"string"},"auditSampled":{"type":"integer"},"workflowSampled":{"type":"integer"},"auditTruncated":{"type":"boolean"},"workflowTruncated":{"type":"boolean"},"sourceLimit":{"type":"integer"}}},"IntelligenceMetricEvidenceItem":{"type":"object","required":["id","sourceEventId","source","recordedAt","action","contribution","recordLabel","recordHref","recordAvailable","explanation","reviewedFields","correctedFields","durationMs","firstPass","reason","actorLabel"],"properties":{"id":{"type":"string"},"sourceEventId":{"type":"integer"},"source":{"type":"string","enum":["audit","workflow"]},"recordedAt":{"type":"string"},"action":{"type":"string"},"contribution":{"type":"integer"},"recordLabel":{"type":["string","null"]},"recordHref":{"type":["string","null"]},"recordAvailable":{"type":"boolean"},"explanation":{"type":"string"},"reviewedFields":{"type":["integer","null"]},"correctedFields":{"type":["integer","null"]},"durationMs":{"type":["integer","null"]},"firstPass":{"type":["boolean","null"]},"reason":{"type":["string","null"]},"actorLabel":{"type":["string","null"]}}},"IntelligenceMetricEvidence":{"type":"object","required":["metric","provenance","items","totalSources","totalContribution","nextOffset"],"properties":{"metric":{"type":"string"},"provenance":{"$ref":"#/components/schemas/IntelligenceMetricProvenance"},"items":{"type":"array","items":{"$ref":"#/components/schemas/IntelligenceMetricEvidenceItem"}},"totalSources":{"type":"integer"},"totalContribution":{"type":"integer"},"nextOffset":{"type":["integer","null"]}}},"ScheduleJobRecord":{"type":"object","required":["id","jobNumber","certificateNumber"],"properties":{"id":{"type":"integer"},"jobNumber":{"type":["string","null"],"description":"Primary job reference. Null on legacy records; never replace the stored value with a certificate number."},"certificateNumber":{"type":["string","null"],"description":"Secondary document reference; display with an explicit Certificate label."},"customerName":{"type":["string","null"]},"siteName":{"type":["string","null"]},"scheduledDate":{"type":["string","null"],"format":"date"},"testDate":{"type":["string","null"],"format":"date"},"scheduledStartTime":{"type":["string","null"]},"scheduledEndTime":{"type":["string","null"]},"assignedUserId":{"type":["integer","null"]},"assignedUserName":{"type":["string","null"]},"status":{"type":"string"},"priority":{"type":"string"}},"additionalProperties":true},"ReportingMutationResult":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean"}}},"ReportingReviewInput":{"type":"object","required":["jobId","exception","state","ownerId","reason"],"properties":{"jobId":{"type":"integer","minimum":1},"exception":{"type":"string"},"state":{"type":"string","enum":["open","reviewed","dismissed"]},"ownerId":{"type":["integer","null"]},"reason":{"type":"string","minLength":3,"maxLength":1000}}},"ReportingClassificationInput":{"type":"object","required":["kind","id","classification"],"properties":{"kind":{"type":"string","enum":["job","customer","site","invoice","quote","credit"]},"id":{"type":"integer","minimum":1},"classification":{"type":"string","enum":["technical_fixture","showcase","operational"]}}},"ReportingExportHistory":{"type":"object","required":["id","state","format","createdAt","expiresAt","recordCount","totalValue","filters"],"properties":{"id":{"type":"string"},"state":{"type":"string"},"format":{"type":"string","enum":["csv","xlsx"]},"createdAt":{"type":"string"},"expiresAt":{"type":"string"},"recordCount":{"type":["integer","null"]},"totalValue":{"type":["number","null"]},"filters":{"type":"object","additionalProperties":true}}},"ReportingDefinition":{"type":"object","required":["id","label","unit","source","calculation","dateBasis","exclusions","caveats"],"properties":{"id":{"type":"string"},"label":{"type":"string"},"unit":{"type":"string"},"source":{"type":"string"},"calculation":{"type":"string"},"dateBasis":{"type":"string"},"exclusions":{"type":"string"},"caveats":{"type":"string"}}},"ReportingMetric":{"type":"object","required":["id","label","unit","value","recordCount","state","warningCount"],"properties":{"id":{"type":"string"},"label":{"type":"string"},"unit":{"type":"string"},"value":{"type":["number","null"]},"recordCount":{"type":"integer"},"warningCount":{"type":"integer"},"state":{"type":"string","enum":["complete","incomplete","unavailable"]}}},"ReportingRecord":{"type":"object","required":["id","reference","customer","site","date","status","value","inclusionReason","warnings","href","details"],"properties":{"id":{"type":"string"},"reference":{"type":"string"},"customer":{"type":"string"},"site":{"type":"string"},"date":{"type":["string","null"]},"status":{"type":"string"},"value":{"type":["number","null"]},"inclusionReason":{"type":"string"},"warnings":{"type":"array","items":{"type":"string"}},"href":{"type":"string"},"details":{"type":"object","additionalProperties":true}}},"ReportingExceptionSummary":{"type":"object","required":["id","label","count","valueAtRisk","oldestDate","priority"],"properties":{"id":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"},"valueAtRisk":{"type":["number","null"]},"oldestDate":{"type":["string","null"]},"priority":{"type":"string"}}},"ReportRetentionPolicy":{"type":"object","additionalProperties":false,"required":["accessDays","retentionDays","reason"],"properties":{"accessDays":{"type":"integer","minimum":1,"maximum":365},"retentionDays":{"type":"integer","minimum":1,"maximum":3650},"reason":{"type":"string","minLength":5,"maxLength":1000}}},"ReportJobEstimate":{"type":"object","additionalProperties":false,"required":["jobId","hours"],"properties":{"jobId":{"type":"integer","minimum":1},"hours":{"type":"number","exclusiveMinimum":0,"maximum":10000}}},"ReportEngineerBasis":{"type":"object","additionalProperties":false,"required":["engineerId","from","to","availableHours","ownedJobIds","estimates","reason","evidenceReference"],"properties":{"engineerId":{"type":"integer","minimum":1},"from":{"type":"string"},"to":{"type":"string"},"availableHours":{"type":["number","null"],"exclusiveMinimum":0,"maximum":8784},"ownedJobIds":{"type":"array","maxItems":1000,"items":{"type":"integer","minimum":1}},"estimates":{"type":"array","maxItems":1000,"items":{"$ref":"#/components/schemas/ReportJobEstimate"}},"reason":{"type":"string","minLength":5,"maxLength":1000},"evidenceReference":{"type":"string","minLength":5,"maxLength":1000},"recordedAt":{"type":"string","readOnly":true},"recordedBy":{"type":"integer","readOnly":true},"source":{"type":"string","readOnly":true}}},"ReportPurgeInput":{"type":"object","additionalProperties":false,"required":["preview","reason"],"properties":{"preview":{"type":"boolean"},"reason":{"type":"string","minLength":5,"maxLength":1000},"confirmation":{"type":"string","pattern":"^[a-f0-9]{64}$"}}},"ReportPurgeResult":{"type":"object","properties":{"confirmation":{"type":"string"},"count":{"type":"integer"},"exports":{"type":"array","items":{"type":"object","required":["id","ownerId"],"properties":{"id":{"type":"string"},"ownerId":{"type":"integer"},"purgeAfter":{"type":["string","null"]}}}},"results":{"type":"array","items":{"type":"object","required":["id","state"],"properties":{"id":{"type":"string"},"state":{"type":"string","enum":["purged","busy","purge_failed"]}}}}}},"ManagementReport":{"type":"object","required":["generatedAt","dateBasis","sourceComplete","selectedMetric","definitions","metrics","records","totalRecords","totalValue","excludedCount","page","pageSize","warnings","exceptions","scheduledDeliveryEnabled"],"properties":{"comparison":{"type":"object","required":["from","to","metrics"],"properties":{"from":{"type":"string"},"to":{"type":"string"},"metrics":{"type":"array","items":{"$ref":"#/components/schemas/ReportingMetric"}}}},"generatedAt":{"type":"string"},"dateBasis":{"type":"string"},"sourceComplete":{"type":"boolean"},"selectedMetric":{"type":"string"},"definitions":{"type":"array","items":{"$ref":"#/components/schemas/ReportingDefinition"}},"metrics":{"type":"array","items":{"$ref":"#/components/schemas/ReportingMetric"}},"records":{"type":"array","items":{"$ref":"#/components/schemas/ReportingRecord"}},"totalRecords":{"type":"integer"},"totalValue":{"type":["number","null"]},"excludedCount":{"type":"integer"},"page":{"type":"integer"},"pageSize":{"type":"integer"},"warnings":{"type":"array","items":{"type":"string"}},"exceptions":{"type":"array","items":{"$ref":"#/components/schemas/ReportingExceptionSummary"}},"scheduledDeliveryEnabled":{"type":"boolean"}}},"ReportingViewInput":{"type":"object","required":["name","filters"],"properties":{"name":{"type":"string","maxLength":80},"filters":{"type":"object","additionalProperties":{"type":"string"}}}},"ReportingView":{"type":"object","required":["id","name","filters","savedAt"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"filters":{"type":"object","additionalProperties":{"type":"string"}},"savedAt":{"type":"string"}}},"ElectricalVaultReceipt":{"type":"object","required":["id","owner","accessExpiresAt"],"properties":{"id":{"type":"string"},"owner":{"$ref":"#/components/schemas/ElectricalRecoveryOwner"},"accessExpiresAt":{"type":"string"}}},"ElectricalRecoveryCredentials":{"type":"object","required":["password"],"properties":{"password":{"type":"string","minLength":1,"maxLength":1024},"totpToken":{"type":"string","pattern":"^\\d{6}$"}}},"ElectricalRecoveryVerification":{"type":"object","required":["verifiedUntil"],"properties":{"verifiedUntil":{"type":"string"}}},"ElectricalVaultRegistration":{"type":"object","required":["id","dataKey","reportIds","accessExpiresAt"],"properties":{"id":{"type":"string"},"dataKey":{"type":"string","minLength":44,"maxLength":44,"description":"One-time data-key escrow over authenticated TLS; never log or persist unsealed."},"reportIds":{"type":"array","minItems":1,"maxItems":20,"items":{"type":"integer","minimum":1}},"accessExpiresAt":{"type":"string"}}},"ElectricalRecoveryApplication":{"type":"object","required":["id","reason"],"properties":{"id":{"type":"string"},"reason":{"type":"string","minLength":10,"maxLength":2000}}},"ElectricalRecoveryDecision":{"type":"object","required":["decision"],"properties":{"decision":{"type":"string","enum":["approve","decline"]}}},"ElectricalRecoveryRequest":{"type":"object","required":["id","vaultId","requesterId","reason","status","approvedBy","createdAt","approvalExpiresAt"],"properties":{"id":{"type":"string"},"vaultId":{"type":"string"},"requesterId":{"type":"integer"},"reason":{"type":"string"},"status":{"type":"string","enum":["pending","approved","declined"]},"approvedBy":{"type":["integer","null"]},"createdAt":{"type":"string"},"approvalExpiresAt":{"type":["string","null"]}}},"ElectricalRecoveryOverview":{"type":"object","required":["configured","administrator","vaults","requests","limit"],"properties":{"configured":{"type":"boolean"},"administrator":{"type":"boolean"},"vaults":{"type":"array","items":{"$ref":"#/components/schemas/ElectricalVaultSummary"}},"requests":{"type":"array","items":{"$ref":"#/components/schemas/ElectricalRecoveryRequest"}},"limit":{"type":"integer"}}},"ElectricalVaultSummary":{"type":"object","required":["id","accessExpiresAt","createdAt"],"properties":{"id":{"type":"string"},"accessExpiresAt":{"type":"string"},"createdAt":{"type":"string"}}},"ElectricalRecoveryAccess":{"type":"object","required":["owner","vaultId","dataKey","expiresAt","mode"],"properties":{"owner":{"$ref":"#/components/schemas/ElectricalRecoveryOwner"},"vaultId":{"type":"string"},"dataKey":{"type":"string"},"expiresAt":{"type":"string"},"mode":{"type":"string","enum":["read_only_recovery"]}}},"ElectricalRecoveryOwner":{"type":"object","required":["tenantId","userId"],"properties":{"tenantId":{"type":"integer"},"userId":{"type":"integer"}}},"ElectricalInspectionRevision":{"type":"object","required":["id","revision","outcome","notes","description","page2TransferRequested"],"properties":{"id":{"type":"integer"},"revision":{"type":"integer"},"outcome":{"type":["string","null"]},"notes":{"type":["string","null"]},"description":{"type":"string"},"page2TransferRequested":{"type":"boolean"}}},"ElectricalChangeRestoration":{"type":"object","required":["side","reason","expectedRevision"],"properties":{"side":{"type":"string","enum":["before","after"]},"reason":{"type":"string","minLength":10,"maxLength":2000},"expectedRevision":{"type":"integer","minimum":1}}},"ElectricalFieldChange":{"type":"object","required":["field","before","after"],"properties":{"field":{"type":"string"},"before":{},"after":{}}},"ElectricalChangeEntry":{"type":"object","required":["id","reportId","entityType","entityId","actorUserId","actorName","kind","reason","baseVersion","newVersion","changes","createdAt","currentRevision","currentValues","canRestore","sourceChangeId","restorationSide"],"properties":{"id":{"type":"integer"},"reportId":{"type":"integer"},"entityType":{"type":"string"},"entityId":{"type":"integer"},"actorUserId":{"type":"integer"},"actorName":{"type":"string"},"kind":{"type":"string"},"reason":{"type":["string","null"]},"baseVersion":{"type":"string"},"newVersion":{"type":"string"},"changes":{"type":"array","items":{"$ref":"#/components/schemas/ElectricalFieldChange"}},"sourceChangeId":{"type":["integer","null"]},"restorationSide":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"currentRevision":{"type":["integer","null"]},"currentValues":{"type":["object","null"],"additionalProperties":true},"canRestore":{"type":"boolean"}}},"ElectricalChangeHistory":{"type":"object","required":["coverage","entries","nextCursor"],"properties":{"coverage":{"type":"string"},"entries":{"type":"array","items":{"$ref":"#/components/schemas/ElectricalChangeEntry"}},"nextCursor":{"type":["integer","null"]}}},"IntelligenceFeedbackActionInput":{"type":"object","additionalProperties":false,"required":["expectedRevision","title","ownerUserId","status","resolutionNote"],"properties":{"expectedRevision":{"type":"integer","minimum":0},"title":{"type":"string","minLength":3,"maxLength":300},"ownerUserId":{"type":["integer","null"],"minimum":1},"status":{"type":"string","enum":["open","in_progress","done"]},"resolutionNote":{"type":"string","maxLength":1000}}},"IntelligenceFeedbackAction":{"type":"object","required":["id","feature","title","ownerUserId","ownerName","status","resolutionNote","revision","updatedAt","resolvedAt"],"properties":{"id":{"type":"integer"},"feature":{"type":"string"},"title":{"type":"string"},"ownerUserId":{"type":["integer","null"]},"ownerName":{"type":["string","null"]},"status":{"type":"string","enum":["open","in_progress","done"]},"resolutionNote":{"type":"string"},"revision":{"type":"integer"},"updatedAt":{"type":"string","format":"date-time"},"resolvedAt":{"type":["string","null"],"format":"date-time"}}},"IntelligenceFeedbackSignal":{"type":"object","required":["feature","helpful","needsImprovement","total","lastFeedbackAt","action"],"properties":{"feature":{"type":"string"},"helpful":{"type":"integer"},"needsImprovement":{"type":"integer"},"total":{"type":"integer"},"lastFeedbackAt":{"type":["string","null"],"format":"date-time"},"action":{"anyOf":[{"$ref":"#/components/schemas/IntelligenceFeedbackAction"},{"type":"null"}]}}},"IntelligenceFeedbackReview":{"type":"object","required":["periodStart","periodEnd","sampleLimit","truncated","ignoredMalformedCount","ownersTruncated","owners","signals"],"properties":{"periodStart":{"type":"string","format":"date-time"},"periodEnd":{"type":"string","format":"date-time"},"sampleLimit":{"type":"integer"},"truncated":{"type":"boolean"},"ignoredMalformedCount":{"type":"integer"},"ownersTruncated":{"type":"boolean"},"owners":{"type":"array","items":{"type":"object","required":["id","name"],"properties":{"id":{"type":"integer"},"name":{"type":"string"}}}},"signals":{"type":"array","items":{"$ref":"#/components/schemas/IntelligenceFeedbackSignal"}}}},"SupplierPostcodeRecoveryInput":{"type":"object","required":["csv"],"properties":{"csv":{"type":"string","minLength":1,"maxLength":1000000}}},"SupplierPostcodeRecoveryApproval":{"type":"object","required":["csv","previewToken"],"properties":{"csv":{"type":"string","minLength":1,"maxLength":1000000},"previewToken":{"type":"string","minLength":1,"maxLength":2000}}},"SupplierPostcodeRecoveryAccount":{"type":"object","required":["id","name","slug"],"properties":{"id":{"type":"integer"},"name":{"type":"string"},"slug":{"type":"string"}}},"SupplierPostcodeRecoveryRow":{"type":"object","required":["sourceRows","name","status","reason","before","after","postcode"],"properties":{"sourceRows":{"type":"array","items":{"type":"integer"}},"supplierId":{"type":"integer"},"name":{"type":"string"},"status":{"type":"string","enum":["ready","held","present"]},"reason":{"type":"string"},"before":{"type":["string","null"]},"after":{"type":["string","null"]},"postcode":{"type":"string"}}},"SupplierPostcodeRecoveryPreview":{"type":"object","required":["account","previewToken","expiresAt","rows","ready","held","present"],"properties":{"account":{"$ref":"#/components/schemas/SupplierPostcodeRecoveryAccount"},"previewToken":{"type":"string"},"expiresAt":{"type":"string"},"rows":{"type":"array","items":{"$ref":"#/components/schemas/SupplierPostcodeRecoveryRow"}},"ready":{"type":"integer"},"held":{"type":"integer"},"present":{"type":"integer"}}},"SupplierPostcodeRecoveryResult":{"type":"object","required":["updated","held","present"],"properties":{"updated":{"type":"integer"},"held":{"type":"integer"},"present":{"type":"integer"}}},"HistoricalArchiveInput":{"type":"object","additionalProperties":false,"required":["archived"],"properties":{"archived":{"type":"boolean"}}},"HolidayDecisionNotesInput":{"type":"object","properties":{"notes":{"type":["string","null"],"maxLength":500}}},"EligibilityRequirement":{"type":"object","additionalProperties":false,"required":["id","label","kind","mode","match","customerId","siteId","jobTypes","allowNoExpiry"],"properties":{"id":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,64}$"},"label":{"type":"string","minLength":1,"maxLength":160},"kind":{"type":"string","enum":["qualification","training","authorisation","site_clearance","instrument","working_hours"]},"mode":{"type":"string","enum":["advisory","required"]},"match":{"type":"string","maxLength":160},"customerId":{"type":["integer","null"],"minimum":1},"siteId":{"type":["integer","null"],"minimum":1},"jobTypes":{"type":"array","maxItems":50,"items":{"type":"string","maxLength":80}},"allowNoExpiry":{"type":"boolean"}}},"EligibilityEvidence":{"type":"object","additionalProperties":false,"required":["id","userId","requirementId","reference","validFrom","validUntil","weekdays","start","end"],"properties":{"id":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,64}$"},"userId":{"type":"integer","minimum":1},"requirementId":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,64}$"},"reference":{"type":"string","minLength":1,"maxLength":300},"validFrom":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"validUntil":{"type":["string","null"],"pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"weekdays":{"type":"array","maxItems":7,"items":{"type":"integer","minimum":1,"maximum":7}},"start":{"type":["string","null"],"pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"end":{"type":["string","null"],"pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"}}},"EligibilityPolicyInput":{"type":"object","additionalProperties":false,"required":["requirements","evidence","revision"],"properties":{"requirements":{"type":"array","maxItems":100,"items":{"$ref":"#/components/schemas/EligibilityRequirement"}},"evidence":{"type":"array","maxItems":500,"items":{"$ref":"#/components/schemas/EligibilityEvidence"}},"revision":{"type":"integer","minimum":0}}},"PilotObservationInput":{"type":"object","additionalProperties":false,"required":["caseId","status","note"],"properties":{"caseId":{"type":"string","maxLength":80},"status":{"type":"string","enum":["not_run","passed","failed","blocked"]},"note":{"type":"string","minLength":10,"maxLength":2000}}},"EicrCorrectionInput":{"type":"object","additionalProperties":false,"required":["action","sourceVersion","note"],"properties":{"action":{"type":"string","enum":["create","correct","accept","reopen"]},"taskId":{"type":"string","format":"uuid"},"version":{"type":"integer","minimum":1},"sourceVersion":{"type":"string","pattern":"^[a-f0-9]{64}$"},"note":{"type":"string","minLength":10,"maxLength":2000},"flagId":{"type":"string","pattern":"^[a-f0-9]{24}$"},"ownerId":{"type":"integer","minimum":1},"dueDate":{"type":["string","null"],"pattern":"^\\d{4}-\\d{2}-\\d{2}$"}}},"AssignmentRecommendationContext":{"type":"object","required":["customerId","siteId","scheduledDate","scheduledStartTime","scheduledEndTime"],"properties":{"customerId":{"type":"integer","minimum":1},"siteId":{"type":"integer","minimum":1},"tradeModule":{"type":"string"},"jobType":{"type":"string"},"requiredSkills":{"type":"array","items":{"type":"string"}},"scheduledDate":{"type":"string","format":"date"},"scheduledStartTime":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"scheduledEndTime":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"priority":{"type":"string"},"slaTargetAt":{"type":["string","null"],"format":"date-time"}}},"FieldWorkingPeriod":{"type":"object","required":["day","start","end"],"properties":{"day":{"type":"integer","minimum":0,"maximum":6,"description":"Sunday through Saturday"},"start":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"end":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"}}},"EngineerFieldProfileInput":{"type":"object","required":["startingLocation"],"properties":{"startingLocation":{"type":"string","enum":["home","team","custom"]},"customAddress":{"type":"string"},"customPostcode":{"type":"string"},"travelOverride":{"type":"boolean"},"maxTravelMinutes":{"type":["integer","null"],"minimum":1},"maxTravelKm":{"type":["number","null"],"minimum":1},"emergencyMaxTravelMinutes":{"type":["integer","null"],"minimum":1},"emergencyCoverage":{"type":"boolean"},"workingPattern":{"type":["array","null"],"items":{"$ref":"#/components/schemas/FieldWorkingPeriod"}},"legacyCoverageMode":{"type":"string","enum":["strict","advisory","off"]},"strictTerritory":{"type":"boolean"},"includeAreas":{"type":"array","items":{"type":"string"}},"excludeAreas":{"type":"array","items":{"type":"string"}},"allowedCustomerIds":{"type":"array","items":{"type":"integer"}}}},"EngineerFieldProfileUpdate":{"type":"object","required":["teamId","homeAddress","homePostcode","profile"],"properties":{"teamId":{"type":["integer","null"]},"homeAddress":{"type":"string"},"homePostcode":{"type":"string"},"profile":{"$ref":"#/components/schemas/EngineerFieldProfileInput"}}},"EngineerFieldProfileView":{"type":"object","required":["userId","teamId","profile","homeAddress","homePostcode","legacyAreas","readiness","locationSummary"],"properties":{"userId":{"type":"integer"},"teamId":{"type":["integer","null"]},"profile":{"$ref":"#/components/schemas/EngineerFieldProfileInput"},"homeAddress":{"type":"string","description":"Sensitive administrator-only address"},"homePostcode":{"type":"string","description":"Sensitive administrator-only postcode"},"legacyAreas":{"type":"array","items":{"type":"string"}},"readiness":{"type":"array","items":{"type":"string"}},"locationSummary":{"type":"string"}}},"TeamDispatchProfileInput":{"type":"object","properties":{"baseAddress":{"type":"string"},"basePostcode":{"type":"string"},"maxTravelMinutes":{"type":["integer","null"],"minimum":1},"maxTravelKm":{"type":["number","null"],"minimum":1},"emergencyMaxTravelMinutes":{"type":["integer","null"],"minimum":1},"workingPattern":{"type":["array","null"],"items":{"$ref":"#/components/schemas/FieldWorkingPeriod"}},"defaultWorkTypes":{"type":"array","items":{"type":"string"}},"strictTerritory":{"type":"boolean"},"includeAreas":{"type":"array","items":{"type":"string"}},"excludeAreas":{"type":"array","items":{"type":"string"}},"allowedCustomerIds":{"type":"array","items":{"type":"integer"}}}},"TeamDispatchProfileView":{"type":"object","required":["teamId","profile","locationSummary"],"properties":{"teamId":{"type":"integer"},"profile":{"$ref":"#/components/schemas/TeamDispatchProfileInput"},"locationSummary":{"type":"string"}}},"EngineerFieldDefaultsCopy":{"type":"object","required":["sourceUserId","targetUserId"],"properties":{"sourceUserId":{"type":"integer","minimum":1},"targetUserId":{"type":"integer","minimum":1}}},"EngineerBulkTeamMove":{"type":"object","required":["userIds","teamId","applyTeamDefaults"],"properties":{"userIds":{"type":"array","items":{"type":"integer","minimum":1}},"teamId":{"type":"integer","minimum":1},"applyTeamDefaults":{"type":"boolean"}}},"LegacyTeamForReview":{"type":"object","required":["id","name"],"properties":{"id":{"type":"integer"},"name":{"type":"string"}}},"DispatchEngineerRanking":{"type":"object","required":["jobId","requiredSkills","candidates","weights","metadata"],"properties":{"jobId":{"type":["integer","null"],"description":"null only for an unsaved preview"},"requiredSkills":{"type":"array","items":{"type":"string"}},"candidates":{"type":"array","items":{"$ref":"#/components/schemas/DispatchEngineerCandidate"}},"weights":{"type":"object","additionalProperties":{"type":"number"}},"metadata":{"type":"object","additionalProperties":true}}},"DispatchEngineerCandidate":{"type":"object","required":["userId","fullName","score","eligible","recommended","onLeave","reasons","exclusionReasons","factors","cautions"],"properties":{"userId":{"type":"integer"},"fullName":{"type":"string"},"score":{"type":"number","description":"Weighted points","not a safety-authorisation probability":null},"eligible":{"type":"boolean","description":"No recorded hard exclusion; unknown evidence may still require human review"},"recommended":{"type":"boolean","description":"Hard rules pass and working-hours availability is evidenced","not an automatic assignment":null},"onLeave":{"type":"boolean"},"reasons":{"type":"array","items":{"type":"string"}},"exclusionReasons":{"type":"array","items":{"type":"string"}},"cautions":{"type":"array","items":{"type":"string"}},"factors":{"type":"object","additionalProperties":true},"travelBasis":{"type":"string","enum":["road_no_live_traffic","straight_line_estimate","unknown"]},"travelMinutes":{"type":["number","null"]},"availableMinutes":{"type":["number","null"]},"onwardMinutes":{"type":["number","null"]},"returnMinutes":{"type":["number","null"]}},"additionalProperties":true},"EicrPhotoAnalysisInput":{"type":"object","required":["scheduleObjectPath"],"properties":{"scheduleObjectPath":{"type":"string","pattern":"^/objects/"}}},"EicrPhotoAcceptanceInput":{"type":"object","required":["confirmed","confirmationStatement","scheduleObjectPath","boards","analysisId","sourceVersion"],"properties":{"analysisId":{"type":"integer","minimum":1},"sourceVersion":{"type":"string","pattern":"^[a-f0-9]{64}$"},"confirmed":{"type":"boolean","enum":[true]},"confirmationStatement":{"type":"string"},"scheduleObjectPath":{"type":"string","pattern":"^/objects/"},"includePhotoInPdf":{"type":"boolean"},"provider":{"type":"string"},"model":{"type":"string"},"analysedAt":{"type":"string"},"rawAiOutput":{"type":"object","additionalProperties":true},"acknowledgedLowConfidenceFields":{"type":"array","items":{"type":"string"}},"initialDraft":{},"boards":{"type":"array","items":{"type":"object","required":["action","fields"],"properties":{"extractionIndex":{"type":["integer","null"],"minimum":0},"action":{"type":"string","enum":["add","merge"]},"mergeIntoBoardId":{"type":["integer","null"]},"acknowledgedDuplicate":{"type":"boolean"},"fields":{"type":"object","additionalProperties":true},"circuits":{"type":"array","items":{"type":"object","additionalProperties":true}}}}},"observations":{"type":"array","items":{"type":"object","additionalProperties":true}}}},"EicrQsFindings":{"type":"object","required":["reportId","reportNumber","status","riskLevel","flags","decisions","metadata"],"properties":{"reportId":{"type":"integer"},"reportNumber":{"type":"string"},"status":{"type":"string"},"riskLevel":{"type":"string","enum":["critical","high","medium","none_recorded"]},"awaitingSince":{"type":["string","null"]},"comparisonStatus":{"type":"string"},"previousReportId":{"type":["integer","null"]},"historyTruncated":{"type":"boolean"},"flags":{"type":"array","items":{"type":"object","additionalProperties":true}},"decisions":{"type":"array","items":{"type":"object","additionalProperties":true}},"metadata":{"type":"object","additionalProperties":true}}},"EicrQsDecisionInput":{"type":"object","additionalProperties":false,"required":["flagId","sourceVersion","decision","note"],"properties":{"flagId":{"type":"string","pattern":"^[a-f0-9]{24}$"},"sourceVersion":{"type":"string","pattern":"^[a-f0-9]{64}$"},"decision":{"type":"string","enum":["relevant","not_relevant","corrected","clarification_required","policy_exception"]},"note":{"type":"string","minLength":10,"maxLength":2000}}},"DispatchRecommendationSettings":{"type":"object","required":["weights","dayHours"],"properties":{"weights":{"type":"object","additionalProperties":false,"required":["skills","travel","capacity","familiarity","sla","instruments","parts","fairness"],"properties":{"skills":{"type":"integer","minimum":0,"maximum":100},"travel":{"type":"integer","minimum":0,"maximum":100},"capacity":{"type":"integer","minimum":0,"maximum":100},"familiarity":{"type":"integer","minimum":0,"maximum":100},"sla":{"type":"integer","minimum":0,"maximum":100},"instruments":{"type":"integer","minimum":0,"maximum":100},"parts":{"type":"integer","minimum":0,"maximum":100},"fairness":{"type":"integer","minimum":0,"maximum":100}}},"dayHours":{"type":"number","minimum":1,"maximum":24},"rulesVersion":{"type":"string","readOnly":true}}},"DispatchRecommendationDecisionInput":{"type":"object","additionalProperties":false,"required":["userId","sourceVersion","reason"],"properties":{"userId":{"type":"integer","minimum":1},"sourceVersion":{"type":"string","pattern":"^[a-f0-9]{64}$"},"reason":{"type":"string","enum":["customer_preference","engineer_continuity","emergency_reassignment","specialist_knowledge","travel_inaccurate","other"]},"note":{"type":"string","maxLength":2000}}},"EicrComparisonResponse":{"type":"object","required":["status","previous","candidates","candidatesTruncated","currentIdentity","selectionSource","metadata","changes","counts","resolvedObservations","newObservations","persistingObservations"],"properties":{"status":{"type":"string","enum":["ready","requires_selection","no_previous"]},"currentIdentity":{"type":"string"},"selectionSource":{"type":"string","enum":["none","explicit_supersedes","recorded_selection","preview"]},"previous":{"allOf":[{"$ref":"#/components/schemas/EicrComparisonCandidate"}],"nullable":true},"candidates":{"type":"array","items":{"$ref":"#/components/schemas/EicrComparisonCandidate"}},"candidatesTruncated":{"type":"boolean"},"changes":{"type":"array","items":{"type":"object","required":["id","group","kind","status","severity","context","previous","current"],"additionalProperties":true,"properties":{"id":{"type":"string"},"group":{"type":"string","enum":["circuits","boards","report","observations","schedule","instruments","signatures"]},"kind":{"type":"string"},"status":{"type":"string","enum":["new","changed","unchanged","removed","requires_review"]},"severity":{"type":"string","enum":["warning","change"]},"context":{"type":"string"},"field":{"type":"string"},"delta":{"type":"number"},"unit":{"type":"string"}}}},"counts":{"type":"object","additionalProperties":{"type":"integer"}},"metadata":{"type":"object","required":["tenantId","userId","generatedAt","rulesVersion","sourceVersions"],"properties":{"tenantId":{"type":"integer"},"userId":{"type":"integer"},"generatedAt":{"type":"string","format":"date-time"},"rulesVersion":{"type":"string"},"sourceVersions":{"type":"object","required":["current","previous"],"properties":{"current":{"type":"string"},"previous":{"type":"string","nullable":true}}}}},"resolvedObservations":{"type":"array","items":{"type":"object","additionalProperties":true}},"newObservations":{"type":"array","items":{"type":"object","additionalProperties":true}},"persistingObservations":{"type":"array","items":{"type":"object","additionalProperties":true}}}},"EicrComparisonCandidate":{"type":"object","required":["id","reportNumber","dateOfInspection","overallAssessment","extentOfInstallation"],"properties":{"id":{"type":"integer"},"reportNumber":{"type":"string"},"dateOfInspection":{"type":"string"},"overallAssessment":{"type":"string","nullable":true},"extentOfInstallation":{"type":"string","nullable":true}}},"HolidayBookingInput":{"type":"object","required":["startDate","endDate"],"properties":{"startDate":{"type":"string","format":"date"},"endDate":{"type":"string","format":"date"},"userId":{"type":"integer"},"leaveType":{"type":"string"},"durationKind":{"type":"string","enum":["full","half","hourly"]},"hours":{"type":["number","null"],"minimum":0,"maximum":24},"halfDayPeriod":{"type":["string","null"],"enum":["am","pm",null]},"reason":{"type":["string","null"],"maxLength":500},"overrideReason":{"type":["string","null"],"maxLength":500},"excludeRequestId":{"type":"integer"}}},"HolidayApprovalPolicy":{"type":"object","required":["minNoticeDays","reminderAfterDays","allowAdminSelfApproval","delegations"],"properties":{"minNoticeDays":{"type":"integer","minimum":0,"maximum":365},"reminderAfterDays":{"type":"integer","minimum":0,"maximum":30},"allowAdminSelfApproval":{"type":"boolean"},"delegations":{"type":"array","maxItems":50,"items":{"type":"object","required":["managerId","deputyId","from","to"],"properties":{"managerId":{"type":"integer"},"deputyId":{"type":"integer"},"from":{"type":"string","format":"date"},"to":{"type":"string","format":"date"}}}}}},"HolidayWorkflowConfiguration":{"type":"object","required":["isAdmin","canManageSettings","users","settings","leaveTypes"],"properties":{"isAdmin":{"type":"boolean"},"canManageSettings":{"type":"boolean"},"settings":{"$ref":"#/components/schemas/HolidayApprovalPolicy"},"users":{"type":"array","items":{"type":"object","required":["id","fullName"],"properties":{"id":{"type":"integer"},"fullName":{"type":"string"}}}},"leaveTypes":{"type":"array","items":{"type":"object","required":["key","label","enabled","deductsFromAllowance","longTerm"],"properties":{"key":{"type":"string"},"label":{"type":"string"},"enabled":{"type":"boolean"},"deductsFromAllowance":{"type":"boolean"},"longTerm":{"type":"boolean"}}}}}},"HolidayBookingPreview":{"type":"object","required":["unit","days","hours","deductible","years","warnings","canSubmit"],"properties":{"unit":{"type":"string","enum":["days","hours"]},"days":{"type":"number"},"hours":{"type":"number"},"deductible":{"type":"boolean"},"canSubmit":{"type":"boolean"},"warnings":{"type":"array","items":{"type":"string"}},"years":{"type":"array","items":{"type":"object","required":["start","end","label","entitlement","approved","pending","requested","remainingAfter"],"properties":{"start":{"type":"string","format":"date"},"end":{"type":"string","format":"date"},"label":{"type":"string"},"entitlement":{"type":"number"},"approved":{"type":"number"},"pending":{"type":"number"},"requested":{"type":"number"},"remainingAfter":{"type":"number"}}}}}},"HolidayAmendmentInput":{"type":"object","required":["kind","reason"],"properties":{"kind":{"type":"string","enum":["cancel","change"]},"reason":{"type":"string","minLength":1,"maxLength":500},"booking":{"$ref":"#/components/schemas/HolidayBookingInput"}}},"HolidayAmendmentDecision":{"type":"object","required":["approve"],"properties":{"approve":{"type":"boolean"},"notes":{"type":"string","maxLength":500}}},"WorkingDayBlocker":{"type":"object","required":["code","label","href","owner","blocking"],"properties":{"code":{"type":"string"},"label":{"type":"string"},"href":{"type":"string"},"owner":{"type":"string","enum":["engineer","office"]},"blocking":{"type":"boolean"}}},"WorkingDayActive":{"type":"object","required":["id","date","startedAt","activeEntryId","activity","activityStartedAt","previousActivity","elapsedMinutes"],"properties":{"id":{"type":"string"},"date":{"type":"string"},"startedAt":{"type":"string"},"activeEntryId":{"type":"integer"},"activity":{"type":"string","enum":["travel","labour","break","overtime"]},"activityStartedAt":{"type":"string"},"previousActivity":{"type":"string","enum":["travel","labour","overtime"]},"elapsedMinutes":{"type":"number"},"jobId":{"type":["integer","null"]},"previousJobId":{"type":["integer","null"]}}},"WorkingDaySummary":{"type":"object","required":["dayId","date","startedAt","endedAt","totalMinutes","breakMinutes","jobsAttended","syncStatus"],"properties":{"dayId":{"type":"string"},"date":{"type":"string"},"startedAt":{"type":"string"},"endedAt":{"type":"string"},"totalMinutes":{"type":"number"},"breakMinutes":{"type":"number"},"jobsAttended":{"type":"integer"},"syncStatus":{"type":"string","enum":["working_time_saved_other_changes_unverified"]}}},"WorkingDayFinishReviewJob":{"type":"object","required":["id","jobNumber","certificateNumber","status","scheduledDate","missingCheckout","missingNotes"],"properties":{"id":{"type":"integer"},"jobNumber":{"type":["string","null"]},"certificateNumber":{"type":"string"},"status":{"type":"string"},"scheduledDate":{"type":["string","null"]},"missingCheckout":{"type":"boolean"},"missingNotes":{"type":"boolean","description":"No saved job notes or non-internal note. Informational, not a new completion or end-day requirement."}}},"WorkingDayFinishReviewTimer":{"type":"object","required":["id","jobId","activity","date","startTime","startedAt"],"properties":{"id":{"type":"integer"},"jobId":{"type":["integer","null"]},"activity":{"type":"string"},"date":{"type":"string"},"startTime":{"type":"string"},"startedAt":{"type":["string","null"]}}},"WorkingDayFinishReview":{"type":"object","description":"Own assignments today, earlier or unscheduled, plus active attendance and independent timers. At most twenty details per list; totals include all matching records. This review adds no new blockers.","required":["jobs","jobsTotal","jobsTruncated","independentTimers","timersTotal","timersTruncated"],"properties":{"jobs":{"type":"array","maxItems":20,"items":{"$ref":"#/components/schemas/WorkingDayFinishReviewJob"}},"jobsTotal":{"type":"integer","minimum":0},"jobsTruncated":{"type":"boolean"},"independentTimers":{"type":"array","maxItems":20,"items":{"$ref":"#/components/schemas/WorkingDayFinishReviewTimer"}},"timersTotal":{"type":"integer","minimum":0},"timersTruncated":{"type":"boolean"}}},"WorkingDayStatus":{"type":"object","required":["serverNow","day","summary","blockers","attendedJobsCount","suggestEndDay"],"properties":{"serverNow":{"type":"string"},"day":{"anyOf":[{"$ref":"#/components/schemas/WorkingDayActive"},{"type":"null"}]},"summary":{"anyOf":[{"$ref":"#/components/schemas/WorkingDaySummary"},{"type":"null"}]},"blockers":{"type":"array","items":{"$ref":"#/components/schemas/WorkingDayBlocker"}},"attendedJobsCount":{"type":"integer"},"suggestEndDay":{"type":"boolean"},"finishReview":{"$ref":"#/components/schemas/WorkingDayFinishReview"}}},"WorkingDayStartInput":{"type":"object","required":["activity","requestId"],"properties":{"requestId":{"type":"string","format":"uuid"},"activity":{"type":"string","enum":["travel","labour","break","overtime"]},"jobId":{"type":["integer","null"],"minimum":1},"legacyStart":{"type":"object","required":["date","startTime","confirmOwnTimer"],"properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"startTime":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"confirmOwnTimer":{"type":"boolean"},"notes":{"type":"string","maxLength":4000}}}}},"WorkingDayActivityInput":{"type":"object","required":["activeEntryId","activity"],"properties":{"activeEntryId":{"type":"integer","minimum":1},"activity":{"type":"string","enum":["travel","labour","break","overtime"]},"jobId":{"type":["integer","null"],"minimum":1}}},"WorkingDayEndInput":{"type":"object","required":["activeEntryId","dayId","clientPendingCount"],"properties":{"activeEntryId":{"type":"integer","minimum":1},"dayId":{"type":"string","format":"uuid"},"clientPendingCount":{"type":"integer","minimum":0}}},"MaterialCategorySuggestionInput":{"type":"object","properties":{"name":{"type":"string","maxLength":20000},"description":{"type":["string","null"],"maxLength":20000}}},"SecurityGroupMembershipInput":{"type":"object","required":["groupId"],"properties":{"groupId":{"type":["integer","null"],"minimum":1}}},"CatalogueEstimateInput":{"type":"object","required":["customerId"],"properties":{"customerId":{"type":"integer","minimum":1},"catalogueId":{"type":"integer","minimum":1},"items":{"type":"array","minItems":1,"maxItems":200,"items":{"$ref":"#/components/schemas/CatalogueEstimateItem"}},"multiplier":{"type":"number","exclusiveMinimum":0,"maximum":100000,"default":1},"includeLabour":{"type":"boolean","default":true}}},"BrowserNotificationPreferences":{"type":"object","required":["routineEnabled","urgentEnabled","quietEnabled","quietStart","quietEnd","timeZone"],"properties":{"routineEnabled":{"type":"boolean"},"urgentEnabled":{"type":"boolean"},"quietEnabled":{"type":"boolean"},"quietStart":{"type":"string","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$"},"quietEnd":{"type":"string","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$"},"timeZone":{"type":"string","minLength":1,"maxLength":80}}},"BrowserNotificationPolicy":{"type":"object","required":["urgentQuietBypass"],"properties":{"urgentQuietBypass":{"type":"boolean"}}},"BrowserNotificationSettings":{"type":"object","required":["preferences","policy","canManagePolicy","backgroundRequirement"],"properties":{"preferences":{"$ref":"#/components/schemas/BrowserNotificationPreferences"},"policy":{"$ref":"#/components/schemas/BrowserNotificationPolicy"},"canManagePolicy":{"type":"boolean"},"backgroundRequirement":{"type":"string"}}},"BrowserNotificationDeviceName":{"type":"object","required":["name"],"properties":{"name":{"type":"string","minLength":1,"maxLength":80}}},"BrowserNotificationDevice":{"type":"object","required":["id","name","endpointHash","createdAt","lastSeenAt","lastStatus","errorCode"],"properties":{"id":{"type":"integer"},"name":{"type":"string"},"endpointHash":{"type":"string"},"createdAt":{"type":"string"},"lastSeenAt":{"type":"string"},"lastStatus":{"type":["string","null"]},"errorCode":{"type":["string","null"]}}},"UrgentDispatch":{"type":"object","required":["id","jobId","engineerId","engineerName","jobNumber","status","message","version","cycle","createdAt","assignedAt","ackDueAt"],"properties":{"id":{"type":"integer"},"jobId":{"type":"integer"},"jobNumber":{"type":"string"},"engineerId":{"type":"integer"},"engineerName":{"type":"string"},"ownerId":{"type":["integer","null"]},"status":{"type":"string","enum":["pending","acknowledged","accepted","declined","escalated","closed","cancelled"]},"message":{"type":"string"},"latestResponse":{"type":["string","null"]},"version":{"type":"integer"},"cycle":{"type":"integer"},"createdAt":{"type":"string"},"assignedAt":{"type":"string"},"updatedAt":{"type":"string"},"ackDueAt":{"type":"string"},"acknowledgedAt":{"type":["string","null"]},"escalatedAt":{"type":["string","null"]},"etaAt":{"type":["string","null"]},"closedAt":{"type":["string","null"]}}},"UrgentDispatchQueue":{"type":"object","required":["items","total","canManage","windowMinutes","pushEnabled","engineers"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/UrgentDispatch"}},"total":{"type":"integer"},"canManage":{"type":"boolean"},"windowMinutes":{"type":"integer"},"pushEnabled":{"type":"boolean"},"engineers":{"type":"array","items":{"type":"object","required":["id","fullName","devices"],"properties":{"id":{"type":"integer"},"fullName":{"type":"string"},"devices":{"type":"integer"}}}}}},"UrgentDispatchDetail":{"type":"object","required":["request","events","notifications","canManage","olderCursor"],"properties":{"browserHealth":{"type":"object","description":"Current assigned engineer's browser evidence, returned only to authorised dispatch managers. Provider acceptance is not display, read or acknowledgement.","required":["userId","registeredBrowsers","state","latestAttemptAt","errorCode","failedBrowsers","historyLimited","nextAction","closed"],"properties":{"userId":{"type":"integer"},"registeredBrowsers":{"type":"integer"},"state":{"type":"string","enum":["no_registration","subscription_expired","failed","unknown","pending","accepted","not_attempted","suppressed"]},"latestAttemptAt":{"type":["string","null"]},"errorCode":{"type":["string","null"]},"failedBrowsers":{"type":"integer"},"historyLimited":{"type":"boolean"},"nextAction":{"type":"string"},"closed":{"type":"boolean"}}},"browserNotificationsTruncated":{"type":"boolean"},"browserNotifications":{"type":"array","items":{"type":"object","required":["id","userId","deviceName","status","attempts","errorCode","createdAt"],"properties":{"id":{"type":"integer"},"userId":{"type":"integer"},"deviceName":{"type":"string"},"status":{"type":"string"},"attempts":{"type":"integer"},"errorCode":{"type":["string","null"]},"createdAt":{"type":"string"}}}},"request":{"$ref":"#/components/schemas/UrgentDispatch"},"canManage":{"type":"boolean"},"olderCursor":{"type":["integer","null"]},"events":{"type":"array","items":{"type":"object","required":["id","type","actorName","message","createdAt"],"properties":{"id":{"type":"integer"},"type":{"type":"string"},"actorName":{"type":"string"},"message":{"type":"string"},"createdAt":{"type":"string"},"metadata":{"type":"object","additionalProperties":true}}}},"notifications":{"type":"array","items":{"type":"object","required":["id","status","requestOutcome","receiptOutcome","createdAt"],"properties":{"id":{"type":"integer"},"status":{"type":"string"},"requestOutcome":{"type":"string"},"receiptOutcome":{"type":"string"},"providerErrorCode":{"type":["string","null"]},"createdAt":{"type":"string"}}}}}},"UrgentDispatchInput":{"type":"object","required":["clientKey","jobId","engineerId","message"],"properties":{"clientKey":{"type":"string","format":"uuid"},"jobId":{"type":"integer","minimum":1},"engineerId":{"type":"integer","minimum":1},"message":{"type":"string","minLength":1,"maxLength":2000}}},"UrgentDispatchAction":{"type":"object","required":["clientKey","version","action"],"properties":{"clientKey":{"type":"string","format":"uuid"},"version":{"type":"integer","minimum":1},"action":{"type":"string","enum":["acknowledge","accept","decline","call","message","reassign","fallback","close","cancel"]},"etaMinutes":{"type":"integer","minimum":1,"maximum":1440},"engineerId":{"type":"integer","minimum":1},"message":{"type":"string","maxLength":2000},"fallbackChannel":{"type":"string","enum":["phone","whatsapp"]}}},"UrgentDispatchSettings":{"type":"object","required":["windowMinutes"],"properties":{"windowMinutes":{"type":"integer","minimum":1,"maximum":60}}},"MarketingAdviserMessage":{"type":"object","additionalProperties":false,"required":["role","content"],"properties":{"role":{"type":"string","enum":["user","assistant"]},"content":{"type":"string","minLength":1,"maxLength":1500}}},"MarketingAdviserInput":{"type":"object","additionalProperties":false,"required":["messages"],"properties":{"messages":{"type":"array","minItems":1,"maxItems":8,"items":{"$ref":"#/components/schemas/MarketingAdviserMessage"}}}},"MarketingAdviserSource":{"type":"object","required":["title","path"],"properties":{"title":{"type":"string"},"path":{"type":"string"}}},"MarketingAdviserAnswer":{"type":"object","required":["answer","sources","nextStep","knowledgeVersion","capabilityStatus","unsupported","reviewedAt","topicId"],"properties":{"topicId":{"type":"string"},"feedbackToken":{"type":"string"},"serviceNotice":{"type":"string"},"answer":{"type":"string"},"sources":{"type":"array","items":{"$ref":"#/components/schemas/MarketingAdviserSource"}},"nextStep":{"type":"string","enum":["trial","demo","enquiry"]},"knowledgeVersion":{"type":"string"},"capabilityStatus":{"type":"string","enum":["available","limited","beta","planned","unsupported","unverified"]},"unsupported":{"type":"boolean"},"reviewedAt":{"type":"string","format":"date"}}},"MarketingAdviserFeedbackInput":{"type":"object","required":["token","rating"],"properties":{"token":{"type":"string","minLength":1,"maxLength":600},"rating":{"type":"string","enum":["helpful","vague","misunderstood"]}}},"MarketingAdviserControlsInput":{"type":"object","required":["mode","dailyBudgetPence","dailyCallLimit"],"properties":{"mode":{"type":"string","enum":["interpreted","reviewed_only"]},"dailyBudgetPence":{"type":"integer","minimum":0,"maximum":10000},"monthlyBudgetPence":{"type":"integer","minimum":0,"maximum":310000,"description":"Marketing-only monthly reserved allowance in whole pence. Omission preserves the existing limit."},"dailyCallLimit":{"type":"integer","minimum":0,"maximum":1000}}},"MarketingAdviserControls":{"allOf":[{"$ref":"#/components/schemas/MarketingAdviserControlsInput"},{"type":"object","required":["today","topics","alert","month","monthlyBudgetPence"],"properties":{"monthlyBudgetPence":{"type":"integer","minimum":0,"maximum":310000},"today":{"type":"object","required":["aiCalls","reservedPence","providerFailures"],"properties":{"aiCalls":{"type":"integer"},"reservedPence":{"type":"integer"},"providerFailures":{"type":"integer"}}},"month":{"type":"object","required":["reservedPence","estimatedCostPence","attempts","unresolvedAttempts"],"properties":{"reservedPence":{"type":"integer"},"estimatedCostPence":{"type":"number"},"attempts":{"type":"integer"},"unresolvedAttempts":{"type":"integer","description":"Reservations with unknown provider cost, including interrupted calls."}}},"topics":{"type":"array","items":{"type":"object","required":["topicId","answers","unresolved","helpful","vague","misunderstood"],"properties":{"topicId":{"type":"string"},"answers":{"type":"integer"},"unresolved":{"type":"integer"},"helpful":{"type":"integer"},"vague":{"type":"integer"},"misunderstood":{"type":"integer"}}}},"alert":{"type":"object","required":["active","message"],"properties":{"active":{"type":"boolean"},"message":{"type":"string"}}}}}]},"MarketingEnquiryInput":{"type":"object","required":["name","company","email","message"],"properties":{"name":{"type":"string","minLength":1,"maxLength":200},"company":{"type":"string","minLength":1,"maxLength":200},"email":{"type":"string","format":"email","maxLength":200},"phone":{"type":"string","maxLength":50},"message":{"type":"string","minLength":1,"maxLength":4000},"source":{"type":"string","enum":["website_adviser"]},"consent":{"type":"boolean"},"attribution":{"type":"object","additionalProperties":true}}},"MarketingEnquiryResult":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean"},"leadId":{"type":"integer"}}},"TrialSignupInput":{"type":"object","required":["companyName","fullName","email"],"properties":{"companyName":{"type":"string","minLength":1,"maxLength":200},"fullName":{"type":"string","minLength":1,"maxLength":120},"email":{"type":"string","format":"email"},"planSlug":{"type":"string","enum":["core","team","scale"],"default":"core"},"referralCode":{"type":"string","maxLength":20}}},"TrialSignupAccepted":{"type":"object","required":["ok","message"],"properties":{"ok":{"type":"boolean","enum":[true]},"message":{"type":"string"}}},"PublicTrialPlan":{"type":"object","required":["slug","name","monthlyPricePence","includedUsers"],"properties":{"slug":{"type":"string","enum":["core","team","scale"]},"name":{"type":"string"},"monthlyPricePence":{"type":"integer"},"includedUsers":{"type":"integer"}}},"TrialSignupPreviewInput":{"type":"object","required":["token"],"properties":{"token":{"type":"string","pattern":"^[A-Fa-f0-9]{64}$"}}},"TrialSignupPreview":{"type":"object","required":["plan","trialDays"],"properties":{"plan":{"allOf":[{"$ref":"#/components/schemas/PublicTrialPlan"}],"nullable":true},"trialDays":{"type":"integer"}}},"TrialSignupVerificationInput":{"type":"object","required":["token","password"],"properties":{"token":{"type":"string","pattern":"^[A-Fa-f0-9]{64}$"},"password":{"type":"string","minLength":12,"maxLength":128,"pattern":"^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9]).+$"}}},"TrialSignupVerificationResult":{"type":"object","required":["ok","loginUrl"],"properties":{"ok":{"type":"boolean","enum":[true]},"loginUrl":{"type":"string","description":"Relative or absolute URL to the sign-in flow"},"plan":{"allOf":[{"$ref":"#/components/schemas/PublicTrialPlan"}],"nullable":true},"trialDays":{"type":"integer"}}},"SignupCheckoutStatus":{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["pending","complete","failed"]}}},"SignupCheckoutNotFound":{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["not_found"]}}},"CustomerPortalInviteInput":{"type":"object","required":["customerId","email"],"properties":{"customerId":{"type":"integer","minimum":1},"email":{"type":"string","format":"email"}}},"CustomerPortalInvite":{"type":"object","required":["id","customerId","customerName","email","expiresAt","usedAt","revokedAt","deliveryStatus","deliveryAttemptedAt","createdAt","status"],"properties":{"id":{"type":"integer"},"customerId":{"type":"integer"},"customerName":{"type":"string"},"email":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"},"usedAt":{"type":["string","null"],"format":"date-time"},"revokedAt":{"type":["string","null"],"format":"date-time"},"deliveryStatus":{"type":"string"},"deliveryAttemptedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["revoked","accepted","expired","pending"]}}},"CustomerPortalInviteDeliveryResult":{"type":"object","required":["inviteId","deliveryStatus","message"],"properties":{"inviteId":{"type":"integer"},"deliveryStatus":{"type":"string"},"message":{"type":"string"}}},"CustomerPortalInviteClaimInput":{"type":"object","required":["token","username","password"],"properties":{"token":{"type":"string","minLength":1},"username":{"type":"string","minLength":3,"maxLength":64,"pattern":"^[a-zA-Z0-9._@+-]{3,64}$"},"password":{"type":"string","minLength":8,"pattern":"^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9]).+$"}}},"CustomerPortalInviteClaimResult":{"type":"object","required":["ok","message"],"properties":{"ok":{"type":"boolean","enum":[true]},"message":{"type":"string"}}},"CurcleAddress":{"type":"object","additionalProperties":false,"required":["id","line1","postcode","summary"],"properties":{"id":{"type":"string"},"line1":{"type":"string"},"line2":{"type":["string","null"]},"line3":{"type":["string","null"]},"city":{"type":["string","null"]},"county":{"type":["string","null"]},"postcode":{"type":"string"},"country":{"type":["string","null"]},"uprn":{"type":["string","null"]},"latitude":{"type":["number","null"]},"longitude":{"type":["number","null"]},"summary":{"type":"string"}}},"AddressLookupResponse":{"type":"object","additionalProperties":false,"required":["postcode","page","totalPages","addresses"],"properties":{"postcode":{"type":"string"},"page":{"type":"integer","minimum":0},"totalPages":{"type":"integer","minimum":1},"addresses":{"type":"array","items":{"$ref":"#/components/schemas/CurcleAddress"}}}},"WorkflowAnalyticsName":{"type":"string","enum":["job_scheduling","field_submission","certificate_review_issue","quote_acceptance","invoice_creation","customer_approval","search_to_action","data_import"]},"WorkflowAnalyticsEventName":{"type":"string","enum":["started","step_completed","completed","abandoned","search_started","action_success"]},"WorkflowAnalyticsRole":{"type":"string","enum":["admin","superadmin","engineer","manager","office_manager","office","viewer","customer"]},"WorkflowAnalyticsSource":{"type":"string","enum":["web","mobile","api","command_palette"]},"WorkflowAnalyticsEventInput":{"type":"object","required":["flowId","workflow","eventName"],"additionalProperties":false,"properties":{"flowId":{"type":"string","pattern":"^[A-Fa-f0-9-]{16,100}$"},"workflow":{"$ref":"#/components/schemas/WorkflowAnalyticsName"},"eventName":{"$ref":"#/components/schemas/WorkflowAnalyticsEventName"},"step":{"type":"string","enum":["customer_selected","site_selected","schedule_set","created","draft_saved","signature_captured","submitted","review_opened","readiness_passed","release","acceptance_submitted","form_started","line_items_saved","approval_submitted","query_executed","action_initiated"]},"source":{"type":"string","enum":["web","mobile","api","command_palette"],"default":"web"},"status":{"type":"string","enum":["failed"]},"outcome":{"type":"string","enum":["scheduled","created","signed","draft","issued","accepted","rejected","action_success","created_from_job","created_deposit","created_consolidated","created_from_quote"]},"durationMs":{"type":"integer","minimum":0,"maximum":86400000},"firstPass":{"type":"boolean"}}},"WorkflowAnalyticsDeadLetter":{"type":"object","required":["id","workflow","eventName","occurredAt","attemptCount"],"properties":{"id":{"type":"integer"},"workflow":{"$ref":"#/components/schemas/WorkflowAnalyticsName"},"eventName":{"type":"string"},"eventStatus":{"type":"string","nullable":true,"enum":["failed"]},"outcome":{"type":"string","nullable":true},"occurredAt":{"type":"string","format":"date-time"},"attemptCount":{"type":"integer"},"lastError":{"type":"string","nullable":true},"updatedAt":{"type":"string","format":"date-time"}}},"WorkflowAnalyticsMetric":{"type":"object","required":["workflow","started","completed","abandoned","stepCompletions","timedCompletionCount","medianCompletionTimeMs","firstPassEligibleCount","abandonmentRate","firstPassCompletionRate","searchToActionSuccessRate"],"properties":{"workflow":{"$ref":"#/components/schemas/WorkflowAnalyticsName"},"started":{"type":"integer","minimum":0},"completed":{"type":"integer","minimum":0},"abandoned":{"type":"integer","minimum":0},"matchedAbandonedCount":{"type":"integer","minimum":0,"description":"Abandoned flows with a matching earlier start; numerator for abandonmentRate."},"unmatchedAbandonedCount":{"type":"integer","minimum":0,"description":"Abandoned flows without a valid matching start; retained in totals but excluded from the rate."},"stepCompletions":{"type":"integer","minimum":0},"timedCompletionCount":{"type":"integer","minimum":0},"firstPassEligibleCount":{"type":"integer","minimum":0},"medianCompletionTimeMs":{"type":"integer","minimum":0,"nullable":true},"abandonmentRate":{"type":"number","minimum":0,"maximum":1},"firstPassCompletionRate":{"type":"number","minimum":0,"maximum":1},"searchToActionSuccessRate":{"type":"number","minimum":0,"maximum":1}}},"WorkflowAnalyticsTrend":{"type":"object","required":["period","workflow","started","completed","abandoned","stepCompletions","timedCompletionCount","medianCompletionTimeMs","firstPassEligibleCount","abandonmentRate","firstPassCompletionRate","searchToActionSuccessRate","lowSample"],"properties":{"period":{"type":"string"},"workflow":{"type":"string","enum":["all"]},"started":{"type":"integer","minimum":0},"completed":{"type":"integer","minimum":0},"abandoned":{"type":"integer","minimum":0},"matchedAbandonedCount":{"type":"integer","minimum":0,"description":"Abandoned flows with a matching earlier start; numerator for abandonmentRate."},"unmatchedAbandonedCount":{"type":"integer","minimum":0,"description":"Unattributed abandonments excluded from the rate, not silently capped."},"stepCompletions":{"type":"integer","minimum":0},"timedCompletionCount":{"type":"integer","minimum":0},"firstPassEligibleCount":{"type":"integer","minimum":0},"medianCompletionTimeMs":{"type":"integer","minimum":0,"nullable":true},"abandonmentRate":{"type":"number","minimum":0,"maximum":1},"firstPassCompletionRate":{"type":"number","minimum":0,"maximum":1},"searchToActionSuccessRate":{"type":"number","minimum":0,"maximum":1},"lowSample":{"type":"object","required":["abandonment","timed","firstPass"],"properties":{"abandonment":{"type":"boolean"},"timed":{"type":"boolean"},"firstPass":{"type":"boolean"}}}}},"WorkflowAnalyticsResponse":{"type":"object","required":["filters","workflows","trends","definitions","trendReliabilityThresholds"],"properties":{"filters":{"type":"object","required":["dateFrom","dateTo","workflow","role","source","granularity"],"properties":{"dateFrom":{"type":["string","null"],"format":"date"},"dateTo":{"type":["string","null"],"format":"date"},"workflow":{"anyOf":[{"$ref":"#/components/schemas/WorkflowAnalyticsName"},{"type":"null"}]},"role":{"anyOf":[{"$ref":"#/components/schemas/WorkflowAnalyticsRole"},{"type":"null"}]},"source":{"anyOf":[{"$ref":"#/components/schemas/WorkflowAnalyticsSource"},{"type":"null"}]},"granularity":{"type":"string","enum":["week","month"]}}},"workflows":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowAnalyticsMetric"}},"trends":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowAnalyticsTrend"}},"definitions":{"type":"object","required":["duration","abandonment","firstPass","searchToAction"],"properties":{"duration":{"type":"string"},"abandonment":{"type":"string"},"firstPass":{"type":"string"},"searchToAction":{"type":"string"}}},"trendReliabilityThresholds":{"$ref":"#/components/schemas/WorkflowConfidenceThresholds"}}},"WorkflowConfidenceThresholds":{"type":"object","additionalProperties":false,"required":["started","timedCompletionCount","firstPassEligibleCount"],"properties":{"started":{"type":"integer","minimum":1,"maximum":50000},"timedCompletionCount":{"type":"integer","minimum":1,"maximum":50000},"firstPassEligibleCount":{"type":"integer","minimum":1,"maximum":50000}}},"WorkflowConfidenceThresholdsResponse":{"type":"object","required":["thresholds"],"properties":{"thresholds":{"$ref":"#/components/schemas/WorkflowConfidenceThresholds"}}},"WorkflowAlertConfigInput":{"type":"object","additionalProperties":false,"required":["enabled","minRecentSample","minBaselineSample","abandonmentIncreasePctPoints","durationIncreasePercent"],"properties":{"enabled":{"type":"boolean"},"minRecentSample":{"type":"integer","minimum":5,"maximum":10000},"minBaselineSample":{"type":"integer","minimum":10,"maximum":50000},"abandonmentIncreasePctPoints":{"type":"number","minimum":1,"maximum":100},"durationIncreasePercent":{"type":"number","minimum":1,"maximum":1000}}},"WorkflowAlertConfig":{"allOf":[{"$ref":"#/components/schemas/WorkflowAlertConfigInput"},{"type":"object","required":["workflow"],"properties":{"workflow":{"$ref":"#/components/schemas/WorkflowAnalyticsName"}}}]},"WorkflowAlertConfigResponse":{"type":"object","required":["recentDays","baselineDays","workflows"],"properties":{"recentDays":{"type":"integer","enum":[7]},"baselineDays":{"type":"integer","enum":[28]},"workflows":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowAlertConfig"}}}},"OpsExceptionAction":{"type":"object","required":["label","href","kind"],"properties":{"label":{"type":"string"},"href":{"type":"string"},"kind":{"type":"string","enum":["open","retry_accounting"]}}},"OpsException":{"type":"object","required":["key","category","priority","owner","title","detail","occurredAt","ageDays","action"],"properties":{"key":{"type":"string"},"category":{"type":"string","enum":["certificate_delivery","certificate_integrity","customer_response","quote","retest","invoice","email_failure","calendar_sync","accounting_sync","qs_review","qs_correction","photo_review","dispatch_eligibility"]},"priority":{"type":"string","enum":["critical","high","normal"]},"owner":{"type":"string"},"title":{"type":"string"},"detail":{"type":"string"},"occurredAt":{"type":"string","format":"date-time"},"ageDays":{"type":"integer","minimum":0},"action":{"$ref":"#/components/schemas/OpsExceptionAction"}}},"OpsExceptionUnavailableSource":{"type":"object","required":["source","message"],"properties":{"source":{"type":"string","enum":["certificates","quotes","retests","invoices","email","calendar","accounting","intelligence"]},"message":{"type":"string"}}},"OpsExceptionWorklist":{"type":"object","required":["generatedAt","items","unavailableSources","totals","truncated"],"properties":{"generatedAt":{"type":"string","format":"date-time"},"items":{"type":"array","items":{"$ref":"#/components/schemas/OpsException"}},"unavailableSources":{"type":"array","items":{"$ref":"#/components/schemas/OpsExceptionUnavailableSource"}},"totals":{"type":"object","required":["critical","high","normal"],"properties":{"critical":{"type":"integer"},"high":{"type":"integer"},"normal":{"type":"integer"}}},"truncated":{"type":"boolean","description":"True when the ranked response is capped and more active exceptions may exist."}}},"OpsExceptionDismissal":{"type":"object","required":["ok","key"],"properties":{"ok":{"type":"boolean"},"key":{"type":"string"}}},"ClarityQuestion":{"type":"object","required":["id","question","audience","visibility","personScoped","params","related"],"properties":{"id":{"type":"string"},"question":{"type":"string"},"audience":{"type":"string","enum":["engineer","office","scheduler","director","customer"]},"visibility":{"type":"string","enum":["self","staff","admin","customer"]},"personScoped":{"type":"boolean"},"related":{"type":"array","items":{"type":"string"}},"params":{"type":"array","items":{"type":"object","required":["name","type","required","description"],"properties":{"name":{"type":"string"},"type":{"type":"string","enum":["number","string"]},"required":{"type":"boolean"},"description":{"type":"string"}}}}}},"ClarityAskInput":{"type":"object","required":["questionId"],"properties":{"questionId":{"type":"string","minLength":1,"maxLength":100},"params":{"type":"object","additionalProperties":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200}]}}}},"ClarityFinding":{"type":"object","required":["questionId","question","kind","headline","facts","provenance","freshness","confidence","evidenceCount","visibility","personScoped","subjectUserId"],"properties":{"questionId":{"type":"string"},"question":{"type":"string"},"kind":{"type":"string","enum":["answer","insufficient_evidence"]},"headline":{"type":"string"},"facts":{"type":"array","items":{"type":"object","required":["label","value"],"properties":{"label":{"type":"string"},"value":{"type":"string"}}}},"provenance":{"type":"array","items":{"type":"object","required":["table","ids"],"properties":{"table":{"type":"string"},"ids":{"type":"array","items":{"type":"integer"}}}}},"freshness":{"type":"object","required":["oldestEvidenceAt","newestEvidenceAt"],"properties":{"oldestEvidenceAt":{"type":["string","null"]},"newestEvidenceAt":{"type":["string","null"]}}},"confidence":{"type":"string","enum":["low","medium","high"]},"evidenceCount":{"type":"integer"},"visibility":{"type":"string","enum":["self","staff","admin","customer"]},"personScoped":{"type":"boolean"},"subjectUserId":{"type":["integer","null"]}}},"DailyLink":{"type":"object","required":["kind","id"],"properties":{"kind":{"type":"string","enum":["job","site","quote","customer"]},"id":{"type":"integer"}}},"DailyItem":{"type":"object","required":["key","title","link","freshnessLabel","finding"],"properties":{"key":{"type":"string"},"title":{"type":"string"},"link":{"oneOf":[{"$ref":"#/components/schemas/DailyLink"},{"type":"null"}]},"freshnessLabel":{"type":["string","null"]},"detail":{"type":["string","null"]},"finding":{"$ref":"#/components/schemas/ClarityFinding"}}},"EngineerDaily":{"type":"object","required":["date","quiet","quietMessage","attention","goingWell","atRisk","next"],"properties":{"date":{"type":"string"},"quiet":{"type":"boolean"},"quietMessage":{"type":["string","null"]},"attention":{"type":"array","items":{"$ref":"#/components/schemas/DailyItem"}},"goingWell":{"type":"array","items":{"$ref":"#/components/schemas/DailyItem"}},"atRisk":{"type":"array","items":{"$ref":"#/components/schemas/DailyItem"}},"next":{"type":"array","items":{"$ref":"#/components/schemas/DailyItem"}}}},"AskClarityVoiceInput":{"type":"object","required":["questionId"],"properties":{"questionId":{"type":"string","minLength":1,"maxLength":100},"params":{"type":"object","additionalProperties":{"oneOf":[{"type":"number"},{"type":"string","maxLength":200}]}}}},"VoiceProse":{"type":"object","required":["prose","reason","label"],"properties":{"prose":{"type":"string","nullable":true,"description":"The Voice's rephrasing, or null when unavailable (structured rendering stands alone)"},"reason":{"type":"string","nullable":true,"description":"Why prose is null (disabled, not_configured, budget_exhausted, timeout, generation_failed, fidelity_violation, empty, quiet, insufficient_evidence)"},"label":{"type":"string","description":"Attribution label surfaces must show with the prose"}}},"ClarityAskTextInput":{"type":"object","required":["text"],"properties":{"text":{"type":"string","minLength":1,"maxLength":300}}},"ClarityAskTextResult":{"type":"object","required":["matched"],"properties":{"matched":{"type":"boolean"},"question":{"$ref":"#/components/schemas/ClarityQuestion"},"message":{"type":"string"}}},"ClarityFeedbackInput":{"type":"object","required":["questionId","questionText"],"properties":{"questionId":{"type":"string","minLength":1,"maxLength":100},"questionText":{"type":"string","minLength":1,"maxLength":300},"helpful":{"type":"boolean"}}},"ClarityAskLogSummary":{"type":"object","required":["unmatched","feedback"],"properties":{"unmatched":{"type":"array","items":{"type":"object","required":["questionText","count","tenantCount","roles","lastAskedAt"],"properties":{"questionText":{"type":"string"},"count":{"type":"integer"},"tenantCount":{"type":"integer"},"roles":{"type":"array","items":{"type":"string"}},"lastAskedAt":{"type":"string"}}}},"feedback":{"type":"array","items":{"type":"object","required":["questionId","questionText","count","tenantCount","lastFlaggedAt"],"properties":{"questionId":{"type":"string"},"questionText":{"type":"string"},"count":{"type":"integer"},"tenantCount":{"type":"integer"},"lastFlaggedAt":{"type":"string"}}}}}},"OfficeDaily":{"type":"object","required":["date","quiet","quietMessage","chase","waiting","quietCustomers","team","certs","contracts"],"properties":{"date":{"type":"string"},"quiet":{"type":"boolean"},"quietMessage":{"type":["string","null"]},"chase":{"type":"array","items":{"$ref":"#/components/schemas/DailyItem"}},"waiting":{"type":"array","items":{"$ref":"#/components/schemas/DailyItem"}},"quietCustomers":{"type":"array","items":{"$ref":"#/components/schemas/DailyItem"}},"team":{"type":"array","items":{"$ref":"#/components/schemas/DailyItem"}},"certs":{"type":"array","items":{"$ref":"#/components/schemas/DailyItem"}},"contracts":{"type":"array","items":{"$ref":"#/components/schemas/DailyItem"}}}},"LeaveProrationPolicy":{"type":"object","additionalProperties":false,"required":["method","rounding","increment","partTime","referenceDays","referenceHours","carryOrder"],"properties":{"method":{"type":"string","enum":["calendar_days","whole_calendar_months"]},"rounding":{"type":"string","enum":["up","down","nearest"]},"increment":{"type":"number","minimum":0.01,"maximum":10},"partTime":{"type":"string","enum":["employee_allowance","weekly_days","weekly_hours"]},"referenceDays":{"type":"number","exclusiveMinimum":0,"maximum":7},"referenceHours":{"type":"number","exclusiveMinimum":0,"maximum":168},"carryOrder":{"type":"string","enum":["carry_first"]}}},"LeaveProrationPolicyInput":{"type":"object","required":["policy","confirmedCompanyPolicy"],"properties":{"policy":{"$ref":"#/components/schemas/LeaveProrationPolicy"},"confirmedCompanyPolicy":{"type":"boolean","enum":[true]}}},"LeaveProrationPolicyResult":{"type":"object","required":["configured","policy"],"properties":{"configured":{"type":"boolean"},"policy":{"anyOf":[{"$ref":"#/components/schemas/LeaveProrationPolicy"},{"type":"null"}]}}},"LeaveEntitlementReviewInput":{"type":"object","required":["employmentStart","employmentEnd","fullYearAllowance","patternKind","averageWeeklyHours","trackCarryOver"],"properties":{"employmentStart":{"type":"string","format":"date"},"employmentEnd":{"type":["string","null"],"format":"date"},"fullYearAllowance":{"type":"number","minimum":0,"maximum":10000},"patternKind":{"type":"string","enum":["fixed","variable"]},"averageWeeklyHours":{"type":["number","null"],"exclusiveMinimum":0,"maximum":168},"yearDate":{"type":"string","format":"date"},"trackCarryOver":{"type":"boolean"}}},"LeaveEntitlementConfirmationInput":{"allOf":[{"$ref":"#/components/schemas/LeaveEntitlementReviewInput"},{"type":"object","required":["previewId","reason","confirm"],"properties":{"previewId":{"type":"string"},"reason":{"type":"string","minLength":1,"maxLength":500},"confirm":{"type":"boolean","enum":[true]},"confirmDeficit":{"type":"boolean"}}}]},"LeaveReviewYear":{"type":"object","required":["label","startISO","endISO"],"properties":{"label":{"type":"string"},"startISO":{"type":"string","format":"date"},"endISO":{"type":"string","format":"date"}}},"LeaveCarryAllocation":{"type":"object","required":["requestId","total","carry","annual","fingerprint"],"properties":{"requestId":{"type":"integer"},"total":{"type":"number"},"carry":{"type":"number"},"annual":{"type":"number"},"fingerprint":{"type":"string"}}},"LeaveCarryHistoryEntry":{"type":"object","additionalProperties":true,"description":"Immutable allocation event or explicitly labelled as-of expiry calculation."},"LeaveCarryDetails":{"type":"object","required":["tracking","granted","consumed","expired","remaining","retained","allocations","history","requiresReview"],"properties":{"tracking":{"type":"boolean"},"granted":{"type":"number"},"consumed":{"type":["number","null"],"description":"Null means unknown historical consumption, never proven zero."},"expired":{"type":["number","null"]},"remaining":{"type":"number"},"retained":{"type":"number","description":"Spent carry plus unexpired unspent carry; avoids charging spent carry against annual allowance twice."},"requiresReview":{"type":"boolean"},"allocations":{"type":"array","items":{"$ref":"#/components/schemas/LeaveCarryAllocation"}},"history":{"type":"array","items":{"$ref":"#/components/schemas/LeaveCarryHistoryEntry"}}}},"LeaveEntitlementReviewPreview":{"type":"object","required":["previewId","year","currentAllowance","proposedAllowance","delta","unit","explanation","warnings","canApply","deficit","carry","inputs"],"properties":{"previewId":{"type":"string"},"year":{"$ref":"#/components/schemas/LeaveReviewYear"},"currentAllowance":{"type":"number"},"proposedAllowance":{"type":"number"},"delta":{"type":"number"},"unit":{"type":"string","enum":["days","hours"]},"explanation":{"type":"array","items":{"type":"string"}},"warnings":{"type":"array","items":{"type":"string"}},"canApply":{"type":"boolean"},"deficit":{"type":"number"},"carry":{"$ref":"#/components/schemas/LeaveCarryDetails"},"inputs":{"$ref":"#/components/schemas/LeaveEntitlementReviewInput"}}},"LeaveAdjustmentEntry":{"type":"object","required":["id","delta","unit","reason","effectiveDate","createdByName","createdAt"],"properties":{"id":{"type":"integer"},"delta":{"type":"number"},"unit":{"type":"string","enum":["days","hours"]},"reason":{"type":"string"},"effectiveDate":{"type":["string","null"]},"createdByName":{"type":["string","null"]},"createdAt":{"type":"string"},"calculationSnapshot":{"type":["object","null"],"additionalProperties":true}}},"LeaveSettingsDetail":{"type":"object","required":["userId","unit","allowanceValue","carryOver","carryOverExpiry","daysPerWeek","hoursPerDay","weeklyPattern","hasSettings","adjustments"],"properties":{"userId":{"type":"integer"},"unit":{"type":"string","enum":["days","hours"]},"allowanceValue":{"type":"number"},"carryOver":{"type":"number"},"carryOverExpiry":{"type":["string","null"]},"daysPerWeek":{"type":"number"},"hoursPerDay":{"type":"number"},"weeklyPattern":{"type":["array","null"],"items":{"type":"number"}},"hasSettings":{"type":"boolean"},"employmentStart":{"type":["string","null"],"format":"date"},"employmentEnd":{"type":["string","null"],"format":"date"},"fullYearAllowance":{"type":["number","null"]},"patternKind":{"type":["string","null"],"enum":["fixed","variable",null]},"averageWeeklyHours":{"type":["number","null"]},"entitlementReview":{"type":["object","null"],"additionalProperties":true},"entitlementReviewStatus":{"type":"string","enum":["configured_legacy","reviewed","review_required"]},"carryLedger":{"type":["object","null"],"additionalProperties":true},"adjustments":{"type":"array","items":{"$ref":"#/components/schemas/LeaveAdjustmentEntry"}}}},"LeaveSettingsInput":{"type":"object","required":["entitlementUnit","allowanceValue","daysPerWeek","hoursPerDay"],"properties":{"entitlementUnit":{"type":"string","enum":["days","hours"]},"allowanceValue":{"type":"number","minimum":0,"maximum":10000},"daysPerWeek":{"type":"number","minimum":0,"maximum":7},"hoursPerDay":{"type":"number","minimum":0,"maximum":24},"weeklyPattern":{"type":["array","null"],"items":{"type":"number"},"minItems":7,"maxItems":7},"carryOver":{"type":"number","minimum":0,"maximum":10000},"carryOverExpiry":{"type":["string","null"]}}},"LeaveSettingsSaveResult":{"type":"object","required":["id","userId","unit","allowanceValue","carryOver"],"properties":{"id":{"type":"integer"},"userId":{"type":"integer"},"unit":{"type":"string","enum":["days","hours"]},"allowanceValue":{"type":"number"},"carryOver":{"type":"number"}}},"LeaveAdjustmentInput":{"type":"object","required":["delta","reason"],"properties":{"delta":{"type":"number","description":"Non-zero entitlement delta in the chosen unit."},"unit":{"type":"string","enum":["days","hours"]},"reason":{"type":"string","minLength":1,"maxLength":500},"effectiveDate":{"type":["string","null"]}}},"LeaveAdjustmentResult":{"type":"object","required":["id","userId","delta","unit","newAllowance"],"properties":{"id":{"type":"integer"},"userId":{"type":"integer"},"delta":{"type":"number"},"unit":{"type":"string","enum":["days","hours"]},"newAllowance":{"type":"number"}}},"SicknessRecord":{"type":"object","required":["id","userId","userFullName","startDate","endDate","days","category","fitNoteReceived","returnToWorkCompleted","ongoingSupport","longTerm","expectedReturnDate","notes","recordedById","recordedByName","createdAt","updatedAt"],"properties":{"id":{"type":"integer"},"userId":{"type":"integer"},"userFullName":{"type":["string","null"]},"startDate":{"type":"string"},"endDate":{"type":"string"},"days":{"type":"number"},"category":{"type":"string","enum":["short_term","long_term","injury","stress","other"]},"fitNoteReceived":{"type":"boolean"},"returnToWorkCompleted":{"type":"boolean"},"ongoingSupport":{"type":"boolean"},"longTerm":{"type":"boolean"},"expectedReturnDate":{"type":["string","null"]},"notes":{"type":["string","null"]},"recordedById":{"type":["integer","null"]},"recordedByName":{"type":["string","null"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}}},"SicknessListResponse":{"type":"object","required":["records"],"properties":{"records":{"type":"array","items":{"$ref":"#/components/schemas/SicknessRecord"}}}},"SicknessInput":{"type":"object","required":["userId","startDate","endDate"],"properties":{"userId":{"type":"integer"},"startDate":{"type":"string"},"endDate":{"type":"string"},"category":{"type":"string","enum":["short_term","long_term","injury","stress","other"]},"fitNoteReceived":{"type":"boolean"},"returnToWorkCompleted":{"type":"boolean"},"ongoingSupport":{"type":"boolean"},"longTerm":{"type":"boolean"},"expectedReturnDate":{"type":["string","null"]},"notes":{"type":["string","null"]}}},"SicknessUpdate":{"type":"object","properties":{"startDate":{"type":"string"},"endDate":{"type":"string"},"category":{"type":"string","enum":["short_term","long_term","injury","stress","other"]},"fitNoteReceived":{"type":"boolean"},"returnToWorkCompleted":{"type":"boolean"},"ongoingSupport":{"type":"boolean"},"longTerm":{"type":"boolean"},"expectedReturnDate":{"type":["string","null"]},"notes":{"type":["string","null"]}}},"LeaveBalanceSummary":{"type":"object","required":["userId","year","yearStart","yearEnd","unit","entitlement","allowance","carryOver","used","pending","remaining","available","sicknessDays","sicknessEpisodes","openReturnToWork"],"properties":{"carryDetails":{"$ref":"#/components/schemas/LeaveCarryDetails"},"entitlementReviewStatus":{"type":"string","enum":["configured_legacy","reviewed","review_required"]},"userId":{"type":"integer"},"year":{"type":"string"},"yearStart":{"type":"string"},"yearEnd":{"type":"string"},"unit":{"type":"string","enum":["days","hours"]},"entitlement":{"type":"number"},"allowance":{"type":"number"},"carryOver":{"type":"number"},"used":{"type":"number"},"pending":{"type":"number"},"remaining":{"type":"number"},"available":{"type":"number"},"sicknessDays":{"type":"number"},"sicknessEpisodes":{"type":"integer"},"openReturnToWork":{"type":"integer"}}},"LeaveOverviewEmployee":{"type":"object","required":["userId","userFullName","role","hasSettings","unit","entitlement","allowance","carryOver","used","pending","remaining","available","sicknessDays","sicknessEpisodes","openReturnToWork"],"properties":{"userId":{"type":"integer"},"userFullName":{"type":["string","null"]},"role":{"type":"string"},"hasSettings":{"type":"boolean"},"unit":{"type":"string","enum":["days","hours"]},"entitlement":{"type":"number"},"allowance":{"type":"number"},"carryOver":{"type":"number"},"used":{"type":"number"},"pending":{"type":"number"},"remaining":{"type":"number"},"available":{"type":"number"},"sicknessDays":{"type":"number"},"sicknessEpisodes":{"type":"integer"},"openReturnToWork":{"type":"integer"}}},"LeaveOverview":{"type":"object","required":["year","yearStart","yearEnd","employees"],"properties":{"year":{"type":"string"},"yearStart":{"type":"string"},"yearEnd":{"type":"string"},"employees":{"type":"array","items":{"$ref":"#/components/schemas/LeaveOverviewEmployee"}}}},"LeaveYearSettings":{"type":"object","required":["startMonth","startDay","year","yearStart","yearEnd"],"properties":{"startMonth":{"type":"integer"},"startDay":{"type":"integer"},"year":{"type":"string"},"yearStart":{"type":"string"},"yearEnd":{"type":"string"}}},"LeaveYearSettingsInput":{"type":"object","required":["startMonth","startDay"],"properties":{"startMonth":{"type":"integer","minimum":1,"maximum":12},"startDay":{"type":"integer","minimum":1,"maximum":31}}},"LeaveBalanceReportRow":{"type":"object","required":["userId","userFullName","team","unit","entitlement","used","pending","remaining","available","sicknessDays","sicknessEpisodes"],"properties":{"userId":{"type":"integer"},"userFullName":{"type":["string","null"]},"team":{"type":["string","null"]},"unit":{"type":"string","enum":["days","hours"]},"entitlement":{"type":"number"},"used":{"type":"number"},"pending":{"type":"number"},"remaining":{"type":"number"},"available":{"type":"number"},"sicknessDays":{"type":"number"},"sicknessEpisodes":{"type":"integer"}}},"LeaveBalancesReport":{"type":"object","required":["year","yearStart","yearEnd","rows"],"properties":{"year":{"type":"string"},"yearStart":{"type":"string"},"yearEnd":{"type":"string"},"rows":{"type":"array","items":{"$ref":"#/components/schemas/LeaveBalanceReportRow"}}}},"SicknessReportRow":{"type":"object","required":["userId","userFullName","team","episodes","totalDays","openReturnToWork"],"properties":{"userId":{"type":"integer"},"userFullName":{"type":["string","null"]},"team":{"type":["string","null"]},"episodes":{"type":"integer"},"totalDays":{"type":"number"},"openReturnToWork":{"type":"integer"}}},"SicknessReport":{"type":"object","required":["year","yearStart","yearEnd","rows"],"properties":{"year":{"type":"string"},"yearStart":{"type":"string"},"yearEnd":{"type":"string"},"rows":{"type":"array","items":{"$ref":"#/components/schemas/SicknessReportRow"}}}},"AbsenceReportRow":{"type":"object","required":["userId","userFullName","team","unit","sicknessDays","sicknessInstances","bradfordFactor","bradfordBand","annualAllowance","annualUsed","annualRemaining","utilisationPct"],"properties":{"userId":{"type":"integer"},"userFullName":{"type":["string","null"]},"team":{"type":["string","null"]},"unit":{"type":"string","enum":["days","hours"]},"sicknessDays":{"type":"number"},"sicknessInstances":{"type":"integer"},"bradfordFactor":{"type":"integer"},"bradfordBand":{"type":"string","enum":["green","amber","red"]},"annualAllowance":{"type":"number"},"annualUsed":{"type":"number"},"annualRemaining":{"type":"number"},"utilisationPct":{"type":"number"}}},"AbsenceReportTeam":{"type":"object","required":["team","headcount","sicknessDays","sicknessInstances","avgBradfordFactor","annualAllowance","annualUsed","utilisationPct"],"properties":{"team":{"type":"string"},"headcount":{"type":"integer"},"sicknessDays":{"type":"number"},"sicknessInstances":{"type":"integer"},"avgBradfordFactor":{"type":"integer"},"annualAllowance":{"type":"number"},"annualUsed":{"type":"number"},"utilisationPct":{"type":"number"}}},"AbsenceReport":{"type":"object","required":["from","to","year","rows","teams"],"properties":{"from":{"type":"string"},"to":{"type":"string"},"year":{"type":"string"},"rows":{"type":"array","items":{"$ref":"#/components/schemas/AbsenceReportRow"}},"teams":{"type":"array","items":{"$ref":"#/components/schemas/AbsenceReportTeam"}}}},"UpcomingLeaveRow":{"type":"object","required":["userId","userFullName","leaveType","startDate","endDate","durationKind"],"properties":{"userId":{"type":"integer"},"userFullName":{"type":["string","null"]},"leaveType":{"type":["string","null"]},"startDate":{"type":"string"},"endDate":{"type":"string"},"durationKind":{"type":["string","null"]}}},"UpcomingLeaveReport":{"type":"object","required":["asOf","rows"],"properties":{"asOf":{"type":"string"},"rows":{"type":"array","items":{"$ref":"#/components/schemas/UpcomingLeaveRow"}}}},"LeaveConflict":{"type":"object","required":["kind","startDate","endDate"],"properties":{"kind":{"type":"string","enum":["holiday","sickness"]},"status":{"type":"string"},"leaveType":{"type":"string"},"startDate":{"type":"string"},"endDate":{"type":"string"}}},"LeaveAvailabilityDay":{"type":"object","required":["userId","date","available","conflicts"],"properties":{"userId":{"type":"integer"},"date":{"type":"string"},"available":{"type":"boolean"},"conflicts":{"type":"array","items":{"$ref":"#/components/schemas/LeaveConflict"}}}},"AvailabilityEntry":{"type":"object","required":["type","label","startDate","endDate"],"properties":{"type":{"type":"string","enum":["holiday","sickness","public_holiday"]},"label":{"type":"string"},"status":{"type":"string"},"leaveType":{"type":"string"},"startDate":{"type":"string"},"endDate":{"type":"string"}}},"UserAvailabilityTimeline":{"type":"object","required":["userId","from","to","entries"],"properties":{"userId":{"type":"integer"},"from":{"type":"string"},"to":{"type":"string"},"entries":{"type":"array","items":{"$ref":"#/components/schemas/AvailabilityEntry"}}}},"LeaveTypeConfig":{"type":"object","required":["key","label","deductsFromAllowance","longTerm","enabled"],"properties":{"key":{"type":"string"},"label":{"type":"string"},"deductsFromAllowance":{"type":"boolean"},"longTerm":{"type":"boolean"},"enabled":{"type":"boolean"}}},"LeaveTypesResponse":{"type":"object","required":["types"],"properties":{"types":{"type":"array","items":{"$ref":"#/components/schemas/LeaveTypeConfig"}}}},"LeaveTypeInput":{"type":"object","required":["key","label","deductsFromAllowance"],"properties":{"key":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-z0-9_]+$"},"label":{"type":"string","minLength":1,"maxLength":80},"deductsFromAllowance":{"type":"boolean"},"longTerm":{"type":"boolean"},"enabled":{"type":"boolean"}}},"LeaveTypesInput":{"type":"object","required":["types"],"properties":{"types":{"type":"array","minItems":1,"maxItems":40,"items":{"$ref":"#/components/schemas/LeaveTypeInput"}}}},"PublicHoliday":{"type":"object","required":["id","date","name"],"properties":{"id":{"type":"integer"},"date":{"type":"string"},"name":{"type":"string"}}},"PublicHolidaysResponse":{"type":"object","required":["holidays","excludeFromEntitlement"],"properties":{"holidays":{"type":"array","items":{"$ref":"#/components/schemas/PublicHoliday"}},"excludeFromEntitlement":{"type":"boolean"}}},"PublicHolidayInput":{"type":"object","required":["date","name"],"properties":{"date":{"type":"string"},"name":{"type":"string","minLength":1,"maxLength":120}}},"ExcludePublicHolidaysInput":{"type":"object","required":["excludeFromEntitlement"],"properties":{"excludeFromEntitlement":{"type":"boolean"}}},"ExcludePublicHolidaysResponse":{"type":"object","required":["excludeFromEntitlement"],"properties":{"excludeFromEntitlement":{"type":"boolean"}}},"ConflictRules":{"type":"object","required":["enabled","maxOnLeave","minAvailable"],"properties":{"enabled":{"type":"boolean"},"maxOnLeave":{"type":["integer","null"]},"minAvailable":{"type":["integer","null"]}}},"ConflictRulesResponse":{"type":"object","required":["rules"],"properties":{"rules":{"$ref":"#/components/schemas/ConflictRules"}}},"ConflictRulesInput":{"type":"object","required":["enabled","maxOnLeave","minAvailable"],"properties":{"enabled":{"type":"boolean"},"maxOnLeave":{"type":["integer","null"],"minimum":0,"maximum":10000},"minAvailable":{"type":["integer","null"],"minimum":0,"maximum":10000}}},"CapacityDay":{"type":"object","required":["date","total","onLeave","onHoliday","onSickness","available","rag","warnings"],"properties":{"date":{"type":"string"},"total":{"type":"integer"},"onLeave":{"type":"integer"},"onHoliday":{"type":"integer"},"onSickness":{"type":"integer"},"available":{"type":"integer"},"rag":{"type":"string","enum":["red","amber","green"]},"warnings":{"type":"array","items":{"type":"string"}}}},"LongTermAbsence":{"type":"object","required":["userId","userFullName","startDate","endDate","category","expectedReturnDate","returnDateKnown"],"properties":{"userId":{"type":"integer"},"userFullName":{"type":["string","null"]},"startDate":{"type":"string"},"endDate":{"type":"string"},"category":{"type":"string"},"expectedReturnDate":{"type":["string","null"]},"returnDateKnown":{"type":"boolean"}}},"LeaveCapacityResponse":{"type":"object","required":["from","to","totalEmployees","rules","days","longTermAbsences"],"properties":{"from":{"type":"string"},"to":{"type":"string"},"totalEmployees":{"type":"integer"},"rules":{"$ref":"#/components/schemas/ConflictRules"},"days":{"type":"array","items":{"$ref":"#/components/schemas/CapacityDay"}},"longTermAbsences":{"type":"array","items":{"$ref":"#/components/schemas/LongTermAbsence"}}}},"SchedulingImpactOff":{"type":"object","required":["userId","userFullName","kind","startDate","endDate"],"properties":{"userId":{"type":"integer"},"userFullName":{"type":["string","null"]},"kind":{"type":"string","enum":["holiday","sickness"]},"leaveType":{"type":"string"},"startDate":{"type":"string"},"endDate":{"type":"string"}}},"SchedulingImpact":{"type":"object","required":["date","rag","warnings","totalEmployees","available","offCount","off"],"properties":{"date":{"type":"string"},"rag":{"type":"string","enum":["red","amber","green"]},"warnings":{"type":"array","items":{"type":"string"}},"totalEmployees":{"type":"integer"},"available":{"type":"integer"},"offCount":{"type":"integer"},"off":{"type":"array","items":{"$ref":"#/components/schemas/SchedulingImpactOff"}}}},"LongTermAbsencesResponse":{"type":"object","required":["asOf","absences"],"properties":{"asOf":{"type":"string"},"absences":{"type":"array","items":{"$ref":"#/components/schemas/LongTermAbsence"}}}},"YearEndPreviewEmployee":{"type":"object","required":["userId","userFullName","unit","entitlement","used","remaining","sicknessDays","proposedCarryOver"],"properties":{"userId":{"type":"integer"},"userFullName":{"type":["string","null"]},"unit":{"type":"string","enum":["days","hours"]},"entitlement":{"type":"number"},"used":{"type":"number"},"remaining":{"type":"number"},"sicknessDays":{"type":"number"},"proposedCarryOver":{"type":"number"}}},"YearEndPreview":{"type":"object","required":["year","yearStart","yearEnd","alreadyClosed","policy","cap","employees"],"properties":{"year":{"type":"string"},"yearStart":{"type":"string"},"yearEnd":{"type":"string"},"alreadyClosed":{"type":"boolean"},"policy":{"type":"string","enum":["none","all","capped","manual"]},"cap":{"type":["number","null"]},"employees":{"type":"array","items":{"$ref":"#/components/schemas/YearEndPreviewEmployee"}}}},"YearEndManualCarryOver":{"type":"object","required":["userId","value"],"properties":{"userId":{"type":"integer"},"value":{"type":"number","minimum":0,"maximum":10000}}},"YearEndCloseInput":{"type":"object","required":["policy"],"properties":{"policy":{"type":"string","enum":["none","all","capped","manual"]},"cap":{"type":"number","minimum":0,"maximum":10000},"manualCarryOvers":{"type":"array","items":{"$ref":"#/components/schemas/YearEndManualCarryOver"}},"force":{"type":"boolean"},"carryOverExpiry":{"type":["string","null"],"format":"date"}}},"YearEndCloseResult":{"type":"object","required":["year","closed","policy"],"properties":{"year":{"type":"string"},"closed":{"type":"integer"},"policy":{"type":"string","enum":["none","all","capped","manual"]}}},"YearEndSnapshot":{"type":"object","required":["id","yearLabel","yearStart","yearEnd","userId","userFullName","unit","entitlement","used","remaining","sicknessDays","carryOver","carryOverPolicy","createdByName","createdAt"],"properties":{"id":{"type":"integer"},"yearLabel":{"type":"string"},"yearStart":{"type":"string"},"yearEnd":{"type":"string"},"userId":{"type":"integer"},"userFullName":{"type":["string","null"]},"unit":{"type":"string"},"entitlement":{"type":"number"},"used":{"type":"number"},"remaining":{"type":"number"},"sicknessDays":{"type":"number"},"carryOver":{"type":"number"},"carryOverPolicy":{"type":"string"},"carryOverExpiry":{"type":["string","null"],"format":"date"},"carryLedgerSnapshot":{"type":["object","null"],"additionalProperties":true,"description":"Archived reviewed allocation ledger, including recorded grant changes and request before/after splits."},"createdByName":{"type":["string","null"]},"createdAt":{"type":"string"}}},"YearEndSnapshotsResponse":{"type":"object","required":["snapshots"],"properties":{"snapshots":{"type":"array","items":{"$ref":"#/components/schemas/YearEndSnapshot"}}}},"HealthStatus":{"type":"object","properties":{"status":{"type":"string"}},"required":["status"]},"ErrorResponse":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]},"CustomerPortalPreview":{"type":"object","required":["customer","readOnly","summary","sites"],"properties":{"customer":{"type":"object","required":["id","name"],"properties":{"id":{"type":"integer"},"name":{"type":"string"}}},"readOnly":{"type":"boolean"},"summary":{"type":"object","required":["sites","attentionSites","outstandingActions","outstandingBalance"],"properties":{"sites":{"type":"integer"},"attentionSites":{"type":"integer"},"outstandingActions":{"type":"integer"},"outstandingBalance":{"type":"string"}}},"sites":{"type":"array","items":{"type":"object","required":["id","name","riskLevel","outstandingActions","counts"],"properties":{"id":{"type":"integer"},"name":{"type":"string"},"riskLevel":{"type":"string"},"outstandingActions":{"type":"integer"},"counts":{"type":"object","required":["visits","certificates","defects","remedials","quotes","invoices","payments"],"properties":{"visits":{"type":"integer"},"certificates":{"type":"integer"},"defects":{"type":"integer"},"remedials":{"type":"integer"},"quotes":{"type":"integer"},"invoices":{"type":"integer"},"payments":{"type":"integer"}}}}}}}},"CustomerPortalOverview":{"type":"object","required":["customersTotal","customersWithAccess","customersWithoutAccess","portalAccounts","activeAccountsLast30Days","pendingInvitations","failedInvitations","preparedCertificateLinks","accessedCertificateLinks","lastCustomerLoginAt"],"properties":{"customersTotal":{"type":"integer"},"customersWithAccess":{"type":"integer"},"customersWithoutAccess":{"type":"integer"},"portalAccounts":{"type":"integer"},"activeAccountsLast30Days":{"type":"integer"},"pendingInvitations":{"type":"integer"},"failedInvitations":{"type":"integer"},"preparedCertificateLinks":{"type":"integer"},"accessedCertificateLinks":{"type":"integer"},"lastCustomerLoginAt":{"type":"string","nullable":true,"format":"date-time"}}},"Customer":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"address":{"type":"string"},"postcode":{"type":"string"},"contactName":{"type":["string","null"]},"contactEmail":{"type":["string","null"]},"contactPhone":{"type":["string","null"]},"website":{"type":["string","null"],"maxLength":2000},"apiRateLimitPerMinute":{"type":["integer","null"],"description":"Default per-minute API rate limit applied to API keys issued for this customer when the key has no explicit override."},"logoUrl":{"type":["string","null"],"description":"Object storage path for the customer's logo image."},"retestRemindersEnabled":{"type":"boolean","description":"When false, automated PAT/EICR retest reminder emails and portal notifications are suppressed for this customer."},"accountingProviderOverride":{"type":["string","null"],"enum":["xero","quickbooks",null],"description":"Pin invoices and credit notes for this customer to a specific accounting ledger. Null means follow the global default."},"tradingName":{"type":["string","null"],"description":"Trading-as name when it differs from the legal entity name."},"legalEntity":{"type":["string","null"],"description":"Registered legal entity / company name."},"status":{"type":"string","description":"Account lifecycle status (active, prospect, on_hold, closed)."},"accountOwnerUserId":{"type":["integer","null"],"description":"Internal user who owns this account relationship."},"customerSince":{"type":["string","null"],"description":"Date the customer relationship began (YYYY-MM-DD)."},"industry":{"type":["string","null"]},"slaLevel":{"type":["string","null"],"description":"Service-level tier for this customer (e.g. standard, priority, critical)."},"creditStatus":{"type":["string","null"],"description":"Credit standing (e.g. good, watch, on_hold, stop)."},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","name","address","postcode","createdAt","updatedAt"]},"CreateCustomerBody":{"type":"object","properties":{"name":{"type":"string"},"address":{"type":"string"},"postcode":{"type":"string"},"contactName":{"type":["string","null"]},"contactEmail":{"type":["string","null"]},"contactPhone":{"type":["string","null"]},"website":{"type":["string","null"],"maxLength":2000},"logoUrl":{"type":["string","null"]},"tradingName":{"type":["string","null"]},"legalEntity":{"type":["string","null"]},"status":{"type":["string","null"]},"accountOwnerUserId":{"type":["integer","null"]},"customerSince":{"type":["string","null"]},"industry":{"type":["string","null"]},"slaLevel":{"type":["string","null"]},"creditStatus":{"type":["string","null"]},"createSiteFromAddress":{"type":"boolean","description":"When true, also create a site for this customer at the same address (named after the customer)."}},"required":["name","address","postcode"]},"UpdateCustomerBody":{"type":"object","properties":{"name":{"type":["string","null"]},"address":{"type":["string","null"]},"postcode":{"type":["string","null"]},"contactName":{"type":["string","null"]},"contactEmail":{"type":["string","null"]},"contactPhone":{"type":["string","null"]},"website":{"type":["string","null"],"maxLength":2000},"apiRateLimitPerMinute":{"type":["integer","null"]},"logoUrl":{"type":["string","null"]},"retestRemindersEnabled":{"type":"boolean","description":"When false, the automated retest reminder sweep skips this customer entirely."},"tradingName":{"type":["string","null"]},"legalEntity":{"type":["string","null"]},"status":{"type":["string","null"]},"accountOwnerUserId":{"type":["integer","null"]},"customerSince":{"type":["string","null"]},"industry":{"type":["string","null"]},"slaLevel":{"type":["string","null"]},"creditStatus":{"type":["string","null"]}}},"ManagementWeeklyHeadlines":{"type":"object","properties":{"revenue":{"type":"number"},"revenueWowPct":{"type":["number","null"]},"profit":{"type":"number"},"marginPct":{"type":["number","null"]},"jobsAllocated":{"type":"integer"},"jobsAttended":{"type":"integer"},"attendedPct":{"type":["number","null"]},"recalls":{"type":"integer"},"recallsWowDelta":{"type":"integer"}},"required":["revenue","revenueWowPct","profit","marginPct","jobsAllocated","jobsAttended","attendedPct","recalls","recallsWowDelta"]},"ManagementWeeklyEngineerRow":{"type":"object","properties":{"userId":{"type":"integer"},"fullName":{"type":"string"},"revenue":{"type":"number"},"salaryCost":{"type":"number"},"profitLoss":{"type":"number"},"attendedPct":{"type":["number","null"]},"ftfPct":{"type":["number","null"]},"recalls":{"type":"integer"},"status":{"type":"string","enum":["green","amber","red"]}},"required":["userId","fullName","revenue","salaryCost","profitLoss","attendedPct","ftfPct","recalls","status"]},"ManagementWeeklyException":{"type":"object","properties":{"severity":{"type":"string","enum":["info","warn","alert"]},"title":{"type":"string"},"detail":{"type":"string"},"link":{"type":["string","null"]}},"required":["severity","title","detail"]},"ManagementWeeklyReport":{"type":"object","properties":{"weekStart":{"type":"string"},"weekEnd":{"type":"string"},"generatedAt":{"type":"string"},"headlines":{"$ref":"#/components/schemas/ManagementWeeklyHeadlines"},"engineerScorecard":{"type":"array","items":{"$ref":"#/components/schemas/ManagementWeeklyEngineerRow"}},"exceptions":{"type":"array","items":{"$ref":"#/components/schemas/ManagementWeeklyException"}},"suggestedActions":{"type":"array","items":{"type":"string"}}},"required":["weekStart","weekEnd","generatedAt","headlines","engineerScorecard","exceptions","suggestedActions"]},"SendManagementWeeklyBody":{"type":"object","properties":{"weekStart":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"recipientIds":{"type":"array","items":{"type":"integer"}}}},"ManagementRecipient":{"type":"object","properties":{"id":{"type":"integer"},"tenantId":{"type":"integer"},"email":{"type":"string"},"fullName":{"type":["string","null"]},"active":{"type":"boolean"},"createdAt":{"type":"string"},"createdBy":{"type":["integer","null"]}},"required":["id","tenantId","email","active","createdAt"]},"CreateManagementRecipientBody":{"type":"object","properties":{"email":{"type":"string","format":"email"},"fullName":{"type":"string"}},"required":["email"]},"UpdateManagementRecipientBody":{"type":"object","properties":{"active":{"type":"boolean"},"fullName":{"type":["string","null"]}}},"CustomerProfitabilityRow":{"type":"object","properties":{"customer_id":{"type":"integer"},"customer_name":{"type":"string"},"job_count":{"type":"integer"},"revenue":{"type":"number"},"hours":{"type":"number"},"labour_cost":{"type":"number"},"materials_cost":{"type":"number"},"gross_profit":{"type":"number"},"gross_margin_pct":{"type":["number","null"]}},"required":["customer_id","customer_name","job_count","revenue","hours","labour_cost","materials_cost","gross_profit"]},"CustomerProfitabilityReport":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"},"customers":{"type":"array","items":{"$ref":"#/components/schemas/CustomerProfitabilityRow"}}},"required":["from","to","customers"]},"CustomerProfitabilityJobRow":{"type":"object","properties":{"job_id":{"type":"integer"},"job_number":{"type":["string","null"]},"certificate_number":{"type":["string","null"]},"status":{"type":["string","null"]},"created_at":{"type":["string","null"]},"scheduled_date":{"type":["string","null"]},"revenue":{"type":"number"},"hours":{"type":"number"},"labour_cost":{"type":"number"},"materials_cost":{"type":"number"},"gross_profit":{"type":"number"},"gross_margin_pct":{"type":["number","null"]}},"required":["job_id","revenue","hours","labour_cost","materials_cost","gross_profit"]},"CustomerProfitabilityJobs":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"},"customerId":{"type":"integer"},"jobs":{"type":"array","items":{"$ref":"#/components/schemas/CustomerProfitabilityJobRow"}}},"required":["from","to","customerId","jobs"]},"QuoteConversionHeadlines":{"type":"object","properties":{"sent_count":{"type":"integer"},"sent_value":{"type":"number"},"accepted_count":{"type":"integer"},"accepted_value":{"type":"number"},"conversion_pct":{"type":["number","null"]},"oldest_outstanding_id":{"type":["integer","null"]},"oldest_outstanding_number":{"type":["string","null"]},"oldest_outstanding_days":{"type":["integer","null"]}}},"QuoteConversionFunnelStage":{"type":"object","properties":{"stage":{"type":"string","enum":["sent","accepted","converted"]},"count":{"type":"integer"},"value":{"type":"number"}},"required":["stage","count","value"]},"QuoteConversionOutstandingRow":{"type":"object","properties":{"id":{"type":"integer"},"quote_number":{"type":["string","null"]},"customer_id":{"type":"integer"},"customer_name":{"type":"string"},"customer_email":{"type":["string","null"]},"customer_contact_name":{"type":["string","null"]},"total":{"type":"number"},"valid_until":{"type":["string","null"]},"created_at":{"type":"string"},"age_days":{"type":"integer"},"created_by":{"type":["integer","null"]},"created_by_name":{"type":["string","null"]}},"required":["id","customer_id","customer_name","total","created_at","age_days"]},"QuoteConversionEngineerRow":{"type":"object","properties":{"user_id":{"type":"integer"},"engineer_name":{"type":"string"},"sent_count":{"type":"integer"},"accepted_count":{"type":"integer"},"conversion_pct":{"type":["number","null"]},"avg_days_to_accept":{"type":["number","null"]},"accepted_value":{"type":"number"}},"required":["user_id","engineer_name","sent_count","accepted_count","accepted_value"]},"QuoteConversionReport":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"},"headlines":{"$ref":"#/components/schemas/QuoteConversionHeadlines"},"funnel":{"type":"array","items":{"$ref":"#/components/schemas/QuoteConversionFunnelStage"}},"outstanding":{"type":"array","items":{"$ref":"#/components/schemas/QuoteConversionOutstandingRow"}},"byEngineer":{"type":"array","items":{"$ref":"#/components/schemas/QuoteConversionEngineerRow"}}},"required":["from","to","headlines","funnel","outstanding","byEngineer"]},"Site":{"type":"object","properties":{"id":{"type":"integer"},"customerId":{"type":"integer"},"customerName":{"type":"string"},"name":{"type":"string"},"address":{"type":"string"},"postcode":{"type":"string"},"addressSnapshot":{"anyOf":[{"$ref":"#/components/schemas/SiteAddressSnapshot"},{"type":"null"}]},"uprn":{"type":["string","null"]},"accessNotes":{"type":["string","null"]},"alarmCode":{"type":["string","null"]},"keyLocation":{"type":["string","null"]},"openingHours":{"type":["string","null"]},"accessInstructions":{"type":["string","null"]},"gateCode":{"type":["string","null"]},"parking":{"type":["string","null"]},"riskInformation":{"type":["string","null"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","customerId","customerName","name","address","postcode","createdAt","updatedAt"]},"CreateSiteBody":{"type":"object","properties":{"customerId":{"type":"integer"},"name":{"type":"string"},"address":{"type":"string"},"postcode":{"type":"string"},"addressSnapshot":{"anyOf":[{"$ref":"#/components/schemas/SiteAddressSnapshot"},{"type":"null"}]},"uprn":{"type":["string","null"]},"accessNotes":{"type":["string","null"]},"alarmCode":{"type":["string","null"]},"keyLocation":{"type":["string","null"]},"openingHours":{"type":["string","null"]},"accessInstructions":{"type":["string","null"]},"gateCode":{"type":["string","null"]},"parking":{"type":["string","null"]},"riskInformation":{"type":["string","null"]}},"required":["customerId","name","address","postcode"]},"UpdateSiteBody":{"type":"object","properties":{"name":{"type":["string","null"]},"address":{"type":["string","null"]},"postcode":{"type":["string","null"]},"addressSnapshot":{"anyOf":[{"$ref":"#/components/schemas/SiteAddressSnapshot"},{"type":"null"}]},"uprn":{"type":["string","null"]},"accessNotes":{"type":["string","null"]},"alarmCode":{"type":["string","null"]},"keyLocation":{"type":["string","null"]},"openingHours":{"type":["string","null"]},"accessInstructions":{"type":["string","null"]},"gateCode":{"type":["string","null"]},"parking":{"type":["string","null"]},"riskInformation":{"type":["string","null"]}}},"SiteAddressSnapshot":{"type":"object","properties":{"id":{"type":"string"},"line1":{"type":"string"},"line2":{"type":"string"},"line3":{"type":"string"},"city":{"type":"string"},"county":{"type":"string"},"postcode":{"type":"string"},"country":{"type":"string"},"uprn":{"type":["string","null"]},"latitude":{"type":["number","null"]},"longitude":{"type":["number","null"]},"summary":{"type":"string"}},"required":["line1","line2","line3","city","county","postcode","country"]},"Job":{"type":"object","properties":{"id":{"type":"integer"},"certificateNumber":{"type":"string"},"jobNumber":{"type":["string","null"]},"customerId":{"type":"integer"},"customerName":{"type":"string"},"siteId":{"type":"integer"},"siteName":{"type":"string"},"siteAddress":{"type":["string","null"]},"sitePostcode":{"type":["string","null"]},"siteLatitude":{"type":["string","null"]},"siteLongitude":{"type":["string","null"]},"engineerName":{"type":"string"},"assignedUserId":{"type":["integer","null"],"description":"Persisted lead account ID. Never infer assignment from the display name."},"assignedUserName":{"type":["string","null"]},"priority":{"type":["string","null"]},"costCentreId":{"type":["integer","null"]},"costCentreName":{"type":["string","null"]},"quoteReference":{"type":["string","null"]},"tradeModule":{"type":["string","null"]},"requiredSkills":{"type":"array","items":{"type":"string"}},"checkInTime":{"type":["string","null"]},"checkOutTime":{"type":["string","null"]},"latitude":{"type":["string","null"]},"longitude":{"type":["string","null"]},"checkInLat":{"type":["string","null"]},"checkInLng":{"type":["string","null"]},"checkOutLat":{"type":["string","null"]},"checkOutLng":{"type":["string","null"]},"engineerPosition":{"type":["string","null"]},"testEquipment":{"type":["string","null"]},"testEquipmentSerial":{"type":["string","null"]},"testDate":{"type":"string"},"scheduledDate":{"type":["string","null"]},"scheduledStartTime":{"type":["string","null"]},"scheduledEndTime":{"type":["string","null"]},"engineerSignature":{"type":["string","null"]},"notes":{"type":["string","null"]},"status":{"type":"string","enum":["logged","quoted","accepted","scheduled","in_progress","on_hold","complete","ready_to_invoice","invoiced","draft","cancelled"]},"sla":{"type":["string","null"]},"jobType":{"type":["string","null"]},"applianceCount":{"type":"integer"},"passCount":{"type":"integer"},"failCount":{"type":"integer"},"waitingOn":{"type":["string","null"],"description":"What the job is waiting on (e.g. parts, customer), null when not on hold"},"waitingNote":{"type":["string","null"]},"waitingSince":{"type":["string","null"],"description":"ISO timestamp the hold started (null when not on hold)"},"waitingOwnerUserId":{"type":["integer","null"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"overdue":{"type":"boolean","description":"Derived overdue flag using Europe/London calendar-day semantics; never a persisted status."}},"required":["id","certificateNumber","customerId","customerName","siteId","siteName","engineerName","testDate","status","applianceCount","passCount","failCount","createdAt","updatedAt"]},"CreateJobBody":{"type":"object","properties":{"customerId":{"type":"integer"},"siteId":{"type":"integer"},"jobNumber":{"type":["string","null"]},"poNumber":{"type":["string","null"]},"engineerName":{"type":"string"},"engineerPosition":{"type":["string","null"]},"testEquipment":{"type":["string","null"]},"testEquipmentSerial":{"type":["string","null"]},"testDate":{"type":"string"},"notes":{"type":["string","null"]},"sla":{"type":["string","null"]},"jobType":{"type":["string","null"]},"tradeModule":{"type":["string","null"]},"requiredSkills":{"type":"array","items":{"type":"string"}},"quoteReference":{"type":["string","null"]},"costCentreId":{"type":["integer","null"]},"assignedUserId":{"type":["integer","null"]},"priority":{"type":["string","null"]},"scheduledDate":{"type":["string","null"]},"scheduledStartTime":{"type":["string","null"]},"scheduledEndTime":{"type":["string","null"]}},"required":["customerId","siteId","testDate"]},"CompleteJobBody":{"type":"object","properties":{"requestId":{"type":"string","format":"uuid","description":"Stable identifier reused for retries of the same completion submission; retained in its completion audit."},"engineerSignature":{"type":["string","null"]},"notes":{"type":["string","null"],"description":"Optional job notes submitted at completion time. When provided and non-empty, they are saved onto the job before the minimum-length validation runs, so notes typed on the job page are never lost if the engineer did not press \"Save Notes\" first."}}},"CompletionOwningControl":{"type":"object","required":["role","label","action"],"properties":{"role":{"type":"string","enum":["engineer","office","system"]},"label":{"type":"string"},"action":{"type":"string"},"targetStep":{"type":"string","enum":["brief","start","work","evidence","complete"]}}},"CompletionBlocker":{"type":"object","required":["code","label","severity","owningControl"],"properties":{"code":{"type":"string"},"label":{"type":"string"},"severity":{"type":"string","enum":["blocking","advisory"]},"clientSatisfiable":{"type":"boolean"},"owningControl":{"$ref":"#/components/schemas/CompletionOwningControl"},"meta":{"type":"object","additionalProperties":true}}},"CompletionReadiness":{"type":"object","required":["jobId","alreadyComplete","rules","blockers","canComplete","validatedAt","freshness","overridable"],"properties":{"jobId":{"type":"integer"},"alreadyComplete":{"type":"boolean"},"rules":{"type":"object","additionalProperties":true},"blockers":{"type":"array","items":{"$ref":"#/components/schemas/CompletionBlocker"}},"canComplete":{"type":"boolean"},"overridable":{"type":"boolean"},"validatedAt":{"type":"string","format":"date-time"},"freshness":{"type":"string","enum":["current"]}}},"ReadyToInvoiceBody":{"type":"object","description":"Office approval that moves a completed job to Ready to Invoice, capturing billing info.","properties":{"poNumber":{"type":["string","null"]},"quoteReference":{"type":["string","null"]},"costCentreId":{"type":["integer","null"]},"notes":{"type":["string","null"]}}},"OkResponse":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean"}}},"SetJobSlaBody":{"type":"object","properties":{"slaTargetAt":{"type":["string","null"],"format":"date-time","description":"ISO-8601 datetime, or null to clear the SLA target"},"hoursFromNow":{"type":["number","null"],"exclusiveMinimum":0,"description":"Set the SLA target to N hours from now (ignored if slaTargetAt is provided); must be > 0"}}},"SetJobSlaResponse":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean"},"slaTargetAt":{"type":["string","null"]}}},"PauseJobSlaBody":{"type":"object","properties":{"reason":{"type":["string","null"]}}},"JobCheckInBody":{"type":"object","properties":{"latitude":{"type":["number","string","null"]},"longitude":{"type":["number","string","null"]},"overrideReason":{"type":["string","null"],"description":"Required when an admin overrides a permit-blocked check-in"}}},"JobCheckOutBody":{"type":"object","properties":{"latitude":{"type":["number","string","null"]},"longitude":{"type":["number","string","null"]}}},"SuggestDayPlanBody":{"type":"object","required":["date"],"properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"engineerId":{"type":["integer","null"]},"startLat":{"type":["number","null"]},"startLng":{"type":["number","null"]}}},"SuggestDayPlanJob":{"type":"object","required":["id","certificateNumber","priority","clusterKey"],"properties":{"id":{"type":"integer"},"certificateNumber":{"type":"string"},"customerName":{"type":["string","null"]},"siteName":{"type":["string","null"]},"sitePostcode":{"type":["string","null"]},"lat":{"type":["number","null"]},"lng":{"type":["number","null"]},"scheduledStartTime":{"type":["string","null"]},"priority":{"type":"string"},"slaTargetAt":{"type":["string","null"]},"driveMinFromPrev":{"type":["number","null"]},"clusterKey":{"type":"string"}}},"SuggestDayPlanResponse":{"type":"object","required":["date","totalJobs","totalDriveMinutes","clusters","ordered"],"properties":{"date":{"type":"string"},"engineerId":{"type":["integer","null"]},"totalJobs":{"type":"integer"},"totalDriveMinutes":{"type":"number"},"clusters":{"type":"integer"},"ordered":{"type":"array","items":{"$ref":"#/components/schemas/SuggestDayPlanJob"}}}},"SetAnnualLeaveAllowanceBody":{"type":"object","required":["allowance"],"properties":{"allowance":{"type":"number","minimum":0,"maximum":365}}},"UpdateJobBody":{"type":"object","properties":{"jobNumber":{"type":["string","null"]},"poNumber":{"type":["string","null"]},"engineerName":{"type":["string","null"]},"engineerPosition":{"type":["string","null"]},"testEquipment":{"type":["string","null"]},"testEquipmentSerial":{"type":["string","null"]},"testDate":{"type":["string","null"]},"notes":{"type":["string","null"]},"status":{"type":["string","null"]},"sla":{"type":["string","null"]},"jobType":{"type":["string","null"]},"scheduledDate":{"type":["string","null"]},"scheduledStartTime":{"type":["string","null"]},"scheduledEndTime":{"type":["string","null"]},"priority":{"type":["string","null"]},"assignedUserId":{"type":["integer","null"]},"costCentreId":{"type":["integer","null"]},"latitude":{"type":["number","string","null"]},"longitude":{"type":["number","string","null"]}}},"JobDetail":{"allOf":[{"$ref":"#/components/schemas/Job"}],"type":"object","properties":{"id":{"type":"integer"},"certificateNumber":{"type":"string"},"customerId":{"type":"integer"},"customerName":{"type":"string"},"customerAddress":{"type":"string"},"customerPostcode":{"type":"string"},"siteId":{"type":"integer"},"siteName":{"type":"string"},"siteAddress":{"type":"string"},"sitePostcode":{"type":"string"},"jobNumber":{"type":["string","null"]},"poNumber":{"type":["string","null"]},"quoteReference":{"type":["string","null"]},"engineerName":{"type":"string"},"engineerPosition":{"type":["string","null"]},"testEquipment":{"type":["string","null"]},"testEquipmentSerial":{"type":["string","null"]},"testDate":{"type":"string"},"scheduledDate":{"type":["string","null"]},"scheduledStartTime":{"type":["string","null"]},"scheduledEndTime":{"type":["string","null"]},"engineerSignature":{"type":["string","null"]},"notes":{"type":["string","null"]},"status":{"type":"string"},"sla":{"type":["string","null"]},"jobType":{"type":["string","null"]},"applianceCount":{"type":"integer"},"passCount":{"type":"integer"},"failCount":{"type":"integer"},"appliances":{"type":"array","items":{"$ref":"#/components/schemas/Appliance"}},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"permitOverrideAt":{"type":["string","null"],"description":"ISO timestamp the admin overrode a permit-blocked check-in (null if no override)"},"permitOverrideByUserId":{"type":["integer","null"]},"permitOverrideByName":{"type":["string","null"]},"permitOverrideReason":{"type":["string","null"]},"permitOverrideBlocking":{"type":["array","null"],"description":"Snapshot of the permits that were blocking attendance at override time","items":{"$ref":"#/components/schemas/PermitOverrideBlockingEntry"}},"dependencyOverrideAt":{"type":["string","null"],"description":"ISO timestamp the admin overrode a dependency-blocked completion (null if no override)"},"dependencyOverrideByUserId":{"type":["integer","null"]},"dependencyOverrideByName":{"type":["string","null"]},"dependencyOverrideReason":{"type":["string","null"]},"dependencyOverrideBlocking":{"type":["array","null"],"description":"Snapshot of the predecessor jobs that were blocking completion at override time","items":{"$ref":"#/components/schemas/DependencyOverrideBlockingEntry"}},"waitingOn":{"type":["string","null"],"description":"What the job is waiting on (e.g. parts, customer), null when not on hold"},"waitingNote":{"type":["string","null"]},"waitingSince":{"type":["string","null"],"description":"ISO timestamp the hold started (null when not on hold)"},"waitingOwnerUserId":{"type":["integer","null"]}},"required":["id","certificateNumber","customerId","customerName","customerAddress","customerPostcode","siteId","siteName","siteAddress","sitePostcode","engineerName","testDate","status","applianceCount","passCount","failCount","appliances","createdAt","updatedAt"]},"PermitOverrideBlockingEntry":{"type":"object","required":["id","permitType","reason"],"properties":{"id":{"type":"integer"},"permitType":{"type":"string"},"reference":{"type":["string","null"]},"reason":{"type":"string","enum":["expired","revoked"]},"expiryDate":{"type":["string","null"]}}},"DependencyOverrideBlockingEntry":{"type":"object","required":["id","jobId","status"],"properties":{"id":{"type":"integer"},"jobId":{"type":"integer"},"certificateNumber":{"type":["string","null"]},"jobNumber":{"type":["string","null"]},"status":{"type":"string"}}},"PermitOverrideReportEntry":{"type":"object","required":["jobId","certificateNumber","siteId","siteName","customerId","customerName","overrideAt","overrideReason","blocking"],"properties":{"jobId":{"type":"integer"},"certificateNumber":{"type":"string"},"siteId":{"type":"integer"},"siteName":{"type":"string"},"customerId":{"type":"integer"},"customerName":{"type":"string"},"overrideAt":{"type":"string"},"overrideByUserId":{"type":["integer","null"]},"overrideByName":{"type":["string","null"]},"overrideReason":{"type":"string"},"blocking":{"type":"array","items":{"$ref":"#/components/schemas/PermitOverrideBlockingEntry"}}}},"PermitOverridesReportResponse":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PermitOverrideReportEntry"}}}},"Appliance":{"type":"object","properties":{"id":{"type":"integer"},"jobId":{"type":"integer"},"applianceId":{"type":"string"},"description":{"type":"string"},"manufacturer":{"type":["string","null"]},"model":{"type":["string","null"]},"location":{"type":"string"},"serialNumber":{"type":["string","null"]},"retestPeriodMonths":{"type":"integer"},"testDate":{"type":"string"},"retestDate":{"type":"string"},"status":{"type":"string","enum":["pass","fail","skip"]},"failReason":{"type":["string","null"]},"notes":{"type":["string","null"]},"photos":{"type":["array","null"],"items":{"type":"string"}},"insulationResistanceMohm":{"type":["string","null"]},"earthContinuityOhm":{"type":["string","null"]},"leakageMa":{"type":["string","null"]},"applianceClass":{"type":["string","null"],"enum":["class_i","class_ii","class_iii",null]},"visualInspectionResult":{"type":["string","null"],"enum":["pass","fail",null]},"fuseRatingA":{"type":["string","null"]},"failureRisk":{"type":"string","enum":["low","medium","high"]},"failureRiskReason":{"type":["string","null"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","jobId","applianceId","description","location","retestPeriodMonths","testDate","retestDate","status","failureRisk","createdAt","updatedAt"]},"PriorApplianceTest":{"type":"object","properties":{"id":{"type":"integer"},"jobId":{"type":"integer"},"applianceId":{"type":["string","null"]},"serialNumber":{"type":["string","null"]},"testDate":{"type":"string"},"status":{"type":"string"},"insulationResistanceMohm":{"type":["string","null"]},"earthContinuityOhm":{"type":["string","null"]},"leakageMa":{"type":["string","null"]}},"required":["id","jobId","testDate","status"]},"GetPriorApplianceTestResponse":{"type":"object","properties":{"priorTest":{"oneOf":[{"$ref":"#/components/schemas/PriorApplianceTest"},{"type":"null"}]}},"required":["priorTest"]},"CreateApplianceBody":{"type":"object","properties":{"jobId":{"type":"integer"},"applianceId":{"type":"string"},"description":{"type":"string"},"manufacturer":{"type":["string","null"]},"model":{"type":["string","null"]},"location":{"type":"string"},"serialNumber":{"type":["string","null"]},"retestPeriodMonths":{"type":"integer"},"testDate":{"type":"string"},"status":{"type":"string","enum":["pass","fail","skip"]},"failReason":{"type":["string","null"]},"notes":{"type":["string","null"]},"photos":{"type":["array","null"],"items":{"type":"string"}},"insulationResistanceMohm":{"type":["string","null"]},"earthContinuityOhm":{"type":["string","null"]},"leakageMa":{"type":["string","null"]},"applianceClass":{"type":["string","null"],"enum":["class_i","class_ii","class_iii",null]},"visualInspectionResult":{"type":["string","null"],"enum":["pass","fail",null]},"fuseRatingA":{"type":["string","null"]},"testerEquipmentId":{"type":"integer"}},"required":["jobId","applianceId","description","location","retestPeriodMonths","testDate","status","testerEquipmentId"]},"UpdateApplianceBody":{"type":"object","properties":{"applianceId":{"type":["string","null"]},"description":{"type":["string","null"]},"manufacturer":{"type":["string","null"]},"model":{"type":["string","null"]},"location":{"type":["string","null"]},"serialNumber":{"type":["string","null"]},"retestPeriodMonths":{"type":["integer","null"]},"testDate":{"type":["string","null"]},"testerEquipmentId":{"type":"integer","description":"Required when changing the PAT test date so provenance can be re-snapshotted."},"status":{"type":["string","null"]},"failReason":{"type":["string","null"]},"notes":{"type":["string","null"]},"photos":{"type":["array","null"],"items":{"type":"string"}},"insulationResistanceMohm":{"type":["string","null"]},"earthContinuityOhm":{"type":["string","null"]},"leakageMa":{"type":["string","null"]},"applianceClass":{"type":["string","null"],"enum":["class_i","class_ii","class_iii",null]},"visualInspectionResult":{"type":["string","null"],"enum":["pass","fail",null]},"fuseRatingA":{"type":["string","null"]}}},"BulkUpdateApplianceMakeModelBody":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"integer"},"minItems":1},"manufacturer":{"type":["string","null"]},"model":{"type":["string","null"]},"onlyIfEmpty":{"type":["boolean","null"],"description":"When true (default), only fill rows whose target field is currently empty."}},"required":["ids"]},"BulkUpdateApplianceMakeModelResponse":{"type":"object","properties":{"updated":{"type":"integer"}},"required":["updated"]},"Report":{"type":"object","properties":{"id":{"type":"integer"},"jobId":{"type":"integer"},"certificateNumber":{"type":"string"},"customerName":{"type":"string"},"siteName":{"type":"string"},"testDate":{"type":"string"},"engineerName":{"type":"string"},"totalAppliances":{"type":"integer"},"passCount":{"type":"integer"},"failCount":{"type":"integer"},"createdAt":{"type":"string"}},"required":["id","jobId","certificateNumber","customerName","siteName","testDate","engineerName","totalAppliances","passCount","failCount","createdAt"]},"ReportDeliveryEvent":{"type":"object","properties":{"action":{"type":"string","enum":["certificate_link_shared","certificate_link_accessed","certificate_reviewed","certificate_downloaded","report_downloaded","certificate_email_sent","certificate_email_queued","certificate_email_failed","certificate_email_delivered","certificate_email_bounced"]},"details":{"type":["string","null"]},"createdAt":{"type":"string"}},"required":["action","details","createdAt"]},"SendReportEmailBody":{"type":"object","properties":{"recipient":{"type":"string","format":"email"},"message":{"type":"string","maxLength":5000},"idempotencyKey":{"type":"string","minLength":12,"maxLength":128}},"required":["recipient","idempotencyKey"]},"ReportEmailAttempt":{"type":"object","properties":{"id":{"type":"integer"},"status":{"type":"string","enum":["sending","queued","sent","delivered","bounced","failed"]},"recipient":{"type":"string","format":"email"},"provider":{"type":["string","null"],"enum":["resend","outlook",null]},"failureReason":{"type":["string","null"]},"sentAt":{"type":["string","null"]},"deliveredAt":{"type":["string","null"]},"bouncedAt":{"type":["string","null"]},"idempotent":{"type":"boolean"}},"required":["id","status","recipient","provider","failureReason","sentAt","deliveredAt","bouncedAt","idempotent"]},"ReportDeliveryEmail":{"type":"object","properties":{"status":{"type":"string","enum":["not_sent","sending","queued","sent","delivered","bounced","failed"]},"recipient":{"type":["string","null"]},"provider":{"type":["string","null"],"enum":["resend","outlook",null]},"failureReason":{"type":["string","null"]},"sentAt":{"type":["string","null"]},"deliveredAt":{"type":["string","null"]},"bouncedAt":{"type":["string","null"]}},"required":["status","recipient","provider","failureReason","sentAt","deliveredAt","bouncedAt"]},"ReportDeliveryEmailAttempt":{"type":"object","properties":{"id":{"type":"integer"},"recipient":{"type":"string","format":"email"},"provider":{"type":["string","null"],"enum":["resend","outlook",null]},"status":{"type":"string","enum":["sending","queued","sent","delivered","bounced","failed"]},"failureReason":{"type":["string","null"]},"sentAt":{"type":["string","null"]},"deliveredAt":{"type":["string","null"]},"bouncedAt":{"type":["string","null"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","recipient","provider","status","failureReason","sentAt","deliveredAt","bouncedAt","createdAt","updatedAt"]},"ReportDelivery":{"type":"object","properties":{"status":{"type":"string","enum":["ready_to_share","link_prepared","link_accessed","reviewed"]},"generatedAt":{"type":"string"},"linkPreparedAt":{"type":["string","null"]},"accessedAt":{"type":["string","null"]},"reviewedAt":{"type":["string","null"]},"customerDownloadedAt":{"type":["string","null"]},"staffDownloadedAt":{"type":["string","null"]},"email":{"$ref":"#/components/schemas/ReportDeliveryEmail"},"emailAttempts":{"type":"array","items":{"$ref":"#/components/schemas/ReportDeliveryEmailAttempt"}},"events":{"type":"array","items":{"$ref":"#/components/schemas/ReportDeliveryEvent"}}},"required":["status","generatedAt","linkPreparedAt","accessedAt","reviewedAt","customerDownloadedAt","staffDownloadedAt","email","emailAttempts","events"]},"CertificateCustomerActionEvent":{"type":"object","properties":{"kind":{"type":"string","enum":["certificate_released","certificate_link_shared","certificate_link_accessed","certificate_reviewed","remedial_request","quote","invoice"]},"label":{"type":"string"},"occurredAt":{"type":"string"}},"required":["kind","label","occurredAt"]},"RemedialQuoteFindingInput":{"type":"object","properties":{"sourceType":{"type":"string","enum":["eicr_observation","appliance"]},"sourceId":{"type":"integer","minimum":1},"unitPrice":{"type":["string","number","null"],"description":"Optional ex-VAT line price; blank or omitted creates a draft awaiting pricing. Findings must be customer-ready (released EICR C1/C2/FI or failed PAT item on a completed certificate)."}},"required":["sourceType","sourceId"]},"RemedialQuoteHandoff":{"type":"object","description":"The normal quote record with immutable source evidence captured in its draft line item.","properties":{"id":{"type":"integer"},"quoteNumber":{"type":"string"},"status":{"type":"string"},"customerId":{"type":"integer"},"siteId":{"type":["integer","null"]},"jobId":{"type":["integer","null"],"description":"Null until this quote is converted to a new remedial job. The originating inspection job is retained in line-item evidence."},"sourceType":{"type":"string","enum":["eicr_observation","appliance"]},"sourceId":{"type":"integer"},"created":{"type":"boolean"},"evidenceLabel":{"type":"string"}},"required":["id","quoteNumber","status","customerId","siteId","jobId","sourceType","sourceId","created","evidenceLabel"]},"CertificateDownstreamAction":{"type":"object","properties":{"kind":{"type":"string","enum":["remedial_request","quote","invoice"]},"id":{"type":"integer"},"status":{"type":["string","null"]},"createdAt":{"type":"string"}},"required":["kind","id","status","createdAt"]},"CertificateNextAction":{"type":"object","properties":{"kind":{"type":"string","enum":["share_certificate","contact_customer","continue_remedial","approve_quote","book_retest","review_invoice"]},"label":{"type":"string"},"targetId":{"type":"integer"}},"required":["kind","label","targetId"]},"EicrCertificateFollowUp":{"type":"object","properties":{"id":{"type":"integer"},"reportNumber":{"type":"string"},"customerName":{"type":"string"},"siteName":{"type":["string","null"]},"releasedAt":{"type":["string","null"],"format":"date-time"},"reviewedAt":{"type":["string","null"],"format":"date-time"},"remedialFollowUp":{"$ref":"#/components/schemas/EicrRemedialFollowUp"}},"required":["id","reportNumber","customerName","siteName","releasedAt","reviewedAt","remedialFollowUp"]},"EicrRemedialFollowUp":{"type":"object","properties":{"total":{"type":"integer"},"outstanding":{"type":"integer"},"status":{"type":"string","enum":["none","open","closed"]},"nextStep":{"type":"string"}},"required":["total","outstanding","status","nextStep"]},"PortalEicrReview":{"type":"object","properties":{"reportId":{"type":"integer"},"status":{"type":"string","enum":["reviewed"]},"reviewedAt":{"type":"string","format":"date-time"},"newlyReviewed":{"type":"boolean"}},"required":["reportId","status","reviewedAt","newlyReviewed"]},"CertificateCustomerAction":{"type":"object","description":"A released PAT certificate with evidence-backed customer follow-up status.","properties":{"id":{"type":"integer"},"jobId":{"type":"integer"},"certificateNumber":{"type":"string"},"customerId":{"type":"integer"},"customerName":{"type":"string"},"siteId":{"type":"integer"},"siteName":{"type":"string"},"testDate":{"type":"string"},"createdAt":{"type":"string"},"failCount":{"type":"integer"},"deliveryState":{"type":"string","enum":["not_shared","link_prepared","accessed","reviewed","reviewed_no_downstream_action"]},"accessedAt":{"type":["string","null"]},"reviewedAt":{"type":["string","null"]},"lastMeaningfulEvent":{"$ref":"#/components/schemas/CertificateCustomerActionEvent"},"downstreamAction":{"type":["object","null"],"allOf":[{"$ref":"#/components/schemas/CertificateDownstreamAction"}]},"nextAction":{"$ref":"#/components/schemas/CertificateNextAction"}},"required":["id","jobId","certificateNumber","customerId","customerName","siteId","siteName","testDate","createdAt","failCount","deliveryState","accessedAt","reviewedAt","lastMeaningfulEvent","downstreamAction","nextAction"]},"CertificateActionType":{"type":"string","enum":["remedial","quote","retest","invoice"]},"CertificateActionStage":{"type":"string","enum":["clicked","started","completed"]},"CertificateActionInput":{"type":"object","properties":{"action":{"$ref":"#/components/schemas/CertificateActionType"},"stage":{"type":"string","enum":["started","completed"]}},"required":["action","stage"]},"CertificateActionClickInput":{"type":"object","properties":{"action":{"$ref":"#/components/schemas/CertificateActionType"}},"required":["action"]},"ReportConversionAction":{"type":"object","properties":{"action":{"$ref":"#/components/schemas/CertificateActionType"},"clickedAt":{"type":["string","null"]},"startedAt":{"type":["string","null"]},"completedAt":{"type":["string","null"]}},"required":["action","clickedAt","startedAt","completedAt"]},"ReportConversion":{"type":"object","properties":{"reportId":{"type":"integer"},"reviewedAt":{"type":["string","null"]},"actions":{"type":"array","items":{"$ref":"#/components/schemas/ReportConversionAction"}}},"required":["reportId","reviewedAt","actions"]},"CertificateActionRecord":{"type":"object","properties":{"status":{"type":"string","enum":["recorded","already_recorded"]},"conversion":{"$ref":"#/components/schemas/ReportConversion"}},"required":["status","conversion"]},"CertificateActionClick":{"type":"object","properties":{"status":{"type":"string","enum":["recorded","already_recorded"]}},"required":["status"]},"CertificateConversionActionMetric":{"type":"object","properties":{"action":{"$ref":"#/components/schemas/CertificateActionType"},"clickedCertificates":{"type":"integer"},"startedCertificates":{"type":"integer"},"completedCertificates":{"type":"integer"}},"required":["action","clickedCertificates","startedCertificates","completedCertificates"]},"CertificateConversionReport":{"type":"object","description":"Review-based attribution. The numerator is certificates with an\nobserved action after their review; no monetary value or payment is inferred.\n","properties":{"from":{"type":"string"},"to":{"type":"string"},"reviewedCertificates":{"type":"integer"},"actionedCertificates":{"type":"integer"},"completedOutcomeCertificates":{"type":"integer"},"actionedRate":{"type":["number","null"]},"completedOutcomeRate":{"type":["number","null"]},"actions":{"type":"array","items":{"$ref":"#/components/schemas/CertificateConversionActionMetric"}},"attributionNote":{"type":"string"}},"required":["from","to","reviewedCertificates","actionedCertificates","completedOutcomeCertificates","actionedRate","completedOutcomeRate","actions","attributionNote"]},"PublicCertificateIssuer":{"type":"object","description":"Safe issuer branding for the tenant that issued a bearer-linked certificate.","properties":{"name":{"type":"string"},"slug":{"type":"string"},"brandingJson":{"type":"object","additionalProperties":true}},"required":["name","slug","brandingJson"]},"PublicReportDetail":{"allOf":[{"$ref":"#/components/schemas/ReportDetail"},{"type":"object","properties":{"tenant":{"type":["object","null"],"allOf":[{"$ref":"#/components/schemas/PublicCertificateIssuer"}]}},"required":["tenant"]}]},"ReportShare":{"type":"object","properties":{"shareToken":{"type":"string"},"expiresAt":{"type":"string"},"url":{"type":"string"}},"required":["shareToken","expiresAt","url"]},"PublicReportLinkError":{"type":"object","properties":{"code":{"type":"string","enum":["not_found","expired","revoked","superseded"]},"error":{"type":"string"},"currentCertificate":{"type":["object","null"],"properties":{"certificateNumber":{"type":"string"},"shareToken":{"type":"string"}},"required":["certificateNumber","shareToken"]}},"required":["code","error","currentCertificate"]},"CreateReportBody":{"type":"object","properties":{"jobId":{"type":"integer"},"supersedesReportId":{"type":"integer","description":"Optional prior PAT report being replaced by this certificate"}},"required":["jobId"]},"ReportDetail":{"type":"object","properties":{"id":{"type":"integer"},"jobId":{"type":"integer"},"certificateNumber":{"type":"string"},"customerName":{"type":"string"},"customerAddress":{"type":"string"},"customerPostcode":{"type":"string"},"siteName":{"type":"string"},"siteAddress":{"type":"string"},"sitePostcode":{"type":"string"},"testDate":{"type":"string"},"engineerName":{"type":"string"},"engineerPosition":{"type":["string","null"]},"testEquipment":{"type":["string","null"]},"testEquipmentSerial":{"type":["string","null"]},"engineerSignature":{"type":["string","null"]},"notes":{"type":["string","null"]},"totalAppliances":{"type":"integer"},"passCount":{"type":"integer"},"failCount":{"type":"integer"},"appliances":{"type":"array","items":{"$ref":"#/components/schemas/Appliance"}},"createdAt":{"type":"string"}},"required":["id","jobId","certificateNumber","customerName","customerAddress","customerPostcode","siteName","siteAddress","sitePostcode","testDate","engineerName","totalAppliances","passCount","failCount","appliances","createdAt"]},"DashboardSummary":{"type":"object","properties":{"totalCustomers":{"type":"integer"},"totalSites":{"type":"integer"},"totalJobs":{"type":"integer"},"totalAppliances":{"type":"integer"},"passRate":{"type":"number"},"jobsThisMonth":{"type":"integer"},"pendingJobs":{"type":"integer"},"reportsGenerated":{"type":"integer"}},"required":["totalCustomers","totalSites","totalJobs","totalAppliances","passRate","jobsThisMonth","pendingJobs","reportsGenerated"]},"CanonicalJobMetrics":{"type":"object","properties":{"totalJobs":{"type":"integer"},"openJobs":{"type":"integer"},"scheduledJobs":{"type":"integer"},"inProgressJobs":{"type":"integer"},"completedJobs":{"type":"integer"},"readyToInvoiceJobs":{"type":"integer"},"overdueJobs":{"type":"integer","description":"Open jobs with a valid scheduled date before today in Europe/London; derived, never a persisted status."}},"required":["totalJobs","openJobs","scheduledJobs","inProgressJobs","completedJobs","readyToInvoiceJobs","overdueJobs"]},"CanonicalCustomerMetrics":{"type":"object","properties":{"totalCustomers":{"type":"integer"}},"required":["totalCustomers"]},"CanonicalQuoteMetrics":{"type":"object","properties":{"totalQuotes":{"type":"integer"},"openQuotes":{"type":"integer"},"wonQuotes":{"type":"integer"},"lostQuotes":{"type":"integer"},"openQuoteValue":{"type":"number"},"wonQuoteValue":{"type":"number"},"conversionRate":{"type":"number"}},"required":["totalQuotes","openQuotes","wonQuotes","lostQuotes","openQuoteValue","wonQuoteValue","conversionRate"]},"CanonicalInvoiceMetrics":{"type":"object","properties":{"totalInvoices":{"type":"integer"},"paidInvoices":{"type":"integer"},"outstandingInvoices":{"type":"integer"},"overdueInvoices":{"type":"integer"},"totalInvoicedValue":{"type":"number"},"paidValue":{"type":"number"},"outstandingValue":{"type":"number"},"overdueValue":{"type":"number"}},"required":["totalInvoices","paidInvoices","outstandingInvoices","overdueInvoices","totalInvoicedValue","paidValue","outstandingValue","overdueValue"]},"CanonicalComplianceMetrics":{"type":"object","properties":{"totalAssets":{"type":"integer"},"validAssets":{"type":"integer"},"overdueAssets":{"type":"integer"},"dueSoonAssets30":{"type":"integer"},"dueSoonAssets90":{"type":"integer"},"failedAssets":{"type":"integer"},"complianceScore":{"type":"number"},"eicrOverdue":{"type":"integer"}},"required":["totalAssets","validAssets","overdueAssets","dueSoonAssets30","dueSoonAssets90","failedAssets","complianceScore","eicrOverdue"]},"CanonicalMetrics":{"type":"object","properties":{"generatedAt":{"type":"string"},"today":{"type":"string"},"tenantId":{"type":"integer"},"customers":{"$ref":"#/components/schemas/CanonicalCustomerMetrics"},"jobs":{"$ref":"#/components/schemas/CanonicalJobMetrics"},"quotes":{"$ref":"#/components/schemas/CanonicalQuoteMetrics"},"invoices":{"$ref":"#/components/schemas/CanonicalInvoiceMetrics"},"compliance":{"$ref":"#/components/schemas/CanonicalComplianceMetrics"},"metadata":{"type":"object","properties":{"freshness":{"type":"string","enum":["live"]},"generatedAt":{"type":"string"},"source":{"type":"string","enum":["canonical_metrics"]},"scope":{"type":"string","enum":["tenant"]},"tenantId":{"type":"integer"},"timezone":{"type":"string","enum":["Europe/London"]}},"required":["freshness","generatedAt","source","scope","tenantId","timezone"]}},"required":["generatedAt","today","tenantId","customers","jobs","quotes","invoices","compliance"]},"RetestItem":{"type":"object","properties":{"applianceId":{"type":"string"},"description":{"type":"string"},"location":{"type":"string"},"siteName":{"type":"string"},"customerName":{"type":"string"},"retestDate":{"type":"string"},"daysUntilRetest":{"type":"integer"},"jobId":{"type":"integer"},"customerId":{"type":"integer","nullable":true},"siteId":{"type":"integer","nullable":true}},"required":["applianceId","description","location","siteName","customerName","retestDate","daysUntilRetest","jobId"]},"UploadUrlRequest":{"type":"object","required":["name","size","contentType"],"properties":{"name":{"type":"string","minLength":1},"size":{"type":"integer","minimum":1},"contentType":{"type":"string","minLength":1}}},"UploadUrlResponse":{"type":"object","required":["uploadURL","objectPath"],"properties":{"uploadURL":{"type":"string","format":"uri"},"objectPath":{"type":"string"},"metadata":{"$ref":"#/components/schemas/UploadUrlRequest"}}},"ImportAppliancesBody":{"type":"object","required":["jobId","testerEquipmentId","appliances"],"properties":{"jobId":{"type":"integer"},"testerEquipmentId":{"type":"integer"},"appliances":{"type":"array","items":{"type":"object","required":["applianceId","description","location","testDate","status"],"properties":{"applianceId":{"type":"string"},"description":{"type":"string"},"manufacturer":{"type":["string","null"]},"model":{"type":["string","null"]},"location":{"type":"string"},"serialNumber":{"type":["string","null"]},"retestPeriodMonths":{"type":"integer","default":12},"testDate":{"type":"string"},"status":{"type":"string","enum":["pass","fail","skip"]},"failReason":{"type":["string","null"]},"notes":{"type":["string","null"]}}}}}},"ImportAppliancesResponse":{"type":"object","required":["imported","total"],"properties":{"imported":{"type":"integer"},"total":{"type":"integer"},"appliances":{"type":"array","items":{"$ref":"#/components/schemas/Appliance"}}}},"PartsPricingProfile":{"type":"object","required":["markupPct","hourlyRate"],"properties":{"customerId":{"type":["integer","null"],"minimum":1},"markupPct":{"type":["number","null"],"minimum":0,"maximum":10000},"hourlyRate":{"type":["number","null"],"minimum":0,"maximum":10000000}}},"CatalogueEstimateItem":{"type":"object","required":["materialId","quantity"],"properties":{"materialId":{"type":"integer","minimum":1},"quantity":{"type":"number","exclusiveMinimum":0,"maximum":100000}}},"PartsCatalogueItem":{"allOf":[{"$ref":"#/components/schemas/CatalogueEstimateItem"},{"type":"object","properties":{"substituteMaterialIds":{"type":"array","maxItems":30,"items":{"type":"integer","minimum":1}}}}]},"PartsCatalogueBody":{"type":"object","required":["name","items"],"properties":{"name":{"type":"string","minLength":1,"maxLength":160},"customerId":{"type":["integer","null"],"minimum":1},"isKit":{"type":"boolean","default":false},"items":{"type":"array","minItems":1,"maxItems":200,"items":{"$ref":"#/components/schemas/PartsCatalogueItem"}}}},"PartsCataloguePatch":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":160},"customerId":{"type":["integer","null"],"minimum":1},"isKit":{"type":"boolean"},"items":{"type":"array","minItems":1,"maxItems":200,"items":{"$ref":"#/components/schemas/PartsCatalogueItem"}},"archived":{"type":"boolean"}}},"PartsCatalogue":{"allOf":[{"$ref":"#/components/schemas/PartsCatalogueBody"},{"type":"object","required":["id","archivedAt","updatedAt"],"properties":{"id":{"type":"integer"},"archivedAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}]},"CatalogueEstimate":{"type":"object","required":["lines","fittingMinutes","totalCost","subtotal","profit","markupSource","warnings"],"properties":{"lines":{"type":"array","items":{"type":"object","required":["description","quantity","unitPrice","total","type"],"properties":{"description":{"type":"string"},"quantity":{"type":"number"},"unitPrice":{"type":"number"},"total":{"type":"number"},"type":{"type":"string","enum":["material","labour"]},"materialId":{"type":"integer"}}}},"fittingMinutes":{"type":"number"},"totalCost":{"type":"number"},"subtotal":{"type":"number"},"profit":{"type":"number","description":"Parts gross profit only; fitting labour cost is not available"},"markupSource":{"type":"string"},"warnings":{"type":"array","items":{"type":"string"}}}},"PartSourceOffer":{"type":"object","required":["priceListId","supplierId","supplierName","materialId","unitCost","packSize","orderQuantity","goodsCost","deliveryCharge","totalCost","meetsMinimumOrder"],"properties":{"priceListId":{"type":"integer"},"supplierId":{"type":"integer"},"supplierName":{"type":"string"},"materialId":{"type":"integer"},"unitCost":{"type":"number"},"tradePrice":{"type":["number","null"]},"discountPct":{"type":["number","null"]},"packSize":{"type":"integer"},"orderQuantity":{"type":"number"},"goodsCost":{"type":"number"},"deliveryCharge":{"type":["number","null"]},"totalCost":{"type":["number","null"]},"meetsMinimumOrder":{"type":"boolean"},"leadTimeDays":{"type":["integer","null"]},"arrivalDate":{"type":["string","null"],"format":"date"},"onTime":{"type":["boolean","null"]},"preferred":{"type":"boolean"}}},"PurchaseInvoiceCheckBody":{"type":"object","required":["poId","invoiceNumber","invoiceDate","lines"],"properties":{"poId":{"type":"integer","minimum":1},"invoiceNumber":{"type":"string","minLength":1,"maxLength":120},"invoiceDate":{"type":"string","format":"date"},"lines":{"type":"array","minItems":1,"maxItems":200,"items":{"type":"object","required":["lineIndex","quantity","unitPrice"],"properties":{"lineIndex":{"type":"integer","minimum":0},"quantity":{"type":"number","exclusiveMinimum":0,"maximum":100000},"unitPrice":{"type":"number","minimum":0,"maximum":10000000}}}}}},"PurchaseInvoiceCheck":{"allOf":[{"$ref":"#/components/schemas/PurchaseInvoiceCheckBody"},{"type":"object","required":["id","status","report"],"properties":{"id":{"type":"integer"},"status":{"type":"string","enum":["needs_review","checked"]},"report":{"type":"object","required":["ready","issues"],"properties":{"ready":{"type":"boolean"},"issues":{"type":"array","items":{"type":"string"}}}}}}]},"ProcurementWorkbench":{"type":"object","required":["defaults","pricingProfiles","catalogues","readiness","invoices","credits","cycleSuggestions","warnings"],"properties":{"defaults":{"$ref":"#/components/schemas/PartsPricingProfile"},"pricingProfiles":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/PartsPricingProfile"},{"type":"object","properties":{"name":{"type":"string"}}}]}},"catalogues":{"type":"array","items":{"$ref":"#/components/schemas/PartsCatalogue"}},"readiness":{"type":"array","items":{"type":"object","additionalProperties":true},"description":"Job readiness from recorded required parts; source cap disclosed in warnings"},"invoices":{"type":"array","items":{"$ref":"#/components/schemas/PurchaseInvoiceCheck"}},"credits":{"type":"array","items":{"type":"object","additionalProperties":true},"description":"Returns lacking an issued linked supplier credit note"},"cycleSuggestions":{"type":"array","items":{"type":"object","additionalProperties":true},"description":"Oldest approved stock counts first; onHand","reserved and available are separate":null},"warnings":{"type":"array","items":{"type":"string"}}}},"Material":{"type":"object","required":["id","partNumber","name","category","unit","costPrice","sellPrice"],"properties":{"id":{"type":"integer"},"partNumber":{"type":"string"},"name":{"type":"string"},"description":{"type":["string","null"]},"category":{"type":"string"},"unit":{"type":"string"},"costPrice":{"type":"string"},"sellPrice":{"type":"string"},"fittingMinutes":{"type":["integer","null"],"minimum":0,"maximum":100000},"minStockLevel":{"type":"string"},"supplier":{"type":["string","null"]},"active":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}}},"CreateMaterialBody":{"type":"object","required":["partNumber","name"],"properties":{"partNumber":{"type":"string"},"name":{"type":"string"},"description":{"type":["string","null"]},"category":{"type":"string"},"unit":{"type":"string"},"costPrice":{"type":"string"},"sellPrice":{"type":"string"},"fittingMinutes":{"type":["integer","null"],"minimum":0,"maximum":100000},"minStockLevel":{"type":"string"},"supplier":{"type":["string","null"]},"active":{"type":"string"}}},"EngineerStockItem":{"type":"object","required":["id","userId","materialId","quantity"],"properties":{"id":{"type":"integer"},"userId":{"type":"integer"},"userName":{"type":"string"},"materialId":{"type":"integer"},"materialName":{"type":"string"},"partNumber":{"type":"string"},"unit":{"type":"string"},"quantity":{"type":"string"}}},"AdjustStockBody":{"type":"object","required":["userId","materialId","quantity","changeType","clientKey"],"properties":{"clientKey":{"type":"string","minLength":1,"maxLength":100,"description":"Stable command key, reused with identical values after an interrupted response."},"userId":{"type":"integer"},"materialId":{"type":"integer"},"quantity":{"type":"string"},"changeType":{"type":"string","enum":["receive","return","issue","adjust"]},"notes":{"type":["string","null"]}}},"Warehouse":{"type":"object","required":["id","name","type","isDefault","active","createdAt","updatedAt"],"properties":{"id":{"type":"integer"},"name":{"type":"string"},"code":{"type":["string","null"]},"type":{"type":"string","enum":["warehouse","depot","van","site","quarantine"]},"userId":{"type":["integer","null"]},"userName":{"type":["string","null"]},"address":{"type":["string","null"]},"notes":{"type":["string","null"]},"isDefault":{"type":"boolean"},"active":{"type":"boolean"},"locationCount":{"type":"integer"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}}},"CreateWarehouseBody":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"code":{"type":["string","null"]},"type":{"type":"string","enum":["warehouse","depot","van","site","quarantine"]},"userId":{"type":["integer","null"]},"address":{"type":["string","null"]},"notes":{"type":["string","null"]},"isDefault":{"type":"boolean"},"active":{"type":"boolean"}}},"WarehouseLocation":{"type":"object","required":["id","warehouseId","label","active","createdAt","updatedAt"],"properties":{"id":{"type":"integer"},"warehouseId":{"type":"integer"},"zone":{"type":["string","null"]},"aisle":{"type":["string","null"]},"shelf":{"type":["string","null"]},"bin":{"type":["string","null"]},"label":{"type":"string"},"notes":{"type":["string","null"]},"active":{"type":"boolean"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}}},"CreateWarehouseLocationBody":{"type":"object","required":["label"],"properties":{"zone":{"type":["string","null"]},"aisle":{"type":["string","null"]},"shelf":{"type":["string","null"]},"bin":{"type":["string","null"]},"label":{"type":"string"},"notes":{"type":["string","null"]},"active":{"type":"boolean"}}},"JobMaterialItem":{"type":"object","required":["id","jobId","materialId","quantity","costPrice","sellPrice"],"properties":{"id":{"type":"integer"},"jobId":{"type":"integer"},"materialId":{"type":"integer"},"materialName":{"type":"string"},"partNumber":{"type":"string"},"unit":{"type":"string"},"quantity":{"type":"string"},"costPrice":{"type":"string"},"sellPrice":{"type":"string"},"notes":{"type":["string","null"]},"assignedByUserId":{"type":["integer","null"]},"assignedByName":{"type":["string","null"]},"createdAt":{"type":"string"}}},"PurchaseOrder":{"type":"object","required":["id","poNumber","supplierName","status","orderDate","subtotal","vat","total","lineItems"],"properties":{"supplierId":{"type":["integer","null"]},"locationUserId":{"type":["integer","null"]},"costCentreId":{"type":["integer","null"]},"deliveryCost":{"type":"string"},"receiptEvidence":{"type":"object","description":"Server-calculated receipt quantities and delivery state. A received status does not invent missing receipt evidence.","required":["asOf","ordered","received","pct","awaiting","overdue","outstanding","warning"],"properties":{"asOf":{"type":"string"},"ordered":{"type":"number"},"received":{"type":"number"},"pct":{"type":"number"},"awaiting":{"type":"boolean"},"overdue":{"type":"boolean"},"outstanding":{"type":"number"},"warning":{"type":["string","null"]}}},"id":{"type":"integer"},"poNumber":{"type":"string"},"supplierName":{"type":"string"},"supplierAddress":{"type":["string","null"]},"supplierEmail":{"type":["string","null"]},"supplierPhone":{"type":["string","null"]},"status":{"type":"string"},"orderDate":{"type":"string"},"expectedDate":{"type":["string","null"]},"receivedDate":{"type":["string","null"]},"receiptDateVerified":{"type":"boolean","description":"False after documentary reconciliation; the retained historical date is not verified delivery-timing evidence."},"subtotal":{"type":"string"},"vat":{"type":"string"},"total":{"type":"string"},"notes":{"type":["string","null"]},"createdByUserId":{"type":["integer","null"]},"createdByName":{"type":["string","null"]},"approvedByUserId":{"type":["integer","null"]},"approvedAt":{"type":["string","null"]},"lineItems":{"type":"array","items":{"type":"object","properties":{"materialId":{"type":["integer","null"]},"partNumber":{"type":"string"},"description":{"type":"string"},"quantity":{"type":"string"},"unitPrice":{"type":"string"},"total":{"type":"string"}}}},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}}},"PurchaseOrderAttachment":{"type":"object","required":["id","purchaseOrderId","fileName","filePath","createdAt"],"properties":{"id":{"type":"integer"},"purchaseOrderId":{"type":"integer"},"fileName":{"type":"string"},"filePath":{"type":"string"},"contentType":{"type":["string","null"]},"fileSize":{"type":["integer","null"]},"uploadedByUserId":{"type":["integer","null"]},"uploadedByName":{"type":["string","null"]},"createdAt":{"type":"string"}}},"CreatePurchaseOrderAttachmentBody":{"type":"object","required":["fileName","filePath"],"properties":{"fileName":{"type":"string"},"filePath":{"type":"string"},"contentType":{"type":["string","null"]},"fileSize":{"type":["integer","null"]}}},"SupplierReturn":{"type":"object","required":["id","reference","purchaseOrderId","status","stockAction","total","createdAt"],"properties":{"id":{"type":"integer"},"reference":{"type":"string"},"rmaReference":{"type":["string","null"]},"purchaseOrderId":{"type":"integer"},"poNumber":{"type":["string","null"]},"supplierId":{"type":["integer","null"]},"supplierName":{"type":["string","null"]},"status":{"type":"string"},"stockAction":{"type":"string"},"reason":{"type":["string","null"]},"sourceUserId":{"type":["integer","null"]},"sourceWarehouseId":{"type":["integer","null"]},"subtotal":{"type":["string","null"]},"vat":{"type":["string","null"]},"total":{"type":"string"},"createdAt":{"type":"string"}}},"CreateSupplierReturnBody":{"type":"object","required":["purchaseOrderId","lineItems"],"properties":{"purchaseOrderId":{"type":"integer"},"rmaReference":{"type":["string","null"]},"stockAction":{"type":"string","enum":["reduce","in_transit"]},"reason":{"type":["string","null"]},"sourceUserId":{"type":["integer","null"]},"sourceWarehouseId":{"type":["integer","null"]},"sourceWarehouseLocationId":{"type":["integer","null"]},"vatRate":{"type":["number","null"]},"lineItems":{"type":"array","items":{"type":"object","required":["description","quantity","unitPrice"],"properties":{"materialId":{"type":["integer","null"]},"partNumber":{"type":"string"},"description":{"type":"string"},"quantity":{"type":"number"},"unitPrice":{"type":"number"}}}}}},"SupplierCreditNote":{"type":"object","required":["id","creditNoteNumber","supplierId","reason","total","status","createdAt"],"properties":{"id":{"type":"integer"},"creditNoteNumber":{"type":"string"},"supplierId":{"type":"integer"},"supplierName":{"type":["string","null"]},"purchaseOrderId":{"type":["integer","null"]},"poNumber":{"type":["string","null"]},"supplierReturnId":{"type":["integer","null"]},"reason":{"type":"string"},"subtotal":{"type":["string","null"]},"vatAmount":{"type":["string","null"]},"total":{"type":"string"},"issuedDate":{"type":["string","null"]},"status":{"type":"string"},"createdAt":{"type":"string"}}},"CreateSupplierCreditNoteBody":{"type":"object","required":["supplierId","reason","lineItems"],"properties":{"supplierId":{"type":"integer"},"purchaseOrderId":{"type":["integer","null"]},"supplierReturnId":{"type":["integer","null"]},"reason":{"type":"string"},"vatRate":{"type":["number","null"]},"issuedDate":{"type":["string","null"]},"notes":{"type":["string","null"]},"lineItems":{"type":"array","items":{"type":"object","required":["description","quantity","unitPrice"],"properties":{"description":{"type":"string"},"quantity":{"type":"number"},"unitPrice":{"type":"number"}}}}}},"SourcingOption":{"type":"object","required":["sourceType","sourceUserId","sourceWarehouseId","sourceLocationId","label","available"],"properties":{"sourceType":{"type":"string","enum":["engineer","warehouse"]},"sourceUserId":{"type":["integer","null"]},"sourceWarehouseId":{"type":["integer","null"]},"sourceLocationId":{"type":["integer","null"]},"label":{"type":"string"},"available":{"type":"number"}}},"SourcingSuggestedTransfer":{"type":"object","required":["materialId","quantity","fromType","fromWarehouseId","fromLocationId","toType","toUserId"],"properties":{"materialId":{"type":"integer"},"quantity":{"type":"number"},"fromType":{"type":"string","enum":["warehouse"]},"fromWarehouseId":{"type":"integer"},"fromLocationId":{"type":["integer","null"]},"toType":{"type":"string","enum":["engineer"]},"toUserId":{"type":"integer"}}},"SourcingSuggestedPo":{"type":"object","required":["materialId","materialName","quantity"],"properties":{"materialId":{"type":"integer"},"materialName":{"type":"string"},"quantity":{"type":"number"}}},"SourcingPart":{"type":"object","required":["requiredPartId","materialId","materialName","sku","quantityNeeded","quantityReserved","reservationStatus","reservedSourceLabel","options","recommended","shortage","needsPo","suggestedTransfer","suggestedPo"],"properties":{"requiredPartId":{"type":"integer"},"materialId":{"type":"integer"},"materialName":{"type":"string"},"sku":{"type":["string","null"]},"quantityNeeded":{"type":"number"},"quantityReserved":{"type":"number"},"consumableQuantity":{"type":"number","minimum":0},"reservationStatus":{"type":"string","enum":["none","partial","reserved"]},"reservedSourceLabel":{"type":["string","null"]},"options":{"type":"array","items":{"$ref":"#/components/schemas/SourcingOption"}},"recommended":{"oneOf":[{"$ref":"#/components/schemas/SourcingOption"},{"type":"null"}]},"shortage":{"type":"number"},"needsPo":{"type":"boolean"},"suggestedTransfer":{"oneOf":[{"$ref":"#/components/schemas/SourcingSuggestedTransfer"},{"type":"null"}]},"suggestedPo":{"oneOf":[{"$ref":"#/components/schemas/SourcingSuggestedPo"},{"type":"null"}]}}},"JobSourcingResponse":{"type":"object","required":["jobId","assignedUserId","mode","parts"],"properties":{"jobId":{"type":"integer"},"assignedUserId":{"type":["integer","null"]},"mode":{"type":"string","enum":["on_assignment","suggest_only","on_add"]},"parts":{"type":"array","items":{"$ref":"#/components/schemas/SourcingPart"}}}},"ReservedLine":{"type":"object","required":["requiredPartId","materialId","materialName","quantity","sourceType","sourceLabel"],"properties":{"requiredPartId":{"type":"integer"},"materialId":{"type":"integer"},"materialName":{"type":"string"},"quantity":{"type":"number"},"sourceType":{"type":"string","enum":["engineer","warehouse"]},"sourceLabel":{"type":"string"}}},"ShortageLine":{"type":"object","required":["requiredPartId","materialId","materialName","shortage"],"properties":{"requiredPartId":{"type":"integer"},"materialId":{"type":"integer"},"materialName":{"type":"string"},"shortage":{"type":"number"}}},"ReserveJobPartsResponse":{"type":"object","required":["reserved","shortages"],"properties":{"reserved":{"type":"array","items":{"$ref":"#/components/schemas/ReservedLine"}},"shortages":{"type":"array","items":{"$ref":"#/components/schemas/ShortageLine"}}}},"ReleaseReservationsResponse":{"type":"object","required":["released"],"properties":{"released":{"type":"integer"}}},"CreatePurchaseOrderBody":{"type":"object","required":["supplierName","orderDate","lineItems"],"properties":{"expectedUpdatedAt":{"type":"string","description":"Last observed updatedAt for conflict detection when editing an existing order."},"supplierName":{"type":"string"},"supplierAddress":{"type":["string","null"]},"supplierEmail":{"type":["string","null"]},"supplierPhone":{"type":["string","null"]},"orderDate":{"type":"string"},"expectedDate":{"type":["string","null"]},"notes":{"type":["string","null"]},"supplierId":{"type":["integer","null"]},"locationUserId":{"type":["integer","null"]},"lineItems":{"type":"array","items":{"type":"object","properties":{"materialId":{"type":["integer","null"]},"partNumber":{"type":"string"},"description":{"type":"string"},"quantity":{"type":"string"},"unitPrice":{"type":"string"}}}}}},"PurchaseOrderReasonBody":{"type":"object","properties":{"reason":{"type":["string","null"]}}},"ReceivePurchaseOrderBody":{"type":"object","required":["receipts"],"properties":{"receipts":{"type":"array","items":{"type":"object","required":["index","receivedQuantity"],"properties":{"index":{"type":"integer"},"receivedQuantity":{"type":"string"}}}},"destinationType":{"type":"string","enum":["engineer","warehouse"]},"locationUserId":{"type":["integer","null"]},"warehouseId":{"type":["integer","null"]},"warehouseLocationId":{"type":["integer","null"]},"receivedDate":{"type":["string","null"]},"notes":{"type":["string","null"]}}},"ReceiptBackOrder":{"type":"object","properties":{"index":{"type":"integer"},"materialId":{"type":["integer","null"]},"partNumber":{"type":["string","null"]},"description":{"type":["string","null"]},"orderedQuantity":{"type":"number"},"receivedQuantity":{"type":"number"},"backOrderQuantity":{"type":"number"}}},"ReceivePurchaseOrderResponse":{"type":"object","required":["purchaseOrder","backOrders"],"properties":{"purchaseOrder":{"$ref":"#/components/schemas/PurchaseOrder"},"stockChanges":{"type":"array","items":{"type":"object","additionalProperties":true}},"destUserId":{"type":["integer","null"]},"destWarehouseId":{"type":["integer","null"]},"destLocationId":{"type":["integer","null"]},"backOrders":{"type":"array","items":{"$ref":"#/components/schemas/ReceiptBackOrder"}}}},"PublicApiIdentity":{"type":"object","additionalProperties":false,"required":["id","name","prefix","scopes","customerId"],"properties":{"id":{"type":"integer"},"name":{"type":"string"},"prefix":{"type":"string","description":"Non-secret key prefix for identifying a token in the admin UI."},"scopes":{"type":"string","description":"Comma-separated scope grants."},"customerId":{"type":["integer","null"],"description":"Customer restriction, or null for an account-wide key."}}},"PublicApiIdentityResponse":{"type":"object","additionalProperties":false,"required":["apiKey"],"properties":{"apiKey":{"$ref":"#/components/schemas/PublicApiIdentity"}}},"PublicApiJobSummary":{"type":"object","additionalProperties":false,"required":["id","certificateNumber","status","testDate","customerId","siteId","createdAt"],"properties":{"id":{"type":"integer"},"certificateNumber":{"type":"string"},"status":{"type":"string"},"testDate":{"type":"string","description":"ISO date of the service test."},"customerId":{"type":"integer"},"customerName":{"type":["string","null"]},"siteId":{"type":"integer"},"siteName":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"}}},"PublicApiJobListResponse":{"type":"object","additionalProperties":false,"required":["data","limit","offset"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiJobSummary"}},"limit":{"type":"integer","minimum":1,"maximum":200},"offset":{"type":"integer","minimum":0}}},"PublicApiAppliance":{"description":"Appliance record returned inside a public job detail.","type":"object","additionalProperties":false,"required":["id","jobId","applianceId","description","manufacturer","model","location","serialNumber","retestPeriodMonths","testDate","retestDate","status","failReason","notes","insulationResistanceMohm","earthContinuityOhm","leakageMa","applianceClass","visualInspectionResult","fuseRatingA","createdAt","updatedAt"],"properties":{"id":{"type":"integer"},"jobId":{"type":"integer"},"applianceId":{"type":"string"},"description":{"type":"string"},"manufacturer":{"type":["string","null"]},"model":{"type":["string","null"]},"location":{"type":"string"},"serialNumber":{"type":["string","null"]},"retestPeriodMonths":{"type":"integer"},"testDate":{"type":"string"},"retestDate":{"type":"string"},"status":{"type":"string"},"failReason":{"type":["string","null"]},"notes":{"type":["string","null"]},"insulationResistanceMohm":{"type":["string","null"]},"earthContinuityOhm":{"type":["string","null"]},"leakageMa":{"type":["string","null"]},"applianceClass":{"type":["string","null"]},"visualInspectionResult":{"type":["string","null"]},"fuseRatingA":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"PublicApiJobDetail":{"description":"Public job details plus all appliance records associated with it.","type":"object","additionalProperties":false,"required":["id","certificateNumber","jobNumber","status","priority","jobType","testDate","scheduledDate","customerId","customerName","siteId","siteName","createdAt","appliances"],"properties":{"id":{"type":"integer"},"certificateNumber":{"type":"string"},"jobNumber":{"type":["string","null"]},"status":{"type":"string"},"priority":{"type":"string"},"jobType":{"type":["string","null"]},"testDate":{"type":"string"},"scheduledDate":{"type":["string","null"]},"customerId":{"type":"integer"},"customerName":{"type":"string"},"siteId":{"type":"integer"},"siteName":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"appliances":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiAppliance"}}}},"PublicApiInvoiceLineItem":{"type":"object","additionalProperties":false,"required":["description","quantity","unitPrice"],"properties":{"description":{"type":"string"},"quantity":{"type":"string","description":"Decimal quantity normalized to a string."},"unitPrice":{"type":"string","description":"Net unit price normalized to a decimal string."}}},"PublicApiInvoice":{"type":"object","additionalProperties":false,"required":["id","customerId","siteId","jobId","invoiceNumber","status","issuedAt","issuedDate","dueDate","paidDate","lineItems","subtotal","vatRate","vatAmount","total","amountPaid","paymentStatus","createdAt","updatedAt"],"properties":{"id":{"type":"integer"},"customerId":{"type":"integer"},"siteId":{"type":["integer","null"]},"jobId":{"type":["integer","null"]},"invoiceNumber":{"type":"string"},"status":{"type":"string"},"issuedAt":{"type":["string","null"],"format":"date-time"},"issuedDate":{"type":["string","null"]},"dueDate":{"type":["string","null"]},"paidDate":{"type":["string","null"]},"lineItems":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiInvoiceLineItem"}},"subtotal":{"type":"string","description":"Decimal value returned as a string."},"vatRate":{"type":"string","description":"Decimal value returned as a string."},"vatAmount":{"type":"string","description":"Decimal value returned as a string."},"total":{"type":"string","description":"Decimal value returned as a string."},"amountPaid":{"type":"string","description":"Decimal value returned as a string."},"paymentStatus":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"PublicApiInvoiceListResponse":{"type":"object","additionalProperties":false,"required":["data","limit","offset"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiInvoice"}},"limit":{"type":"integer","minimum":1,"maximum":200},"offset":{"type":"integer","minimum":0}}},"PublicApiCertificate":{"type":"object","additionalProperties":false,"required":["id","jobId","publicUrl","certificateNumber","customerId","customerName","siteName","createdAt"],"properties":{"id":{"type":"integer"},"jobId":{"type":"integer"},"publicUrl":{"type":"string","format":"uri","description":"Time-limited bearer link for a released","current certificate.":null},"certificateNumber":{"type":"string"},"customerId":{"type":"integer"},"customerName":{"type":"string"},"siteName":{"type":"string"},"createdAt":{"type":"string","format":"date-time"}}},"PublicApiCertificateListResponse":{"type":"object","additionalProperties":false,"required":["data","limit","offset"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiCertificate"}},"limit":{"type":"integer","minimum":1,"maximum":200},"offset":{"type":"integer","minimum":0}}},"PublicApiCustomer":{"type":"object","additionalProperties":false,"required":["id","name","address","postcode","contactName","contactEmail","contactPhone","status","createdAt","updatedAt"],"properties":{"id":{"type":"integer"},"name":{"type":"string"},"address":{"type":"string"},"postcode":{"type":"string"},"contactName":{"type":["string","null"]},"contactEmail":{"type":["string","null"]},"contactPhone":{"type":["string","null"]},"status":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"PublicApiCustomerListResponse":{"type":"object","additionalProperties":false,"required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiCustomer"}}}},"PublicApiHealthResponse":{"type":"object","additionalProperties":false,"required":["ok","version","time"],"properties":{"ok":{"type":"boolean","const":true},"version":{"type":"string","const":"v1"},"time":{"type":"string","format":"date-time"}}},"RateLimitError":{"type":"object","required":["error","retryAfter"],"properties":{"error":{"type":"string","const":"Rate limit exceeded"},"retryAfter":{"type":"integer","minimum":1,"description":"Seconds to wait before retrying."}}},"WebhookJobCompletedData":{"type":"object","required":["id","certificateNumber","customerId","siteId","completedAt"],"properties":{"id":{"type":"integer"},"certificateNumber":{"type":"string"},"customerId":{"type":"integer"},"siteId":{"type":"integer"},"completedAt":{"type":"string","format":"date-time"}}},"WebhookCertificateIssuedData":{"type":"object","required":["reportId","jobId","certificateNumber","customerName","shareToken"],"properties":{"reportId":{"type":"integer"},"jobId":{"type":"integer"},"certificateNumber":{"type":["string","null"]},"customerName":{"type":["string","null"]},"shareToken":{"type":["string","null"]}}},"WebhookInvoicePaidData":{"type":"object","required":["id","invoiceNumber","customerId","total","paidDate"],"properties":{"id":{"type":"integer"},"invoiceNumber":{"type":"string"},"customerId":{"type":"integer"},"total":{"type":"string","description":"Decimal value returned as a string."},"paidDate":{"type":["string","null"]}}},"WebhookQuoteCreatedData":{"type":"object","required":["id","quoteNumber","customerId","siteId","total","status","sourceType","sourceId","createdAt"],"properties":{"id":{"type":"integer"},"quoteNumber":{"type":"string"},"customerId":{"type":"integer"},"siteId":{"type":["integer","null"]},"total":{"type":"string","description":"Decimal value returned as a string."},"status":{"type":["string","null"]},"sourceType":{"type":["string","null"]},"sourceId":{"type":["integer","null"]},"createdAt":{"type":"string","format":"date-time"}}},"WebhookInvoiceSentData":{"type":"object","required":["id","invoiceNumber","customerId","total","issuedDate","dueDate","sentAt"],"properties":{"id":{"type":"integer"},"invoiceNumber":{"type":"string"},"customerId":{"type":"integer"},"total":{"type":"string","description":"Decimal value returned as a string."},"issuedDate":{"type":["string","null"]},"dueDate":{"type":["string","null"]},"sentAt":{"type":"string","format":"date-time"}}},"WebhookJobCompletedEvent":{"type":"object","required":["event","data","timestamp"],"properties":{"event":{"type":"string","const":"job.completed"},"data":{"$ref":"#/components/schemas/WebhookJobCompletedData"},"timestamp":{"type":"string","format":"date-time"}}},"WebhookCertificateIssuedEvent":{"type":"object","required":["event","data","timestamp"],"properties":{"event":{"type":"string","const":"certificate.issued"},"data":{"$ref":"#/components/schemas/WebhookCertificateIssuedData"},"timestamp":{"type":"string","format":"date-time"}}},"WebhookInvoicePaidEvent":{"type":"object","required":["event","data","timestamp"],"properties":{"event":{"type":"string","const":"invoice.paid"},"data":{"$ref":"#/components/schemas/WebhookInvoicePaidData"},"timestamp":{"type":"string","format":"date-time"}}},"WebhookQuoteCreatedEvent":{"type":"object","required":["event","data","timestamp"],"properties":{"event":{"type":"string","const":"quote.created"},"data":{"$ref":"#/components/schemas/WebhookQuoteCreatedData"},"timestamp":{"type":"string","format":"date-time"}}},"WebhookInvoiceSentEvent":{"type":"object","required":["event","data","timestamp"],"properties":{"event":{"type":"string","const":"invoice.sent"},"data":{"$ref":"#/components/schemas/WebhookInvoiceSentData"},"timestamp":{"type":"string","format":"date-time"}}},"WebhookTestPingEvent":{"type":"object","required":["event","data","timestamp"],"properties":{"event":{"type":"string","const":"test.ping"},"data":{"type":"object","required":["ok","when"],"properties":{"ok":{"type":"boolean","const":true},"when":{"type":"string","format":"date-time"}}},"timestamp":{"type":"string","format":"date-time"}}},"WebhookEventEnvelope":{"description":"HMAC-signed webhook body. The timestamp is the enqueue time.","oneOf":[{"$ref":"#/components/schemas/WebhookJobCompletedEvent"},{"$ref":"#/components/schemas/WebhookCertificateIssuedEvent"},{"$ref":"#/components/schemas/WebhookQuoteCreatedEvent"},{"$ref":"#/components/schemas/WebhookInvoiceSentEvent"},{"$ref":"#/components/schemas/WebhookInvoicePaidEvent"},{"$ref":"#/components/schemas/WebhookTestPingEvent"}]},"ErrorEnvelope":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}},"SupplierKpis":{"type":"object","required":["orderCount","totalSpend","spendYtd","spendLast30","avgOrderValue","onTimeDeliveryPct","avgLeadTimeDays","ordersPerMonth","avgDaysBetweenOrders","returnsCount","returnsPct","warrantyClaims","supplierScore","ragStatus"],"properties":{"orderCount":{"type":"integer"},"totalSpend":{"type":"string"},"spendYtd":{"type":"string"},"spendLast30":{"type":"string"},"avgOrderValue":{"type":"string"},"onTimeDeliveryPct":{"type":["number","null"]},"avgLeadTimeDays":{"type":["number","null"]},"ordersPerMonth":{"type":["number","null"]},"avgDaysBetweenOrders":{"type":["number","null"]},"returnsCount":{"type":"integer"},"returnsPct":{"type":["number","null"]},"warrantyClaims":{"type":["integer","null"]},"supplierScore":{"type":["integer","null"]},"ragStatus":{"type":"string","enum":["green","amber","red","unrated"]}}},"SupplierRecentOrder":{"type":"object","required":["id","poNumber","status","deliveryStatus"],"properties":{"id":{"type":"integer"},"poNumber":{"type":"string"},"status":{"type":"string"},"orderDate":{"type":["string","null"]},"expectedDate":{"type":["string","null"]},"receivedDate":{"type":["string","null"]},"total":{"type":["string","null"]},"leadTimeDays":{"type":["integer","null"]},"deliveryStatus":{"type":"string","enum":["on_time","late","pending","received","cancelled"]},"engineerName":{"type":["string","null"]}}},"SupplierPerformance":{"type":"object","required":["supplierId","kpis","recentOrders"],"properties":{"supplierId":{"type":"integer"},"kpis":{"$ref":"#/components/schemas/SupplierKpis"},"recentOrders":{"type":"array","items":{"$ref":"#/components/schemas/SupplierRecentOrder"}}}},"SupplierInsightsData":{"type":"object","properties":{"performanceSummary":{"type":"string"},"strengths":{"type":"array","items":{"type":"string"}},"riskWarnings":{"type":"array","items":{"type":"string"}},"costObservations":{"type":"array","items":{"type":"string"}},"reorderSuggestions":{"type":"array","items":{"type":"string"}},"spendAnalysis":{"type":"string"},"recommendation":{"type":"string"},"nextBestAction":{"type":"string"}}},"SupplierInsightsResult":{"type":"object","required":["supplierId","aiConfigured","insights"],"properties":{"supplierId":{"type":"integer"},"aiConfigured":{"type":"boolean"},"insights":{"$ref":"#/components/schemas/SupplierInsightsData"}}},"StockReorderSuggestion":{"type":"object","properties":{"materialId":{"type":"integer"},"partNumber":{"type":"string"},"name":{"type":"string"},"unit":{"type":"string"},"onHand":{"type":"string"},"reserved":{"type":"string"},"available":{"type":"string"},"onOrder":{"type":"string"},"minimumShortfall":{"type":"string"},"minStockLevel":{"type":"string"},"suggestedQty":{"type":"string"},"supplier":{"type":["string","null"]},"supplierId":{"type":["integer","null"]},"unitPrice":{"type":"string"},"priceSource":{"type":"string"},"supplierSku":{"type":["string","null"]},"minOrderQty":{"type":["string","null"]},"leadTimeDays":{"type":["integer","null"]},"estCost":{"type":"string"}}},"StockMover":{"type":"object","properties":{"materialId":{"type":"integer"},"partNumber":{"type":"string"},"name":{"type":"string"},"unit":{"type":"string"},"qtyMoved":{"type":"string"},"movements":{"type":"integer"}}},"StockDeadItem":{"type":"object","properties":{"materialId":{"type":"integer"},"partNumber":{"type":"string"},"name":{"type":"string"},"unit":{"type":"string"},"onHand":{"type":"string"},"value":{"type":"string"}}},"StockSlowItem":{"type":"object","properties":{"materialId":{"type":"integer"},"partNumber":{"type":"string"},"name":{"type":"string"},"unit":{"type":"string"},"onHand":{"type":"string"}}},"StockDashboard":{"type":"object","required":["currency","valuation","counts","fastMoving","slowMoving","deadStock","reorderSuggestions"],"properties":{"currency":{"type":"string"},"valuation":{"type":"object","properties":{"totalStockValue":{"type":"string"},"warehouseValue":{"type":"string"},"engineerValue":{"type":"string"}}},"counts":{"type":"object","properties":{"activeMaterials":{"type":"integer"},"lowStockCount":{"type":"integer"},"outOfStockCount":{"type":"integer"},"ordersDueCount":{"type":"integer"},"ordersOverdueCount":{"type":"integer"},"returnsCount":{"type":"integer"}}},"fastMoving":{"type":"array","items":{"$ref":"#/components/schemas/StockMover"}},"slowMoving":{"type":"array","items":{"$ref":"#/components/schemas/StockSlowItem"}},"deadStock":{"type":"array","items":{"$ref":"#/components/schemas/StockDeadItem"}},"reorderSuggestions":{"type":"array","items":{"$ref":"#/components/schemas/StockReorderSuggestion"}}}},"StockInsightsData":{"type":"object","required":["summary","reorderPredictions","demandForecast","seasonality","shortageWarnings","deadExcessStock","supplierRecommendations","nextBestAction"],"properties":{"summary":{"$ref":"#/components/schemas/StockBriefingStatement"},"reorderPredictions":{"type":"array","items":{"$ref":"#/components/schemas/StockBriefingStatement"}},"demandForecast":{"$ref":"#/components/schemas/StockBriefingStatement"},"seasonality":{"$ref":"#/components/schemas/StockBriefingStatement"},"shortageWarnings":{"type":"array","items":{"$ref":"#/components/schemas/StockBriefingStatement"}},"deadExcessStock":{"type":"array","items":{"$ref":"#/components/schemas/StockBriefingStatement"}},"supplierRecommendations":{"type":"array","items":{"$ref":"#/components/schemas/StockBriefingStatement"}},"nextBestAction":{"$ref":"#/components/schemas/StockBriefingStatement"}}},"StockBriefingStatement":{"type":"object","required":["text","evidenceRefs"],"properties":{"text":{"type":"string","minLength":1,"maxLength":1200},"evidenceRefs":{"type":"array","minItems":1,"maxItems":8,"items":{"type":"string","maxLength":100}}}},"StockBriefingEvidence":{"type":"object","required":["id","kind","materialId","label","href","facts"],"properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["position","consumption","inactivity","supplier_price","coverage"]},"materialId":{"type":["integer","null"]},"label":{"type":"string"},"href":{"type":"string"},"facts":{"type":"object","additionalProperties":{"type":["string","number","boolean","null"]}}}},"StockBriefingSource":{"type":"object","required":["version","capturedAt","databaseSnapshot","asOfDate","consumptionSince","inactivitySince","rulesVersion","evidence","limitations"],"properties":{"version":{"type":"string","pattern":"^[a-f0-9]{64}$"},"capturedAt":{"type":"string"},"databaseSnapshot":{"type":"string"},"asOfDate":{"type":"string"},"consumptionSince":{"type":"string"},"inactivitySince":{"type":"string"},"rulesVersion":{"type":"string"},"evidence":{"type":"array","items":{"$ref":"#/components/schemas/StockBriefingEvidence"}},"limitations":{"type":"array","items":{"type":"string"}}}},"IntelligenceFeature":{"type":"string","enum":["quote-drafter","quote-follow-up","job-summary","eicr-assistance","stock-briefing","inbox-triage","parts-suggestions","risk-narrative"]},"StockInsightsResult":{"type":"object","required":["aiConfigured","status","generationId","requestedAt","completedAt","source","insights","reason"],"properties":{"aiConfigured":{"type":"boolean"},"status":{"type":"string","enum":["ready","insufficient_data"]},"generationId":{"type":"string"},"requestedAt":{"type":"string"},"completedAt":{"type":"string"},"source":{"$ref":"#/components/schemas/StockBriefingSource"},"reason":{"type":["string","null"]},"insights":{"anyOf":[{"$ref":"#/components/schemas/StockInsightsData"},{"type":"null"}]}}},"SupplierHistoryPo":{"type":"object","required":["id","poNumber","status","createdAt"],"properties":{"id":{"type":"integer"},"poNumber":{"type":"string"},"status":{"type":"string"},"orderDate":{"type":["string","null"]},"total":{"type":["string","null"]},"createdAt":{"type":"string"}}},"SupplierHistoryReturn":{"type":"object","required":["id","poNumber","quantity","createdAt"],"properties":{"id":{"type":"integer"},"poNumber":{"type":"string"},"materialName":{"type":["string","null"]},"quantity":{"type":"string"},"notes":{"type":["string","null"]},"createdAt":{"type":"string"}}},"SupplierHistoryJob":{"type":"object","required":["id","receiptCount","suppliedAt"],"properties":{"id":{"type":"integer"},"jobNumber":{"type":["string","null"]},"status":{"type":["string","null"]},"scheduledDate":{"type":["string","null"]},"receiptCount":{"type":"integer"},"suppliedAt":{"type":"string"}}},"SupplierHistoryAudit":{"type":"object","required":["id","action","userName","createdAt"],"properties":{"id":{"type":"integer"},"action":{"type":"string"},"userName":{"type":["string","null"]},"details":{"type":["string","null"]},"createdAt":{"type":"string"}}},"SupplierHistory":{"type":"object","required":["purchaseOrders","returns","suppliedJobs","auditLog","notTracked"],"properties":{"purchaseOrders":{"type":"array","items":{"$ref":"#/components/schemas/SupplierHistoryPo"}},"returns":{"type":"array","items":{"$ref":"#/components/schemas/SupplierHistoryReturn"}},"suppliedJobs":{"type":"array","items":{"$ref":"#/components/schemas/SupplierHistoryJob"}},"auditLog":{"type":"array","items":{"$ref":"#/components/schemas/SupplierHistoryAudit"}},"notTracked":{"type":"array","items":{"type":"string"}}}},"EicrWayArrangementInput":{"type":"object","required":["arrangement"],"properties":{"arrangement":{"type":"string","enum":["TP","split"]},"confirmRecordedData":{"type":"boolean"},"survivorCircuitId":{"type":"integer","description":"Required when multiple populated phase rows are collapsed; explicitly selects the stable circuit identity and data to retain."}}},"EicrOcpdRatingStatus":{"type":"string","nullable":true,"enum":["LIM","N/A","N/V","---"]},"MaxZsCalculation":{"type":"object","required":["value","reason","basisPct"],"properties":{"value":{"type":"number","nullable":true},"reason":{"type":"string","nullable":true,"enum":["Missing OCPD BS (EN)","Missing OCPD Type","Missing Rating (A)","Unsupported combination",null]},"basisPct":{"type":"integer","enum":[80,100]}}},"EicrCircuitResponse":{"type":"object","required":["maxZsCalculation"],"additionalProperties":true,"properties":{"maxZsCalculation":{"$ref":"#/components/schemas/MaxZsCalculation"}}},"EicrWayArrangementResult":{"type":"object","required":["ok","arrangement","affectedCircuits","circuits"],"properties":{"ok":{"type":"boolean"},"arrangement":{"type":"string","enum":["TP","split"]},"arrangementHistoryId":{"type":"integer","nullable":true},"affectedCircuits":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"reference":{"type":"string"},"phase":{"type":"string"},"populated":{"type":"boolean"}}}},"circuits":{"type":"array","items":{"$ref":"#/components/schemas/EicrCircuitResponse"}}}},"EicrCircuitBulkDefaults":{"type":"object","additionalProperties":false,"properties":{"circuitType":{"type":["string","null"]},"protectiveDeviceType":{"type":["string","null"]},"protectiveDeviceRatingA":{"type":["integer","null"],"minimum":0},"breakingCapacityKa":{"type":["number","null"],"minimum":0},"curve":{"type":["string","null"]},"cableCsaMm2":{"type":["number","null"],"minimum":0},"cpcCsaMm2":{"type":["number","null"],"minimum":0},"cableType":{"type":["string","null"]},"wiringTypeCode":{"type":["string","null"]},"conductorMaterial":{"type":["string","null"]},"numCores":{"type":["integer","null"],"minimum":0},"referenceMethod":{"type":["string","null"]},"maxDisconnectTimeS":{"type":["number","null"],"minimum":0},"irTestVoltageV":{"type":["integer","null"],"minimum":0},"rcdPresent":{"type":["boolean","null"]},"rcdType":{"type":["string","null"]},"rcdRatedInMa":{"type":["integer","null"],"minimum":0},"afddPresent":{"type":["boolean","null"]},"samplePct":{"type":["integer","null"],"minimum":0}}},"EicrCircuitBulkDefaultsInput":{"type":"object","required":["circuitIds","defaults"],"properties":{"circuitIds":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"integer"}},"defaults":{"$ref":"#/components/schemas/EicrCircuitBulkDefaults"},"overwrite":{"type":"boolean","default":false}}},"EicrCircuitBulkDefaultsResult":{"type":"object","required":["updated"],"properties":{"updated":{"type":"integer","minimum":0}}},"EicrCircuitBulkDefaultsConflict":{"type":"object","required":["circuitId","reference","field"],"properties":{"circuitId":{"type":"integer"},"reference":{"type":"string"},"field":{"type":"string"}}},"EicrCircuitBulkDefaultsConflictResult":{"type":"object","required":["error","requiresConfirmation","conflicts"],"properties":{"error":{"type":"string"},"requiresConfirmation":{"type":"boolean","const":true},"conflicts":{"type":"array","items":{"$ref":"#/components/schemas/EicrCircuitBulkDefaultsConflict"}}}},"EicrAutofillInput":{"type":"object","required":["value","scope"],"properties":{"value":{"type":"string","enum":["N/A","LIM","---"]},"scope":{"type":"string","enum":["current_circuit","current_board"]},"circuitId":{"type":"integer"},"distributionBoardId":{"type":"integer"}}},"EicrAutofillResult":{"type":"object","required":["value","affectedCellCount","affectedCircuits"],"properties":{"value":{"type":"string"},"affectedCellCount":{"type":"integer"},"undoToken":{"type":"string","nullable":true},"affectedCircuits":{"type":"array","items":{"type":"object","properties":{"circuitId":{"type":"integer"},"field":{"type":"string"},"reference":{"type":"string"}}}}}},"EicrAutofillUndoResult":{"type":"object","required":["ok","restoredCellCount"],"properties":{"ok":{"type":"boolean"},"restoredCellCount":{"type":"integer"}}},"EicrDeviationInput":{"type":"object","required":["description","code"],"properties":{"description":{"type":"string","minLength":1,"maxLength":4000},"code":{"type":"string","enum":["C1","C2","C3","FI","LIM","NOTE"]},"sortOrder":{"type":"integer","minimum":0},"distributionBoardId":{"type":"integer","nullable":true},"clientIdempotencyKey":{"type":"string","minLength":1,"maxLength":200}}},"EicrDeviation":{"allOf":[{"$ref":"#/components/schemas/EicrDeviationInput"},{"type":"object","required":["id","eicrReportId","createdAt","updatedAt"],"properties":{"id":{"type":"integer"},"eicrReportId":{"type":"integer"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}]},"ElectricalSettings":{"type":"object","required":["requireSupervisorReview","supervisorMustDiffer","requireObservationRecommendations","autoRemedialQuoteOnRelease","requireTestInstruments","enableTesterImport","blockExpiredCalibration","reportPrefixEicr","reportPrefixEic","reportPrefixMinorWorks","portalShowCertificates","quoteVatRatePct","quoteValidDays","intervalMonths","extentOfInstallation","agreedLimitations","operationalLimitations","allowEngineerRelease","allowEngineerManageInstruments","pdfShowLogo","pdfAccentColor","pdfFooterText","requireQsReviewPat","requireQsReviewEmergencyLighting","requireQsReviewRcd","requireQsProfileForCertificateSignRelease","requireObservationsForUnsatisfactory","allowQuoteFromFindings","preventDuplicateQuotes","allowQuoteRevisions","remedialQuoteWording","remedialPricingRules","complianceBodyName","complianceBodyRegNumber","maxZsBasisPct"],"properties":{"requireSupervisorReview":{"type":"boolean"},"supervisorMustDiffer":{"type":"boolean"},"requireObservationRecommendations":{"type":"boolean"},"autoRemedialQuoteOnRelease":{"type":"boolean"},"requireTestInstruments":{"type":"boolean"},"enableTesterImport":{"type":"boolean"},"blockExpiredCalibration":{"type":"boolean"},"reportPrefixEicr":{"type":"string"},"reportPrefixEic":{"type":"string"},"reportPrefixMinorWorks":{"type":"string"},"portalShowCertificates":{"type":"boolean"},"quoteVatRatePct":{"type":"integer","minimum":0,"maximum":100},"quoteValidDays":{"type":"integer","minimum":0,"maximum":365},"intervalMonths":{"type":"integer","minimum":1,"maximum":120},"extentOfInstallation":{"type":"string"},"agreedLimitations":{"type":"string"},"operationalLimitations":{"type":"string"},"allowEngineerRelease":{"type":"boolean"},"allowEngineerManageInstruments":{"type":"boolean"},"pdfShowLogo":{"type":"boolean"},"pdfAccentColor":{"type":"string"},"pdfFooterText":{"type":"string"},"requireQsReviewPat":{"type":"boolean"},"requireQsReviewEmergencyLighting":{"type":"boolean"},"requireQsReviewRcd":{"type":"boolean"},"requireQsProfileForCertificateSignRelease":{"type":"boolean"},"requireObservationsForUnsatisfactory":{"type":"boolean"},"allowQuoteFromFindings":{"type":"boolean"},"preventDuplicateQuotes":{"type":"boolean"},"allowQuoteRevisions":{"type":"boolean"},"remedialQuoteWording":{"type":"string"},"remedialPricingRules":{"type":"array","items":{"$ref":"#/components/schemas/RemedialPricingRule"}},"complianceBodyName":{"type":"string"},"complianceBodyRegNumber":{"type":"string"},"maxZsBasisPct":{"type":"integer","enum":[80,100]}}},"RemedialPricingRule":{"type":"object","required":["code","label","keywords","price"],"properties":{"code":{"type":"string","enum":["C1","C2","C3","FI"]},"label":{"type":"string","maxLength":200},"keywords":{"type":"string","maxLength":300},"price":{"type":"string","pattern":"^\\d{1,7}(\\.\\d{1,2})?$"}}},"UpdateElectricalSettingsBody":{"type":"object","properties":{"requireSupervisorReview":{"type":"boolean"},"supervisorMustDiffer":{"type":"boolean"},"requireObservationRecommendations":{"type":"boolean"},"autoRemedialQuoteOnRelease":{"type":"boolean"},"requireTestInstruments":{"type":"boolean"},"enableTesterImport":{"type":"boolean"},"blockExpiredCalibration":{"type":"boolean"},"reportPrefixEicr":{"type":"string","pattern":"^[A-Za-z0-9]{1,10}$"},"reportPrefixEic":{"type":"string","pattern":"^[A-Za-z0-9]{1,10}$"},"reportPrefixMinorWorks":{"type":"string","pattern":"^[A-Za-z0-9]{1,10}$"},"portalShowCertificates":{"type":"boolean"},"quoteVatRatePct":{"type":"integer","minimum":0,"maximum":100},"quoteValidDays":{"type":"integer","minimum":0,"maximum":365},"intervalMonths":{"type":"integer","minimum":1,"maximum":120},"extentOfInstallation":{"type":"string","maxLength":2000},"agreedLimitations":{"type":"string","maxLength":4000},"operationalLimitations":{"type":"string","maxLength":4000},"allowEngineerRelease":{"type":"boolean"},"allowEngineerManageInstruments":{"type":"boolean"},"pdfShowLogo":{"type":"boolean"},"pdfAccentColor":{"type":"string","pattern":"^$|^#[0-9a-fA-F]{6}$"},"pdfFooterText":{"type":"string","maxLength":300},"requireQsReviewPat":{"type":"boolean"},"requireQsReviewEmergencyLighting":{"type":"boolean"},"requireQsReviewRcd":{"type":"boolean"},"requireQsProfileForCertificateSignRelease":{"type":"boolean"},"requireObservationsForUnsatisfactory":{"type":"boolean"},"allowQuoteFromFindings":{"type":"boolean"},"preventDuplicateQuotes":{"type":"boolean"},"allowQuoteRevisions":{"type":"boolean"},"remedialQuoteWording":{"type":"string","maxLength":2000},"remedialPricingRules":{"type":"array","maxItems":50,"items":{"$ref":"#/components/schemas/RemedialPricingRule"}},"complianceBodyName":{"type":"string","maxLength":120},"complianceBodyRegNumber":{"type":"string","maxLength":60},"maxZsBasisPct":{"type":"integer","enum":[80,100]}}},"ImportEntity":{"type":"string","enum":["customers","sites","suppliers","materials","users","rates","jobs","assets","quotes","invoices","certificates"]},"ImportSourceProfile":{"type":"string","enum":["common","curcle","contacts","schedules","equipment"]},"ImportFileFormat":{"type":"string","enum":["csv","xlsx"]},"ImportColumnDefinition":{"type":"object","required":["key","label"],"properties":{"key":{"type":"string"},"label":{"type":"string"},"required":{"type":"boolean"},"example":{"type":"string"},"notes":{"type":"string"},"format":{"type":"string","enum":["email","role","password","date"]}}},"ImportFileInspectionInput":{"type":"object","required":["format","content"],"properties":{"format":{"$ref":"#/components/schemas/ImportFileFormat"},"content":{"type":"string","minLength":1,"description":"CSV raw text or XLSX base64 content."},"fileName":{"type":"string"},"entityHint":{"oneOf":[{"$ref":"#/components/schemas/ImportEntity"},{"type":"null"}]},"sourceProfile":{"$ref":"#/components/schemas/ImportSourceProfile"}}},"ImportValidationIssue":{"type":"object","required":["code","path","message"],"properties":{"code":{"type":"string"},"path":{"type":"array","items":{"oneOf":[{"type":"string"},{"type":"integer"}]}},"message":{"type":"string"}},"additionalProperties":true},"ImportFileInspectionError":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"details":{"type":"array","description":"Zod validation issues, included for structurally invalid JSON input.","items":{"$ref":"#/components/schemas/ImportValidationIssue"}}}},"ImportUncertainColumn":{"type":"object","required":["sourceColumn","candidates","reason"],"properties":{"sourceColumn":{"type":"string"},"candidates":{"type":"array","items":{"type":"string"}},"reason":{"type":"string"}}},"ImportDeterministicColumnMatch":{"type":"object","required":["entity","mapping","matchedRequired","totalRequired","matchedColumns","score","uncertainColumns"],"properties":{"entity":{"$ref":"#/components/schemas/ImportEntity"},"mapping":{"type":"object","description":"Source heading to canonical field key; unmatched headings use the sentinel __none__.","additionalProperties":{"type":"string"}},"matchedRequired":{"type":"integer","minimum":0},"totalRequired":{"type":"integer","minimum":0},"matchedColumns":{"type":"integer","minimum":0},"score":{"type":"number","minimum":0,"maximum":1},"uncertainColumns":{"type":"array","items":{"$ref":"#/components/schemas/ImportUncertainColumn"}}}},"ImportEntityTemplate":{"type":"object","required":["key","label","fields"],"properties":{"key":{"$ref":"#/components/schemas/ImportEntity"},"label":{"type":"string"},"fields":{"type":"array","items":{"$ref":"#/components/schemas/ImportColumnDefinition"}}}},"ImportSourceProfilePreset":{"type":"object","required":["key","label"],"properties":{"key":{"$ref":"#/components/schemas/ImportSourceProfile"},"label":{"type":"string"}}},"ImportFileInspection":{"type":"object","required":["headers","total","matches","suggestedEntity","presets","entities"],"properties":{"headers":{"type":"array","items":{"type":"string"}},"total":{"type":"integer","minimum":1,"maximum":5000},"matches":{"type":"array","description":"One deterministic header-matching result per canonical import entity, ranked by score descending.","items":{"$ref":"#/components/schemas/ImportDeterministicColumnMatch"}},"suggestedEntity":{"oneOf":[{"$ref":"#/components/schemas/ImportEntity"},{"type":"null"}]},"presets":{"type":"array","items":{"$ref":"#/components/schemas/ImportSourceProfilePreset"}},"entities":{"type":"array","items":{"$ref":"#/components/schemas/ImportEntityTemplate"}}}},"ImportRowError":{"type":"object","required":["row","message"],"properties":{"row":{"type":"integer","minimum":1,"description":"One-based source row number."},"field":{"type":"string"},"message":{"type":"string"}}},"ImportQualityIssue":{"type":"object","required":["id","severity","title","detail","count","rows"],"properties":{"id":{"type":"string"},"severity":{"type":"string","enum":["critical","warning","suggestion"]},"title":{"type":"string"},"detail":{"type":"string"},"count":{"type":"integer","minimum":0},"rows":{"type":"array","maxItems":100,"items":{"type":"integer","minimum":1}}}},"ImportQualityDimension":{"type":"object","required":["key","label","applicable","score","detail"],"properties":{"key":{"type":"string"},"label":{"type":"string"},"applicable":{"type":"boolean"},"score":{"type":"number","minimum":0,"maximum":100},"detail":{"type":"string"}}},"ImportQualityScore":{"type":"object","required":["entity","entityLabel","overall","total","readyRows","reviewRows","criticalRows","dimensions","issues","criticalCount","warningCount","suggestionCount","summary"],"properties":{"entity":{"$ref":"#/components/schemas/ImportEntity"},"entityLabel":{"type":"string"},"overall":{"type":"number","minimum":0,"maximum":100},"total":{"type":"integer","minimum":0},"readyRows":{"type":"integer","minimum":0},"reviewRows":{"type":"integer","minimum":0},"criticalRows":{"type":"integer","minimum":0},"dimensions":{"type":"array","items":{"$ref":"#/components/schemas/ImportQualityDimension"}},"issues":{"type":"array","items":{"$ref":"#/components/schemas/ImportQualityIssue"}},"criticalCount":{"type":"integer","minimum":0},"warningCount":{"type":"integer","minimum":0},"suggestionCount":{"type":"integer","minimum":0},"summary":{"type":"string"}}},"ImportMismatchHint":{"type":"object","required":["suggested","suggestedLabel","activeMatches","suggestedMatches"],"properties":{"suggested":{"$ref":"#/components/schemas/ImportEntity"},"suggestedLabel":{"type":"string"},"activeMatches":{"type":"integer","minimum":0},"suggestedMatches":{"type":"integer","minimum":0}}},"BulkImportPreviewRow":{"type":"object","required":["index","data","errors"],"properties":{"index":{"type":"integer","minimum":0,"description":"Zero-based source row index."},"data":{"type":"object","additionalProperties":{"type":"string"}},"errors":{"type":"array","items":{"$ref":"#/components/schemas/ImportRowError"}},"willSkipReason":{"type":"string"},"materialFill":{"type":"object","required":["fingerprint","changes"],"properties":{"fingerprint":{"type":"string","pattern":"^[a-f0-9]{64}$"},"changes":{"type":"array","items":{"$ref":"#/components/schemas/MaterialFillChange"}}}}}},"MaterialFillChange":{"type":"object","required":["table","field","before","after"],"properties":{"table":{"type":"string","enum":["materials","supplier_price_list"]},"field":{"type":"string"},"before":{},"after":{}}},"ImportMappingArchiveInput":{"type":"object","additionalProperties":false,"required":["archived"],"properties":{"archived":{"type":"boolean"}}},"ImportCorrectionReference":{"type":"object","additionalProperties":false,"required":["draftId","fileKey"],"properties":{"draftId":{"type":"integer","minimum":1},"fileKey":{"type":"string","minLength":1,"maxLength":150}}},"ImportCorrectionPrepareInput":{"type":"object","additionalProperties":false,"required":["fileKey","format","content"],"properties":{"fileKey":{"type":"string","minLength":1,"maxLength":150},"format":{"$ref":"#/components/schemas/ImportFileFormat"},"content":{"type":"string","minLength":1,"maxLength":73400320}}},"ImportCorrectionFilesInfo":{"type":"object","required":["parentDraftId","expiresAt","files"],"properties":{"parentDraftId":{"type":"integer","minimum":1},"expiresAt":{"type":"string","format":"date-time"},"files":{"type":"array","items":{"type":"object","required":["fileKey","entity","fileName","remaining","resolved"],"properties":{"fileKey":{"type":"string"},"entity":{"$ref":"#/components/schemas/ImportEntity"},"fileName":{"type":"string"},"remaining":{"type":"integer","minimum":0},"resolved":{"type":"integer","minimum":0}}}}}},"ImportCorrectionPrepared":{"type":"object","required":["entity","format","content","fileName","columnMapping","correction"],"properties":{"entity":{"$ref":"#/components/schemas/ImportEntity"},"format":{"type":"string","enum":["csv"]},"content":{"type":"string"},"fileName":{"type":"string"},"columnMapping":{"type":"object","additionalProperties":{"type":"string"}},"correction":{"$ref":"#/components/schemas/ImportCorrectionReference"}}},"ImportTrialForecast":{"type":"object","required":["noWrite","checkedAt","sourceRows","wouldCreate","wouldAddContacts","existing","held","excluded","blank"],"properties":{"noWrite":{"type":"boolean","enum":[true]},"checkedAt":{"type":"string","format":"date-time"},"sourceRows":{"type":"integer","minimum":0},"wouldCreate":{"type":"integer","minimum":0},"wouldUpdate":{"type":"integer","minimum":0,"description":"Existing parts whose missing details would be filled; never new materials."},"wouldAddContacts":{"type":"integer","minimum":0},"existing":{"type":"integer","minimum":0},"held":{"type":"integer","minimum":0},"excluded":{"type":"integer","minimum":0},"blank":{"type":"integer","minimum":0}}},"BulkImportPreview":{"type":"object","required":["total","validCount","errorCount","rows","errors","template","mismatchHint","qualityScore"],"properties":{"total":{"type":"integer","minimum":0},"validCount":{"type":"integer","minimum":0},"errorCount":{"type":"integer","minimum":0},"rows":{"type":"array","items":{"$ref":"#/components/schemas/BulkImportPreviewRow"}},"errors":{"type":"array","items":{"$ref":"#/components/schemas/ImportRowError"}},"template":{"type":"array","items":{"$ref":"#/components/schemas/ImportColumnDefinition"}},"mismatchHint":{"oneOf":[{"$ref":"#/components/schemas/ImportMismatchHint"},{"type":"null"}]},"qualityScore":{"$ref":"#/components/schemas/ImportQualityScore"},"trialRun":{"$ref":"#/components/schemas/ImportTrialForecast"}}},"BulkImportFileInput":{"type":"object","required":["entity","format","content"],"properties":{"entity":{"$ref":"#/components/schemas/ImportEntity"},"format":{"$ref":"#/components/schemas/ImportFileFormat"},"content":{"type":"string","minLength":1,"description":"CSV raw text or XLSX base64 content."},"fileName":{"type":"string"},"columnMapping":{"type":"object","additionalProperties":{"type":"string"}},"rowEdits":{"type":"object","description":"Zero-based row index string to canonical field key to replacement value.","additionalProperties":{"type":"object","additionalProperties":{"type":"string"}}},"excludeIndexes":{"type":"array","description":"Zero-based row indexes excluded from duplicate checks and import.","items":{"type":"integer","minimum":0}}}},"BulkImportPreviewInput":{"allOf":[{"$ref":"#/components/schemas/BulkImportFileInput"},{"type":"object","properties":{"correction":{"$ref":"#/components/schemas/ImportCorrectionReference"},"fillMissingMaterials":{"type":"boolean","description":"Single-file materials repair-only mode. Requires unique active same-company SKU/supplier and matching costs. No new materials or existing price overwrites."}}}],"description":"One-file preview request. excludeIndexes may be supplied to mark rows excluded."},"BulkImportApplyInput":{"allOf":[{"$ref":"#/components/schemas/BulkImportFileInput"},{"type":"object","properties":{"correction":{"$ref":"#/components/schemas/ImportCorrectionReference"}}}],"type":"object","properties":{"includeIndexes":{"type":"array","description":"Optional zero-based parsed row indexes to include; if omitted all eligible rows are included.","items":{"type":"integer","minimum":0}},"draftId":{"type":"integer","minimum":1},"acceptCritical":{"type":"boolean"},"fillMissingMaterials":{"type":"boolean"},"materialFillApproval":{"type":"object","description":"Zero-based source indexes to fingerprints from the reviewed preview. Missing or stale approval holds a repair row without writing it.","additionalProperties":{"type":"string","pattern":"^[a-f0-9]{64}$"}}}},"BulkImportRowOutcome":{"type":"object","required":["row","status"],"properties":{"row":{"type":"integer","minimum":1,"description":"One-based source row number."},"status":{"type":"string","enum":["added","updated","duplicate","excluded","problem"]},"message":{"type":"string"},"recordId":{"type":"integer","minimum":1},"entity":{"$ref":"#/components/schemas/ImportEntity"},"href":{"type":"string"},"changes":{"type":"array","items":{"$ref":"#/components/schemas/MaterialFillChange"}}}},"BulkImportApplyResult":{"type":"object","required":["operationId","batchId","inserted","skipped","errors","total","rowOutcomes"],"properties":{"correction":{"$ref":"#/components/schemas/ImportCorrectionReference"},"operationId":{"type":"string","format":"uuid"},"batchId":{"type":"integer","minimum":1},"inserted":{"type":"integer","minimum":0},"updated":{"type":"integer","minimum":0,"description":"Existing records updated; not included in inserted or skipped."},"skipped":{"type":"integer","minimum":0},"errors":{"type":"array","items":{"$ref":"#/components/schemas/ImportRowError"}},"total":{"type":"integer","minimum":0},"rowOutcomes":{"type":"array","items":{"$ref":"#/components/schemas/BulkImportRowOutcome"}},"draftWarning":{"type":"string"}}},"BulkImportApplyFailure":{"type":"object","required":["error","inserted","skipped","errors"],"properties":{"error":{"type":"string"},"inserted":{"type":"integer","enum":[0]},"skipped":{"type":"integer","enum":[0]},"errors":{"type":"array","items":{"$ref":"#/components/schemas/ImportRowError"}}}},"BulkImportCriticalConflict":{"type":"object","required":["error","qualityScore"],"properties":{"error":{"type":"string"},"qualityScore":{"$ref":"#/components/schemas/ImportQualityScore"}}},"MultiBulkImportFileInput":{"type":"object","required":["entity","format","content"],"properties":{"entity":{"$ref":"#/components/schemas/ImportEntity"},"format":{"$ref":"#/components/schemas/ImportFileFormat"},"content":{"type":"string","minLength":1,"description":"CSV raw text or XLSX base64 content."},"fileName":{"type":"string"},"uploadId":{"type":"string","maxLength":150},"columnMapping":{"type":"object","additionalProperties":{"type":"string"}},"rowEdits":{"type":"object","description":"Zero-based row index string to canonical field key to replacement value.","additionalProperties":{"type":"object","additionalProperties":{"type":"string"}}},"excludeIndexes":{"type":"array","description":"Zero-based row indexes excluded from duplicate checks and import.","items":{"type":"integer","minimum":0}}}},"MultiBulkImportInput":{"type":"object","required":["files"],"properties":{"files":{"type":"array","minItems":1,"maxItems":20,"items":{"$ref":"#/components/schemas/MultiBulkImportFileInput"}}}},"MultiBulkImportApplyInput":{"allOf":[{"$ref":"#/components/schemas/MultiBulkImportInput"}],"type":"object","properties":{"acceptCritical":{"type":"boolean"},"draftId":{"type":"integer","minimum":1}}},"MultiBulkImportPreviewFile":{"type":"object","required":["entity","entityLabel","preview"],"properties":{"entity":{"$ref":"#/components/schemas/ImportEntity"},"entityLabel":{"type":"string"},"fileName":{"type":"string"},"uploadId":{"type":"string"},"preview":{"$ref":"#/components/schemas/BulkImportPreview"}}},"MultiBulkImportPreview":{"type":"object","required":["files","order","criticalCount"],"properties":{"files":{"type":"array","items":{"$ref":"#/components/schemas/MultiBulkImportPreviewFile"}},"order":{"type":"array","items":{"$ref":"#/components/schemas/ImportEntity"}},"criticalCount":{"type":"integer","minimum":0}}},"MultiBulkImportCriticalFile":{"type":"object","required":["entity","entityLabel","qualityScore"],"properties":{"entity":{"$ref":"#/components/schemas/ImportEntity"},"entityLabel":{"type":"string"},"fileName":{"type":"string"},"uploadId":{"type":"string"},"qualityScore":{"$ref":"#/components/schemas/ImportQualityScore"}}},"MultiBulkImportCriticalConflict":{"type":"object","required":["error","files"],"properties":{"error":{"type":"string"},"files":{"type":"array","items":{"$ref":"#/components/schemas/MultiBulkImportCriticalFile"}}}},"MultiBulkImportFileResult":{"type":"object","required":["entity","entityLabel","inserted","skipped","errors","rowOutcomes"],"properties":{"entity":{"$ref":"#/components/schemas/ImportEntity"},"entityLabel":{"type":"string"},"fileName":{"type":"string"},"uploadId":{"type":"string"},"inserted":{"type":"integer","minimum":0},"skipped":{"type":"integer","minimum":0},"errors":{"type":"array","items":{"$ref":"#/components/schemas/ImportRowError"}},"rowOutcomes":{"type":"array","items":{"$ref":"#/components/schemas/BulkImportRowOutcome"}},"batchId":{"type":"integer","minimum":1}}},"MultiBulkImportApplyResult":{"type":"object","required":["operationId","bundleKey","batchIds","results","totalInserted","totalSkipped"],"properties":{"operationId":{"type":"string","format":"uuid"},"bundleKey":{"type":"string","format":"uuid"},"batchIds":{"type":"array","items":{"type":"integer","minimum":1}},"results":{"type":"array","items":{"$ref":"#/components/schemas/MultiBulkImportFileResult"}},"totalInserted":{"type":"integer","minimum":0},"totalSkipped":{"type":"integer","minimum":0},"draftWarning":{"type":"string"}}},"BulkImportHistoryEntry":{"type":"object","required":["id","entity","entityLabel","fileName","bundleKey","totalRows","inserted","skipped","failed","qualityScore","acceptedCritical","errors","undoable","createdByName","createdAt"],"properties":{"id":{"type":"integer","minimum":1},"entity":{"type":"string","description":"Entity identifier persisted on the import batch."},"entityLabel":{"type":"string"},"fileName":{"type":["string","null"]},"bundleKey":{"type":["string","null"]},"totalRows":{"type":"integer","minimum":0},"inserted":{"type":"integer","minimum":0},"updated":{"type":"integer","minimum":0},"skipped":{"type":"integer","minimum":0},"failed":{"type":"integer","minimum":0},"qualityScore":{"type":["integer","null"],"minimum":0,"maximum":100},"acceptedCritical":{"type":"integer","minimum":0},"errors":{"type":"array","items":{"$ref":"#/components/schemas/ImportRowError"}},"undoable":{"type":"boolean","description":"True only when a valid version-1 provenance manifest is stored."},"createdByName":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"}}},"ImportReferenceField":{"type":"object","required":["field","label","required"],"properties":{"field":{"type":"string"},"label":{"type":"string"},"required":{"type":"boolean"}}},"BulkImportTemplates":{"type":"object","required":["customers","sites","suppliers","materials","users","rates","jobs","assets","quotes","invoices","certificates"],"properties":{"customers":{"type":"array","items":{"$ref":"#/components/schemas/ImportColumnDefinition"}},"sites":{"type":"array","items":{"$ref":"#/components/schemas/ImportColumnDefinition"}},"suppliers":{"type":"array","items":{"$ref":"#/components/schemas/ImportColumnDefinition"}},"materials":{"type":"array","items":{"$ref":"#/components/schemas/ImportColumnDefinition"}},"users":{"type":"array","items":{"$ref":"#/components/schemas/ImportColumnDefinition"}},"rates":{"type":"array","items":{"$ref":"#/components/schemas/ImportColumnDefinition"}},"jobs":{"type":"array","items":{"$ref":"#/components/schemas/ImportColumnDefinition"}},"assets":{"type":"array","items":{"$ref":"#/components/schemas/ImportColumnDefinition"}},"quotes":{"type":"array","items":{"$ref":"#/components/schemas/ImportColumnDefinition"}},"invoices":{"type":"array","items":{"$ref":"#/components/schemas/ImportColumnDefinition"}},"certificates":{"type":"array","items":{"$ref":"#/components/schemas/ImportColumnDefinition"}}}},"BulkImportDependencyOrder":{"type":"object","required":["order","labels","references"],"properties":{"order":{"type":"array","items":{"$ref":"#/components/schemas/ImportEntity"}},"labels":{"type":"object","required":["customers","sites","suppliers","materials","users","rates","jobs","assets","quotes","invoices","certificates"],"properties":{"customers":{"type":"string"},"sites":{"type":"string"},"suppliers":{"type":"string"},"materials":{"type":"string"},"users":{"type":"string"},"rates":{"type":"string"},"jobs":{"type":"string"},"assets":{"type":"string"},"quotes":{"type":"string"},"invoices":{"type":"string"},"certificates":{"type":"string"}}},"references":{"type":"object","required":["customers","sites","suppliers","materials","users","rates","jobs","assets","quotes","invoices","certificates"],"properties":{"customers":{"type":"array","items":{"$ref":"#/components/schemas/ImportReferenceField"}},"sites":{"type":"array","items":{"$ref":"#/components/schemas/ImportReferenceField"}},"suppliers":{"type":"array","items":{"$ref":"#/components/schemas/ImportReferenceField"}},"materials":{"type":"array","items":{"$ref":"#/components/schemas/ImportReferenceField"}},"users":{"type":"array","items":{"$ref":"#/components/schemas/ImportReferenceField"}},"rates":{"type":"array","items":{"$ref":"#/components/schemas/ImportReferenceField"}},"jobs":{"type":"array","items":{"$ref":"#/components/schemas/ImportReferenceField"}},"assets":{"type":"array","items":{"$ref":"#/components/schemas/ImportReferenceField"}},"quotes":{"type":"array","items":{"$ref":"#/components/schemas/ImportReferenceField"}},"invoices":{"type":"array","items":{"$ref":"#/components/schemas/ImportReferenceField"}},"certificates":{"type":"array","items":{"$ref":"#/components/schemas/ImportReferenceField"}}}}}},"ImportUndoRecord":{"type":"object","required":["entity","table","recordId","sourceRow","status","reasons"],"properties":{"entity":{"type":"string"},"table":{"type":"string"},"recordId":{"type":"integer","minimum":1},"sourceRow":{"type":"integer","minimum":1},"status":{"type":"string","enum":["eligible","protected","absent","removed","restored"]},"action":{"type":"string","enum":["delete","restore"]},"reasons":{"type":"array","items":{"type":"string"}}}},"ImportUndoBatchScope":{"type":"object","required":["batchId"],"properties":{"batchId":{"type":"integer","minimum":1}}},"ImportUndoBundleScope":{"type":"object","required":["bundleKey"],"properties":{"bundleKey":{"type":"string","minLength":1,"maxLength":150}}},"ImportUndoScope":{"oneOf":[{"$ref":"#/components/schemas/ImportUndoBatchScope"},{"$ref":"#/components/schemas/ImportUndoBundleScope"}]},"ImportUndoAssessment":{"type":"object","required":["scope","batchIds","bundleKey","undoable","removed","eligible","protected","records","applied"],"properties":{"scope":{"$ref":"#/components/schemas/ImportUndoScope"},"batchIds":{"type":"array","items":{"type":"integer","minimum":1}},"bundleKey":{"type":["string","null"]},"undoable":{"type":"boolean"},"removed":{"type":"integer","minimum":0},"eligible":{"type":"integer","minimum":0,"description":"Count of safe deletions plus field restorations in this pass."},"eligibleDeletions":{"type":"integer","minimum":0},"eligibleRestorations":{"type":"integer","minimum":0},"restored":{"type":"integer","minimum":0},"protected":{"type":"integer","minimum":0},"records":{"type":"array","items":{"$ref":"#/components/schemas/ImportUndoRecord"}},"applied":{"type":"boolean"}}},"ImportUndoPreview":{"allOf":[{"$ref":"#/components/schemas/ImportUndoAssessment"},{"type":"object","properties":{"applied":{"type":"boolean","enum":[false]}}}]},"ImportUndoResult":{"allOf":[{"$ref":"#/components/schemas/ImportUndoAssessment"},{"type":"object","properties":{"applied":{"type":"boolean","enum":[true]}}}]},"ImportUndoConflict":{"allOf":[{"$ref":"#/components/schemas/ImportUndoResult"},{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}]},"ImportUndoConfirmation":{"type":"object","required":["confirm"],"properties":{"confirm":{"type":"boolean","enum":[true]}}},"ImportDraftMode":{"type":"string","enum":["single","bundle"]},"ImportDraftStage":{"type":"string","enum":["map","preview"]},"ImportOperationStatus":{"type":"string","enum":["checking","importing","completed","failed","interrupted"]},"ImportOperationPhase":{"type":["string","null"],"enum":["checking","importing",null]},"ImportDraftStatus":{"type":"string","enum":["draft","checking","importing","completed","failed","interrupted"]},"ImportDraftUploadInput":{"type":"object","required":["size"],"properties":{"size":{"type":"integer","minimum":1,"maximum":52428800,"description":"Exact expected uploaded byte count. Maximum 50 MiB (52,428,800 bytes)."}}},"ImportDraftUploadUrl":{"type":"object","required":["uploadURL","objectPath"],"properties":{"uploadURL":{"type":"string","format":"uri"},"objectPath":{"type":"string"}}},"ImportDraftContent":{"type":"object","required":["version","flowId","startedAt","hadRepair","state"],"description":"Versioned importer state stored as an immutable private object, not a raw database row.","properties":{"version":{"type":"integer","minimum":1},"flowId":{"type":"string","minLength":1,"maxLength":200},"startedAt":{"type":"number","description":"Unix timestamp in milliseconds."},"hadRepair":{"type":"boolean"},"state":{"type":"object","description":"Arbitrary importer state for the stated version; its fields are defined by the client importer flow, not the database.","additionalProperties":true}}},"ImportDraftOperationSummary":{"type":"object","required":["operationId","status","phase","processed","total"],"properties":{"operationId":{"type":"string","format":"uuid"},"status":{"$ref":"#/components/schemas/ImportOperationStatus"},"phase":{"$ref":"#/components/schemas/ImportOperationPhase"},"processed":{"type":"integer","minimum":0},"total":{"type":"integer","minimum":0},"result":{"oneOf":[{"$ref":"#/components/schemas/BulkImportApplyResult"},{"$ref":"#/components/schemas/MultiBulkImportApplyResult"}]},"error":{"type":"string"}}},"ImportOperation":{"type":"object","required":["operationId","status","phase","processed","total"],"properties":{"operationId":{"type":"string","format":"uuid"},"draftId":{"type":"integer","minimum":1},"status":{"$ref":"#/components/schemas/ImportOperationStatus"},"phase":{"$ref":"#/components/schemas/ImportOperationPhase"},"processed":{"type":"integer","minimum":0},"total":{"type":"integer","minimum":0},"result":{"oneOf":[{"$ref":"#/components/schemas/BulkImportApplyResult"},{"$ref":"#/components/schemas/MultiBulkImportApplyResult"}]},"error":{"type":"string"}}},"ImportOperationResponse":{"type":"object","required":["operation"],"properties":{"operation":{"$ref":"#/components/schemas/ImportOperation"}}},"ImportDraft":{"type":"object","required":["id","revision","mode","stage","label","status","processed","total","updatedAt","expiresAt"],"properties":{"id":{"type":"integer","minimum":1},"revision":{"type":"integer","minimum":1},"mode":{"$ref":"#/components/schemas/ImportDraftMode"},"stage":{"$ref":"#/components/schemas/ImportDraftStage"},"label":{"type":["string","null"],"maxLength":200},"status":{"$ref":"#/components/schemas/ImportDraftStatus"},"processed":{"type":"integer","minimum":0},"total":{"type":"integer","minimum":0},"result":{"oneOf":[{"$ref":"#/components/schemas/BulkImportApplyResult"},{"$ref":"#/components/schemas/MultiBulkImportApplyResult"}]},"error":{"type":"string"},"operation":{"$ref":"#/components/schemas/ImportDraftOperationSummary"},"updatedAt":{"type":"string","format":"date-time"},"expiresAt":{"type":"string","format":"date-time"}}},"ImportDraftInput":{"type":"object","required":["objectPath","mode","stage"],"properties":{"objectPath":{"type":"string","minLength":1,"maxLength":1024},"mode":{"$ref":"#/components/schemas/ImportDraftMode"},"stage":{"$ref":"#/components/schemas/ImportDraftStage"},"label":{"type":"string","maxLength":200}}},"ImportDraftUpdate":{"allOf":[{"$ref":"#/components/schemas/ImportDraftInput"}],"type":"object","required":["revision"],"properties":{"revision":{"type":"integer","minimum":1}}},"ImportDraftResponse":{"type":"object","required":["draft"],"properties":{"draft":{"$ref":"#/components/schemas/ImportDraft"}}},"ImportDraftList":{"type":"object","required":["drafts"],"properties":{"drafts":{"type":"array","items":{"$ref":"#/components/schemas/ImportDraft"}}}},"ImportDraftUpdateResponse":{"type":"object","required":["draft"],"properties":{"draft":{"$ref":"#/components/schemas/ImportDraft"},"warning":{"type":"string"}}},"BuildInformation":{"type":"object","required":["commit","builtAt","dirty","environment"],"properties":{"commit":{"type":["string","null"]},"builtAt":{"type":["string","null"]},"dirty":{"type":["boolean","null"]},"environment":{"type":"string"},"component":{"type":"string","enum":["api","frontend"]},"buildId":{"type":["string","null"]},"sourceFingerprint":{"type":["string","null"]},"sourceDirty":{"type":["boolean","null"]},"schemaVersion":{"type":["object","null"],"properties":{"count":{"type":"integer"},"fingerprint":{"type":"string"}}}}},"JobSchedule":{"type":"object","additionalProperties":false,"required":["scheduledDate","scheduledStartTime","scheduledEndTime"],"properties":{"scheduledDate":{"type":["string","null"],"format":"date"},"scheduledStartTime":{"type":["string","null"],"pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$"},"scheduledEndTime":{"type":["string","null"],"pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$"}}},"JobRescheduleReceipt":{"type":"object","required":["ok","changed","outcome","jobId","requestId","schedule","assignment"],"properties":{"ok":{"type":"boolean"},"changed":{"type":["boolean","null"]},"outcome":{"type":"string","enum":["changed","no_change","legacy_confirmed"]},"jobId":{"type":"integer"},"requestId":{"type":"string","format":"uuid"},"schedule":{"$ref":"#/components/schemas/JobSchedule"},"assignment":{"oneOf":[{"$ref":"#/components/schemas/JobAssignmentSnapshot"},{"type":"null"}]},"idempotentReplay":{"type":"boolean"},"legacyReceipt":{"type":"boolean"},"message":{"type":"string"}}},"JobAssignmentSnapshot":{"type":"object","additionalProperties":false,"required":["assignedUserId","additionalUserIds"],"properties":{"assignedUserId":{"type":["integer","null"],"minimum":1,"multipleOf":1},"additionalUserIds":{"type":"array","maxItems":100,"uniqueItems":true,"items":{"type":"integer","minimum":1,"multipleOf":1}}}},"JobRescheduleInput":{"type":"object","additionalProperties":false,"required":["scheduledDate","scheduledStartTime","scheduledEndTime","reason","requestId"],"properties":{"scheduledDate":{"type":["string","null"],"format":"date"},"scheduledStartTime":{"type":["string","null"],"pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$"},"scheduledEndTime":{"type":["string","null"],"pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$"},"reason":{"type":"string","minLength":1,"maxLength":1000},"requestId":{"type":"string","format":"uuid"},"expectedSchedule":{"$ref":"#/components/schemas/JobSchedule"},"assignedUserId":{"type":["integer","null"],"minimum":1,"multipleOf":1},"additionalUserIds":{"type":"array","maxItems":100,"uniqueItems":true,"items":{"type":"integer","minimum":1,"multipleOf":1}},"expectedAssignment":{"$ref":"#/components/schemas/JobAssignmentSnapshot"}}},"StockConsumptionInput":{"type":"object","additionalProperties":false,"required":["quantity","requestId"],"properties":{"quantity":{"type":"number","exclusiveMinimum":0,"multipleOf":0.01},"requestId":{"type":"string","format":"uuid"}}},"StockCorrectionInput":{"type":"object","additionalProperties":false,"required":["quantity","requestId","reason"],"properties":{"quantity":{"type":"number","exclusiveMinimum":0,"multipleOf":0.01},"requestId":{"type":"string","format":"uuid"},"reason":{"type":"string","minLength":1,"maxLength":1000}}},"StockReservationInput":{"type":"object","additionalProperties":false,"properties":{"reason":{"type":"string","maxLength":1000},"sources":{"type":"array","items":{"$ref":"#/components/schemas/StockReservationSource"}}}},"StockReservationSource":{"type":"object","additionalProperties":false,"required":["requiredPartId","sourceType"],"properties":{"requiredPartId":{"type":"integer","minimum":1,"multipleOf":1},"sourceType":{"type":"string","enum":["engineer","warehouse"]},"sourceUserId":{"type":["integer","null"],"minimum":1,"multipleOf":1},"sourceWarehouseId":{"type":["integer","null"],"minimum":1,"multipleOf":1},"sourceLocationId":{"type":["integer","null"],"minimum":1}}},"WorkforceDemoInput":{"type":"object","additionalProperties":false,"required":["confirm"],"properties":{"confirm":{"type":"boolean","enum":[true]}}},"WorkforceBootstrapInput":{"type":"object","additionalProperties":false,"required":["previewToken"],"properties":{"previewToken":{"type":"string","pattern":"^[a-f0-9]{64}$"},"decisions":{"type":"array","items":{"$ref":"#/components/schemas/WorkforceBootstrapDecision"}}}},"WorkforceBootstrapDecision":{"type":"object","additionalProperties":false,"required":["userId","action"],"properties":{"userId":{"type":"integer","minimum":1,"multipleOf":1},"action":{"type":"string","enum":["create","link","skip"]},"personId":{"type":"integer","minimum":1,"multipleOf":1}}},"WorkforceRollbackInput":{"type":"object","additionalProperties":false,"required":["batchId"],"properties":{"batchId":{"type":"string","format":"uuid"}}},"WorkforceActivationInput":{"type":"object","additionalProperties":false,"required":["token","username","password"],"properties":{"token":{"type":"string","pattern":"^[a-f0-9]{64}$"},"username":{"type":"string","pattern":"^[a-zA-Z0-9_.-]{3,64}$"},"password":{"type":"string","minLength":12,"maxLength":72}}},"WorkforceSectionInput":{"type":"object","additionalProperties":false,"required":["version","data"],"properties":{"version":{"type":"integer","minimum":0,"multipleOf":1},"data":{"type":"object","additionalProperties":true,"description":"Validated again by the authorised private category schema before persistence."}}},"WorkforceVersionInput":{"type":"object","additionalProperties":false,"required":["version"],"properties":{"version":{"type":"integer","minimum":1,"multipleOf":1}}},"WorkforceLeaverApprovalInput":{"type":"object","additionalProperties":false,"required":["version"],"properties":{"version":{"type":"integer","minimum":1,"multipleOf":1},"endAccessNow":{"type":"boolean"}}},"WorkforceSettingsInput":{"type":"object","additionalProperties":false,"required":["settings"],"properties":{"settings":{"$ref":"#/components/schemas/WorkforcePrivacySettings"}}},"WorkforcePrivacySettings":{"type":"object","additionalProperties":false,"properties":{"emergencyRemindersEnabled":{"type":"boolean","default":false},"emergencyConfirmationDays":{"type":"integer","minimum":7,"maximum":730,"default":180},"reminderRepeatDays":{"type":"integer","minimum":1,"maximum":90,"default":30},"documentRetentionDays":{"type":["integer","null"],"minimum":1,"maximum":36500,"default":null},"privacyPurpose":{"type":"string","maxLength":2000,"default":""},"privateRetentionDays":{"$ref":"#/components/schemas/WorkforcePrivateRetention"}}},"WorkforcePrivateRetention":{"type":"object","additionalProperties":false,"properties":{"personal":{"type":["integer","null"],"minimum":0,"maximum":36500,"default":null},"home":{"type":["integer","null"],"minimum":0,"maximum":36500,"default":null},"dob":{"type":["integer","null"],"minimum":0,"maximum":36500,"default":null},"emergency":{"type":["integer","null"],"minimum":0,"maximum":36500,"default":null}}},"WorkforceDocumentUpdate":{"type":"object","additionalProperties":false,"required":["version"],"properties":{"version":{"type":"integer","minimum":1,"multipleOf":1},"retainUntil":{"type":["string","null"],"pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"legalHold":{"type":"boolean"},"archived":{"type":"boolean"},"employeeVisible":{"type":"boolean"}}},"WorkforcePurgeInput":{"type":"object","additionalProperties":false,"required":["version","confirm"],"properties":{"version":{"type":"integer","minimum":1,"multipleOf":1},"confirm":{"type":"boolean","enum":[true]}}},"WorkforceSectionPurgeInput":{"type":"object","additionalProperties":false,"required":["version","confirm"],"properties":{"version":{"type":"integer","minimum":0,"multipleOf":1},"confirm":{"type":"boolean","enum":[true]}}},"WorkforceRetentionHoldInput":{"type":"object","additionalProperties":false,"required":["version","hold"],"properties":{"version":{"type":"integer","minimum":1,"multipleOf":1},"hold":{"type":"boolean"}}}}},"security":[{"bearerAuth":[]}]}