Документация для разработчиков
Темная тема

Accounting

Методы

Сервис предназначен для работы с информацией, связанной с деньгами - типы плательщиков, расчеты сумм и т.д.

Основной сценарий использования - расчет итоговой суммы для элемента CRM по списку привязанных к нему товарных позиций с учетом налогов, скидок и т.д.

В процессе расчета вычисляется сразу несколько сумм, при этом сам расчет может быть достаточно затратной операцией.

Чтобы не выполнять одинаковые расчеты несколько раз, внутри сервиса производится кеширование результатов расчета на уровне элемента.

Кеш можно сбросить отдельным методом. Также есть метод, выполняющий расчеты без кеширования.

Экземпляр сервиса следует получать из контейнера.

Метод Описание С версии
public function isTaxMode(): 
bool
Вернет true, если сервис использует логику расчета налогов как налог на документ.
Начальное значение определяется в конструкторе сервиса из настроек CRM.
public function setTaxMode(bool $isTaxMode): 
self
Установит режим расчета налога. Если $isTaxMode = true, то сервис будет работать с налогами как налог на документ. Если false, то НДС.
public function clearCache(): 
self
Сбросит кеш расчетов итоговых сумм элементов.
public function calculateByItem(Item $item): 
Accounting\Result
Выполнит расчеты итоговых сумм для элемента $item и запишет данные в результат (Accounting\Result).
Итоги расчетов будут закешированы в разрезе элемента. Если данные уже есть в кеше, будут использованы они.
public function calculate
(array $productRows, string $currencyId, int $personTypeId, 
?string $locationId = null): 
?array
Метод, который фактически выполняет все расчеты, кеш не используется.
Этот метод является оберткой над \CCrmSaleHelper::Calculate().
public function resolvePersonTypeId(Item $item): 
int
Вернет тип плательщика в зависимости от привязок элемента $item.
public function calculatePriceWithoutTax
(float $priceWithTax, float $taxRate): float
  • $priceWithTax - цена с налогами;
  • $taxRate - ставка налога в процентах (число от 0 до 100).

Рассчитывает сумму без учета налога. Например, если $priceWithTax = 120, а $taxRate = 20, то результат будет 100.
public function calculatePriceWithTax
(float $priceWithoutTax, float $taxRate): 
float
  • $priceWithoutTax - цена без налога;
  • $taxRate - ставка налога в процентах (число от 0 до 100).

Рассчитывает сумму с учетом налога. Например, если $priceWithoutTax = 100, а $taxRate = 20, то результат будет 120.

Accounting\Result

Результат расчета итоговых сумм отдается в виде отдельного класса наследника Bitrix\Main\Result.

Он содержит в себе как сами результаты расчетов, так и информацию об ошибках.

Информация об ошибках редко используется. Как правило, надо выполнить расчет и получить одно из полей результата.

Чтобы обеспечить работоспособность этого сценария у класса есть ряд публичных методов.

Если при выполнении расчетов возникла ошибка, то эти методы вернут null.

Метод Описание С версии
public function getPrice(): ?float
Вернет итоговую сумму с учетом налогов и скидок.
public function getCurrencyId(): ?string
Вернет идентификатор валюты.
public function getPersonTypeId(): ?int
Вернет идентификатор типа плательщика.
public function getLocationId(): ?string
Вернет идентификатор местоположения.
public function getTaxValue(): ?float
Вернет сумму налогов.

Примеры

use Bitrix\Crm\Service;

$factory = Service\Container::getInstance()->getFactory(\CCrmOwnerType::Quote);

$item = $factory->createItem();

$productRow = \Bitrix\Crm\ProductRow::createFromArray([
	'PRODUCT_NAME' => 'new product',
	'PRICE' => 999,
	'QUANTITY' => 3,
	'DISCOUNT_RATE' => 20,
]);

$item->addToProductRows($productRow);

$price = Service\Container::getInstance()->getAccounting()->calculateByItem($item)->getPrice();

$item->setOpportunity($price);

Пользовательские комментарии

Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
© «Битрикс», 2001-2023, «1С-Битрикс», 2023
Наверх