function Update($ID, $arFields) { global $DB; $ID = IntVal($ID); if (!CSaleTaxRate::CheckFields("UPDATE", $arFields)) { return false; } $strUpdate = $DB->PrepareUpdate("b_sale_tax_rate", $arFields); $strSql = "UPDATE b_sale_tax_rate SET " . "\tTIMESTAMP_X = " . $DB->GetNowFunction() . ", " . "\t" . $strUpdate . " " . "WHERE ID = " . $ID . " "; $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__); if (is_set($arFields, "TAX_LOCATION")) { CSaleTaxRate::SetTaxRateLocation($ID, $arFields["TAX_LOCATION"]); } return $ID; }
/** * <p>Метод добавляет новую ставку налога с параметрами из массива arFields. Метод динамичный.</p> * * * @param array $arFields Ассоциативный массив параметров новой ставки налога. Ключами * являются названия параметров ставки, а значениями - * соответствующие значения.<br> Допустимые ключи: <ul> <li> <b>TAX_ID</b> - код * налога;</li> <li> <b>PERSON_TYPE_ID</b> - тип плательщика;</li> <li> <b>VALUE</b> - величина * налога (в процентах);</li> <li> <b>CURRENCY</b> - валюта;</li> <li> <b>IS_PERCENT</b> - * всегда значение "Y";</li> <li> <b>IS_IN_PRICE</b> - налог уже включен в цену * товара;</li> <li> <b>APPLY_ORDER</b> - порядок применения;</li> <li> <b>ACTIVE</b> - флаг * (Y/N) активности налога;</li> <li> <b>TAX_LOCATION</b> - массив для указания * местоположений и групп местоположений, для которых действует эта * ставка. Каждый элемент массива представляет собой ассоциативный * массив с ключами: <ul> <li> <b>LOCATION_ID</b> - код местоположения или группы * местоположений;</li> <li> <b>LOCATION_TYPE</b> - "L" для местоположения и "G" для * группы местоположений.</li> </ul> </li> </ul> * * @return int <p>Возвращается код добавленной ставки налога или <i>false</i> в случае * ошибки.</p> <br><br> * * @static * @link http://dev.1c-bitrix.ru/api_help/sale/classes/csaletaxrate/csaletaxrate__add.40a40d86.php * @author Bitrix */ public static function Add($arFields, $arOptions = array()) { global $DB; if (!CSaleTaxRate::CheckFields("ADD", $arFields)) { return false; } $arInsert = $DB->PrepareInsert("b_sale_tax_rate", $arFields); $strSql = "INSERT INTO b_sale_tax_rate(" . $arInsert[0] . ", TIMESTAMP_X) " . "VALUES(" . $arInsert[1] . ", " . $DB->GetNowFunction() . ")"; $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__); $ID = IntVal($DB->LastID()); if (is_set($arFields, "TAX_LOCATION")) { CSaleTaxRate::SetTaxRateLocation($ID, $arFields["TAX_LOCATION"], $arOptions); } return $ID; }
function Delete($ID) { global $DB; $ID = IntVal($ID); $db_taxrates = CSaleTaxRate::GetList(array(), array("TAX_ID" => $ID)); while ($ar_taxrates = $db_taxrates->Fetch()) { CSaleTaxRate::Delete($ar_taxrates["ID"]); } $DB->Query("DELETE FROM b_sale_tax_exempt2group WHERE TAX_ID = " . $ID . "", true); return $DB->Query("DELETE FROM b_sale_tax WHERE ID = " . $ID . "", true); }
break; case "activate": case "deactivate": $arFields = array("ACTIVE" => $_REQUEST['action'] == "activate" ? "Y" : "N"); if (!CSaleTaxRate::Update($ID, $arFields)) { if ($ex = $APPLICATION->GetException()) { $lAdmin->AddGroupError($ex->GetString(), $ID); } else { $lAdmin->AddGroupError(GetMessage("ERROR_EDIT_TAX_RATE"), $ID); } } break; } } } $dbResultList = CSaleTaxRate::GetList(array($by => $order), $arFilter); $dbResultList = new CAdminResult($dbResultList, $sTableID); $dbResultList->NavStart(); $lAdmin->NavText($dbResultList->GetNavPrint(GetMessage("SALE_TAX_RATE_LIST"))); $lAdmin->AddHeaders(array(array("id" => "ID", "content" => "ID", "sort" => "ID", "default" => true), array("id" => "ACTIVE", "content" => GetMessage("RATE_ACTIVE"), "sort" => "ACTIVE", "default" => true, "align" => "center"), array("id" => "TIMESTAMP_X", "content" => GetMessage("TAX_TIMESTAMP"), "sort" => "TIMESTAMP_X", "default" => true), array("id" => "NAME", "content" => GetMessage("TAX_NAME"), "sort" => "NAME", "default" => true), array("id" => "PERSON_TYPE_ID", "content" => GetMessage("RATE_PERSON_TYPE"), "sort" => "PERSON_TYPE_ID", "default" => true), array("id" => "VALUE", "content" => GetMessage("RATE_VALUE"), "sort" => "", "default" => true), array("id" => "IS_IN_PRICE", "content" => GetMessage("RATE_IS_INPRICE"), "sort" => "IS_IN_PRICE", "default" => true), array("id" => "APPLY_ORDER", "content" => GetMessage("RATE_APPLY_ORDER"), "sort" => "APPLY_ORDER", "default" => true))); $arVisibleColumns = $lAdmin->GetVisibleHeaderColumns(); $arPersonTypeList = array(); $dbPersonType = CSalePersonType::GetList(array("SORT" => "ASC", "NAME" => "ASC"), array()); while ($arPersonType = $dbPersonType->Fetch()) { $arPersonTypeList[$arPersonType["ID"]] = array("ID" => $arPersonType["ID"], "NAME" => htmlspecialcharsEx($arPersonType["NAME"]), "LID" => implode(", ", $arPersonType["LIDS"])); } while ($arTaxRate = $dbResultList->NavNext(true, "f_")) { $row =& $lAdmin->AddRow($f_ID, $arTaxRate); $row->AddField("ID", $f_ID); $row->AddField("ACTIVE", $f_ACTIVE == "Y" ? GetMessage("RATE_YES") : GetMessage("RATE_NET")); $row->AddField("TIMESTAMP_X", $f_TIMESTAMP_X);
<tr class="adm-detail-required-field"> <td width="40%" valign="top"><?php echo GetMessage("F_LOCATION2"); ?> :</td> <td width="60%" valign="top"> <select name="LOCATION2[]" size="5" multiple> <?php $db_vars = CSaleLocationGroup::GetList(array("NAME" => "ASC"), array(), LANG); ?> <?php $arLOCATION2 = array(); if ($bInitVars) { $arLOCATION2 = $LOCATION2; } else { $db_location = CSaleTaxRate::GetLocationList(array("TAX_RATE_ID" => $ID, "LOCATION_TYPE" => "G")); while ($arLocation = $db_location->Fetch()) { $arLOCATION2[] = $arLocation["LOCATION_ID"]; } } if (!is_array($arLOCATION2)) { $arLOCATION2 = array(); } ?> <?php while ($vars = $db_vars->Fetch()) { ?> <option value="<?php echo $vars["ID"]; ?> "<?php
$arUserGroups = $USER->GetUserGroupArray(); $dbTaxExemptList = CSaleTax::GetExemptList(array("GROUP_ID" => $arUserGroups)); while ($TaxExemptList = $dbTaxExemptList->Fetch()) { if (!in_array(IntVal($TaxExemptList["TAX_ID"]), $arResult["TaxExempt"])) { $arResult["TaxExempt"][] = IntVal($TaxExemptList["TAX_ID"]); } } $dbTaxRate = CSaleTaxRate::GetList( array("APPLY_ORDER"=>"ASC"), array( "LID" => SITE_ID, "PERSON_TYPE_ID" => $arUserResult["PERSON_TYPE_ID"], "ACTIVE" => "Y", "LOCATION" => $arUserResult["TAX_LOCATION"], ) ); while ($arTaxRate = $dbTaxRate->GetNext()) { if (!in_array(IntVal($arTaxRate["TAX_ID"]), $arResult["TaxExempt"])) { $arResult["arTaxList"][] = $arTaxRate; } } $arTaxSums = array(); if (count($arResult["arTaxList"]) > 0) {
} } } // TAX $arTaxPrice = array(); for ($i = 0; $i < count($arBasketList); $i++) { $arTaxPrice[$i] = 0; } $arTaxList = array(); $arOrderTaxList = array(); for ($i = 0; $i < count($arBasketList); $i++) { $arOrderTaxList[$i] = array(); } if ($bNeedReCount) { if (!$bUseVat) { $dbTaxRate = CSaleTaxRate::GetList(array("APPLY_ORDER" => "ASC"), array("LID" => $LID, "PERSON_TYPE_ID" => $PERSON_TYPE_ID, "ACTIVE" => "Y", "LOCATION" => $TAX_LOCATION)); $i = -1; while ($arTaxRate = $dbTaxRate->Fetch()) { if (!in_array(IntVal($arTaxRate["TAX_ID"]), $arTaxExempt)) { $i++; $arTaxList[] = array("ID" => 0, "IND" => $i, "TAX_NAME" => $arTaxRate["NAME"], "VALUE" => $arTaxRate["VALUE"], "VALUE_MONEY" => 0, "APPLY_ORDER" => $arTaxRate["APPLY_ORDER"], "CODE" => $arTaxRate["CODE"], "IS_IN_PRICE" => $arTaxRate["IS_IN_PRICE"] == "Y" ? "Y" : "N"); } } } else { $arTaxList[] = array("ID" => 0, "TAX_NAME" => GetMessage("SOE_VAT"), "IS_PERCENT" => "Y", "VALUE" => $vatRate * 100, "VALUE_MONEY" => 0, "APPLY_ORDER" => 100, "IS_IN_PRICE" => "Y", "CODE" => "VAT"); } } else { $TAX_COUNTER = IntVal($TAX_COUNTER); for ($i = 0; $i <= $TAX_COUNTER; $i++) { ${"TAX_NAME_" . $i} = Trim(${"TAX_NAME_" . $i}); if (strlen(${"TAX_NAME_" . $i}) > 0) {
$taxies = array(); $allTaxies = CCrmTax::GetAll(); foreach ($allTaxies as $k => $v) { $tax = array(); $tax['ID'] = $tax['~ID'] = $k; // Key is Currency ID $tax['TIMESTAMP_X'] = $tax['~TIMESTAMP_X'] = CCrmComponentHelper::TrimDateTimeString(FormatDate('FULL', MakeTimeStamp($v['TIMESTAMP_X']))); $tax['LID'] = $arLangs[$v['LID']]; $tax['NAME'] = $v['NAME']; $tax['CODE'] = $v['CODE']; $tax['PATH_TO_TAX_SHOW'] = CComponentEngine::MakePathFromTemplate($arParams['PATH_TO_TAX_SHOW'], array('tax_id' => $k)); $tax['PATH_TO_TAX_EDIT'] = CComponentEngine::MakePathFromTemplate($arParams['PATH_TO_TAX_EDIT'], array('tax_id' => $k)); $tax['PATH_TO_TAX_SHOW_RATES'] = CHTTP::urlAddParams($tax['PATH_TO_TAX_EDIT'], array("FORM_ID" => $arResult['EDIT_FORM_ID'], $arResult['EDIT_FORM_ID'] . "_active_tab" => 'tab_rateslist')); $tax['PATH_TO_TAX_DELETE'] = CHTTP::urlAddParams(CComponentEngine::MakePathFromTemplate($arParams['PATH_TO_TAX_LIST'], array('tax_id' => $k)), array('action_' . $arResult['GRID_ID'] => 'delete', 'ID' => $k, 'sessid' => bitrix_sessid())); $rateNum = 0; $dbRes = CSaleTaxRate::GetList(array(), array("TAX_ID" => $tax['ID'])); while ($dbRes->Fetch()) { $rateNum++; } if ($rateNum > 0) { $rateNumShow = "<a href=\"" . $tax['PATH_TO_TAX_SHOW_RATES'] . "\">" . $rateNum . "</a>"; } else { $rateNumShow = "0"; } $tax['STAV'] = $rateNumShow; $tax['~NAME'] = htmlspecialcharsBack($tax['NAME']); $tax['~LID'] = htmlspecialcharsBack($tax['LID']); $tax['~CODE'] = htmlspecialcharsBack($tax['CODE']); $taxies[] = $tax; } if (is_array($sort) && count($sort) > 0) {
$arResult['VALUE'] = isset($arTaxRate['VALUE']) ? strval($arTaxRate['VALUE']) : ''; $arResult['IS_IN_PRICE'] = isset($arTaxRate['IS_IN_PRICE']) && $arTaxRate['IS_IN_PRICE'] == 'Y' ? true : false; $arResult['APPLY_ORDER'] = isset($arTaxRate['APPLY_ORDER']) ? intval($arTaxRate['APPLY_ORDER']) : 100; $arTax = CCrmTax::GetById($arResult['TAX_ID']); $arResult['TAX_NAME'] = htmlspecialcharsbx($arTax['NAME']); $arLOCATION1 = array(); if ($lpEnabled) { $arResult['LOCATION1'] = array(); $arResult['LOCATION1_LIST'] = array(); if (isset($_POST['LOCATION1']) || isset($_POST['LOCATION2'])) { $arResult['LOCATION_QUERY'] = array('L' => isset($LOCATION1) ? $LOCATION1 : array(), 'G' => isset($LOCATION2) ? $LOCATION2 : array()); } else { $arResult['LOCATION_QUERY'] = false; } } else { $db_location = CSaleTaxRate::GetLocationList(array("TAX_RATE_ID" => $arResult['ID'], "LOCATION_TYPE" => "L")); while ($arLocation = $db_location->Fetch()) { $arLOCATION1[] = $arLocation["LOCATION_ID"]; } if (!is_array($arLOCATION1)) { $arLOCATION1 = array(); } $arResult['LOCATION1'] = $arLOCATION1; $arLocationsList = array(); $dbLocList = CSaleLocation::GetList(array("SORT" => "ASC", "COUNTRY_NAME_LANG" => "ASC", "COUNTRY_NAME_ORIG" => "ASC", "REGION_NAME_LANG" => "ASC", "REGION_NAME_ORIG" => "ASC", "CITY_NAME_LANG" => "ASC", "CITY_NAME_ORIG" => "ASC"), array("LID" => LANGUAGE_ID)); while ($arLoc = $dbLocList->Fetch()) { $arLocationsList[$arLoc['ID']] = array(); //$arLoc; if (in_array(intval($arLoc['ID']), $arResult['LOCATION1'])) { $arLocationsList[$arLoc['ID']]['SELECTED'] = true; } else {
} } } $dbPaySystem = CSalePaySystem::GetList(array("SORT" => "ASC", "PSA_NAME" => "ASC"), $arFilter); $bFirst = True; while ($arPaySystem = $dbPaySystem->Fetch()) { if (IntVal($arResult["PAY_SYSTEM_ID"]) == IntVal($arPaySystem["ID"]) || IntVal($arResult["PAY_SYSTEM_ID"]) <= 0 && $bFirst) { $arPaySystem["CHECKED"] = "Y"; } $arPaySystem["PSA_NAME"] = htmlspecialcharsEx($arPaySystem["PSA_NAME"]); $arResult["PAY_SYSTEM"][] = $arPaySystem; $bFirst = false; } $bHaveTaxExempts = False; if (is_array($arResult["TaxExempt"]) && count($arResult["TaxExempt"]) > 0) { $dbTaxRateList = CSaleTaxRate::GetList(array("APPLY_ORDER" => "ASC"), array("LID" => SITE_ID, "PERSON_TYPE_ID" => $PERSON_TYPE, "IS_IN_PRICE" => "N", "ACTIVE" => "Y", "LOCATION" => IntVal($TAX_LOCATION))); while ($arTaxRateList = $dbTaxRateList->GetNext()) { if (in_array(IntVal($arTaxRateList["TAX_ID"]), $arResult["TaxExempt"])) { $arResult["HaveTaxExempts"] = "Y"; break; } } } if (CModule::IncludeModule("statistic")) { $event1 = "eStore"; $event2 = "Step4_4"; $event3 = ""; foreach ($arProductsInBasket as $ar_prod) { $event3 .= $ar_prod["PRODUCT_ID"] . ", "; } $e = $event1 . "/" . $event2 . "/" . $event3;
public static function isTaxMode() { if (self::isVatMode()) { return false; } if (!CModule::IncludeModule('sale')) { return false; } $count = 0; $dbActiveTaxRates = CSaleTaxRate::GetList(array(), array('ACTIVE' => 'Y')); $arFields = $dbActiveTaxRates->Fetch(); return is_array($arFields); }
/** * <p>Метод изменяет параметры ставки налога с кодом ID. Метод динамичный.</p> * * * @param int $ID Код ставки налога. </ht * * @param array $arFields Ассоциативный массив новых параметров ставки налога. Ключами * являются названия параметров ставки, а значениями - * соответствующие значения.<br><br> Допустимые ключи: <ul> <li> <b>TAX_ID</b> - * код налога;</li> <li> <b>PERSON_TYPE_ID</b> - тип плательщика;</li> <li> <b>VALUE</b> - * величина налога (в процентах);</li> <li> <b>CURRENCY</b> - валюта;</li> <li> * <b>IS_PERCENT</b> - всегда значение "Y";</li> <li> <b>IS_IN_PRICE</b> - налог уже включен * в цену товара;</li> <li> <b>APPLY_ORDER</b> - порядок применения;</li> <li> <b>ACTIVE</b> - * флаг (Y/N) активности налога;</li> <li> <b>TAX_LOCATION</b> - массив для указания * местоположений и групп местоположений, для которых действует эта * ставка. Каждый элемент массива представляет собой ассоциативный * массив с ключами: <ul> <li> <b>LOCATION_ID</b> - код местоположения или группы * местоположений;</li> <li> <b>LOCATION_TYPE</b> - "L" для местоположения и "G" для * группы местоположений.</li> </ul> </li> </ul> * * @return int <p>Возвращается код измененной ставки налога или <i>false</i> в случае * ошибки.</p> <br><br> * * @static * @link http://dev.1c-bitrix.ru/api_help/sale/classes/csaletaxrate/csaletaxrate__update.bd202837.php * @author Bitrix */ public static function Update($ID, $arFields, $arOptions = array()) { global $DB; $ID = intval($ID); if (0 >= $ID) { return false; } if (!CSaleTaxRate::CheckFields("UPDATE", $arFields)) { return false; } $strUpdate = $DB->PrepareUpdate("b_sale_tax_rate", $arFields); $strSql = "UPDATE b_sale_tax_rate SET TIMESTAMP_X = " . $DB->GetNowFunction() . ", " . $strUpdate . " WHERE ID = " . $ID; $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__); if (array_key_exists("TAX_LOCATION", $arFields)) { CSaleTaxRate::SetTaxRateLocation($ID, $arFields["TAX_LOCATION"], $arOptions); } return $ID; }
$error = GetMessage('CRM_TAXRATE_UPDATE_GENERAL_ERROR'); } ShowError($error); return; } } } } if (!isset($_POST['AJAX_CALL'])) { LocalRedirect($APPLICATION->GetCurPage()); } } elseif ($_SERVER['REQUEST_METHOD'] == 'GET' && check_bitrix_sessid() && isset($_GET['action_' . $arResult['GRID_ID']])) { if ($arResult['CAN_DELETE'] && $_GET['action_' . $arResult['GRID_ID']] === 'delete') { $rateID = isset($_GET['ID']) ? $_GET['ID'] : ''; if ($rateID > 0) { if (!CSaleTaxRate::Delete($rateID)) { ShowError(GetMessage('CRM_TAXRATE_DELETION_GENERAL_ERROR')); } } unset($_GET['ID'], $_REQUEST['ID']); // otherwise the filter will work } if (!isset($_GET['AJAX_CALL'])) { LocalRedirect($bInternal ? '?' . $arParams['TAX_FORM_ID'] . '_active_tab=tab_props' : ''); } } $gridOptions = new CCrmGridOptions($arResult['GRID_ID']); $gridSorting = $gridOptions->GetSorting(array('sort' => array('ID' => 'asc'), 'vars' => array('by' => 'by', 'order' => 'order'))); $sort = $arResult['SORT'] = $gridSorting['sort']; $arResult['SORT_VARS'] = $gridSorting['vars']; $dbPersonType = CSalePersonType::GetList(array("SORT" => "ASC", "NAME" => "ASC"), array());
} if (strlen($lang) <= 0) { $lang = "ru"; } $bRus = false; if ($lang == "ru") { $bRus = true; } __IncludeLang(GetLangFileName(dirname(__FILE__) . "/lang/", "/step8.php", $lang)); $dbLocation = CSaleLocation::GetList(array("ID" => "ASC"), array("LID" => $lang)); if ($arLocation = $dbLocation->Fetch()) { $arLocation4Delivery = array(); do { $arLocation4Delivery[] = array("LOCATION_ID" => $arLocation["ID"], "LOCATION_TYPE" => "L"); } while ($arLocation = $dbLocation->Fetch()); //Location group $dblocationGroupID = CSaleLocationGroup::GetList(array("ID" => "DESC")); if ($arLocationGroupID = $dblocationGroupID->Fetch()) { $locationGroupID = $arLocationGroupID["ID"]; } $arLocation4Delivery[] = array("LOCATION_ID" => $locationGroupID, "LOCATION_TYPE" => "G"); //delivery handler CSaleDeliveryHandler::Set("simple", array("LID" => "", "ACTIVE" => "Y", "HID" => "simple", "NAME" => GetMessage("SALE_WIZARD_COUR1"), "SORT" => 100, "DESCRIPTION" => "", "HANDLERS" => "/bitrix/modules/sale/delivery/delivery_simple.php", "SETTINGS" => "", "PROFILES" => "", "TAX_RATE" => 0, "CONFIG" => array("price_" . $locationGroupID => "100"))); //Tax $taxID = CSaleTax::Add(array("LID" => $siteID, "NAME" => GetMessage("SALE_WIZARD_VAT"), "CODE" => "NDS")); $dbPerson = CSalePersonType::GetList(array("SORT" => "DESC")); if ($arPerson = $dbPerson->Fetch()) { //Tax rate CSaleTaxRate::Add(array("TAX_ID" => $taxID, "PERSON_TYPE_ID" => $arPerson["ID"], "VALUE" => 18, "CURRENCY" => $bRus ? "RUB" : "USD", "IS_PERCENT" => "Y", "IS_IN_PRICE" => "Y", "APPLY_ORDER" => 100, "ACTIVE" => "Y", "TAX_LOCATION" => $arLocation4Delivery)); } }
/** * @return array */ protected function loadAvailableList() { $order = $this->getOrder(); $basket = $order->getBasket(); if (!$basket) { return null; } if (!$order->isUsedVat()) { $taxExemptList = static::loadExemptList($order->getUserId()); $taxRateRes = \CSaleTaxRate::GetList(array("APPLY_ORDER" => "ASC"), array("LID" => $order->getSiteId(), "PERSON_TYPE_ID" => $order->getPersonTypeId(), "ACTIVE" => "Y", "LOCATION" => $order->getTaxLocation())); while ($taxRate = $taxRateRes->GetNext()) { if (!in_array(intval($taxRate["TAX_ID"]), $taxExemptList)) { if ($taxRate["IS_PERCENT"] != "Y") { $taxRate["VALUE"] = RoundEx(\CCurrencyRates::convertCurrency($taxRate["VALUE"], $taxRate["CURRENCY"], $order->getCurrency()), SALE_VALUE_PRECISION); $taxRate["CURRENCY"] = $order->getCurrency(); } $this->availableList[] = $taxRate; } } } else { $this->availableList[] = array("NAME" => Loc::getMessage("SOA_VAT"), "IS_PERCENT" => "Y", "VALUE" => $order->getVatRate() * 100, "VALUE_FORMATED" => "(" . $order->getVatRate() * 100 . "%, " . GetMessage("SOA_VAT_INCLUDED") . ")", "VALUE_MONEY" => $order->getVatSum(), "VALUE_MONEY_FORMATED" => SaleFormatCurrency($order->getVatSum(), $order->getCurrency()), "APPLY_ORDER" => 100, "IS_IN_PRICE" => "Y", "CODE" => "VAT"); } return $this->availableList; }
/** * <p>Метод осуществляет продление подписки с кодом ID.</p> <p><b>Примечание</b>. Метод использует внутреннюю транзакцию. Если у вас используется <b>MySQL</b> и <b>InnoDB</b>, и ранее была открыта транзакция, то ее необходимо закрыть до подключения метода.</p> * * * * * @param int $ID Код записи с информацией о продлении. * * * * @return bool <p>Метод возвращает <i>true</i> в случае успешного продления или <i>false</i> * в случае ошибки.</p><br><br> * * @static * @link http://dev.1c-bitrix.ru/api_help/sale/classes/csalerecurring/csalerecurring.nextpayment.php * @author Bitrix */ public static 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) || count($arProduct) <= 0) { CSaleRecurring::CancelRecurring($arRecur["ID"], "Y", "Product is not found"); /* $arFields = array( "CANCELED" => "Y", "DATE_CANCELED" => Date(CDatabase::DateFormatToPHP(CLang::GetDateFormat("FULL", LANG))), "CANCELED_REASON" => "Product is not found" ); CSaleRecurring::Update($arRecur["ID"], $arFields); */ //CSaleRecurring::Delete($arRecur["ID"]); return True; } if ($arProduct["WITHOUT_ORDER"] == "Y" || $arRecur["SUCCESS_PAYMENT"] == "Y") { $baseSiteCurrency = CSaleLang::GetLangCurrency($arOrder["LID"]); $productPrice = roundEx(CCurrencyRates::ConvertCurrency($arProduct["PRICE"], $arProduct["CURRENCY"], $baseSiteCurrency), SALE_VALUE_PRECISION); // 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"]), // Changed by Sigurd, 2007-08-16 "ORDER_PRICE" => $productPrice * DoubleVal($arProduct["QUANTITY"]), "ACTIVE" => "Y", "LOCATION" => $deliveryLocation ) ); while ($arDelivery = $dbDelivery->Fetch()) { $deliveryPriceTmp = roundEx(CCurrencyRates::ConvertCurrency($arDelivery["PRICE"], $arDelivery["CURRENCY"], $baseSiteCurrency), SALE_VALUE_PRECISION); 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) { $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 = roundEx($productPrice * $arDiscount["DISCOUNT_VALUE"] / 100, SALE_VALUE_PRECISION); $discount = roundEx($discountProduct * DoubleVal($arProduct["QUANTITY"]), SALE_VALUE_PRECISION); // Changed by Sigurd, 2007-08-16 $discountPrice = $productPrice - $discountProduct; } else { $discountValue = CCurrencyRates::ConvertCurrency($arDiscount["DISCOUNT_VALUE"], $arDiscount["CURRENCY"], $baseSiteCurrency); $discountValue = roundEx($discountValue, SALE_VALUE_PRECISION); $discountProduct = roundEx(1.0 * $discountValue / DoubleVal($arProduct["QUANTITY"]), SALE_VALUE_PRECISION);// Changed by Sigurd, 2007-08-16 $discount = roundEx($curDiscount * DoubleVal($arProduct["QUANTITY"]), SALE_VALUE_PRECISION); $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"] = (($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"], "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 )); } 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; }
$fieldShow = $f_NAME . "<br><small>" . $f_DESCRIPTION . "</small><br>"; if ($row->VarsFromForm() && $_REQUEST["FIELDS"]) { $valName = $_REQUEST["FIELDS"][$f_ID]["NAME"]; $valDescr = $_REQUEST["FIELDS"][$f_ID]["DESCRIPTION"]; } else { $valName = $f_NAME; $valDescr = $f_DESCRIPTION; } $fieldEdit = "<input type=\"text\" name=\"FIELDS[" . $f_ID . "][NAME]\" value=\"" . htmlspecialcharsbx($valName) . "\" size=\"30\"><br>"; $fieldEdit .= "<input type=\"text\" name=\"FIELDS[" . $f_ID . "][DESCRIPTION]\" value=\"" . htmlspecialcharsbx($valDescr) . "\" size=\"30\">"; $row->AddField("NAME", $fieldShow, $fieldEdit); $row->AddInputField("CODE"); $fieldShow = ""; if (in_array("STAV", $arVisibleColumns)) { $num = 0; $dbRes = CSaleTaxRate::GetList(array(), array("TAX_ID" => $f_ID)); while ($dbRes->Fetch()) { $num++; } if ($num > 0) { $fieldShow = "<a href=\"sale_tax_rate.php?lang=" . LANG . "&filter_tax_id=" . $f_ID . "&set_filter=Y\" title=\"" . GetMessage("TAX_RATE_DESCR") . "\">" . $num . "</a>"; } else { $fieldShow = "0"; } } $row->AddField("STAV", $fieldShow); $arActions = array(); $arActions[] = array("ICON" => "edit", "TEXT" => GetMessage("TAX_EDIT_DESCR"), "ACTION" => $lAdmin->ActionRedirect("sale_tax_edit.php?ID=" . $f_ID . "&lang=" . LANG . GetFilterParams("filter_") . ""), "DEFAULT" => true); if ($saleModulePermissions >= "W") { $arActions[] = array("SEPARATOR" => true); $arActions[] = array("ICON" => "delete", "TEXT" => GetMessage("SALE_DELETE_DESCR"), "ACTION" => "if(confirm('" . GetMessage('TAX_DEL_CONF') . "')) " . $lAdmin->ActionDoGroup($f_ID, "delete"));