fromArray($data); } } /** * Возвращает наименование товара * @return string Наименование товара */ public function getDescription() { return $this->_description; } /** * Устанавливает наименование товара * * @param string $value Наименование товара * * @throws EmptyPropertyValueException Выбрасывается если было передано пустое значение * @throws InvalidPropertyValueTypeException Выбрасывается если в качестве аргумента была передана не строка */ public function setDescription($value) { if ($value === null || $value === '') { throw new EmptyPropertyValueException( 'Empty description value in ReceiptItem', 0, 'ReceiptItem.description' ); } elseif (TypeCast::canCastToString($value)) { $castedValue = (string)$value; if ($castedValue === '') { throw new EmptyPropertyValueException( 'Empty description value in ReceiptItem', 0, 'ReceiptItem.description' ); } $this->_description = mb_substr($castedValue, 0, 128); } else { throw new InvalidPropertyValueTypeException( 'Empty description value in ReceiptItem', 0, 'ReceiptItem.description', $value ); } } /** * Возвращает количество товара * @return float Количество купленного товара */ public function getQuantity() { return $this->_quantity; } /** * Устанавливает количество покупаемого товара * * @param int $value Количество * * @throws EmptyPropertyValueException Выбрасывается если было передано пустое значение * @throws InvalidPropertyValueException Выбрасывается если в качестве аргумента был передан ноль * или отрицательное число * @throws InvalidPropertyValueTypeException Выбрасывается если в качестве аргумента было передано не число */ public function setQuantity($value) { if ($value === null || $value === '') { throw new EmptyPropertyValueException('Empty quantity value in ReceiptItem', 0, 'ReceiptItem.quantity'); } elseif (!is_numeric($value)) { throw new InvalidPropertyValueTypeException( 'Invalid quantity value type in ReceiptItem', 0, 'ReceiptItem.quantity', $value ); } elseif ($value <= 0.0) { throw new InvalidPropertyValueException( 'Invalid quantity value in ReceiptItem', 0, 'ReceiptItem.quantity', $value ); } else { $this->_quantity = (float)$value; } } /** * Возвращает общую стоимость покупаемого товара в копейках/центах * @return int Сумма стоимости покупаемого товара */ public function getAmount() { return (int)round($this->_amount->getIntegerValue() * $this->_quantity); } /** * Возвращает цену товара * @return AmountInterface Цена товара */ public function getPrice() { return $this->_amount; } /** * Устанавливает цену товара * * @param AmountInterface $value Цена товара */ public function setPrice(AmountInterface $value) { $this->_amount = $value; } /** * Возвращает ставку НДС * @return int|null Ставка НДС, число 1-6, или null если ставка не задана */ public function getVatCode() { return $this->_vatCode; } /** * Устанавливает ставку НДС * * @param int $value Ставка НДС, число 1-6 * * @throws InvalidPropertyValueException Выбрасывается если в качестве аргумента было передано число меньше одного * или больше шести * @throws InvalidPropertyValueTypeException Выбрасывается если в качестве аргумента было передано не число */ public function setVatCode($value) { if ($value === null || $value === '') { $this->_vatCode = null; } elseif (!is_numeric($value)) { throw new InvalidPropertyValueTypeException( 'Invalid vatId value type in ReceiptItem', 0, 'ReceiptItem.vatId', $value ); } elseif ($value < 1 || $value > 6) { throw new InvalidPropertyValueException( 'Invalid vatId value in ReceiptItem', 0, 'ReceiptItem.vatId', $value ); } else { $this->_vatCode = (int)$value; } } /** * Возвращает признак предмета расчета * @return string|null Признак предмета расчета */ public function getPaymentSubject() { return $this->_paymentSubject; } /** * Устанавливает признак предмета расчета * * @param string $value Признак предмета расчета * * @throws InvalidPropertyValueTypeException Выбрасывается если в качестве аргумента была передана не строка */ public function setPaymentSubject($value) { if ($value === null || $value === '') { $this->_paymentSubject = null; } elseif (!TypeCast::canCastToString($value)) { throw new InvalidPropertyValueTypeException('Invalid paymentSubject value type', 0, 'ReceiptItem.paymentSubject'); } else { $this->_paymentSubject = $value; } } /** * Возвращает признак способа расчета * @return string|null Признак способа расчета */ public function getPaymentMode() { return $this->_paymentMode; } /** * Устанавливает признак способа расчета * * @param string $value Признак способа расчета * * @throws InvalidPropertyValueTypeException Выбрасывается если в качестве аргумента была передана не строка */ public function setPaymentMode($value) { if ($value === null || $value === '') { $this->_paymentMode = null; } elseif (!TypeCast::canCastToString($value)) { throw new InvalidPropertyValueTypeException( 'Invalid paymentMode value type', 0, 'ReceiptItem.paymentMode', $value ); } else { $this->_paymentMode = $value; } } /** * Возвращает код товара — уникальный номер, который присваивается экземпляру товара при маркировке * @return string|null Код товара */ public function getProductCode() { return $this->_productCode; } /** * Устанавливает код товара — уникальный номер, который присваивается экземпляру товара при маркировке * * @param string|ProductCode $value Код товара * * @throws InvalidPropertyValueTypeException Выбрасывается если в качестве аргумента была передана не строка */ public function setProductCode($value) { if ($value instanceof ProductCode) { $value = (string)$value; } if ($value === null || $value === '') { $this->_productCode = null; } elseif (!TypeCast::canCastToString($value)) { throw new InvalidPropertyValueTypeException( 'Invalid productCode value type', 0, 'ReceiptItem.productCode', $value ); } elseif (strlen((string)$value) > 96) { throw new InvalidPropertyValueException( 'Invalid productCode value: "'.$value.'"', 0, 'ReceiptItem.productCode', $value ); } elseif (!preg_match('/^[0-9A-F ]{2,96}$/', (string)$value)) { throw new InvalidPropertyValueException( 'Invalid productCode value: "'.$value.'"', 0, 'ReceiptItem.productCode', $value ); } else { $this->_productCode = $value; } } /** * Возвращает код страны происхождения товара по общероссийскому классификатору стран мира * @return string|null Код страны происхождения товара */ public function getCountryOfOriginCode() { return $this->_countryOfOriginCode; } /** * Устанавливает код страны происхождения товара по общероссийскому классификатору стран мира * * @param string $value Код страны происхождения товара * * @throws InvalidPropertyValueTypeException Выбрасывается если в качестве аргумента была передана не строка */ public function setCountryOfOriginCode($value) { if ($value === null || $value === '') { $this->_countryOfOriginCode = null; } elseif (!TypeCast::canCastToString($value)) { throw new InvalidPropertyValueTypeException( 'Invalid countryOfOriginCode value type', 0, 'ReceiptItem.countryOfOriginCode', $value ); } elseif (strlen((string)$value) != 2) { throw new InvalidPropertyValueException( 'Invalid countryOfOriginCode value: "'.$value.'"', 0, 'ReceiptItem.countryOfOriginCode', $value ); } elseif (!preg_match('/^[A-Z]{2}$/', (string)$value)) { throw new InvalidPropertyValueException( 'Invalid countryOfOriginCode value: "'.$value.'"', 0, 'ReceiptItem.countryOfOriginCode', $value ); } else { $this->_countryOfOriginCode = $value; } } /** * Возвращает номер таможенной декларации * @return string|null Номер таможенной декларации (от 1 до 32 символов) */ public function getCustomsDeclarationNumber() { return $this->_customsDeclarationNumber; } /** * Устанавливает номер таможенной декларации (от 1 до 32 символов) * * @param string $value Номер таможенной декларации * * @throws InvalidPropertyValueTypeException Выбрасывается если в качестве аргумента была передана не строка */ public function setCustomsDeclarationNumber($value) { if ($value === null || $value === '') { $this->_customsDeclarationNumber = null; } elseif (!TypeCast::canCastToString($value)) { throw new InvalidPropertyValueTypeException( 'Invalid customsDeclarationNumber value type', 0, 'ReceiptItem.customsDeclarationNumber', $value ); } elseif (strlen((string)$value) > 32) { throw new InvalidPropertyValueException( 'Invalid customsDeclarationNumber value: "'.$value.'"', 0, 'ReceiptItem.customsDeclarationNumber', $value ); } else { $this->_customsDeclarationNumber = $value; } } /** * Возвращает сумму акциза товара с учетом копеек * @return float|null Сумма акциза товара с учетом копеек */ public function getExcise() { return $this->_excise; } /** * Устанавливает сумму акциза товара с учетом копеек * * @param float $value Сумма акциза товара с учетом копеек * * @throws InvalidPropertyValueTypeException Выбрасывается если в качестве аргумента было передано не число */ public function setExcise($value) { if ($value === null || $value === '') { $this->_excise = null; } elseif (!is_numeric($value)) { throw new InvalidPropertyValueTypeException( 'Invalid excise value type', 0, 'ReceiptItem.excise', $value ); } elseif ($value <= 0.0) { throw new InvalidPropertyValueException( 'Invalid excise value in ReceiptItem', 0, 'ReceiptItem.excise', $value ); } else { $this->_excise = $value; } } /** * Устанавливает флаг доставки для текущего объекта айтема в чеке * * @param bool $value True если айтем является доставкой, false если нет * * @return ReceiptItem * @throws InvalidPropertyValueException Генерируется если передано значение невалидного типа */ public function setIsShipping($value) { if ($value === null || $value === '') { $this->_shipping = false; } elseif (TypeCast::canCastToBoolean($value)) { $this->_shipping = $value ? true : false; } else { throw new InvalidPropertyValueException( 'Invalid isShipping value in ReceiptItem', 0, 'ReceiptItem.isShipping', $value ); } return $this; } /** * Возвращает информацию о поставщике товара или услуги. * * @return SupplierInterface */ public function getSupplier() { return $this->_supplier; } /** * Устанавливает информацию о поставщике товара или услуги. * * @param SupplierInterface|array $value */ public function setSupplier($value) { if ($value === null || $value === '') { throw new EmptyPropertyValueException( 'Empty supplier value in receipt', 0, 'Receipt.supplier' ); } if (is_array($value)) { $value = new Supplier($value); } if (!($value instanceof SupplierInterface)) { throw new InvalidPropertyValueTypeException( 'Invalid supplier value type in receipt', 0, 'Receipt.supplier', $value ); } $this->_supplier = $value; } /** * @param string $value */ public function setAgentType($value) { if ($value === null || $value === '') { $this->_paymentMode = null; } elseif (!TypeCast::canCastToEnumString($value)) { throw new InvalidPropertyValueException( 'Invalid value for "agentType" parameter in Receipt.item.agentType', 0, 'Receipt.item.agentType', $value ); } elseif (!AgentType::valueExists($value)) { throw new InvalidPropertyValueException( 'Invalid value for "agentType" parameter in Receipt.item.agentType', 0, 'Receipt.item.agentType', $value ); } $this->_agentType = $value; } public function getAgentType() { return $this->_agentType; } /** * Проверяет, является ли текущий элемент чека доствкой * @return bool True если доставка, false если обычный товар */ public function isShipping() { return $this->_shipping; } /** * Применяет для товара скидку * * @param float $coefficient Множитель скидки */ public function applyDiscountCoefficient($coefficient) { $this->_amount->multiply($coefficient); } /** * Увеличивает цену товара на указанную величину * * @param float $value Сумма на которую цену товара увеличиваем */ public function increasePrice($value) { $this->_amount->increase($value); } /** * Уменьшает количество покупаемого товара на указанное, возвращает объект позиции в чеке с уменьшаемым количеством * * @param float $count Количество на которое уменьшаем позицию в чеке * * @return ReceiptItem * * @throws EmptyPropertyValueException Выбрасывается если было передано пустое значение * @throws InvalidPropertyValueException Выбрасывается если в качестве аргумента был передан ноль * или отрицательное число, или число больше текущего количества покупаемого товара * @throws InvalidPropertyValueTypeException Выбрасывается если в качестве аргумента было передано не число */ public function fetchItem($count) { if ($count === null || $count === '') { throw new EmptyPropertyValueException( 'Empty quantity value in ReceiptItem in fetchItem method', 0, 'ReceiptItem.quantity' ); } elseif (!is_numeric($count)) { throw new InvalidPropertyValueTypeException( 'Invalid quantity value type in ReceiptItem in fetchItem method', 0, 'ReceiptItem.quantity', $count ); } elseif ($count <= 0.0 || $count >= $this->_quantity) { throw new InvalidPropertyValueException( 'Invalid quantity value in ReceiptItem in fetchItem method', 0, 'ReceiptItem.quantity', $count ); } $result = clone $this; $result->setPrice(clone $this->getPrice()); $result->setQuantity($count); $this->_quantity -= $count; return $result; } /** * Устанавливает значения свойств текущего объекта из массива * @param array|\Traversable $sourceArray Ассоциативный массив с настройками */ public function fromArray($sourceArray) { $amount = new ReceiptItemAmount(); $amount->fromArray($sourceArray['amount']); $sourceArray['price'] = $amount; unset($sourceArray['amount']); parent::fromArray($sourceArray); } /** * @return array */ public function jsonSerialize() { $result = array( 'description' => $this->getDescription(), 'amount' => array( 'value' => $this->getPrice()->getValue(), 'currency' => $this->getPrice()->getCurrency(), ), 'quantity' => $this->getQuantity(), 'vat_code' => $this->getVatCode(), ); if ($this->getPaymentSubject()) { $result['payment_subject'] = $this->getPaymentSubject(); } if ($this->getPaymentMode()) { $result['payment_mode'] = $this->getPaymentMode(); } if ($this->getProductCode()) { $result['product_code'] = $this->getProductCode(); } if ($this->getCountryOfOriginCode()) { $result['country_of_origin_code'] = $this->getCountryOfOriginCode(); } if ($this->getCustomsDeclarationNumber()) { $result['customs_declaration_number'] = $this->getCustomsDeclarationNumber(); } if ($this->getExcise()) { $result['excise'] = $this->getExcise(); } if ($this->getSupplier()) { $result['supplier'] = $this->getSupplier()->jsonSerialize(); } if ($this->getAgentType()) { $result['agent_type'] = $this->getAgentType(); } return $result; } }