Модель подписки OpenCart (х месяцев)

Я настраиваю сайт электронной коммерции, используя OpenCart, и хочу предложить подписку. Конкретно 3/6/12 месяцев подписки. Я НЕ заинтересован в регулярном выставлении счетов (я знаю, что существуют модули для PayPal и Authorize.net). Я хочу, чтобы пользователи платили один раз заранее. Это переводит на 3 псевдопродукта с точки зрения конфигурации? Я думаю, что пока это возможно, только с помощью конфигурации продукта. 3 продукта, каждый по одной цене.

Здесь начинается сложная часть. За каждый месяц, когда пользователи платят, они имеют доступ к заказу товара, только один раз в месяц, в рамках своего "биллингового цикла". Итак, если пользователь оплачивает 3-месячную подписку 23/5:

  • он может получить один товар в период 23/5-22/6,
  • один в 23/6-22/7, и
  • один в 23/7-22/8

Пользователь не должен иметь возможность заказывать более одного продукта в месяц, а также он не должен иметь возможность получать какие-либо продукты после 22 августа, если он не продлит свою подписку. Более того, было бы замечательно, если бы я мог получить работу cron, проверить, использовал ли пользователь свою подписку на текущий месяц, и отправить электронное письмо с напоминанием "Эй, получи свой продукт на этот месяц".

Это мой первый проект OpenCart, я просмотрел документацию и много гуглил, я играл с локальной установкой, и я пытаюсь выяснить, возможно ли то, что я спрашиваю, без изменения кода ядра, я хотел бы Избегайте этого. Тем не менее, если нет другого пути, я понимаю, что OpenCart - это фреймворк MVC(+L(anguage)), но я не нашел какой-либо надежной документации о том, как настроить его функциональность, только отдельные кусочки для конкретных требований.

Если можно, я хотел бы записать, что я имею в виду, пожалуйста, сообщите, если это звучит нормально:

  • Я хотел бы добавить еще одну сущность (объект / модель) для хранения подписки, пользователя, которому она принадлежит, даты начала и окончания, а также того, была ли она использована. По сути, подписка - это нормальный порядок, и я хотел бы, чтобы она сохранялась как единое целое, мне просто нужно сохранить еще несколько полей. Как я уже сказал, мне нужно выполнить две проверки:
  • Использовал ли пользователь свою подписку на текущий месяц? Для этого я думал о наличии поля флага "isUsed", которое можно сбросить с помощью задания cron каждый раз, когда пользователь достигает своей даты выставления счета. (в нашем примере 23/6, 23/7). В качестве альтернативы я мог бы добавить 3 записи, по одной для каждого цикла выставления счетов, и соответственно обновить их.
  • Срок действия подписки истек? Я мог бы проверить срок действия подписки.

Я понятия не имею, как подключить эту функцию во время оформления заказа или как начать реализацию этого.

Я прошел через форум и много гуглил, но ответа пока не нашел. Я опытный разработчик Grails/Java EE, поэтому я достаточно техничен, если этот пост слишком техничный:-)

Означает ли вышеприведенное звучание выполнимо, и я на правильном пути?

Ура,
Ираклис

1 ответ

Эта функциональность далеко за пределами того, для чего построен Opencart, но если вы немного знакомы с PHP/CodeIgniter, то вы сможете сделать большинство / все моды. Также будет полезно знать SQL, но если вы еще этого не сделаете, его быстро освоить.

Я бы сказал, что ваши моды состоят из 2 частей, каждая со своим уровнем сложности.

Я настраиваю сайт электронной коммерции, используя OpenCart, и хочу предложить подписку. Конкретно 3/6/12 месяцев подписки. Я НЕ заинтересован в регулярном выставлении счетов (я знаю, что существуют модули для PayPal и Authorize.net). Я хочу, чтобы пользователи платили один раз заранее. Это переводит на 3 псевдопродукта с точки зрения конфигурации? Я думаю, что пока это возможно, только с помощью конфигурации продукта. 3 продукта, каждый по одной цене.

Здесь начинается сложная часть. За каждый месяц, когда пользователи платят, они имеют доступ к заказу товара, только один раз в месяц, в рамках своего "биллингового цикла". Итак, если пользователь оплачивает 3-месячную подписку 23/5:

he can get one product in the period 23/5-22/6,
one in 23/6-22/7, and
one in 23/7-22/8

Я думаю, что я бы сделал для этого, добавив продукт для каждой длины подписки, и каждый продукт выдал им соответствующий кредит учетной записи, и у этого кредита есть идеальная сумма, чтобы купить один продукт в месяц для длины подписки.

Для этого я рекомендую добавить функцию для добавления средств в поле customer_transaction в базе данных в каталоге файлов>model>checkout>order.php (или любой другой модели, которую вы выберете), затем вызвать ее и добавить данные в каталог>controller>checkout> Success.php.

Я думаю, что было бы разумно проверить, что клиент приобрел соответствующий продукт подписки, и убедиться, что на эту покупку уже не было кредита.

Чтобы гарантировать, что они получают только 1 продукт в месяц, вам нужно написать скрипт в начало каталога>controller>checkout>checkout.php, чтобы перенаправить их на сообщение об ошибке, если они пытаются получить продукты слишком часто.

Пользователь не должен иметь возможность заказывать более одного продукта в месяц, а также он не должен иметь возможность получать какие-либо продукты после 22 августа, если он не продлит свою подписку. Более того, было бы замечательно, если бы я мог получить работу cron, проверить, использовал ли пользователь свою подписку на текущий месяц, и отправить электронное письмо с напоминанием "Эй, получи свой продукт на этот месяц".

Я даже не знаю, с чего начать, но если вы готовы платить, вы можете написать о помощи и, возможно, добавить эту функцию за хорошую цену.

Это мой первый проект OpenCart, я просмотрел документацию и много гуглил, я играл с локальной установкой, и я пытаюсь выяснить, возможно ли то, что я спрашиваю, без изменения кода ядра, я хотел бы Избегайте этого. Тем не менее, если нет другого пути, я понимаю, что OpenCart - это фреймворк MVC(+L(anguage)), но я не нашел какой-либо надежной документации о том, как настроить его функциональность, только отдельные кусочки для конкретных требований.

Опять же, это далеко за пределы того, для чего создан Opencart, и потребует нескольких модификаций. Что касается документации о том, как работает сценарий Opencart и как его настроить, я тоже не нашел. Мне было очень трудно узнать, что у меня есть за последние 2 месяца, но если ваши вопросы короткие, вы обычно можете попросить людей помочь вам по пути, когда вам это нужно.

Если можно, я хотел бы записать, что я имею в виду, пожалуйста, сообщите, если это звучит нормально:

I would like to add one more entity (object/model) for storing the subscription, the user to which it belongs, start and end date and

было ли оно использовано. По сути, подписка - это нормальный порядок, и я хотел бы, чтобы она сохранялась как единое целое, мне просто нужно сохранить еще несколько полей.

Я хотел бы добавить их в качестве атрибутов, вы можете сделать это в администрировании в конце каталога сайта> атрибуты, каталог> группы атрибутов и каталог> продукты на вкладке атрибутов.

Как я уже сказал, мне нужно выполнить две проверки: использовал ли пользователь свою подписку на текущий месяц? Для этого я думал о наличии поля флага "isUsed", которое можно сбросить с помощью задания cron каждый раз, когда пользователь достигает своей даты выставления счета. (в нашем примере 23/6, 23/7). В качестве альтернативы я мог бы добавить 3 записи, по одной для каждого цикла выставления счетов, и соответственно обновить их. Срок действия подписки истек? Я мог бы проверить срок действия подписки.

Я не знаю, как выполнить эту работу cron, но если вы сможете это выяснить, вы можете найти в базе данных имена и значения атрибутов, а затем применить вашу работу cron, если значения находятся в пределах вашего диапазона.

Надеюсь, это поможет вам с вашими ожиданиями!

ОБНОВИТЬ

Чтобы вставить данные в базу данных, вы можете повторить что-то вроде функции addTransaction () в admin/model/sale/customer.php

public function addTransaction($customer_id, $description = '', $amount = '', $order_id = 0) {
    $customer_info = $this->getCustomer($customer_id);

    if ($customer_info) { 
      $this->db->query("INSERT INTO " . DB_PREFIX . "customer_transaction
              SET customer_id = '" . (int)$customer_id . "',
              order_id = '" . (int)$order_id . "',
              description = '" . $this->db->escape($description) . "',
              amount = '" . (float)$amount . "',
              date_added = NOW()");
}

И это в admin/controller/sale/customer.php

$this->load->model('sale/customer');

if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->user->hasPermission('modify', 'sale/customer')) { 

  $this->model_sale_customer->addTransaction($this->request->get['customer_id'], 
  $this->request->post['description'], $this->request->post['amount']);

  $this->data['success'] = $this->language->get('text_success');
} else {
  $this->data['success'] = '';
}
Другие вопросы по тегам