function WithdrawByID($sum, $currency, $ID, $orderID = 0) { $sum = DoubleVal($sum); if ($sum <= 0) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SKGUC_EMPTY_SUM"), "EMPTY_SUM"); return false; } $currency = Trim($currency); if (strlen($currency) <= 0) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SKGUC_EMPTY_CURRENCY"), "EMPTY_SUM_CURRENCY"); return false; } $ID = IntVal($ID); if ($ID <= 0) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SKGUC_EMPTY_ID"), "EMPTY_ID"); return false; } $orderID = IntVal($orderID); $arUserCard = CSaleUserCards::GetByID($ID); if (!$arUserCard) { $GLOBALS["APPLICATION"]->ThrowException(str_replace("#ID#", $ID, GetMessage("SKGUC_NO_RECID")), "NO_RECORD"); return false; } return CSaleUserCards::Withdraw($sum, $currency, $arUserCard, $orderID); }
/** * <p>Метод снимает указанную сумму с внутреннего счета пользователя. Если на внутреннем счете не достаточно средств, то делается попытка снять дополнительные средства с пластиковой карточки пользователя. Метод динамичный.</p> * * * @param int $userID Код пользователя. </h * * @param double $paySum Снимаемая сумма. * * @param string $payCurrency Валюта снимаемой суммы. * * @param $int Код заказа, если снятие денег относится к заказу. * * @param orderI $D = 0[ Если <i>true</i>, то система пробует снять деньги с пластиковой карты * пользователя при недостаточности средств на внутреннем счете. * Если <i>false</i>, то пластиковая карта пользователя не задействуется. * * @param bool $useCC = True]] * * @return bool <p>Метод возвращает <i>true</i> в случае успешного снятия денег с * внутреннего счета пользователя и <i>false</i> в случае невозможности * снять указанную сумму.</p> <p></p><div class="note"> <b>Примечание</b>: деньги * снимаются только со счета той же валюты, которая передается * параметром в метод. Счета пользователя в другой валюте не * затрагиваются.</div> <a name="examples"></a> * * <h4>Example</h4> * <pre> * <? * // Снимем с рублевого счета текущего пользователя 3 рубля в счет оплаты заказа номер 21 * $bSuccessPayment = CSaleUserAccount::Pay( * $USER->GetID(), * 3, * "RUR", * 21, * False * ); * if ($bSuccessPayment) * echo "Сумма для оплаты счета успешно снята"; * ?> * </pre> * * * @static * @link http://dev.1c-bitrix.ru/api_help/sale/classes/csaleuseraccount/csaleuseraccount.pay.php * @author Bitrix */ public static function Pay($userID, $paySum, $payCurrency, $orderID = 0, $useCC = True, $paymentId = null) { global $DB; $errorCode = ""; $userID = IntVal($userID); if ($userID <= 0) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SKGU_EMPTY_USER_ID"), "EMPTY_USER_ID"); return False; } $paySum = str_replace(",", ".", $paySum); $paySum = DoubleVal($paySum); if ($paySum <= 0) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SKGU_EMPTY_SUM"), "EMPTY_SUM"); return False; } $payCurrency = Trim($payCurrency); if (strlen($payCurrency) <= 0) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SKGU_EMPTY_CURRENCY"), "EMPTY_CURRENCY"); return False; } $orderID = IntVal($orderID); $paymentId = IntVal($paymentId); $useCC = $useCC ? True : False; if (!CSaleUserAccount::Lock($userID, $payCurrency)) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SKGU_ERROR_LOCK"), "ACCOUNT_NOT_LOCKED"); return False; } $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); } $withdrawSum = 0; if ($currentBudget < $paySum && $useCC) { $payOverdraft = $paySum - $currentBudget; // Try to get money from credit cards $bPayed = False; $dbUserCards = CSaleUserCards::GetList(array("SORT" => "ASC"), array("USER_ID" => $userID, "CURRENCY" => $payCurrency, "ACTIVE" => "Y")); while ($arUserCard = $dbUserCards->Fetch()) { if ($withdrawSum = CSaleUserCards::Withdraw($payOverdraft, $payCurrency, $arUserCard, $orderID)) { $bPayed = True; break; } } if (!$bPayed) { $dbUserCards = CSaleUserCards::GetList(array("SORT" => "ASC"), array("USER_ID" => $userID, "CURRENCY" => "", "ACTIVE" => "Y")); while ($arUserCard = $dbUserCards->Fetch()) { if ($withdrawSum = CSaleUserCards::Withdraw($payOverdraft, $payCurrency, $arUserCard, $orderID)) { $bPayed = True; break; } } } if ($bPayed) { $arFields = array("USER_ID" => $userID, "TRANSACT_DATE" => date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL", SITE_ID))), "AMOUNT" => $withdrawSum, "CURRENCY" => $payCurrency, "DEBIT" => "Y", "ORDER_ID" => $orderID > 0 ? $orderID : False, "PAYMENT_ID" => $paymentId > 0 ? $paymentId : False, "DESCRIPTION" => "CC_CHARGE_OFF", "EMPLOYEE_ID" => $GLOBALS["USER"]->IsAuthorized() ? $GLOBALS["USER"]->GetID() : False); CSaleUserTransact::Add($arFields); if ($arUserAccount) { $arFields = array("CURRENT_BUDGET" => $withdrawSum + $currentBudget); CSaleUserAccount::Update($arUserAccount["ID"], $arFields); } else { $arFields = array("USER_ID" => $userID, "CURRENT_BUDGET" => $withdrawSum + $currentBudget, "CURRENCY" => $payCurrency); CSaleUserAccount::Add($arFields); } } } if ($withdrawSum + $currentBudget >= $paySum) { if ($arUserAccount) { $arFields = array("CURRENT_BUDGET" => $withdrawSum + $currentBudget - $paySum); CSaleUserAccount::Update($arUserAccount["ID"], $arFields); } else { $arFields = array("USER_ID" => $userID, "CURRENT_BUDGET" => $withdrawSum + $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, "PAYMENT_ID" => $paymentId > 0 ? $paymentId : False, "DESCRIPTION" => "ORDER_PAY", "EMPLOYEE_ID" => $GLOBALS["USER"]->IsAuthorized() ? $GLOBALS["USER"]->GetID() : False); CSaleUserTransact::Add($arFields); CSaleUserAccount::UnLock($userID, $payCurrency); return True; } CSaleUserAccount::UnLock($userID, $payCurrency); $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SKGU_NO_ENOUGH"), "CANT_PAY"); return False; }