Bitrix-D7  20.0.0
Класс Tax

Открытые члены

 getTaxList ()
 
 initTaxList (array $list)
 
 getOrder ()
 
 calculate ()
 Calculation of taxes. Подробнее...
 
 calculateDelivery ()
 
 save ()
 
 resetTaxList ()
 
 resetAvailableTaxList ()
 
 refreshData ()
 
 getAvailableList ()
 
 setDeliveryCalculate ($value)
 
 isDeliveryCalculate ()
 
 createClone (\SplObjectStorage $cloneEntity)
 
 isClone ()
 

Открытые статические члены

static getRegistryType ()
 
static load (OrderBase $order)
 
static loadExemptList ($userId)
 

Защищенные члены

 __construct ()
 Tax constructor. Подробнее...
 
 checkModifyTaxList (array $taxList)
 
 loadList ()
 
 loadAvailableList ()
 

Защищенные статические члены

static getTaxClassName ()
 
static getOrderTaxClassName ()
 

Защищенные данные

 $order = null
 
 $list = null
 
 $availableList = null
 
 $changedValues = array()
 
 $deliveryTax = null
 
 $isClone = false
 
 $isExternal = false
 

Подробное описание

См. определение в файле tax.php строка 16

Конструктор(ы)

◆ __construct()

__construct ( )
protected

Tax constructor.

См. определение в файле tax.php строка 42

43  {
44 
45  }

Методы

◆ calculate()

calculate ( )

Calculation of taxes.

Возвращает
Result
Исключения
Main

См. определение в файле tax.php строка 126

127  {
128  /** @var Result $result */
129  $result = new Result();
130 
131  /** @var Order $order */
132  if (!$order = $this->getOrder())
133  {
134  throw new Main\ObjectNotFoundException('Entity "Order" not found');
135  }
136 
137  $taxResult = array();
138 
139  $taxList = $this->getTaxList();
140 
141  $taxExempt = static::loadExemptList($order->getUserId());
142 
143  $fields = array(
144  "SITE_ID" => $order->getSiteid(),
145  "PERSON_TYPE_ID" => $order->getPersonTypeId(),
146  "TAX_LOCATION" => $order->getTaxLocation(),
147  "CURRENCY" => $order->getCurrency(),
148  "USE_VAT" => $order->isUsedVat(),
149  "VAT_RATE" => $order->getVatRate(),
150  "VAT_SUM" => $order->getVatSum(),
151  );
152 
153  if (is_array($taxExempt))
154  {
155  $fields['TAX_EXEMPT'] = $taxExempt;
156  }
157 
158  if (is_array($taxList) && !empty($taxList))
159  {
160  $fields['TAX_LIST'] = $taxList;
161  }
162 
163  /** @var Basket $basket */
164  $basket = $order->getBasket();
165 
166  if (empty($basket))
167  return $result;
168 
169  /** @var BasketItem $basketItem */
170  foreach ($basket as $basketItem)
171  {
172  if ($basketItem->getQuantity() == 0)
173  continue;
174  $fields['BASKET_ITEMS'][] = $basketItem->getFieldValues();
175  }
176 
177  /** @var \CSaleTax $className */
178  $className = static::getTaxClassName();
179  $className::calculateTax($fields, array(), $errors = array());
180 
181  if (!$order->isUsedVat() && is_array($fields['TAX_LIST']))
182  {
183  $taxResult['TAX_LIST'] = $fields['TAX_LIST'];
184  }
185 
186  if (array_key_exists('TAX_PRICE', $fields) && floatval($fields['TAX_PRICE']) >= 0)
187  {
188  $taxResult['TAX_PRICE'] = $fields['TAX_PRICE'];
189  }
190 
191  if (array_key_exists('VAT_SUM', $fields) && floatval($fields['VAT_SUM']) > 0)
192  {
193  $taxResult['VAT_SUM'] = $fields['VAT_SUM'];
194  }
195 
196  if (array_key_exists('TAX_LIST', $fields))
197  {
198  $newTaxList = $this->checkModifyTaxList($fields['TAX_LIST']);
199  $taxResult['TAX_LIST'] = $newTaxList;
200 
201  $this->list = $newTaxList;
202  }
203 
204  if (!$order->isUsedVat() && empty($this->list) && is_array($this->list))
205  {
206  $taxResult['TAX_PRICE'] = 0;
207  }
208 
209  if (!empty($taxResult))
210  {
211  $result->setData($taxResult);
212  }
213 
214  return $result;
215  }

◆ calculateDelivery()

calculateDelivery ( )
Возвращает
Result
Исключения
Main

См. определение в файле tax.php строка 221

222  {
223  /** @var Result $result */
224  $result = new Result();
225 
226  /** @var Order $order */
227  if (!$order = $this->getOrder())
228  {
229  throw new Main\ObjectNotFoundException('Entity "Order" not found');
230  }
231 
232  if ($order->getId() > 0 || (!empty($this->list) && is_array($this->list)))
233  {
234  $taxList = $this->getTaxList();
235  }
236  else
237  {
238  $taxList = $this->getAvailableList();
239  }
240 
241  $taxExempt = static::loadExemptList($order->getUserId());
242 
243  /** @var Basket $basket */
244  if (!$basket = $order->getBasket())
245  {
246  throw new Main\ObjectNotFoundException('Entity "Basket" not found');
247  }
248 
249  $fields = array(
250  "TAX_LOCATION" => $order->getTaxLocation(),
251  "VAT_SUM" => $basket->getVatSum(),
252  "CURRENCY" => $order->getCurrency(),
253  );
254 
255 
256  if (!empty($taxExempt))
257  {
258  $fields['TAX_EXEMPT'] = $taxExempt;
259  }
260 
261  if (!empty($taxList))
262  {
263  $fields['TAX_LIST'] = $taxList;
264  }
265 
266  $options = array();
267 
268  if (($isDeliveryCalculate = $this->isDeliveryCalculate()))
269  {
270  $options['COUNT_DELIVERY_TAX'] = ($isDeliveryCalculate === true ? "Y" : "N");
271  }
272 
273  $shipmentCollection = $order->getShipmentCollection();
274  if (!$shipmentCollection)
275  {
276  throw new Main\ObjectNotFoundException('Entity "ShipmentCollection" not found');
277  }
278 
279  /** @var Shipment $shipment */
280  foreach ($shipmentCollection as $shipment)
281  {
282  if ($shipment->isSystem())
283  continue;
284 
285  $service = $shipment->getDelivery();
286  if ($service === null)
287  continue;
288 
289  $additionalFields = array(
290  "DELIVERY_PRICE" => $shipment->getPrice()
291  );
292 
293  $vatRate = $shipment->getVatRate();
294  if ($vatRate)
295  {
296  $additionalFields["USE_VAT"] = true;
297  $additionalFields["VAT_RATE"] = $vatRate;
298  }
299 
300  $fields = array_merge($fields, $additionalFields);
301 
302  /** @var \CSaleTax $className */
303  $className = static::getTaxClassName();
304  $className::calculateDeliveryTax($fields, $options, $errors = array());
305  }
306 
307 
308  $taxResult = array();
309 
310  if (array_key_exists('TAX_PRICE', $fields) && floatval($fields['TAX_PRICE']) > 0)
311  {
312  $taxResult['TAX_PRICE'] = $fields['TAX_PRICE'];
313  }
314 
315  if (array_key_exists('VAT_SUM', $fields) && floatval($fields['VAT_SUM']) > 0)
316  {
317  $taxResult['VAT_SUM'] = $fields['VAT_SUM'];
318  }
319 
320  if (array_key_exists('VAT_DELIVERY', $fields) && floatval($fields['VAT_DELIVERY']) > 0)
321  {
322  $taxResult['VAT_DELIVERY'] = $fields['VAT_DELIVERY'];
323  }
324 
325 
326  if ($isDeliveryCalculate && array_key_exists('TAX_LIST', $fields) && !empty($fields['TAX_LIST']) && is_array($fields['TAX_LIST']))
327  {
328  $newTaxList = $this->checkModifyTaxList($fields['TAX_LIST']);
329  $this->list = $newTaxList;
330  }
331 
332  if (!empty($taxResult))
333  {
334  $result->setData($taxResult);
335  }
336 
337 
338  return $result;
339  }

◆ checkModifyTaxList()

checkModifyTaxList ( array  $taxList)
protected
Аргументы
array$taxList
Возвращает
array

См. определение в файле tax.php строка 346

347  {
348  $oldTaxList = $this->loadList();
349 
350  $taxIndexList = array();
351 
352  if (!empty($oldTaxList) && is_array($oldTaxList))
353  {
354  $oldTaxIndexList = array();
355  foreach ($oldTaxList as $taxOldKey => $taxOldValue)
356  {
357  $oldTaxIndexList[$taxOldValue['NAME']."|".$taxOldValue['CODE']] = $taxOldKey;
358  }
359 
360  foreach ($taxList as $taxValue)
361  {
362  if (array_key_exists($taxValue['NAME']."|".$taxValue['CODE'], $oldTaxIndexList))
363  {
364  $taxIndexList[$taxValue['NAME']."|".$taxValue['CODE']] = $oldTaxIndexList[$taxValue['NAME']."|".$taxValue['CODE']];
365  }
366  }
367  }
368 
369  if (!empty($taxList) && is_array($taxList))
370  {
371  foreach ($taxList as $taxKey => $taxValue)
372  {
373  $taxCode = $taxValue['NAME']."|".$taxValue['CODE'];
374  if (isset($taxIndexList[$taxCode]))
375  {
376  $oldTaxKey = $taxIndexList[$taxCode];
377 
378  $oldTaxValueDat = $oldTaxList[$oldTaxKey];
379  foreach($taxValue as $key => $value)
380  {
381  if (array_key_exists($key, $oldTaxValueDat))
382  {
383  if ($oldTaxValueDat[$key] != $value)
384  {
385  $oldTaxList[$oldTaxKey][$key] = $value;
386 
387  if (!in_array($taxCode, $this->changedValues))
388  {
389  $this->changedValues[$taxCode] = true;
390  }
391  }
392  }
393  else
394  {
395  $oldTaxList[$oldTaxKey][$key] = $value;
396  if (!in_array($taxCode, $this->changedValues))
397  {
398  $this->changedValues[$taxCode] = true;
399  }
400  }
401  }
402  }
403  else
404  {
405  $oldTaxList[] = array(
406  'NAME' => $taxValue['NAME'],
407  'IS_PERCENT' => $taxValue['IS_PERCENT'],
408  'VALUE' => $taxValue['VALUE'],
409  'VALUE_MONEY' => $taxValue['VALUE_MONEY'],
410  'APPLY_ORDER' => $taxValue['APPLY_ORDER'],
411  'IS_IN_PRICE' => $taxValue['IS_IN_PRICE'],
412  'TAX_VAL' => $taxValue['TAX_VAL'],
413  'CODE' => $taxValue['CODE'],
414  );
415 
416  // if (!in_array($taxCode, $this->changedValues))
417  // {
418  // $this->changedValues[$taxCode] = true;
419  // }
420  }
421  }
422 
423  // one tax to order
424  $taxListModify1C = array();
425  foreach($oldTaxList as $taxOrder)
426  {
427  if($taxOrder['CODE'] == 'VAT1C')
428  {
429  $taxListModify1C[] = $taxOrder;
430  }
431  }
432 
433  if(count($taxListModify1C)>0)
434  {
435  $oldTaxList = $taxListModify1C;
436  }
437  }
438  else
439  {
440  $oldTaxList = array();
441  }
442 
443  return $oldTaxList;
444  }

◆ createClone()

createClone ( \SplObjectStorage  $cloneEntity)

См. определение в файле tax.php строка 743

744  {
745  if ($this->isClone() && $cloneEntity->contains($this))
746  {
747  return $cloneEntity[$this];
748  }
749 
750  $taxClone = clone $this;
751  $taxClone->isClone = true;
752 
753  if (!$cloneEntity->contains($this))
754  {
755  $cloneEntity[$this] = $taxClone;
756  }
757 
758  if ($this->order)
759  {
760  if ($cloneEntity->contains($this->order))
761  {
762  $taxClone->order = $cloneEntity[$this->order];
763  }
764  }
765 
766  return $taxClone;
767  }

◆ getAvailableList()

getAvailableList ( )
Возвращает
array

См. определение в файле tax.php строка 654

655  {
656  if ($this->availableList === null)
657  {
658  $this->availableList = $this->loadAvailableList();
659  }
660 
661  return $this->availableList;
662 
663  }

◆ getOrder()

getOrder ( )
Возвращает
OrderBase

См. определение в файле tax.php строка 114

115  {
116  return $this->order;
117  }

◆ getOrderTaxClassName()

static getOrderTaxClassName ( )
staticprotected
Возвращает
string

См. определение в файле tax.php строка 58

59  {
60  return \CSaleOrderTax::class;
61  }

◆ getRegistryType()

static getRegistryType ( )
static
Возвращает
string

См. определение в файле tax.php строка 503

504  {
506  }

◆ getTaxClassName()

static getTaxClassName ( )
staticprotected
Возвращает
string

См. определение в файле tax.php строка 50

51  {
52  return \CSaleTax::class;
53  }

◆ getTaxList()

getTaxList ( )
Возвращает
array

См. определение в файле tax.php строка 66

67  {
68  if ($this->list === null)
69  {
70  $this->list = $this->loadList();
71  }
72 
73  $event = new Main\Event('sale', EventActions::EVENT_ON_TAX_GET_LIST, array(
74  'ENTITY' => $this,
75  'VALUES' => $this->list,
76  ));
77  $event->send();
78 
79  if ($event->getResults())
80  {
81  /** @var Main\EventResult $evenResult */
82  foreach($event->getResults() as $eventResult)
83  {
84  if($eventResult->getType() == Main\EventResult::SUCCESS)
85  {
86  $eventResultData = $eventResult->getParameters();
87  if (!empty($eventResultData['VALUES']))
88  {
89  $this->list = $eventResultData['VALUES'];
90  }
91  }
92  }
93  }
94 
95  return $this->list;
96  }

◆ initTaxList()

initTaxList ( array  $list)
Аргументы
array$list

См. определение в файле tax.php строка 102

103  {
104  if (!empty($list))
105  {
106  $this->list = $list;
107  $this->isExternal = true;
108  }
109  }

◆ isClone()

isClone ( )
Возвращает
bool

См. определение в файле tax.php строка 772

773  {
774  return $this->isClone;
775  }

◆ isDeliveryCalculate()

isDeliveryCalculate ( )
Возвращает
bool

См. определение в файле tax.php строка 732

733  {
734  return $this->deliveryTax;
735  }

◆ load()

static load ( OrderBase  $order)
static
Аргументы
OrderBase$order
Возвращает
Tax

См. определение в файле tax.php строка 513

514  {
515  $tax = static::createTaxObject();
516  $tax->order = $order;
517 
518  if ($order->getId() > 0)
519  {
520  $tax->getTaxList();
521  }
522  else
523  {
524  $tax->list = $tax->getAvailableList();
525  }
526 
527  return $tax;
528  }

◆ loadAvailableList()

loadAvailableList ( )
protected
Возвращает
array

См. определение в файле tax.php строка 668

669  {
670  $order = $this->getOrder();
671  $basket = $order->getBasket();
672  if (!$basket)
673  return null;
674 
675  $availableList = array();
676 
677  if (!$order->isUsedVat())
678  {
679  $taxExemptList = static::loadExemptList($order->getUserId());
680 
681  $taxRateRes = \CSaleTaxRate::GetList(
682  array("APPLY_ORDER" => "ASC"),
683  array(
684  "LID" => $order->getSiteId(),
685  "PERSON_TYPE_ID" => $order->getPersonTypeId(),
686  "ACTIVE" => "Y",
687  "LOCATION_CODE" => $order->getTaxLocation(),
688  )
689  );
690  while ($taxRate = $taxRateRes->GetNext())
691  {
692  if (!in_array(intval($taxRate["TAX_ID"]), $taxExemptList))
693  {
694  if ($taxRate["IS_PERCENT"] != "Y")
695  {
696  $taxRate["VALUE"] = PriceMaths::roundPrecision(\CCurrencyRates::convertCurrency($taxRate["VALUE"], $taxRate["CURRENCY"], $order->getCurrency()));
697  $taxRate["CURRENCY"] = $order->getCurrency();
698  }
699  $availableList[] = $taxRate;
700  }
701  }
702  }
703  else
704  {
705  $availableList[] = array(
706  "NAME" => Main\Localization\Loc::getMessage("SOA_VAT"),
707  "IS_PERCENT" => "Y",
708  "VALUE" => $order->getVatRate() * 100,
709  "VALUE_FORMATED" => "(".($order->getVatRate() * 100)."%, ".GetMessage("SOA_VAT_INCLUDED").")",
710  "VALUE_MONEY" => $order->getVatSum(),
711  "VALUE_MONEY_FORMATED" => SaleFormatCurrency($order->getVatSum(), $order->getCurrency()),
712  "APPLY_ORDER" => 100,
713  "IS_IN_PRICE" => "Y",
714  "CODE" => "VAT"
715  );
716  }
717 
718  return $availableList;
719  }

◆ loadExemptList()

static loadExemptList (   $userId)
static
Аргументы
$userId
Возвращает
array

См. определение в файле tax.php строка 608

609  {
610  $exemptList = array();
611 
612  static $proxyUserGroups = array();
613  static $proxyTaxExemptList = array();
614 
615  if (!empty($proxyUserGroups[$userId]))
616  {
617  $userGroups = $proxyUserGroups[$userId];
618  }
619  else
620  {
621  $userGroups = \CUser::GetUserGroup($userId);
622  $proxyUserGroups[$userId] = $userGroups;
623  }
624 
625 
626  $proxyTaxExemptKey = md5(join('|', $userGroups));
627 
628  if (array_key_exists($proxyTaxExemptKey, $proxyTaxExemptList))
629  {
630  $exemptList = $proxyTaxExemptList[$proxyTaxExemptKey];
631  }
632  else
633  {
634  /** @var \CSaleTax $className */
635  $className = static::getTaxClassName();
636  $dbTaxExemptList = $className::GetExemptList(array("GROUP_ID" => $userGroups));
637  while ($taxExemptList = $dbTaxExemptList->Fetch())
638  {
639  if (!in_array(intval($taxExemptList["TAX_ID"]), $exemptList))
640  $exemptList[] = intval($taxExemptList["TAX_ID"]);
641  }
642 
643  $proxyTaxExemptList[$proxyTaxExemptKey] = $exemptList;
644  }
645 
646 
647 
648  return $exemptList;
649  }

◆ loadList()

loadList ( )
protected
Возвращает
array

См. определение в файле tax.php строка 533

534  {
535  $resultList = array();
536  $order = $this->getOrder();
537 
538  if ($order->getId() <= 0)
539  return null;
540 
541  /** @var \CSaleOrderTax $className */
542  $className = static::getOrderTaxClassName();
543 
544  $dbTaxList = $className::GetList(
545  array("APPLY_ORDER" => "ASC"),
546  array("ORDER_ID" => $order->getId())
547  );
548  while ($taxList = $dbTaxList->Fetch())
549  {
550  $taxList['NAME'] = $taxList['TAX_NAME'];
551  $resultList[] = $taxList;
552  }
553 
554  return (!empty($resultList) ? $resultList : null);
555  }

◆ refreshData()

refreshData ( )

См. определение в файле tax.php строка 570

571  {
572  $result = new Result();
573 
574  if (!$this->isExternal)
575  {
576  $this->resetTaxList();
577  }
578 
579  $this->resetAvailableTaxList();
580 
581  /** @var Result $r */
582  $r = $this->calculate();
583  if (!$r->isSuccess())
584  {
585  $result->addErrors($r->getErrors());
586  return $result;
587  }
588 
589  $taxResult = $r->getData();
590 
591  $r = $this->calculateDelivery();
592  if (!$r->isSuccess())
593  {
594  $result->addErrors($r->getErrors());
595  return $result;
596  }
597  $taxResult = array_merge($taxResult, $r->getData());
598 
599  $result->setData($taxResult);
600 
601  return $result;
602  }

◆ resetAvailableTaxList()

resetAvailableTaxList ( )

См. определение в файле tax.php строка 563

564  {
565  $this->availableList = null;
566  }

◆ resetTaxList()

resetTaxList ( )

См. определение в файле tax.php строка 558

559  {
560  $this->list = array();
561  }

◆ save()

save ( )
Возвращает
Result
Исключения
Main

См. определение в файле tax.php строка 451

452  {
453 
454  $result = new Result();
455  /** @var Order $order */
456  if (!$order = $this->getOrder())
457  {
458  throw new Main\ObjectNotFoundException('Entity "Order" not found');
459  }
460 
461  //DoSaveOrderTax
462 
463  /** @var \CSaleTax $className */
464  $className = static::getTaxClassName();
465  $className::DoSaveOrderTax($order->getId(), $this->getTaxList(), $errors = array());
466 
467  if (!empty($errors) && is_array($errors))
468  {
469  foreach ($errors as $error)
470  {
471  $result->addError(new Main\Entity\EntityError($error));
472  }
473  }
474 
475 
476  if ($order->getId() > 0)
477  {
478  $registry = Registry::getInstance(static::getRegistryType());
479  /** @var OrderHistory $orderHistory */
480  $orderHistory = $registry->getOrderHistoryClassName();
481 
482  $orderHistory::collectEntityFields('TAX', $order->getId());
483  }
484 
485  return $result;
486  }

◆ setDeliveryCalculate()

setDeliveryCalculate (   $value)
Аргументы
$value

См. определение в файле tax.php строка 724

725  {
726  $this->deliveryTax = ($value === true? true : false);
727  }

Поля

◆ $availableList

$availableList = null
protected

См. определение в файле tax.php строка 25

◆ $changedValues

$changedValues = array()
protected

См. определение в файле tax.php строка 28

◆ $deliveryTax

$deliveryTax = null
protected

См. определение в файле tax.php строка 31

◆ $isClone

$isClone = false
protected

См. определение в файле tax.php строка 34

◆ $isExternal

$isExternal = false
protected

См. определение в файле tax.php строка 37

◆ $list

$list = null
protected

См. определение в файле tax.php строка 22

◆ $order

$order = null
protected

См. определение в файле tax.php строка 19


Объявления и описания членов класса находятся в файле:
Bitrix\Main\Localization\Loc\getMessage
static getMessage($code, $replace=null, $language=null)
Returns translation by message code.
Definition: loc.php:29
Bitrix\Sale\Tax\resetTaxList
resetTaxList()
Definition: tax.php:558
Bitrix\Sale\Tax\loadList
loadList()
Definition: tax.php:533
Bitrix\Sale\Tax\getAvailableList
getAvailableList()
Definition: tax.php:654
Bitrix\Sale\Tax\resetAvailableTaxList
resetAvailableTaxList()
Definition: tax.php:563
Bitrix\Sale\Tax\$deliveryTax
$deliveryTax
Definition: tax.php:31
Bitrix\Sale\Registry\REGISTRY_TYPE_ORDER
const REGISTRY_TYPE_ORDER
Definition: sale/lib/registry.php:16
Bitrix\Sale\Tax\isDeliveryCalculate
isDeliveryCalculate()
Definition: tax.php:732
Bitrix\Sale\Tax\isClone
isClone()
Definition: tax.php:772
Bitrix\Sale\Tax\$order
$order
Definition: tax.php:19
Bitrix\Sale\Tax\calculateDelivery
calculateDelivery()
Definition: tax.php:221
Bitrix\Sale\Tax\$isClone
$isClone
Definition: tax.php:34
Bitrix\Sale\Registry\getInstance
static getInstance($type)
Definition: sale/lib/registry.php:161
Bitrix\Sale\Tax\calculate
calculate()
Calculation of taxes.
Definition: tax.php:126
Bitrix\Sale\EventActions\EVENT_ON_TAX_GET_LIST
const EVENT_ON_TAX_GET_LIST
Definition: eventactions.php:59
Bitrix\Sale\Tax\loadAvailableList
loadAvailableList()
Definition: tax.php:668
Bitrix\Main\EventResult\SUCCESS
const SUCCESS
Definition: main/lib/eventresult.php:7
Bitrix\Sale\Tax\checkModifyTaxList
checkModifyTaxList(array $taxList)
Definition: tax.php:346
Bitrix\Sale\Tax\$list
$list
Definition: tax.php:22
Bitrix\Sale\Tax\getTaxList
getTaxList()
Definition: tax.php:66
Bitrix\Sale\Tax\getOrder
getOrder()
Definition: tax.php:114
Bitrix\Sale\Tax\$availableList
$availableList
Definition: tax.php:25
Bitrix\Sale\PriceMaths\roundPrecision
static roundPrecision($value)
Definition: pricemaths.php:17