Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Магазин с пост оплатой

00 голосов
3
Подскажите если кто сталкивался с подобным.
Задача:
необходимо организовать работу магазина с пост оплатой, после доставки товаров. Клиенты постоянные - имеют счета в магазине. Нужно чтоб после доставки заказа его стоимость добавлялась в счет клиента "в минус", а расчет с клиентом производился после за несколько заказов, на пример, раз в месяц. Моя идея - на обработчик события OnSaleDeliveryOrder подцепить CSaleOrder::PayOrder.

в файле /bitrix/php_interface/init.php

AddEventHandler("sale", "OnSaleDeliveryOrder", Array("MyClass", "MyOnSaleDeliveryOrder"));

// обработчик события
class MyClass
{
function MyOnSaleDeliveryOrder($ID, $val)
{
if (!CSaleOrder::PayOrder($ID, $val, True, False, 0, array()))
{
echo "Ошибка обновления заказа";
}
}
}

Но, что то не получается, подозреваю, из-за того, что счет клиента в магазине не может быть отрицательным.
спросил 24 Июнь, 13 от KateStern (200 баллов)

3 Ответы

00 голосов
Может кто то видел подобное решение или есть другие идеи?
ответил 24 Июнь, 13 от KateStern (200 баллов)
00 голосов
В штатном компоненте bitrix:sale.order.full есть возможность оплаты с личного счёта.
Может, просто в начале месяца зачислять на личные счета какую-то сумму, а в конце месяца смотреть, сколько с личного счёта было списано?
ответил 18 Июль, 13 от Ly (4,580 баллов)
00 голосов
Я думал об этой возможности, но она не подходит: во-первых, "сначала деньги а потом стулья" (деньги списываются раньше чем доставляется товар - меня это не устраивает, т.к. до "доставки" состав заказа может меняться и отменяться сам заказ, а клиент должен видеть свой счет "кредитовый" и он должен быть честным); во-вторых, будет путаница с последующими расчетами.

Я нашел решение, все в том же обработчике события OnSaleDeliveryOrder, написал свой код (выкинул ненужное из стандартной функции CSaleUserAccount::Pay):
//в файле /bitrix/php_interface/init.php
Код
// регистрируем обработчик
AddEventHandler("sale", "OnSaleDeliveryOrder", Array("MyClassSaleDeliveryOrder", "MyOnSaleDeliveryOrder")); 
// обработчик события
class MyClassSaleDeliveryOrder
{
   function MyOnSaleDeliveryOrder($ID, $val)
   { 
   global $DB;
      $arOrder = CSaleOrder::GetByID($ID);
      if (!$arOrder)
      {
         $GLOBALS["APPLICATION"]->ThrowException(str_replace("#ID#", $ID, GetMessage("SKGO_NO_ORDER")), "NO_ORDER");
         return False;
      }
      if ($arOrder["PAYED"] == $val)
      {
         $GLOBALS["APPLICATION"]->ThrowException(str_replace("#ID#", $ID, GetMessage("SKGO_DUB_PAY")), "ALREADY_FLAG");
         return False;
      }
      
      $errorCode = "";
      $userID = $arOrder["USER_ID"];
      $userID = IntVal($userID);
      if ($userID <= 0)
      {
         $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SKGU_EMPTY_USER_ID"), "EMPTY_USER_ID");
         return False;
      }
      $paySum = $arOrder["PRICE"];
      $paySum = str_replace(",", ".", $paySum);
      $paySum = DoubleVal($paySum);
      if ($paySum <= 0)
      {
         $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SKGU_EMPTY_SUM"), "EMPTY_SUM");
         return False;
      }
      $payCurrency = $arOrder["CURRENCY"];
      $payCurrency = Trim($payCurrency);
      if (strlen($payCurrency) <= 0)
      {
         $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SKGU_EMPTY_CURRENCY"), "EMPTY_CURRENCY");
         return False;
      }

      $orderID = IntVal($ID);
      $currentBudget = 0.0;
      // Check current user account budget
      $dbUserAccount = CSaleUserAccount::GetList(
            array(),
            array("USER_ID" => $userID, "CURRENCY" => $payCurrency)
         );
      if ($arUserAccount = $dbUserAccount->Fetch())
         $currentBudget = roundEx(DoubleVal($arUserAccount["CURRENT_BUDGET"]), SALE_VALUE_PRECISION);
      
      if ($arUserAccount)
         {
            $arFields = array(
                  "CURRENT_BUDGET" => ($currentBudget - $paySum)
               );
            CSaleUserAccount::Update($arUserAccount["ID"], $arFields);
         }
         else
         {
            $arFields = array(
                  "USER_ID" => $userID,
                  "CURRENT_BUDGET" => ($currentBudget - $paySum),
                  "CURRENCY" => $payCurrency
               );
            CSaleUserAccount::Add($arFields);
         }

         $arFields = array(
               "USER_ID" => $userID,
               "TRANSACT_DATE" => date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL", SITE_ID))),
               "AMOUNT" => $paySum,
               "CURRENCY" => $payCurrency,
               "DEBIT" => "N",
               "ORDER_ID" => (($orderID > 0) ? $orderID : False),
               "DESCRIPTION" => "ORDER_PAY",
               "EMPLOYEE_ID" => ($GLOBALS["USER"]->IsAuthorized() ? $GLOBALS["USER"]->GetID() : False)
            );
         CSaleUserTransact::Add($arFields);

         //CSaleUserAccount::UnLock($userID, $payCurrency);
         return True
ответил 22 Окт, 13 от KateStern (200 баллов)

Похожие вопросы

0 голосов
0 ответов
0 голосов
2 ответов
0 голосов
0 ответов
0 голосов
3 ответов
спросил 17 Март, 14 от Defiance (120 баллов)
0 голосов
3 ответов
спросил 16 Март, 14 от Grimmi (2,560 баллов)