8. Стандартные операции с данными
8.1. Добавление товара на склад (CREATE_PRODUCT)
Товар принадлежит продавцу SELLER. Для товара могут храниться различные медиа-материалы (картинки, чертежи, звуковые описания, рекламные ролики). Ссылки на такие материалы сохраняются в таблице MEDIA и связываются с нужным товаром в таблице PRODUCT_MEDIA.
Запасы товара хранятся на складах (один товар может храниться партиями на нескольких складах - WAREHOUSE). Запись в таблице WAREHOUSE_STOCK соответствует одной партии данного товара на указанном складе в наличествующем количестве (запас на складе).
Регламентное добавление товара на склад выполняется функцией CREATE_PRODUCT. На вход ей нужно передать:
ID склада, на который будет добавлен товар,
ID описания товара GOODS_ID, если оно уже имеется в БД,
полную информацию о партии товара в формате JSON.
Например:
{
"NAME": "Один популярный товар для питания.",
"DESCRIPTION": "Сделан профессионалами для профессионалов. Только положительные отзывы",
"ATTRIBUTES": {"attributes": [
{"name":"категория","value":"Новинки"},
{"name":"color","value":"blue"},
{"name":"stars","value":1}
]},
"PRICE": 12.76,
"DISCOUNT_PERCENT": 6,
"TAX_PERCENT": 13,
"END_PRICE": 13.6532,
"STOCK_QUANTITY": 1403,
"MAIN_IMAGE_URL": "http://example.com/img242.jpg",
"SELLER_ID": 83
}
Синтаксический разбор JSON и получение значений параметров выполняются средствами SQL JSON. Выполняются проверки:
существует ли в SELLERS запись про указанного продавца?
имеется ли запись в WAREHOUSES про указанный склад?
Если GOODS_ID указан → проверка существования товара
Негативные ответы приводят к созданию исключения и прекращению дальнейшей обработки.
Если GOODS_ID указан → используем существующий. Иначе — создается новое описание в таблице GOODS. Создается новая запись в таблице PRODUCTS, в поля которой помещаются значения из полей JSON входных данных. Функция возвращает PRODUCT_ID созданной записи. В таблицу WAREHOUSE_STOCK добавляется запись с партией нового товара и указанием его количества.
Каждый склад имеет максимальную емкость. При добавлении товара на конкретный склад специальным триггером CHECK_WAREHOUSE_CAPACITY проверяется, не превысит ли новое количество максимально допустимое.
Обновление информации о товаре может быть выполнено с помощью процедуры UPDATE_PRODUCT_INFO с аналогичными входными параметрами.
Процедура ADD_PRODUCT_MEDIA служит для добавления и “привязки” медиафайлов к товару.
8.2. Ликвидация товара на складе (D, U)
Удаление партии товара на складе выполняется хранимой процедурой DEL_PRODUCT_FROM_WAREHOUSE, на вход которой передаются: ID склада, ID товара, удаляемое количество товара. Производится проверка на допустимость значений указанных параметров, в частности ненулевое и положительное количество.
Если на данном складе есть несколько партий этого товара, он будет забираться из самой маленькой подходящей (размер наименьшей партии, который равен или превышает запрошенное количество). Если такой не нашлось, вызывается исключение, операция прерывается.
Количество товара в найденной партии уменьшается на указанное количество. Запись может быть удалена, если количество = 0
Общее количество товара на складе пересчитывается.
8.3. Учет товара (R)
Процедура GET_PRODUCT_INFO выдает полную информацию о товаре, включая данные о продавце.
8.4. Создание и добавление заказа (C)
Покупатель (CUSTOMER) делает заказы (ORDERS) на товары (PRODUCTS). Для регламентированного создания записи заказа служит процедура CREATE_ORDER, в которую передается вся информация о заказе в формате JSON. Например:
{
"CUSTOMER_ID": 330,
"PICKUP_POINT_ID": 1,
"SHIPPING_METHOD_ID": 1,
"WAREHOUSES": [
{
"WAREHOUSE_ID": 7,
"PRODUCTS": [
{"PRODUCT_ID": 36,"QUANTITY": 99},
{"PRODUCT_ID": 354, "QUANTITY": 82},
{"PRODUCT_ID": 385, "QUANTITY": 40}
]
},
{
"WAREHOUSE_ID": 8,
"PRODUCTS": [
{"PRODUCT_ID": 320, "QUANTITY": 89}
]
},
{
"WAREHOUSE_ID": 9,
"PRODUCTS": [
{"PRODUCT_ID": 169,"QUANTITY": 86}
]
}
]
}
Данные в формате JSON могут быть получены, например, из ответа REST API, или сформированы на WEB-странице, или в мобильном приложении.
В заказе покупатель указывает удобный ему пункт выдачи (PICKUP_POINTS) и вид доставки (SHIPPING_METHOD). Процедура сначала проверяет:
правильный ли синтаксис JSON во входном параметре,
присутствует ли в БД указанный покупатель,
имеется ли в БД запись про указанный склад,
находится ли код указанного вида доставки в списке допустимых,
имеется ли запись про указанный пункт выдачи
При негативном ответе на эти проверки создается исключение, и дальнейшие действия прекращаются. После синтаксического разбора JSON для каждого товара проверяется наличие достаточного запаса на указанном складе.
Если заказ еще не создан, создается запись в таблице ORDERS. Каждый товар из заказа заносится в уникальную запись в таблице (ORDER_ITEMS) с указанием ID заказа, количества, цены и склада. Процедура обновляет количество товара на складе с учетом попавшего в заказ, общее количество товара в заказе и полную сумму заказа.
Процедура создает запись об оплате заказа в таблице PAYMENTS. После этого заказ переходит в статус “AWAITING_PAYMENT” и ожидает оплаты, а товару для доставки назначается Tracking_Number в формате GUID, дата доставки и вид доставки (Base | Express).
Код из справочника статуса заказа заносится в поле STATUS_ID. Статус ACTIVE соответствует любому из (AWAITING PAYMENT, PAID, DELIVERED).
8.5. Оплата товаров (U)
Оплата выполняется с помощью вызова хранимой процедуры PAY_FOR_ORDER с параметрами: ORDER_ID_PARAM, PAYMENT_AMOUNT
Оплата заносится в таблицу PAYMENTS, где сохраняется информация обо всех платежах, включая неудачные попытки. После завершения покупателем полной (сумма по всем прошедшим платежам) оплаты, заказ считается оплаченным (PAID). Подтверждение полной оплаты заказа можно получить функцией IS_PAID.
8.6. Доставка товаров(U)
В этой демонстрационной БД доставленным считается любой полностью оплаченный заказ, у которого прошло определенное количество дней после указанной даты доставки (по умолчанию - 30).
Проверка того, является ли заказ доставленным (DELIVERED), выполняется функцией IS_DELIVERED.
8.7. Закрытие заказа (U)
Полностью оплаченный и доставленный заказ считается полностью выполненным (завершенным) и может быть “закрыт”, т.е. переведен в статус CLOSED. Чтобы закрыть заказ, следует вызвать процедуру CLOSE_ORDER_WITH_RESULT и передать ей order_id заказа.
Правила ее работы: После получения подтверждения полной оплаты функцией IS_PAID, значение поля STATUS_ID устанавливается в код, соответствующий ‘PAID’ , проверяется, доставлен ли заказ (вызов функции IS_DELIVERED), если заказ доставлен, то значение поля STATUS_ID заказа устанавливается в код, соответствующий статусу ‘CLOSED' .
Для массового закрытия полностью выполненных заказов служит процедура CLOSE_PENDING_ORDERS - Закрытие ожидающих заказов, которая возвращает статистику своей работы.
8.8. Отмена заказа (U)
Уже отмененный (CANCELED) заказ отменить нельзя. Завершенный или доставленный заказ (CLOSED, DELIVERED) отменить нельзя (только через возврат товара, который в демонстрационный пример не входит). Отмена заказа выполняется вызовом процедуры CANCEL_ORDER_WITH_REFUND. Активный заказ переводится в статус ‘CANCELED’, товары из его строк возвращаются на склад (с разрешением конфликта, если место уже занято). Если отмененный заказ был оплачен, то выполняется возврат платежей (все оплаты по заказу со статусом ‘PAID’). Запись об отмене заказа заносится в таблицу ORDER_CANCELATIONS.
8.9. Возврат платежей (U)
Если отмененный заказ был оплачен, то выполняется возврат платежей. Возврат платежей выполняется вызовом процедуры PAYMENT_REFUND.
Возвращается только та сумма, которая была уплачена к моменту возврата (все оплаты по заказу со статусом ‘PAID’). Для каждой из таких прошедших оплат добавляются компенсационные записи с отрицательной суммой, которые переводятся в статус ‘RFD’ (возвращены). Компенсационная запись имеет ссылку на отмененную оплату.
8.10. Оставить отзыв и оценить (U)
Отзыв на товар из заказа создается процедурой CREATE_ORDER_REVIEW Покупатель присылает отзыв и указывает: товар, заказ и оценку (0 .. 5)