Я думал об этой возможности, но она не подходит: во-первых, "сначала деньги а потом стулья" (деньги списываются раньше чем доставляется товар - меня это не устраивает, т.к. до "доставки" состав заказа может меняться и отменяться сам заказ, а клиент должен видеть свой счет "кредитовый" и он должен быть честным); во-вторых, будет путаница с последующими расчетами.
Я нашел решение, все в том же обработчике события OnSaleDeliveryOrder, написал свой код (выкинул ненужное из стандартной функции CSaleUserAccount::Pay):
//в файле /bitrix/php_interface/init.php
не судите строго, чистил не очень тщательно
Я нашел решение, все в том же обработчике события 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; } } |
не судите строго, чистил не очень тщательно