Ejemplo n.º 1
0
        public BookingsCommandService(IAggregateStore store, IsRoomAvailable isRoomAvailable, ConvertCurrency convertCurrency) : base(store)
        {
            OnNew <BookingCommands.Book>(
                (booking, cmd) =>
                booking.BookRoom(
                    new BookingId(cmd.BookingId),
                    cmd.GuestId,
                    new RoomId(cmd.RoomId),
                    new StayPeriod(cmd.From, cmd.To),
                    new Money(cmd.Price, cmd.Currency),
                    cmd.BookedBy,
                    cmd.BookedAt,
                    isRoomAvailable
                    )
                );

            OnExisting <BookingCommands.RecordPayment>(
                cmd => new BookingId(cmd.BookingId),
                (booking, cmd) => booking.RecordPayment(
                    new Money(cmd.Amount, cmd.Currency),
                    convertCurrency,
                    cmd.PaidBy,
                    cmd.PaidAt
                    )
                );

            OnExisting <BookingCommands.ApplyDiscount>(
                cmd => new BookingId(cmd.BookingId),
                (booking, cmd) => booking.ApplyDiscount(
                    new Money(cmd.Amount, cmd.Currency),
                    convertCurrency
                    )
                );
        }
Ejemplo n.º 2
0
        public async Task BookRoom(
            BookingId bookingId,
            string guestId,
            RoomId roomId,
            StayPeriod period,
            Money price,
            string bookedBy,
            DateTimeOffset bookedAt,
            IsRoomAvailable isRoomAvailable
            )
        {
            EnsureDoesntExist();
            await EnsureRoomAvailable(roomId, period, isRoomAvailable);

            Apply(
                new RoomBooked(
                    bookingId.Value,
                    roomId.Value,
                    guestId,
                    period.CheckIn,
                    period.CheckOut,
                    price.Amount,
                    price.Currency,
                    bookedBy,
                    bookedAt
                    )
                );
        }
Ejemplo n.º 3
0
        static async Task EnsureRoomAvailable(RoomId roomId, StayPeriod period, IsRoomAvailable isRoomAvailable)
        {
            var roomAvailable = await isRoomAvailable(roomId, period);

            if (!roomAvailable)
            {
                throw new DomainException("Room not available");
            }
        }
Ejemplo n.º 4
0
        public Block Do()
        {
            foreach (var theClass in _block.Classes)
            {
                var isRoomFreeForClass = new IsRoomAvailable(_room, theClass).IsValid();

                if (isRoomFreeForClass)
                {
                    new ClassRoomChanger(_classRepository, theClass, _room)
                    .Do();
                }
            }

            return(_block);
        }