Таблица oc_subscription
Таблица oc_subscription появилась в OpenCart начиная с версии 4.x и предназначена для управления подписками на товары с регулярными (рекуррентными) платежами. Она хранит информацию о статусе подписки, частоте платежей, количестве циклов и истории платежей.
Поля
| Поле | Тип данных | Описание |
|---|---|---|
subscription_id |
int |
Уникальный идентификатор подписки. Первичный ключ таблицы. |
order_id |
int |
ID заказа, в рамках которого была создана подписка. Внешний ключ для таблицы oc_order.
|
order_product_id |
int |
ID товара в заказе, на который оформлена подписка. Ссылается на oc_order_product.
|
customer_id |
int |
ID клиента, оформившего подписку. Внешний ключ для таблицы oc_customer.
|
payment_method |
text |
Данные о способе оплаты, используемом для подписки. Обычно хранится в формате JSON, включая код платежного модуля и название метода. |
payment_code |
varchar(128) |
Код платежного модуля (например, pp_express для PayPal Express Checkout), который обрабатывает recurring-платежи.
|
shipping_method |
text |
Данные о способе доставки для подписки. Хранится в формате JSON. |
product_name |
varchar(255) |
Название товара на момент создания подписки (дублируется из заказа для исторической сохранности). |
product_id |
int |
ID товара из каталога. Внешний ключ для таблицы oc_product.
|
quantity |
int |
Количество товара в подписке. |
trial_price |
decimal(10,4) |
Цена пробного периода подписки. |
trial_frequency |
enum('day', 'week', 'semi_month', 'month', 'year') |
Периодичность платежей в пробном периоде (день, неделя, две недели, месяц, год). |
trial_cycle |
int |
Количество интервалов (trial_frequency) между платежами в пробном периоде. Например, при trial_frequency = 'week' и trial_cycle = 2, платежи будут раз в 2 недели.
|
trial_duration |
int |
Продолжительность пробного периода. Определяет, сколько раз будет совершен платеж в пробном периоде. |
trial_remaining |
int |
Оставшееся количество платежей в пробном периоде. |
trial_status |
tinyint(1) |
Статус пробного периода (1 - активен, 0 - неактивен/завершен).
|
price |
decimal(10,4) |
Основная цена подписки (после пробного периода). |
frequency |
enum('day', 'week', 'semi_month', 'month', 'year') |
Периодичность основных платежей подписки. |
cycle |
int |
Количество интервалов (frequency) между основными платежами.
|
duration |
int |
Общая продолжительность подписки. Количество основных платежей, которые будут совершены. 0 означает бессрочную подписку до отмены.
|
remaining |
int |
Оставшееся количество платежей по подписке. |
date_next |
datetime |
Дата и время следующего платежа по подписке. |
comment |
text |
Комментарий к подписке (может использоваться администратором или платежной системой). |
subscription_status_id |
int |
ID статуса подписки. Внешний ключ для таблицы oc_subscription_status.
|
date_added |
datetime |
Дата и время создания подписки. |
date_modified |
datetime |
Дата и время последнего изменения подписки. |
Как это работает
Когда клиент покупает товар, для которого в карточке товара (вкладка Recurring) настроен профиль recurring-платежей, в момент оформления заказа создается запись в таблице oc_subscription. Эта запись связывает товар, заказ, клиента и платежный метод.
Подписка может иметь пробный период (trial_* поля) с собственной ценой и периодичностью, после которого начинается основной период с регулярными платежами по основной цене.
Платежный модуль (например, PayPal) использует информацию из этой таблицы для создания billing agreement и проведения регулярных списаний. Cron-задача или внешний вызов от платежной системы обновляет статус подписки (subscription_status_id), количество оставшихся платежей (remaining) и дату следующего платежа (date_next).
Клиент и администратор могут просматривать статус подписки и управлять ею (например, приостанавливать или отменять) через панель управления OpenCart.
Пример SQL-запроса
Выбрать все активные подписки с информацией о клиенте и статусе:
SELECT
s.subscription_id,
s.product_name,
s.quantity,
s.price,
s.frequency,
s.remaining,
s.date_next,
c.email,
c.customer_id,
ss.name as status_name
FROM oc_subscription s
LEFT JOIN oc_customer c ON (s.customer_id = c.customer_id)
LEFT JOIN oc_subscription_status ss ON (s.subscription_status_id = ss.subscription_status_id)
WHERE ss.language_id = 1
AND s.subscription_status_id IN (1, 2) -- Активные статусы
ORDER BY s.date_next ASC;
Смотрите также
-
таблицу
oc_subscription_status,
которая хранит статусы подписок на разных языках -
таблицу
oc_subscription_history,
которая хранит историю изменений статусов подписки -
таблицу
oc_subscription_transaction,
которая хранит историю транзакций по подписке -
таблицу
oc_order,
которая хранит информацию о заказах