Как дополнение, для доступа к одному только материалу (продукту который куплен), нужно ище будет:
3. Например: Отдельной таблицой oc_restrict_access_products (условное название)
Колонки: customer_id (клиент), product_id (продукт), expired (дата)
Проверять есть ли доступ: клиенту до продукта до даты. Соответственно если expired < текущей даты - доступа уже не будет.
Проверка на групу стандартная:
$this->customer->getId() # id покупателя
$this->customer->getCustomerGroupId() # id групы
Берем запрос с БД по id user который хочет взять продукт, если нет такого лесом, иначе дальше, дальше пока будет не будет потвержден.
Нужно знать продавать "виртуальный товар будет из страницы категорий и или на странице продукта";
Доступ к видео, отдельным модулем(страничкой) или скрытый текст на странице продукта(*?), что там визуально будет размещено и т.д.
Так как тут только стандартная логика работы скрипта расписана.