Skip to content
  1. Extras
  2. msBonus2
  3. Cases
  4. Extra bonuses for first order

Extra bonuses for first order on the site

Sometimes you want to give points not for registration (that is built-in) but for the user's first order. Besides the usual order accrual (percent of cost), you add a fixed amount for the first order. This case shows how.

Step 1

Create lexicon entries:

  • msb2_logs_+first_order = Extra points for first order
  • msb2_logs_-first_order = Expired first-order points writeoff

The second entry is needed if you add a lifetime in msb2_lifetime_for_bonus for type first_order.

Step 2

Add a plugin and attach it to msOnChangeOrderStatus with priority 99999997.

php
switch ($modx->event->name) {
  case 'msOnChangeOrderStatus':
    // Fixed points for first order
    $additional_points = 2000;

    // Minimum cost of first order
    $min_order_cost = 0;

    // Only orders with status "New (1)"
    if ((int)$order->get('status') !== 1) {
      break;
    }

    // Is it first order?
    $user_id = $order->get('user_id');
    if ($order->get('cost') < $min_order_cost || $modx->getCount('msOrder', ['user_id' => $user_id]) !== 1) {
      break;
    }
    $msb2 = $modx->getService('msbonus2', 'msBonus2',
        MODX_CORE_PATH . 'components/msbonus2/model/msbonus2/');
    $msb2->initialize($modx->context->key);
    $manager = $msb2->getManager();
    $manager->setPlus('first_order', $additional_points, $user_id, $order->get('id'), $user_id);

    break;
}