Пример #1
0
 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);
 }
Пример #2
0
 /**
  * <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>
  * &lt;?
  * // Снимем с рублевого счета текущего пользователя 3 рубля в счет оплаты заказа номер 21
  * $bSuccessPayment = CSaleUserAccount::Pay(
  *         $USER-&gt;GetID(),
  *         3,
  *         "RUR",
  *         21,
  *         False
  *     );
  * if ($bSuccessPayment)
  *     echo "Сумма для оплаты счета успешно снята";
  * ?&gt;
  * </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;
 }