amount = new MonetaryAmount(); } elseif ($value instanceof AmountInterface) { $this->amount->setValue($value->getValue()); $this->amount->setCurrency($value->getCurrency()); } elseif (is_array($value)) { $this->amount->fromArray($value); } else { $this->amount->setValue($value); if (!empty($currency)) { $this->amount->setCurrency($currency); } } return $this; } /** * Устанавливает трансферы. * * @param array|TransferDataInterface[]|ListObjectInterface $value Массив трансферов * * @return self Инстанс билдера запросов */ public function setTransfers(mixed $value): self { $this->currentObject->setTransfers($value); return $this; } /** * Добавляет трансфер. * * @param array|TransferDataInterface $value Трансфер * * @return self Инстанс билдера запросов */ public function addTransfer(mixed $value): self { $this->currentObject->getTransfers()->add($value); return $this; } /** * Устанавливает валюту в которой будет происходить подтверждение оплаты заказа. * * @param string $value Валюта в которой подтверждается оплата * * @return self Инстанс билдера запросов */ public function setCurrency(string $value): self { $this->amount->setCurrency($value); foreach ($this->receipt->getItems() as $item) { $item->getPrice()->setCurrency($value); } return $this; } /** * Устанавливает чек. * * @param array|ReceiptInterface $value Инстанс чека или ассоциативный массив с данными чека * * @return self Инстанс билдера запросов * * @throws InvalidPropertyValueTypeException Генерируется если было передано значение невалидного типа */ public function setReceipt(mixed $value): self { if (is_array($value)) { $this->receipt->fromArray($value); } elseif ($value instanceof ReceiptInterface) { $this->receipt = clone $value; } else { throw new InvalidPropertyValueTypeException('Invalid receipt value type', 0, 'receipt', $value); } return $this; } /** * Устанавливает список товаров для создания чека. * * @param array $value Массив товаров в заказе * * @return self Инстанс билдера запросов * * @throws InvalidPropertyValueException Выбрасывается если хотя бы один из товаров имеет неверную структуру */ public function setReceiptItems(array $value = []): self { $this->receipt->removeItems(); foreach ($value as $item) { if ($item instanceof ReceiptItemInterface) { $this->receipt->addItem($item); } else { $this->receipt->addItem(new ReceiptItem($item)); } } return $this; } /** * Добавляет в чек товар * * @param string $title Название или описание товара * @param string $price Цена товара в валюте, заданной в заказе * @param float $quantity Количество товара * @param int $vatCode Ставка НДС * @param null|string $paymentSubject значение перечисления PaymentSubject * @param null|string $paymentMode значение перечисления PaymentMode * @param null|mixed $productCode * @param null|mixed $countryOfOriginCode * @param null|mixed $customsDeclarationNumber * @param null|mixed $excise * * @return self Инстанс билдера запросов * * @see PaymentSubject * @see PaymentMode */ public function addReceiptItem(string $title, string $price, float $quantity, int $vatCode, ?string $paymentMode = null, ?string $paymentSubject = null, $productCode = null, $countryOfOriginCode = null, $customsDeclarationNumber = null, $excise = null): self { $item = new ReceiptItem(); $item->setDescription($title); $item->setQuantity($quantity); $item->setVatCode($vatCode); $item->setPrice(new ReceiptItemAmount($price, $this->amount->getCurrency())); $item->setPaymentSubject($paymentSubject); $item->setPaymentMode($paymentMode); $item->setProductCode($productCode); $item->setCountryOfOriginCode($countryOfOriginCode); $item->setCustomsDeclarationNumber($customsDeclarationNumber); $item->setExcise($excise); $this->receipt->addItem($item); return $this; } /** * Добавляет в чек доставку товара. * * @param string $title Название доставки в чеке * @param string $price Стоимость доставки * @param int $vatCode Ставка НДС * @param null|string $paymentSubject значение перечисления PaymentSubject * @param null|string $paymentMode значение перечисления PaymentMode * * @return self Инстанс билдера запросов * * @see PaymentSubject * @see PaymentMode */ public function addReceiptShipping(string $title, string $price, int $vatCode, ?string $paymentMode = null, ?string $paymentSubject = null): self { $item = new ReceiptItem(); $item->setDescription($title); $item->setQuantity(1); $item->setVatCode($vatCode); $item->setIsShipping(true); $item->setPrice(new ReceiptItemAmount($price, $this->amount->getCurrency())); $item->setPaymentMode($paymentMode); $item->setPaymentSubject($paymentSubject); $this->receipt->addItem($item); return $this; } /** * Устанавливает адрес электронной почты получателя чека. * * @param string|null $value Email получателя чека * * @return self Инстанс билдера запросов */ public function setReceiptEmail(?string $value): self { if (!$this->receipt->getCustomer()) { $this->receipt->setCustomer(new ReceiptCustomer()); } $this->receipt->getCustomer()->setEmail($value); return $this; } /** * Устанавливает телефон получателя чека. * * @param string|null $value Телефон получателя чека * * @return self Инстанс билдера запросов */ public function setReceiptPhone(?string $value): self { if (!$this->receipt->getCustomer()) { $this->receipt->setCustomer(new ReceiptCustomer()); } $this->receipt->getCustomer()->setPhone($value); return $this; } /** * Устанавливает код системы налогообложения. * * @param int|null $value Код системы налогообложения. Число 1-6. * * @return self Инстанс билдера запросов */ public function setTaxSystemCode(?int $value): self { $this->receipt->setTaxSystemCode($value); return $this; } /** * Инициализирует пустой запрос * * @return AbstractRequestInterface|null */ protected function initCurrentObject(): ?AbstractRequestInterface { $this->amount = new MonetaryAmount(); $this->receipt = new Receipt(); return new AbstractPaymentRequest(); } }