shoc-backend/SeaHaven.DataServices/Implementation
Alexandre Brandizzi 9ef2512e14 fix(vendor-roster): conflict on colliding rename, reject no-op company update (SH-250)
Two review findings on the additive PATCH path:

- AddTechniciansAsync can rename via CompanyFields.Name and write NormalizedName
  against the unique index, but the save had no guard. A colliding rename
  surfaced as an unhandled 500 from the PATCH action instead of a stable client
  conflict. Pre-check the normalized name against other live companies and throw
  VendorRosterDuplicateNameException, with a scoped catch around the save for the
  race where a competing rename commits in between. The controller maps it to a
  409 alongside the existing concurrency conflict.
- Empty-payload validation only rejected a null CompanyFields, so an all-blank
  CompanyFields object was forwarded as a company update, bumping RowVersion and
  rewriting every technician's LastModificationTime without changing any company
  data. Blank fields now collapse to no company change, and a request with
  neither technicians nor a real company value fails validation.
2026-08-18 17:33:16 -03:00
..
AccountDataService.cs fix(work-orders): apply account scope across create and reads [SH-221] 2026-08-11 10:45:37 -03:00
AssetDataService.cs backend architectural template 2026-05-06 10:49:33 -05:00
CalendarDataService.cs refactor: enforce backend boundaries and optimize dispatch (#30) 2026-07-24 17:35:34 -03:00
CategoryDataService.cs refactor 2026-04-28 18:55:14 -05:00
CommentDataService.cs fix(work-orders): scope legacy GET GetComments by account [SH-221] 2026-08-11 15:18:29 -03:00
CommonDataService.cs refactor: enforce backend boundaries and optimize dispatch (#30) 2026-07-24 17:35:34 -03:00
CompletionDocTemplateDataService.cs feat(work-orders): add Phase 6 slide-over detail comments audit and media API 2026-07-13 13:13:00 -03:00
ContactDataService.cs backend architectural template 2026-05-06 10:49:33 -05:00
DashboardDataService.cs refactor: enforce backend boundaries and optimize dispatch (#30) 2026-07-24 17:35:34 -03:00
DispatchDataService.cs refactor: enforce backend boundaries and optimize dispatch (#30) 2026-07-24 17:35:34 -03:00
DropdownOptionsDataService.cs refactor: enforce backend boundaries and optimize dispatch (#30) 2026-07-24 17:35:34 -03:00
EmployeeDataService.cs backend architectural template 2026-05-06 10:49:33 -05:00
FollowUpDataService.cs refactor: enforce backend boundaries and optimize dispatch (#30) 2026-07-24 17:35:34 -03:00
ForgetPasswordDataService.cs refactor: enforce backend boundaries and optimize dispatch (#30) 2026-07-24 17:35:34 -03:00
LocationDataService.cs refactor: enforce backend boundaries and optimize dispatch (#30) 2026-07-24 17:35:34 -03:00
PMScheduleDataService.cs backend architectural template 2026-05-06 10:49:33 -05:00
QuotesDataService.cs refactor: enforce backend boundaries and optimize dispatch (#30) 2026-07-24 17:35:34 -03:00
SettingsDataService.cs refactor: enforce backend boundaries and optimize dispatch (#30) 2026-07-24 17:35:34 -03:00
SyncDataService.cs refactor: enforce backend boundaries and optimize dispatch (#30) 2026-07-24 17:35:34 -03:00
TaskListTemplateDataService.cs refactor: enforce backend boundaries and optimize dispatch (#30) 2026-07-24 17:35:34 -03:00
UpliftDataService.cs feat(uplifts): complete SH-101 approval lifecycle 2026-08-11 08:58:19 -03:00
UserDataService.cs refactor: enforce backend boundaries and optimize dispatch (#30) 2026-07-24 17:35:34 -03:00
VendorCompanyRosterDataService.cs fix(vendor-roster): conflict on colliding rename, reject no-op company update (SH-250) 2026-08-18 17:33:16 -03:00
VendorDataService.cs feat(vendors): add company roster management (SH-198) (#48) 2026-08-03 17:53:24 -03:00
VendorDocumentDataService.cs feat(uplifts): complete SH-101 approval lifecycle 2026-08-11 08:58:19 -03:00
VendorOperationsDataService.cs refactor: enforce backend boundaries and optimize dispatch (#30) 2026-07-24 17:35:34 -03:00
WorkOrderAdvancedSearchDataService.cs feat(work-orders): board search facets for SH-121/SH-196 2026-08-13 16:34:21 -03:00
WorkOrderAuditDataService.cs refactor: enforce backend boundaries and optimize dispatch (#30) 2026-07-24 17:35:34 -03:00
WorkOrderBoardDataService.cs feat(work-orders): expose pendingUpliftCount on board rows (SH-188) 2026-08-12 09:43:10 -03:00
WorkOrderBoardMutationDataService.cs refactor: enforce backend boundaries and optimize dispatch (#30) 2026-07-24 17:35:34 -03:00
WorkOrderCompletionDataService.cs fix(work-orders): scope comments and completion-doc by account [SH-221] 2026-08-11 14:52:02 -03:00
WorkOrderDataService.cs fix(work-orders): scope legacy list/detail GETs by account [SH-221] 2026-08-11 11:57:37 -03:00
WorkOrderDetailDataService.cs !fix(work-orders): fail-closed media account scope with org_scope claim [SH-221] 2026-08-06 10:26:04 -03:00
WorkOrderDomainJobDataService.cs fix(work-orders): derive Past Due from DueDate instead of ScheduledDate 2026-08-13 13:28:25 -03:00
WorkOrderFieldLockDataService.cs refactor: enforce backend boundaries and optimize dispatch (#30) 2026-07-24 17:35:34 -03:00
WorkOrderIngestDataService.cs refactor: enforce backend boundaries and optimize dispatch (#30) 2026-07-24 17:35:34 -03:00
WorkOrderMediaDataService.cs !fix(work-orders): fail-closed media account scope with org_scope claim [SH-221] 2026-08-06 10:26:04 -03:00
WorkOrderOpsHealthDataService.cs refactor: enforce backend boundaries and optimize dispatch (#30) 2026-07-24 17:35:34 -03:00
WorkOrderReconciliationDataService.cs feat: complete SH-133 procurement reconciliation 2026-07-24 22:13:25 -03:00
WorkOrderWebhookDataService.cs fix(work-orders): apply account scope across create and reads [SH-221] 2026-08-11 10:45:37 -03:00