Таблица oc_customer_subscription
Таблица oc_customer_subscription появилась в OpenCart начиная с версии 4.x и предназначена для управления подписками покупателей. Она позволяет организовать систему регулярных платежей (рекуррентные платежи) или подписку на товары с определенной периодичностью.
Поля
| Поле | Тип данных | Описание |
|---|---|---|
customer_subscription_id |
int |
Уникальный идентификатор подписки покупателя. Первичный ключ таблицы с автоинкрементом. |
order_id |
int |
Идентификатор заказа, в рамках которого была создана подписка. Внешний ключ к таблице oc_order.
|
order_product_id |
int |
Идентификатор товара в заказе, на который оформлена подписка. Внешний ключ к таблице oc_order_product.
|
customer_id |
int |
Идентификатор покупателя, оформившего подписку. Внешний ключ к таблице oc_customer.
|
payment_method |
varchar(255) |
Код способа оплаты, используемого для подписки (например, bank_transfer, cheque, или код платежного шлюза).
|
payment_code |
varchar(255) |
Код платежного модуля (расширения), обрабатывающего подписку. |
product_name |
varchar(255) |
Название товара или услуги, на которую оформлена подписка, на момент создания заказа. |
product_id |
int |
Идентификатор товара из каталога. Внешний ключ к таблице oc_product.
|
quantity |
int |
Количество товара в подписке. |
price |
decimal(15,4) |
Цена за единицу товара на момент оформления подписки. |
trial_price |
decimal(15,4) |
Цена пробного периода подписки, если он предусмотрен. |
trial_frequency |
enum('day', 'week', 'semi_month', 'month', 'year') |
Периодичность пробного периода (день, неделя, две недели, месяц, год). |
trial_cycle |
int |
Количество единиц периодичности пробного периода (например, 2 недели).
|
trial_duration |
int |
Общая продолжительность пробного периода в указанных единицах. |
trial_remaining |
int |
Оставшееся количество платежных циклов пробного периода. |
trial_status |
tinyint(1) |
Статус пробного периода (1 - активен, 0 - неактивен или завершен).
|
frequency |
enum('day', 'week', 'semi_month', 'month', 'year') |
Периодичность основного платежного цикла подписки. |
cycle |
int |
Количество единиц периодичности основного цикла (например, 1 месяц).
|
duration |
int |
Общая планируемая продолжительность подписки в количестве циклов. 0 означает бессрочную подписку до отмены.
|
remaining |
int |
Оставшееся количество платежных циклов до окончания подписки. |
date_next |
datetime |
Дата и время следующего платежа по подписке. |
status |
tinyint(1) |
Текущий статус подписки (1 - активна, 0 - отключена/приостановлена).
|
date_added |
datetime |
Дата и время создания записи о подписке. |
Как это работает
Функционал подписок позволяет покупателям оформлять регулярные заказы на товары или услуги. Процесс начинается с создания обычного заказа, который содержит товар с настроенными опциями подписки (периодичность, длительность, пробный период).
После успешной оплаты начального заказа в таблице oc_customer_subscription создается запись, которая становится основой для управления последующими автоматическими списаниями. Система или администратор вручную отслеживает поле date_next для определения времени следующего платежа.
При наступлении даты следующего платежа система (часто через Cron задание) инициирует процесс списания средств с помощью указанного в payment_code платежного модуля. После успешного списания создается новый заказ, обновляются поля remaining, date_next, а история платежей фиксируется в связанной таблице oc_customer_subscription_transaction.
Поля, связанные с пробным периодом (trial_*), позволяют предлагать клиентам специальные условия на начальном этапе подписки, после чего автоматически переходить на стандартный тариф.
Пример SQL-запроса
Получить список активных подписок с информацией о клиентах и товарах можно следующим запросом:
SELECT
cs.customer_subscription_id,
cs.product_name,
cs.quantity,
cs.price,
cs.date_next,
c.firstname,
c.lastname,
c.email,
p.model as product_model
FROM oc_customer_subscription cs
LEFT JOIN oc_customer c ON (cs.customer_id = c.customer_id)
LEFT JOIN oc_product p ON (cs.product_id = p.product_id)
WHERE cs.status = 1
ORDER BY cs.date_next ASC;
Смотрите также
-
таблицу
oc_order,
которая содержит информацию о заказах -
таблицу
oc_customer,
которая хранит данные покупателей -
таблицу
oc_product,
которая содержит информацию о товарах