Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
БД_ресторан_5семестр.doc
Скачиваний:
0
Добавлен:
23.01.2026
Размер:
1.76 Mб
Скачать
  1. Процедура «SetOrderWaitingForPayment» для перевода заказа в статус ожидания оплаты

В данной процедуре проверяется, существует ли указанный заказ и имеет ли он статус «Принят». Также, если сумма заказа равна 0 (то есть в него не добавлены никакие позиции), процедура не выполнится.

Запрос:

CREATE PROCEDURE rest.SetOrderWaitingForPayment

@OrderID INT

AS

BEGIN

SET NOCOUNT ON;

IF NOT EXISTS (SELECT 1 FROM rest.Orders WHERE OrderID = @OrderID)

BEGIN

PRINT 'Ошибка: заказ не найден.';

RETURN;

END

DECLARE @CurrentStatus NVARCHAR(20);

SELECT @CurrentStatus = Status FROM rest.Orders WHERE OrderID = @OrderID;

IF @CurrentStatus <> 'Принят'

BEGIN

PRINT 'Заказ не находится в статусе "Принят" и не может быть переведён в "Ожидает оплаты".';

RETURN;

END

DECLARE @TotalAmount DECIMAL(10,2);

SELECT @TotalAmount = rest.ufn_OrderTotal(@OrderID);

UPDATE rest.Orders

SET Status = 'Ожидает оплаты'

WHERE OrderID = @OrderID;

PRINT 'Заказ будет переведён в статус "Ожидает оплаты", если сумма к оплате больше 0.';

PRINT 'Сумма к оплате: ' + CAST(@TotalAmount AS NVARCHAR(20)) + ' руб.';

END;

GO

Примеры использования

  1. Несуществующий заказ

Запрос, в котором применим процедуру к несуществующему заказу:

EXEC rest.SetOrderWaitingForPayment @OrderID = 15;

Ошибка выполнения (рис. 27).

Рисунок 27. Выполнение запроса

  1. Заказ указан корректно

EXEC rest.SetOrderWaitingForPayment @OrderID = 9;

При корректном запросе увидим сообщение о переводе заказа в режим ожидания оплаты и сумму к оплате (рис. 28).

Рисунок 28. Выполнение запроса

  1. Процедура «PayOrder» для оплаты заказа

В данной процедуре мы указываем заказ, сумму для оплаты и способ оплаты. Процедура проверяет параметры и в случае корректного ввода совершает оплату заказа. Если заплатили меньше, чем нужно, оплата не пройдет. Если заплатили больше, чем указанная сумма, остаток засчитывается как чаевые официанту.

CREATE PROCEDURE rest.PayOrder

@OrderID INT,

@Amount DECIMAL(10,2),

@PaymentMethod NVARCHAR(20)

AS

BEGIN

SET NOCOUNT ON;

DECLARE @CurrentStatus NVARCHAR(20),

@Total DECIMAL(10,2),

@Overpayment DECIMAL(10,2);

IF NOT EXISTS (SELECT 1 FROM rest.Orders WHERE OrderID = @OrderID)

BEGIN

PRINT 'Ошибка: заказ не найден.';

RETURN;

END

SELECT @CurrentStatus = Status

FROM rest.Orders

WHERE OrderID = @OrderID;

IF @CurrentStatus <> 'Ожидает оплаты'

BEGIN

PRINT 'Заказ не находится в статусе "Ожидает оплаты". Оплата невозможна.';

RETURN;

END

SET @Total = rest.ufn_OrderTotal(@OrderID);

IF @Amount < @Total

BEGIN

PRINT 'Ошибка: сумма оплаты меньше полной стоимости заказа. Статус заказа не изменен.';

RETURN;

END

SET @Overpayment = @Amount - @Total;

INSERT INTO rest.Payments (OrderID, PaymentMethod, Amount, TipAmount)

VALUES (@OrderID, @PaymentMethod, @Total, @Overpayment);

UPDATE rest.Orders

SET Status = 'Оплачен', CompletedDate = GETDATE()

WHERE OrderID = @OrderID;

IF @Overpayment > 0

BEGIN

PRINT 'Заказ успешно оплачен. Чаевые официанту: ' + CAST(@Overpayment AS NVARCHAR(20)) + ' руб.';

END

ELSE

BEGIN

PRINT 'Заказ успешно оплачен.';

END

END;

GO

Примеры использования

  1. Оплата несуществующего заказа

Запрос:

EXEC rest.PayOrder

@OrderID = 15,

@Amount = 150.50,

@PaymentMethod = 'Наличные';

Ошибка выполнения процедуры (рис. 29).

Рисунок 29. Выполнение запроса

  1. Оплата заказа, у которого не стоит статус «Ожидает оплаты»

Запрос для оплаченного или принятого заказа:

EXEC rest.PayOrder

@OrderID = 10,

@Amount = 150.50,

@PaymentMethod = 'Наличные';

Ошибка выполнения процедуры (рис. 30).

Рисунок 30. Выполнение запроса

  1. Недостаточно средств для оплаты

Запрос, в котором в поле оплаты введена слишком маленькая сумма:

EXEC rest.PayOrder

@OrderID = 9,

@Amount = 150.50,

@PaymentMethod = 'Наличные';

Ошибка выполнения запроса, потому что недостаточно средств (рис. 31).

Рисунок 31. Выполнение запроса

  1. Корректный запрос

EXEC rest.PayOrder

@OrderID = 9,

@Amount = 3000,

@PaymentMethod = 'Наличные';

Оплата прошла успешно, остаток средств зачислен официанту в качестве чаевых (рис. 32).

Рисунок 32. Выполнение запроса