public void UpdateStatus(BookingStatus newStatus, string updatedBy, string cancelReason)
        {
            if (string.IsNullOrEmpty(updatedBy))
            {
                throw new ArgumentNullException(nameof(updatedBy));
            }

            if (newStatus == BookingStatus.Cancelled && string.IsNullOrEmpty(cancelReason))
            {
                throw new ArgumentNullException(nameof(cancelReason));
            }

            var bookingStatusTransition = new BookingStatusTransition();
            var statusChangedEvent      = new StatusChangedEvent(Status, newStatus);

            if (!bookingStatusTransition.IsValid(statusChangedEvent))
            {
                throw new DomainRuleException("BookingStatus", $"Cannot change the booking status from {Status} to {newStatus}");
            }

            Status       = newStatus;
            UpdatedDate  = DateTime.UtcNow;
            UpdatedBy    = updatedBy;
            CancelReason = cancelReason;
            if (newStatus == BookingStatus.Created)
            {
                // Booking confirmed
                ConfirmedBy   = updatedBy;
                ConfirmedDate = DateTime.UtcNow;
            }
        }
Example #2
0
 public bool IsValid(StatusChangedEvent statusChangedEvent)
 {
     return(_permissibleTransitions.Any(x => x.Key == statusChangedEvent.CurrentStatus && x.Value == statusChangedEvent.NewStatus));
 }