mirror of
https://github.com/Sea-Haven-Industries/shoc-backend.git
synced 2026-09-30 17:43:12 +00:00
Editing a work order's POC never reached the backend: no update path wrote
PocName/PocPhone/PocNotes, so the optimistic UI edit was lost on refetch and
the completion freeze captured the Site contact instead of the manual value,
and nothing was audited.
- Add tenant-scoped PATCH api/workorders/{id}/poc via new WorkOrderPocService
+ WorkOrderPocDataService: persists the override, stages FieldChanged audit
entries (which also write field locks so sync never overwrites a manual POC),
and enforces row-version concurrency and terminal-status read-only rules.
- Lock semantics (SH-190): a manual POC away from the Site's live contacts is
stored WO-level; an edit equal to a live Site contact (or blanking name+phone)
stores nothing so the WO follows the Site. PocCustomized exposes the state.
- Board projection, completion freeze and create now share one Site-contact
fallback (first non-deleted contact by SiteContactOrder) so a never-overridden
WO keeps following the Site, including at create when the wizard prefills it.
- Route contract baseline gains PATCH {id:int}/poc.
28 lines
1 KiB
C#
28 lines
1 KiB
C#
using Data.SeaHavenIndustries;
|
|
|
|
namespace SeaHaven.DataServices.Interfaces
|
|
{
|
|
/// <summary>
|
|
/// SH-379: data access for the work-order-level POC override.
|
|
/// </summary>
|
|
public interface IWorkOrderPocDataService
|
|
{
|
|
/// <summary>
|
|
/// SH-221 account-scoped tracked load for POC updates. Includes the site's
|
|
/// contacts and the linked WorkOrderContacts POC. Null when the work order
|
|
/// does not exist or is outside the caller's account scope.
|
|
/// </summary>
|
|
Task<WorkOrder?> GetTrackedWorkOrderAsync(
|
|
int workOrderId,
|
|
int? accountId,
|
|
CancellationToken cancellationToken);
|
|
|
|
/// <summary>
|
|
/// The site's live contacts for a location ordered by SiteContactOrder then Id.
|
|
/// Deleted contacts are excluded. Empty when the location has none.
|
|
/// </summary>
|
|
Task<IReadOnlyList<Contacts>> GetSiteContactsAsync(
|
|
int? locationId,
|
|
CancellationToken cancellationToken);
|
|
}
|
|
}
|