From 07796b05c8615908f8c883bdd8d02aaab513f74f Mon Sep 17 00:00:00 2001 From: Scott Pouliot Date: Tue, 19 May 2026 16:03:58 -0400 Subject: [PATCH] Clear ReminderSentAt when appointment is rescheduled Edit POST now detects if ScheduledStartTime changed (via previousStart comparison after AutoMapper merge) and nulls ReminderSentAt so the background service will fire the reminder again at the new time. Calendar drag-drop (UpdateEventTime) always clears ReminderSentAt since rescheduling is its only purpose. Co-Authored-By: Claude Sonnet 4.6 --- .../Controllers/AppointmentsController.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/PowderCoating.Web/Controllers/AppointmentsController.cs b/src/PowderCoating.Web/Controllers/AppointmentsController.cs index 9418f0a..bfefd92 100644 --- a/src/PowderCoating.Web/Controllers/AppointmentsController.cs +++ b/src/PowderCoating.Web/Controllers/AppointmentsController.cs @@ -381,9 +381,15 @@ public class AppointmentsController : Controller return View(dto); } - // Map changes + // Map changes — capture old start before overwrite so we can detect a reschedule. + var previousStart = appointment.ScheduledStartTime; _mapper.Map(dto, appointment); + // If the appointment was rescheduled, clear the reminder stamp so the background + // service will fire again at the new time. + if (appointment.ScheduledStartTime != previousStart) + appointment.ReminderSentAt = null; + // Update await _unitOfWork.Appointments.UpdateAsync(appointment); await _unitOfWork.CompleteAsync(); @@ -725,6 +731,8 @@ public class AppointmentsController : Controller var duration = appointment.ScheduledEndTime - appointment.ScheduledStartTime; appointment.ScheduledStartTime = start; appointment.ScheduledEndTime = end; + // Drag-drop always changes the time — reset so the reminder fires at the new time. + appointment.ReminderSentAt = null; await _unitOfWork.Appointments.UpdateAsync(appointment); await _unitOfWork.CompleteAsync();