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 = 120, а $taxRate = 20, то результат будет 100. | |
public function calculatePriceWithTax (float $priceWithoutTax, float $taxRate): float |
Рассчитывает сумму с учетом налога. Например, если $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);