Таблица oc_customer_reward
Таблица oc_customer_reward является ключевой для работы системы лояльности в OpenCart. Она фиксирует все операции по начислению бонусных баллов за покупки и другие действия, а также их списание для оплаты заказов.
Поля
| Поле | Тип данных | Описание |
|---|---|---|
customer_reward_id |
int |
Уникальный идентификатор записи в таблице. Автоинкремент. |
customer_id |
int |
Внешний ключ, связывающий запись с конкретным клиентом. Ссылается на oc_customer.
|
order_id |
int |
Внешний ключ, указывающий на заказ, с которым связана операция (начисление за покупку или списание для оплаты). Ссылается на oc_order. Может быть 0, если баллы начислены не за заказ (например, за регистрацию).
|
description |
text |
Текстовое описание операции. Объясняет, за что были начислены или списаны баллы (например, "Заказ #123", "Оплата бонусами заказа #123").
|
points |
int |
Количество баллов в операции. Положительное число означает начисление, отрицательное - списание. |
date_added |
datetime |
Дата и время совершения операции. |
Как это работает
Администратор магазина в настройках может установить правило: сколько бонусных баллов начисляется за каждую потраченную денежную единицу (например, 1 балл за каждые 10 рублей).
Когда клиент совершает покупку и его заказ переходит в статус, указанный в настройках для начисления баллов (например, "Завершен"), система рассчитывает сумму к начислению и создает запись в oc_customer_reward с положительным значением в поле points и ссылкой на order_id.
Если клиент решит оплатить часть следующего заказа бонусными баллами, при подтверждении заказа будет создана новая запись в этой таблице с отрицательным значением points, которая и будет означать списание.
Текущий баланс баллов клиента ⁅b⁆не хранится⁅/b⁆ в этой таблице явно. Он всегда вычисляется как сумма (SUM()) всех значений в поле points для данного customer_id. Это позволяет всегда иметь актуальную сумму, основанную на полной истории операций.
Пример SQL-запроса
Получить полную историю начислений и списаний, а также текущий баланс для клиента с customer_id = 5:
SELECT
*,
SUM(points) OVER (PARTITION BY customer_id ORDER BY date_added) AS running_balance
FROM oc_customer_reward
WHERE customer_id = 5
ORDER BY date_added;
Получить только текущий баланс баллов клиента:
SELECT SUM(points) AS total_points
FROM oc_customer_reward
WHERE customer_id = 5;
Смотрите также
-
таблицу
oc_customer,
в которой хранятся основные данные клиентов -
таблицу
oc_order,
с которой связаны операции начисления баллов -
таблицу
oc_customer_transaction,
которая работает по схожему принципу для учета денежных транзакций