Esempio n. 1
0
 function NextPayment($ID)
 {
     global $DB;
     global $USER;
     $ID = IntVal($ID);
     if ($ID <= 0) {
         $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SKGR_NO_RECID"), "NO_RECORD_ID");
         return False;
     }
     $arRecur = CSaleRecurring::GetByID($ID);
     if (!$arRecur) {
         $GLOBALS["APPLICATION"]->ThrowException(str_replace("#ID#", $ID, GetMessage("SKGR_NO_RECID1")), "NO_RECORD");
         return False;
     }
     $arOrder = CSaleOrder::GetByID($arRecur["ORDER_ID"]);
     if (!$arOrder) {
         $GLOBALS["APPLICATION"]->ThrowException(str_replace("#ID#", $arRecur["ORDER_ID"], GetMessage("SKGR_NO_ORDER1")), "NO_ORDER");
         return False;
     }
     $bSuccess = True;
     $newOrderID = IntVal($arRecur["ORDER_ID"]);
     /** @var $productProvider IBXSaleProductProvider */
     if ($productProvider = CSaleBasket::GetProductProvider($arRecur)) {
         $arProduct = $productProvider::RecurringOrderProduct(array("PRODUCT_ID" => $arRecur["PRODUCT_ID"], "USER_ID" => $arOrder["USER_ID"]));
     } else {
         $arProduct = CSaleRecurring::ExecuteCallbackFunction($arRecur["CALLBACK_FUNC"], $arRecur["MODULE"], $arRecur["PRODUCT_ID"], $arOrder["USER_ID"]);
     }
     if (!$arProduct || !is_array($arProduct) || empty($arProduct)) {
         CSaleRecurring::CancelRecurring($arRecur["ID"], "Y", "Product is not found");
         return true;
     }
     if ($arProduct["WITHOUT_ORDER"] == "Y" || $arRecur["SUCCESS_PAYMENT"] == "Y") {
         $baseSiteCurrency = CSaleLang::GetLangCurrency($arOrder["LID"]);
         $productPrice = \Bitrix\Sale\PriceMaths::roundPrecision(CCurrencyRates::ConvertCurrency($arProduct["PRICE"], $arProduct["CURRENCY"], $baseSiteCurrency));
         // Delivery
         $deliveryPrice = 0;
         $deliveryID = 0;
         $arOrder["DELIVERY_ID"] = IntVal($arOrder["DELIVERY_ID"]);
         if ($arOrder["DELIVERY_ID"] > 0) {
             $deliveryLocation = 0;
             $dbOrderPropValues = CSaleOrderPropsValue::GetList(array(), array("ORDER_ID" => $arRecur["ORDER_ID"], "PROP_IS_LOCATION" => "Y"), false, false, array("VALUE"));
             if ($arOrderPropValues = $dbOrderPropValues->Fetch()) {
                 $deliveryLocation = IntVal($arOrderPropValues["VALUE"]);
             }
             $dbDelivery = CSaleDelivery::GetList(array("SORT" => "ASC", "NAME" => "ASC"), array("LID" => $arOrder["LID"], "WEIGHT" => DoubleVal($arProduct["WEIGHT"]) * DoubleVal($arProduct["QUANTITY"]), "ORDER_PRICE" => $productPrice * DoubleVal($arProduct["QUANTITY"]), "ACTIVE" => "Y", "LOCATION" => $deliveryLocation));
             while ($arDelivery = $dbDelivery->Fetch()) {
                 $deliveryPriceTmp = \Bitrix\Sale\PriceMaths::roundPrecision(CCurrencyRates::ConvertCurrency($arDelivery["PRICE"], $arDelivery["CURRENCY"], $baseSiteCurrency));
                 if (IntVal($arDelivery["ID"]) == $arOrder["DELIVERY_ID"]) {
                     $deliveryID = IntVal($arDelivery["ID"]);
                     $deliveryPrice = $deliveryPriceTmp;
                     break;
                 }
                 if ($deliveryPriceTmp < $deliveryPrice || $deliveryID <= 0) {
                     $deliveryID = IntVal($arDelivery["ID"]);
                     $deliveryPrice = $deliveryPriceTmp;
                 }
             }
             if ($deliveryID <= 0) {
                 $deliveryID = \Bitrix\Sale\Delivery\Services\EmptyDeliveryService::getEmptyDeliveryServiceId();
                 if ($deliveryID > 0) {
                     $deliveryID = \CSaleDelivery::getCodeById($deliveryID);
                 }
             }
             if ($deliveryID <= 0) {
                 $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SKGR_NO_DELIVERY"), "NO_DELIVERY");
                 return False;
             }
         }
         // Sale discounts
         $discount = 0;
         $discountPrice = $productPrice;
         $discountProduct = 0;
         $dbDiscount = CSaleDiscount::GetList(array("SORT" => "ASC"), array("LID" => $arOrder["LID"], "ACTIVE" => "Y", "!>ACTIVE_FROM" => Date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL"))), "!<ACTIVE_TO" => Date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL"))), "<=PRICE_FROM" => $productPrice, ">=PRICE_TO" => $productPrice, "USER_GROUPS" => $USER->GetUserGroup($arOrder['USER_ID'])));
         if ($arDiscount = $dbDiscount->Fetch()) {
             if ($arDiscount["DISCOUNT_TYPE"] == "P") {
                 $discountProduct = \Bitrix\Sale\PriceMaths::roundPrecision($productPrice * $arDiscount["DISCOUNT_VALUE"] / 100);
                 $discount = \Bitrix\Sale\PriceMaths::roundPrecision($discountProduct * DoubleVal($arProduct["QUANTITY"]));
                 // Changed by Sigurd, 2007-08-16
                 $discountPrice = $productPrice - $discountProduct;
             } else {
                 $discountValue = CCurrencyRates::ConvertCurrency($arDiscount["DISCOUNT_VALUE"], $arDiscount["CURRENCY"], $baseSiteCurrency);
                 $discountValue = \Bitrix\Sale\PriceMaths::roundPrecision($discountValue);
                 $discountProduct = \Bitrix\Sale\PriceMaths::roundPrecision(1.0 * $discountValue / DoubleVal($arProduct["QUANTITY"]));
                 // Changed by Sigurd, 2007-08-16
                 $discount = \Bitrix\Sale\PriceMaths::roundPrecision($curDiscount * DoubleVal($arProduct["QUANTITY"]));
                 $discountPrice = $productPrice - $discountProduct;
             }
         }
         $bUseVat = false;
         $vatRate = 0;
         if (DoubleVal($arProduct["VAT_RATE"]) > 0) {
             $bUseVat = true;
             $vatRate = $arProduct["VAT_RATE"];
         }
         // Tax
         $arTaxExempt = array();
         $dbUserGroups = CUser::GetUserGroupEx($arOrder["USER_ID"]);
         while ($arUserGroups = $dbUserGroups->Fetch()) {
             $dbTaxExemptTmp = CSaleTax::GetExemptList(array("GROUP_ID" => $arUserGroups["GROUP_ID"]));
             while ($arTaxExemptTmp = $dbTaxExemptTmp->Fetch()) {
                 $arTaxExemptTmp["TAX_ID"] = IntVal($arTaxExemptTmp["TAX_ID"]);
                 if (!in_array($arTaxExemptTmp["TAX_ID"], $arTaxExempt)) {
                     $arTaxExempt[] = $arTaxExemptTmp["TAX_ID"];
                 }
             }
         }
         $taxPrice = 0;
         $taxVatPrice = 0;
         if (!$bUseVat) {
             $taxLocation = 0;
             $dbOrderPropValues = CSaleOrderPropsValue::GetList(array(), array("ORDER_ID" => $arRecur["ORDER_ID"], "PROP_IS_LOCATION4TAX" => "Y"), false, false, array("VALUE"));
             if ($arOrderPropValues = $dbOrderPropValues->Fetch()) {
                 $taxLocation = IntVal($arOrderPropValues["VALUE"]);
             }
             $arTaxList = array();
             $dbTaxRateTmp = CSaleTaxRate::GetList(array("APPLY_ORDER" => "ASC"), array("LID" => $arOrder["LID"], "PERSON_TYPE_ID" => $arOrder["PERSON_TYPE_ID"], "ACTIVE" => "Y", "LOCATION" => $taxLocation));
             while ($arTaxRateTmp = $dbTaxRateTmp->Fetch()) {
                 if (!in_array(IntVal($arTaxRateTmp["TAX_ID"]), $arTaxExempt)) {
                     $arTaxList[] = $arTaxRateTmp;
                 }
             }
         } else {
             $arTaxList[] = array("ID" => 0, "TAX_NAME" => GetMessage("SKGR_VAT"), "IS_PERCENT" => "Y", "VALUE" => $vatRate * 100, "VALUE_MONEY" => 0, "APPLY_ORDER" => 100, "IS_IN_PRICE" => "Y", "CODE" => "VAT");
         }
         $arTaxSums = array();
         if (!empty($arTaxList)) {
             if (!$bUseVat) {
                 $taxPriceTmp = CSaleOrderTax::CountTaxes($discountPrice * DoubleVal($arProduct["QUANTITY"]), $arTaxList, $baseSiteCurrency);
                 for ($di = 0, $intCount = count($arTaxList); $di < $intCount; $di++) {
                     $arTaxList[$di]["VALUE_MONEY"] += $arTaxList[$di]["TAX_VAL"];
                 }
                 for ($di = 0, $intCount = count($arTaxList); $di < $intCount; $di++) {
                     $arTaxSums[$arTaxList[$di]["TAX_ID"]]["VALUE"] = $arTaxList[$di]["VALUE_MONEY"];
                     $arTaxSums[$arTaxList[$di]["TAX_ID"]]["NAME"] = $arTaxList[$di]["NAME"];
                     if ($arTaxList[$di]["IS_IN_PRICE"] != "Y") {
                         $taxPrice += $arTaxList[$di]["VALUE_MONEY"];
                     }
                 }
             } else {
                 $arTaxList[0]["VALUE_MONEY"] = \Bitrix\Sale\PriceMaths::roundPrecision($discountPrice / ($vatRate + 1) * $vatRate * DoubleVal($arProduct["QUANTITY"]));
                 $taxVatPrice = $arTaxList[0]["VALUE_MONEY"];
             }
         }
         // Changed by Sigurd, 2007-08-16
         $totalOrderPrice = $discountPrice * DoubleVal($arProduct["QUANTITY"]) + $deliveryPrice + $taxPrice;
         $arProduct["WITHOUT_ORDER"] = $arProduct["WITHOUT_ORDER"] == "Y" ? "Y" : "N";
         if ($arProduct["WITHOUT_ORDER"] == "N") {
             $DB->StartTransaction();
             // Saving
             $arSaleUser = CSaleUser::GetList(array(), array("USER_ID" => $arOrder["USER_ID"]));
             if (!empty($arSaleUser)) {
                 $currentFUser = $arSaleUser["ID"];
             } else {
                 $currentFUser = CSaleUser::_Add(array("=DATE_INSERT" => $DB->GetNowFunction(), "=DATE_UPDATE" => $DB->GetNowFunction(), "USER_ID" => $arOrder["USER_ID"]));
             }
             $arFields = array("FUSER_ID" => $currentFUser, "PRODUCT_ID" => $arProduct["PRODUCT_ID"], "PRODUCT_NAME" => $arProduct["PRODUCT_NAME"], "PRODUCT_URL" => $arProduct["PRODUCT_URL"], "PRODUCT_PRICE_ID" => $arProduct["PRODUCT_PRICE_ID"], "PRICE" => $arProduct["PRICE"], "CURRENCY" => $arProduct["CURRENCY"], "WEIGHT" => $arProduct["WEIGHT"], "QUANTITY" => $arProduct["QUANTITY"], "LID" => $arOrder["LID"], "DELAY" => "N", "CAN_BUY" => "Y", "NAME" => $arProduct["NAME"], "CALLBACK_FUNC" => $arProduct["CALLBACK_FUNC"], "ORDER_CALLBACK_FUNC" => $arProduct["ORDER_CALLBACK_FUNC"], "CANCEL_CALLBACK_FUNC" => $arProduct["CANCEL_CALLBACK_FUNC"], "PAY_CALLBACK_FUNC" => $arProduct["PAY_CALLBACK_FUNC"], "PRODUCT_PROVIDER_CLASS" => $arProduct["PRODUCT_PROVIDER_CLASS"], "MODULE" => $arRecur["MODULE"], "NOTES" => $arProduct["CATALOG_GROUP_NAME"], "DETAIL_PAGE_URL" => $arProduct["DETAIL_PAGE_URL"], "VATE_RATE" => $arProduct["VATE_RATE"], "PRODUCT_XML_ID" => $arProduct["PRODUCT_XML_ID"], "TYPE" => $arProduct["TYPE"], "RENEWAL" => "Y");
             $basketID = CSaleBasket::Add($arFields);
             $basketID = IntVal($basketID);
             if ($basketID <= 0) {
                 $bSuccess = False;
             }
             if ($bSuccess) {
                 if (CModule::IncludeModule("statistic")) {
                     CStatistic::Set_Event("eStore", "add2basket", $arFields["PRODUCT_ID"]);
                 }
                 $arFields = array("LID" => $arOrder["LID"], "PERSON_TYPE_ID" => $arOrder["PERSON_TYPE_ID"], "PAYED" => "N", "CANCELED" => "N", "STATUS_ID" => "N", "PRICE_DELIVERY" => $deliveryPrice, "ALLOW_DELIVERY" => "N", "PRICE" => $totalOrderPrice, "CURRENCY" => $baseSiteCurrency, "DISCOUNT_VALUE" => $discount, "USER_ID" => $arOrder["USER_ID"], "PAY_SYSTEM_ID" => $arOrder["PAY_SYSTEM_ID"], "DELIVERY_ID" => $deliveryID, "USER_DESCRIPTION" => $arOrder["USER_DESCRIPTION"], "TAX_VALUE" => $bUseVat ? $taxVatPrice : $taxPrice, "STAT_GID" => $arOrder["STAT_GID"], "RECURRING_ID" => $arRecur["ID"]);
                 $newOrderID = CSaleOrder::Add($arFields);
                 $newOrderID = IntVal($newOrderID);
                 if ($newOrderID <= 0) {
                     $bSuccess = False;
                 }
             }
             if ($bSuccess) {
                 $arDiscounts = array();
                 $arDiscounts[$basketID] = $discountProduct;
                 CSaleBasket::OrderBasket($newOrderID, $currentFUser, $arOrder["LID"], $arDiscounts);
             }
             if ($bSuccess) {
                 for ($it = 0, $intCount = count($arTaxList); $it < $intCount; $it++) {
                     $arFields = array("ORDER_ID" => $newOrderID, "TAX_NAME" => $arTaxList[$it]["TAX_NAME"], "IS_PERCENT" => $arTaxList[$it]["IS_PERCENT"], "VALUE" => $arTaxList[$it]["IS_PERCENT"] == "Y" ? $arTaxList[$it]["VALUE"] : RoundEx(CCurrencyRates::ConvertCurrency($arTaxList[$it]["VALUE"], $arTaxList[$it]["CURRENCY"], $baseSiteCurrency), 2), "VALUE_MONEY" => $arTaxList[$it]["VALUE_MONEY"], "APPLY_ORDER" => $arTaxList[$it]["APPLY_ORDER"], "IS_IN_PRICE" => $arTaxList[$it]["IS_IN_PRICE"], "CODE" => $arTaxList[$it]["CODE"]);
                     CSaleOrderTax::Add($arFields);
                 }
                 $dbOrderPropValues = CSaleOrderPropsValue::GetList(array(), array("ORDER_ID" => $arRecur["ORDER_ID"]), false, false, array("ORDER_PROPS_ID", "NAME", "CODE", "VALUE", "PROP_IS_PAYER", "PROP_IS_EMAIL"));
                 while ($arOrderPropValues = $dbOrderPropValues->Fetch()) {
                     $arFields = array("ORDER_ID" => $newOrderID, "ORDER_PROPS_ID" => $arOrderPropValues["ORDER_PROPS_ID"], "NAME" => $arOrderPropValues["NAME"], "CODE" => $arOrderPropValues["CODE"], "VALUE" => $arOrderPropValues["VALUE"]);
                     CSaleOrderPropsValue::Add($arFields);
                     if ($arOrderPropValues["PROP_IS_PAYER"] == "Y") {
                         $payerName = $arOrderPropValues["VALUE"];
                     }
                     if ($arOrderPropValues["PROP_IS_EMAIL"] == "Y") {
                         $payerEMail = $arOrderPropValues["VALUE"];
                     }
                 }
             }
             if ($bSuccess) {
                 if (CModule::IncludeModule("statistic")) {
                     CStatistic::Set_Event("eStore", "order_create", $newOrderID);
                 }
             }
             if ($bSuccess) {
                 $strOrderList = "";
                 $dbBasketTmp = CSaleBasket::GetList(array("NAME" => "ASC"), array("ORDER_ID" => $newOrderID));
                 while ($arBasketTmp = $dbBasketTmp->Fetch()) {
                     $strOrderList .= $arBasketTmp["NAME"] . " - " . $arBasketTmp["QUANTITY"] . " " . GetMessage("SALE_QUANTITY_UNIT");
                     $strOrderList .= "\n";
                 }
                 if (strlen($payerName) <= 0 || strlen($payerEMail) <= 0) {
                     $dbUser = CUser::GetByID($arOrder["USER_ID"]);
                     if ($arUser = $dbUser->Fetch()) {
                         if (strlen($payerName) <= 0) {
                             $payerName = $arUser["NAME"] . (strlen($arUser["NAME"]) <= 0 || strlen($arUser["LAST_NAME"]) <= 0 ? "" : " ") . $arUser["LAST_NAME"];
                         }
                         if (strlen($payerEMail) <= 0) {
                             $payerEMail = $arUser["EMAIL"];
                         }
                     }
                 }
                 $arFields = array("ORDER_ID" => $newOrderID, "ORDER_DATE" => Date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT", $arOrder["LID"]))), "ORDER_USER" => $payerName, "PRICE" => SaleFormatCurrency($totalOrderPrice, $baseSiteCurrency), "BCC" => COption::GetOptionString("sale", "order_email", "order@" . $SERVER_NAME), "EMAIL" => $payerEMail, "ORDER_LIST" => $strOrderList, "SALE_EMAIL" => COption::GetOptionString("sale", "order_email", "order@" . $SERVER_NAME));
                 $eventName = "SALE_NEW_ORDER_RECURRING";
                 $bSend = true;
                 foreach (GetModuleEvents("sale", "OnOrderRecurringSendEmail", true) as $arEvent) {
                     if (ExecuteModuleEventEx($arEvent, array($newOrderID, &$eventName, &$arFields)) === false) {
                         $bSend = false;
                     }
                 }
                 if ($bSend) {
                     $event = new CEvent();
                     $event->Send($eventName, $arOrder["LID"], $arFields, "N");
                 }
             }
             if ($bSuccess) {
                 $DB->Commit();
             } else {
                 $DB->Rollback();
             }
         }
     } else {
         $totalOrderPrice = $arOrder["PRICE"];
         $baseSiteCurrency = $arOrder["CURRENCY"];
     }
     $res = False;
     if ($bSuccess) {
         $res = CSaleUserAccount::Pay($arOrder["USER_ID"], $totalOrderPrice, $baseSiteCurrency, $newOrderID, True);
         if ($res) {
             if ($arProduct["WITHOUT_ORDER"] == "N") {
                 CSaleOrder::PayOrder($newOrderID, "Y", False, False, $arRecur["ID"]);
                 CSaleOrder::DeliverOrder($newOrderID, "Y", $arRecur["ID"]);
                 CSaleOrder::DeductOrder($newOrderID, "Y", "", true, array(), $arRecur["ID"]);
             } else {
                 /** @var $productProvider IBXSaleProductProvider */
                 if ($productProvider = CSaleBasket::GetProductProvider($arProduct)) {
                     $r = $productProvider::DeliverProduct(array("PRODUCT_ID" => $arProduct["PRODUCT_ID"], "USER_ID" => $arOrder["USER_ID"], "PAID" => true, 'BASKET_ID' => $basketID));
                 } else {
                     $r = CSaleBasket::ExecuteCallbackFunction($arProduct["PAY_CALLBACK_FUNC"], $arRecur["MODULE"], $arProduct["PRODUCT_ID"], $arOrder["USER_ID"], true);
                 }
             }
             $arFields = array("ORDER_ID" => $newOrderID, "PRODUCT_NAME" => $arProduct["PRODUCT_NAME"], "PRODUCT_URL" => $arProduct["PRODUCT_URL"], "PRICE_TYPE" => $arProduct["PRICE_TYPE"], "RECUR_SCHEME_TYPE" => $arProduct["RECUR_SCHEME_TYPE"], "RECUR_SCHEME_LENGTH" => $arProduct["RECUR_SCHEME_LENGTH"], "WITHOUT_ORDER" => $arProduct["WITHOUT_ORDER"], "PRIOR_DATE" => Date($GLOBALS["DB"]->DateFormatToPHP(CLang::GetDateFormat("FULL", SITE_ID))), "NEXT_DATE" => $arProduct["NEXT_DATE"], "REMAINING_ATTEMPTS" => Defined("SALE_PROC_REC_ATTEMPTS") ? SALE_PROC_REC_ATTEMPTS : 3, "SUCCESS_PAYMENT" => "Y");
             CSaleRecurring::Update($arRecur["ID"], $arFields);
         } else {
             $arFields = array("ORDER_ID" => $newOrderID, "PRODUCT_NAME" => $arProduct["PRODUCT_NAME"], "PRODUCT_URL" => $arProduct["PRODUCT_URL"], "PRICE_TYPE" => $arProduct["PRICE_TYPE"], "RECUR_SCHEME_LENGTH" => $arProduct["RECUR_SCHEME_LENGTH"], "RECUR_SCHEME_TYPE" => $arProduct["RECUR_SCHEME_TYPE"], "WITHOUT_ORDER" => $arProduct["WITHOUT_ORDER"], "NEXT_DATE" => Date($GLOBALS["DB"]->DateFormatToPHP(CLang::GetDateFormat("FULL", SITE_ID)), time() + SALE_PROC_REC_TIME + CTimeZone::GetOffset()), "REMAINING_ATTEMPTS" => IntVal($arRecur["REMAINING_ATTEMPTS"]) - 1, "SUCCESS_PAYMENT" => "N");
             CSaleRecurring::Update($arRecur["ID"], $arFields);
             if (IntVal($arRecur["REMAINING_ATTEMPTS"]) - 1 <= 0) {
                 CSaleRecurring::CancelRecurring($arRecur["ID"], "Y", "Can't pay order");
                 /*
                 $arFields["CANCELED"] = "Y";
                 $arFields["DATE_CANCELED"] = Date(CDatabase::DateFormatToPHP(CLang::GetDateFormat("FULL", LANG)));
                 $arFields["CANCELED_REASON"] = "Can't pay order";
                 */
             }
         }
     }
     return $res;
 }
 public function processAdditionalInfoShipmentEdit(Shipment $shipment, array $requestData)
 {
     if (empty($requestData['REQUEST_SELF']) || $requestData['REQUEST_SELF'] != 'Y') {
         return null;
     }
     $shipmentId = $shipment->getId();
     if (intval($shipmentId) <= 0) {
         return null;
     }
     $dt = new \Bitrix\Main\Type\DateTime();
     $arResult = CSaleDeliveryHandler::executeAction(\CSaleDelivery::getCodeById($shipment->getDeliveryId()), 'REQUEST_SELF', \CAllSaleDelivery::convertOrderNewToOld($shipment));
     if (!$arResult) {
         return null;
     }
     $res = \Bitrix\Sale\Internals\OrderDeliveryReqTable::add(array("SHIPMENT_ID" => $shipmentId, "ORDER_ID" => $shipment->getCollection()->getOrder()->getId(), "DATE_REQUEST" => $dt, "PARAMS" => array("TYPE" => "REQUEST_SELF", "RESULT" => $arResult)));
     if (!$res->isSuccess()) {
         return null;
     }
     if (isset($arResult["TRACKING_NUMBER"])) {
         $shipment->setField("TRACKING_NUMBER", $arResult["TRACKING_NUMBER"]);
     }
     if (isset($arResult["DELIVERY_DOC_NUM"])) {
         $shipment->setField("DELIVERY_DOC_NUM", $arResult["DELIVERY_DOC_NUM"]);
         $shipment->setField("DELIVERY_DOC_DATE", $dt);
     }
     return $shipment;
 }
 public static function GetList($arFilter = array(), $arGroupBy = false, $arSelectFields = array())
 {
     $params = array();
     if (is_array($arFilter) && !empty($arFilter)) {
         if (isset($arFilter["DELIVERY_ID"]) || $arFilter["DELIVERY_PROFILE_ID"]) {
             $ids = self::convertDeliveryIds(isset($arFilter["DELIVERY_ID"]) ? $arFilter["DELIVERY_ID"] : array(), isset($arFilter["DELIVERY_PROFILE_ID"]) ? $arFilter["DELIVERY_PROFILE_ID"] : array());
             if (!empty($ids)) {
                 $arFilter["=DELIVERY_ID"] = $ids;
             }
             unset($arFilter["DELIVERY_ID"]);
             unset($arFilter["DELIVERY_PROFILE_ID"]);
         }
         if (isset($arFilter["PAYSYSTEM_ID"])) {
             $arFilter["=PAYSYSTEM_ID"] = $arFilter["PAYSYSTEM_ID"];
             unset($arFilter["PAYSYSTEM_ID"]);
         }
         $params['filter'] = $arFilter;
     }
     //todo:
     if (is_array($arGroupBy) && !empty($arGroupBy)) {
         $params['group'] = array_intersect($arGroupBy, array("DELIVERY_ID", "PAYSYSTEM_ID"));
     }
     $params["select"] = array("DELIVERY_ID", "PAYSYSTEM_ID", "LINK_DIRECTION");
     $deliveryChildrenList = self::getDeliveryChildrenList();
     $records = array();
     $res = DeliveryPaySystemTable::getList($params);
     $restricted = array('D' => array(), 'P' => array());
     while ($record = $res->fetch()) {
         if ($record['LINK_DIRECTION'] == 'D') {
             if (!in_array($record["DELIVERY_ID"], $restricted['D'])) {
                 $restricted['D'][] = $record["DELIVERY_ID"];
             }
         } elseif ($record['LINK_DIRECTION'] == 'P') {
             if (!in_array($record["DELIVERY_ID"], $restricted['P'])) {
                 $restricted['P'][] = $record["PAYSYSTEM_ID"];
             }
         }
         $deliveryId = $record["DELIVERY_ID"];
         $linkDirection = $record["LINK_DIRECTION"];
         unset($record["LINK_DIRECTION"]);
         $deliveryCode = \CSaleDelivery::getCodeById($record["DELIVERY_ID"]);
         $delivery = CSaleDeliveryHelper::getDeliverySIDAndProfile($deliveryCode);
         $record["DELIVERY_ID"] = $delivery["SID"];
         $record["DELIVERY_PROFILE_ID"] = isset($delivery["PROFILE"]) ? $delivery["PROFILE"] : null;
         $records[] = $record;
         if (!empty($deliveryChildrenList[$deliveryId])) {
             foreach ($deliveryChildrenList[$deliveryId] as $childrenId) {
                 if ($linkDirection == 'D' && !in_array($childrenId, $restricted['D'])) {
                     $restricted['D'][] = $childrenId;
                 }
                 $deliveryCode = \CSaleDelivery::getCodeById($childrenId);
                 $delivery = CSaleDeliveryHelper::getDeliverySIDAndProfile($deliveryCode);
                 $record["DELIVERY_ID"] = $delivery["SID"];
                 $record["DELIVERY_PROFILE_ID"] = isset($delivery["PROFILE"]) ? $delivery["PROFILE"] : null;
                 $records[] = $record;
             }
         }
     }
     foreach (self::getFullDeliveryList() as $dlvId) {
         if (in_array($dlvId, $restricted['D'])) {
             continue;
         }
         $deliveryCode = \CSaleDelivery::getCodeById($dlvId);
         $delivery = CSaleDeliveryHelper::getDeliverySIDAndProfile($deliveryCode);
         $record = array("DELIVERY_ID" => $delivery["SID"], "DELIVERY_PROFILE_ID" => isset($delivery["PROFILE"]) ? $delivery["PROFILE"] : null);
         foreach (self::getFullPaySystemList() as $psId) {
             if (in_array($psId, $restricted['P'])) {
                 continue;
             }
             if (self::isRecordExists($record["DELIVERY_ID"], $record["DELIVERY_PROFILE_ID"], $psId, $records)) {
                 continue;
             }
             $record["PAYSYSTEM_ID"] = $psId;
             $records[] = $record;
         }
     }
     $result = new \CDBResult();
     $result->InitFromArray($records);
     return $result;
 }