Минимальная сумма заказ

#
Минимальная сумма заказ
Для ограничения возможности оформления заказа в интернет-магазине задаваемой минимальной суммой обновите код типовой динамической страницы "Интернет-магазин корзина" на этот:
<?php

$shop = & singleton('shop');

if (class_exists("SiteUsers"))
{
   /* Получаем id текущего пользователя сайта */
   $SiteUsers = & singleton('SiteUsers');
   $site_users_id = $SiteUsers->GetCurrentSiteUser();
}
else
{
   $site_users_id = false;
}

######################################################
### Обработка принятия заказа от платежной системы ###
######################################################

// ------------------------------------------------
// Подготовка редиректа для PayPal
// ------------------------------------------------
if (isset($_POST['paymentType']))
{
   // Получаем ID заказа
   $order_id = to_int($_POST['order_id']);

   $order_row = $shop->GetOrder($order_id);

   if ($order_row)
   {
      // Вызов обработчика платежной системы
      $shop->ExecSystemsOfPayHandler($order_row['shop_system_of_pay_id']);
   }
}

// ------------------------------------------------
// Обработка уведомления об оплате от RBK Money
// ------------------------------------------------
if (isset($_POST['paymentStatus']) || isset($_GET['PayPalOrderConfirmation']))
{
   // Получаем ID заказа
   $order_id = to_int($_POST['orderId']);

   $order_row = $shop->GetOrder($order_id);

   if ($order_row)
   {
      // Вызов обработчика платежной системы
      $shop->ExecSystemsOfPayHandler($order_row['shop_system_of_pay_id']);
   }
}

// ------------------------------------------------
// Обработка уведомления об оплате от WebMoney
// ------------------------------------------------
if (isset($_POST['LMI_PAYEE_PURSE']))
{
   // Получаем ID заказа
   $order_id = to_int($_POST['LMI_PAYMENT_NO']);

   $order_row = $shop->GetOrder($order_id);

   if ($order_row)
   {
      // Вызов обработчика платежной системы
      $shop->ExecSystemsOfPayHandler($order_row['shop_system_of_pay_id']);
   }
}

// ------------------------------------------------
// Вывод информации о статусе платежа после его совершения и перенаправления с платежной системы
// ------------------------------------------------
if (isset($_REQUEST['payment']) && isset($_REQUEST['order_id']))
{
   // Получаем ID заказа
   $order_id = to_int($_REQUEST['order_id']);

   $order_row = $shop->GetOrder($order_id);

   // Если заказ принадлежит текущему авторизированному пользователю
   if ($order_row['site_users_id'] == $site_users_id)
   {
      if (to_str($_REQUEST['payment']) == 'success')
      {
         ?><h1>Подтверждение платежа</h1>
<p>Спасибо, информация об оплате заказа <strong>№ <?php echo $order_row['shop_order_account_number']?></strong>
получена.</p>
         <?php
      }
      else
      {
         ?><h1>Платеж не получен</h1>
<p>К сожалению при оплате заказа <strong>№ <?php echo $order_row['shop_order_account_number']?></strong>
произошла ошибка.</p>
         <?php
      }
   }
   // Для случаев, когда отключен модуль "Пользователи сайта"
   elseif ($site_users_id === false)
   {
      ?><h1>Подтверждение платежа</h1>
<p>Благодарим за посещение нашего магазина!</p>
      <?php
   }
   else
   {
      ?><h1>Ошибка</h1>
<p>Неверный номер заказа!</p>
      <?php
   }

   // Прерываем выполнение типовой динамической страницы
   return true;
}

// ------------------------------------------------
// Обработка уведомления об оплате от ROBOKASSA
// ------------------------------------------------
if (isset($_REQUEST['SignatureValue']))
{
   // Получаем ID заказа
   $order_id = to_int($_REQUEST['InvId']);

   $order_row = $shop->GetOrder($order_id);

   if ($order_row)
   {
      // Вызов обработчика платежной системы
      $shop->ExecSystemsOfPayHandler($order_row['shop_system_of_pay_id']);
   }
}

############################################################
### [END] Обработка принятия заказа от платежной системы ###
############################################################

/* Идентификатор интернет-магазина */
$shop_id = to_int($GLOBALS['LA']['shop_id']);

/* Проверяем наличие текущего пользователя */
/* Пользователь не авторизироаан */
if ($site_users_id == 0)
{
   /* Быстрая регистрация пользователя */
   if (isset($_POST['step1_2']))
   {
      /* пароль необязателен при обновлении данных о пользователе */
      if (isset($_POST['site_users_login'])
      && isset($_POST['site_users_password'])
      && isset($_POST['site_users_email'])
      && isset($_POST['site_users_password_retry'])
      && strpos($_POST['site_users_login'], 'http://') === false // Логин не начинается с http://
      )
      {
         if (to_str($_POST['site_users_password']) == to_str($_POST['site_users_password_retry']))
         {
            // В массив дополнительных параметров пишем адрес магазина
            $shop_row = $shop->GetShop($shop_id);

            // Получаем путь к магазину
            $Structure = & singleton('Structure');
            $shop_path = "/".$Structure->GetStructurePath($shop_row['structure_id'],0);

            $param['location'] = $shop_path . "cart/";

            $param['site_users_login'] = to_str($_POST['site_users_login']);
            $param['site_users_password'] = to_str($_POST['site_users_password']);
            $param['site_users_email'] = to_str($_POST['site_users_email']);
            $param['site_users_name'] = to_str($_POST['site_users_name']);
            $param['site_users_surname'] = to_str($_POST['site_users_surname']);
            $param['site_users_patronymic'] = to_str($_POST['site_users_patronymic']);
            $param['site_users_country'] = to_str($_POST['site_users_country']);
            $param['site_users_company'] = to_str($_POST['site_users_company']);
            $param['site_users_phone'] = to_str($_POST['site_users_phone']);
            // Группа по умолчанию
            $param['site_users_group_id'] = $SiteUsers->GetDefaultGroup();
            $param['xslname'] = to_str($GLOBALS['LA']['xsl_registaration_letter']);

            /* Не отправлять письмо о подтверждении регистрации,
             необходим при автоматическом подтрвеждении регистрации (ниже подтверждение) */

            /*
             ДАННЫЙ ПАРАМЕТР НЕОБХОДИМО УСТАНОВИТЬ, ЕСЛИ НЕ ТРЕБУЕТСЯ ПОДТВЕРЖДЕНИЕ РЕГИСТРАЦИИ
             ПОЛЬЗОВАТЕЛЯ ПОСЛЕ БЫСТРОГО ЗАКАЗА
             */
            $param['not_send_mail_confirm'] = true;

            // добавляем пользователя, отправляем уведомление о регистрации
            $result = $SiteUsers->InsertSiteUser($param);

            /* Если не отправляли подтверждение -  */
            if ($result > 0 && $param['not_send_mail_confirm'])
            {
               /* Подтверждаем регистрацию */
               $SiteUsers->SetConfirmationID($result);

               /* Авторизируем пользователя */
               $SiteUsers->SetCurrentSiteUser($result);

               $site_users_id = $result;

               /* Перенсоим товары из cookies в корзину пользователя */
               $shop->GetItemsFromCookiesToCart($site_users_id);

               // Проверяем куки пользователя на предмет наличия в них логина аффилиата
               if (isset($_COOKIE['affiliate_name']))
               {
                  $affiliate = new affiliate();
                     
                  $affiliate_login = quote_smart($_COOKIE['affiliate_name']);
                     
                  $affiliate_row = $SiteUsers->GetSiteUserByLogin($affiliate_login);
                     
                  if ($affiliate_row)
                  {
                     $affiliate_id = $affiliate_row['site_users_id'];

                     // Проводим вставку пользователя аффилиата
                     $affiliate->InsertAffiliate(array('site_users_id' => $result, 'affiliate_plans_id' => 0, 'affiliate_site_users_id' => $affiliate_id, 'affiliate_active' => 1));
                  }
               }

            }

            /* Если пользователь зарегистрирован и необходимо подтверждать авторизацию */
            if ($result > 0 && !$param['not_send_mail_confirm'])
            {
               ?>
<h1>Спасибо за регистрацию</h1>
<p>Для продолжения работы необходимо подтвердить регистрацию Ваших
данных. В Ваш адрес отправлено письмо, содержащее ссылку для
подтверждения регистрации.</p>
               <?php
            }

            // Проверяем наличие ошибки при регистрации
            if ($result < 0)
            {
               // -3 - Пользователь с таким логином зарегистрирован ранее
               // -2 - Пользователь с таким e-mail зарегистрирован ранее
               // -1 - Введен некорректный e-mail
               $GLOBALS['external_propertys']['error'] = $result;
            }
         }
         else
         {
            $GLOBALS['external_propertys']['error'] = -7; /*Повторный пароль введен неверно*/
         }
      }
      else
      {
         $GLOBALS['external_propertys']['error'] = -4; /* Пожалуйста, задайте все обязательные параметры */
      }
   }
}



/* Если отключен модуль пользователей сайта */
if (isset($_POST['step_1_1a']) && isset($_POST['step_1']))
{
   if (strlen(to_str($_POST['site_users_name'])) < 1)
   {
      $message = 'Введите имя!';
   }
   
   if (strlen(to_str($_POST['site_users_surname'])) < 1)
   {
      $message = 'Введите фамилию!';
   }
   
   if (strlen(to_str($_POST['site_users_email'])) < 1
   || !valid_email(to_str($_POST['site_users_email'])))
   {
      $message = 'Введите e-mail!';
   }
}

$sum_order = false;
if(isset($_POST['step_1']) || isset($_POST['step_2']) || isset($_POST['step_3']))
{
   $mas_cart = $shop->GetItemsFromCart($site_users_id, $shop_id);

   $total_sum = 0;
   foreach($mas_cart as $key => $value)
   {
      if($mas_cart[$key]['shop_cart_flag_postpone'] != 1)
      {  
         $ind = $mas_cart[$key]['shop_items_catalog_item_id'];
         $count = $mas_cart[$key]['shop_cart_item_quantity'];
         $mas_item = $shop->GetItem($ind);
         $price = $mas_item['shop_items_catalog_price'];
         $total_sum = $total_sum + $count*$price;
      }
   };

   if(($total_sum >= to_int($GLOBALS['LA']['min_sum_order'])) && $sum_order == false) $sum_order=true;
   else
   {
      $print_sum = to_str($GLOBALS['LA']['min_sum_order']);
      ?>
      <div id="error">Минимальная сумма заказа <?php echo $print_sum?> рублей</div>
      <?php
   }
}
elseif(isset($_POST['step_4']))
{
$sum_order = true;
}

if (empty($message) && ($site_users_id > 0 || $site_users_id === false) && $sum_order === true)

{
   /* Ввод адреса доставки */
   if (isset($_POST['step_1']))
   {
                $external_propertys = array ();

      /* Если отключен модуль пользователей сайта, то вызывается этот подэтап */
      if (isset($_POST['step_1_1a']))
      {
         /* Данные о пользователе передаем через внешние параметры и сохраним в сессию */
         $external_propertys['site_users_name'] = $_SESSION['site_users_name'] = to_str($_POST['site_users_name']);
         $external_propertys['site_users_surname'] = $_SESSION['site_users_surname'] = to_str($_POST['site_users_surname']);
         $external_propertys['site_users_patronymic'] = $_SESSION['site_users_patronymic'] = to_str($_POST['site_users_patronymic']);
         $external_propertys['site_users_email'] = $_SESSION['site_users_email'] = to_str($_POST['site_users_email']);
         $external_propertys['site_users_phone'] = $_SESSION['site_users_phone'] = to_str($_POST['site_users_phone']);
         $external_propertys['site_users_fax'] = $_SESSION['site_users_fax'] = to_str($_POST['site_users_fax']);
         $external_propertys['site_users_address'] = $_SESSION['site_users_address'] = to_str($_POST['site_users_address']);
         $external_propertys['site_users_company'] = $_SESSION['site_users_company'] = to_str($_POST['site_users_company']);
      }
      else
      {
         $aInfoSiteUser = $SiteUsers->GetSiteUser($site_users_id);

         $external_propertys['site_users_name'] = $_SESSION['site_users_name'] = to_str($aInfoSiteUser['site_users_name']);
         $external_propertys['site_users_surname'] = $_SESSION['site_users_surname'] = to_str($aInfoSiteUser['site_users_surname']);
         $external_propertys['site_users_patronymic'] = $_SESSION['site_users_patronymic'] = to_str($aInfoSiteUser['site_users_patronymic']);
         $external_propertys['site_users_email'] = $_SESSION['site_users_email'] = to_str($aInfoSiteUser['site_users_email']);
         $external_propertys['site_users_phone'] = $_SESSION['site_users_phone'] = to_str($aInfoSiteUser['site_users_phone']);
         $external_propertys['site_users_fax'] = $_SESSION['site_users_fax'] = to_str($aInfoSiteUser['site_users_fax']);
         $external_propertys['site_users_address'] = $_SESSION['site_users_address'] = to_str($aInfoSiteUser['site_users_address']);
         $external_propertys['site_users_company'] = $_SESSION['site_users_company'] = to_str($aInfoSiteUser['site_users_company']);
         $external_propertys['site_users_postcode'] = $_SESSION['index'] = to_str($aInfoSiteUser['site_users_postcode']);
      }

      /* Запоминаем купон */
      $_SESSION['shop_coupon_text'] = to_str($_POST['shop_coupon_text']);

      /* Отображаем форму ввода адреса */
      // Не выбираем show_location, show_city и show_city_area, т.к. подгружаются через AJAX
      $shop->ShowAddress(to_str($GLOBALS['LA']['xsl_delivery_address']), $shop_id, array('show_location' => false, 'show_city' => false, 'show_city_area' => false), $external_propertys);

   }
   /* Отображаем доступные доставки */
   elseif (isset($_POST['step_2']))
   {
      /* Сохраняем данные, введенные на первом этапе */
      $country = to_int($_POST['country']);
      $location = to_int($_POST['location']);
      $city = to_int($_POST['sel_city']);
      $city_area = to_int($_POST['sel_city_area']);

      // Сбрасываем информацию о последнем заказе
      $_SESSION['last_order_id'] = 0;

      /* Пишем информацию об адресе доставки в сессию */
      $_SESSION['country'] = $country;
      $_SESSION['location'] = $location;
      $_SESSION['city'] = $city;
      $_SESSION['city_area'] = $city_area;
      $_SESSION['index'] = to_int($_POST['index']);
      $_SESSION['full_address'] = to_str($_POST['full_address']);

      $_SESSION['site_users_name'] = to_str($_POST['site_users_name']);
      $_SESSION['site_users_surname'] = to_str($_POST['site_users_surname']);
      $_SESSION['site_users_patronymic'] = to_str($_POST['site_users_patronymic']);
      $_SESSION['site_users_email'] = to_str($_POST['site_users_email']);
      $_SESSION['site_users_phone'] = to_str($_POST['site_users_phone']);
      $_SESSION['site_users_fax'] = to_str($_POST['site_users_fax']);
      $_SESSION['site_users_company'] = to_str($_POST['site_users_company']);
      $_SESSION['description'] = to_str($_POST['description']);

      /* Индекс и полный адрес (в массив дополнительных параметров) */
      $external_propertys['index'] = to_str($_POST['index']);
      $external_propertys['full_address'] = to_str($_POST['full_address']);

      /* Получаем количество элементов, их общую цену, вес, валюту для заданного пользователя */
      $a_param = $shop->SelectAllItemsFromCartForUser($shop_id, $site_users_id);

      /* Выбираем все доступные типы доставки (с группировкой по типу доставки) */
      $param = array();
      $param['shop_coupon_text'] = to_str($_SESSION['shop_coupon_text']);
      
      // Передаем количество товара
      $param['count'] = $a_param['quantity'];
      
      $shop->ShowTypeOfDelivery($shop_id, $country, $location, $city, $city_area, $a_param['weight'], $a_param['price'],
      to_str($GLOBALS['LA']['xsl_shop_delivery']), $param, $external_propertys);
   }
   /* Показываем страницу доступных платежных систем */
   elseif (isset($_POST['step_3']))
   {
      /* Обрабатываем полученные данные о типе доставки */
      $_SESSION['cond_of_delivery'] = to_int($_POST['cond_of_delivery']);

      /* Расчитываем цену доставки */

      /* Получаем данные о магазине */
      $shop_row = $shop->GetShop($shop_id);

      $row = $shop->GetCondOfDelivery($_SESSION['cond_of_delivery']);

      /* идентификатор валюты магазина */
      $shop_currency_id = to_int($shop_row['shop_currency_id']);
      $coefficient = $shop->GetCurrencyCoefficientToShopCurrency($row['shop_currency_id'], $shop_currency_id);
   
      $aPriceDelivery = $shop->GetPriceForCondOfDelivery($row['shop_cond_of_delivery_id']);
      
      $price_delivery = sprintf("%.2f", $aPriceDelivery['price_tax'] * $coefficient);

      $_SESSION['cond_of_delivery_price'] = $price_delivery;
      
      if ($row && $row['shop_tax_id'] != 0)
      {
         $row_tax = $shop->GetTax($row['shop_tax_id']);
         
         if ($row_tax)
         {
            $_SESSION['cond_of_delivery_price_tax'] = $row_tax['shop_tax_rate'];
         }
         else
         {
            $_SESSION['cond_of_delivery_price_tax'] = 0;
         }
      }
      else
      {
         $_SESSION['cond_of_delivery_price_tax'] = 0;
      }

      /* Выводим  платежные системы */
      $external_propertys['cond_of_delivery'] = to_int($_POST['cond_of_delivery']);

      $shop->ShowSystemOfPay(to_str($GLOBALS['LA']['xsl_system_of_pay']), $external_propertys, array('shop_shops_id' => $shop_id));
   }
   elseif (isset($_POST['step_4']))
   {
      /* Если выбрана (существует) платежная система */
      if (to_int($_POST['system_of_pay_id']) != 0)
      {
         /* Вызываем обработчик платежной системы */
         if (!$shop->ExecSystemsOfPayHandler(to_int($_POST['system_of_pay_id'])))
         {
            /* Не удалось найти обработчик */
            show_error_message("Не найден обработчик платежной системы с номером ".to_int($_POST['system_of_pay_id']));
         }
      }
      else
      {
         /* Ошибка, не указана платежная система! */
         show_error_message('Ошибка! Не указана ни одна платежная система.');
      }
   }
   else
   {
      /* Очищаем сессию */
      if (isset($_SESSION['CART'][$shop_id]))
      {
         unset($_SESSION['CART'][$shop_id]);
      }

      /* Отображаем корзину */
      $shop->ShowCart($shop_id, $site_users_id,
      to_str($GLOBALS['LA']['xsl_cart']), array('shop_coupon_text' => to_str($_REQUEST['shop_coupon_text'])));

   }
}
elseif ($site_users_id === 0 || !empty($message) || $sum_order === false)
{
   /* Выводим корзину */
   $external_propertys = array();

   if (!empty($message))
   {
      $external_propertys['message'] = $message;
   }

   $external_propertys['site_users_name'] = to_str($_POST['site_users_name']);
   $external_propertys['site_users_surname'] = to_str($_POST['site_users_surname']);
   $external_propertys['site_users_patronymic'] = to_str($_POST['site_users_patronymic']);
   $external_propertys['site_users_email'] = to_str($_POST['site_users_email']);
   $external_propertys['site_users_phone'] = to_str($_POST['site_users_phone']);
   $external_propertys['site_users_fax']   = to_str($_POST['site_users_fax']);
   $external_propertys['site_users_address'] = to_str($_POST['site_users_address']);
   $external_propertys['site_users_company'] = to_str($_POST['site_users_company']);

   $shop->ShowCart($shop_id, $site_users_id, to_str($GLOBALS['LA']['xsl_cart']), array('shop_coupon_text' => to_str($_REQUEST['shop_coupon_text'])), $external_propertys);

   if (class_exists("SiteUsers") && $site_users_id === 0)
   {
      /* Выводим форму быстрой регистрации (регистрация для пользователей) */
      $GLOBALS['external_propertys']['ПоказатьАвторизацию'] = 'true';
      $SiteUsers->ShowSiteUserRegistartion($site_users_id,
      to_str($GLOBALS['LA']['xsl_quick_registration']), $GLOBALS['external_propertys']);
   }
}
else
{
   ?>
Вам необходимо подтвердить регистрацию!
   <?php
}

?>

После этого для данной типовой динамической страницы необходимо добавить новый параметр с именем переменной min_sum_order. Затем в "Структуре сайта" нужно отредактировать узел, соответствующий корзине, и ввести в появившееся поле значение минимальной суммы заказа.
#
Re: Минимальная сумма заказ
natalya писал(а):
обновите код типовой динамической страницы «Интернет-магазин корзина» на этот


Я можно конкретно подсказать, что именно поменять. или добавить?

Просто у меня там много чего уже добавлено... (к примеру: вычисление товара новинки в каталоге.) Боюсь не помню чего ещё, и если я поменяю... мало-ли что слетит...
Модератор
#
Re: Минимальная сумма заказ
kvasiliy,
фрагменты выделены жирным.
#
Re: Минимальная сумма заказ
natalya писал(а):
$print_sum = 10000;


если я правильно понимаю где-то тут задаётся минимальная сумма заказа, и во всех корзинах использующих этот код будет минимальная сумма заказа 10 000. (можно конечно поменять...)

Тогда параметр с именем переменной min_sum_order будет лишним..?
#
Re: Минимальная сумма заказ
На самом деле, в двух местах ТДС где встречается число 10000 надо бы поставить какую-нибудь переменную $min_sum_order, которую перед этим вычислить как
$min_sum_order = to_int($GLOBALS['LA']['min_sum_order'])
, а потом для каждого магазина задавать минимальную сумму заказа через редактирование соответствующего узла структуры.
Это будет гораздо правильнее чем такой жесткий хардкод в ТДС.
Заказов не беру. Консультирую редко.
#
Re: Минимальная сумма заказ
а можно сделать чтобы мин. сумма указывалась для определенного региона/страны?
после того как в "адрес доставки" покупатель укажет "китай" и на след этапе у него появится предупреждение о мин заказе, а для тех у кого не стоит ограничение то появится "способ доставки"
как такое реализовать?
#
Re: Минимальная сумма заказ
Где-нибудь перед
$shop->ShowTypeOfDelivery($shop_id, $country, $location, $city, $city_area, $a_param['weight'], $a_param['price'],
      to_str($GLOBALS['LA']['xsl_shop_delivery']), $param, $external_propertys);
вставить условие, которое проверяет код страны, переданный из формы "адрес доставки" и если он равен коду Китая, то проверить сумму заказа и если она меньше необходимой то вывести предупреждение, а если больше или равна то перейти как раз к процитированному мной фрагменту кода.
Заказов не беру. Консультирую редко.
#
Re: Минимальная сумма заказ
Kotoff, спс, но самому такое не осилить
#
Re: Минимальная сумма заказ
Вроде бы все правильно сделал, но с этим кодом корзина вообще не отображается. В параметрах страницы какой тип выбрать?
iNikSite - дизайн и фронтенд разработка
#
Re: Минимальная сумма заказ
Предлагаю иной вариант, который я у себя реализовал.
Я просто спрятал кнопку "оформить заказ" и вывел сообщение о, том что сумма заказа менее минимальной.
Находим в шаблоне корзины:

<div class="gray_button">
        <div>
             <input name="step_1" value="Оформить заказ" type="submit" style="font-weight: bold"/>
        </div>
</div>


и преобразовываем его до состояния:


<xsl:if test="total_sum_without_discount &lt; 200">
    <p><h2>Заказ не может быть обработан, так как сумма вашего заказа менее 200р. </h2></p>
</xsl:if>

<xsl:if test="total_sum_without_discount &gt; 200">
    <div class="gray_button">
   <div>
   <input name="step_1" value="Оформить заказ" type="submit" style="font-weight: bold"/>
   </div>
    </div>
</xsl:if>

Получается что при сумме заказа без скидки менее 200 рублей выводится надпись "Заказ не может быть обработан, так как сумма вашего заказа менее 200р.", а если сумма заказа больше то выводится кнопка "Оформить заказ".
Авторизация