name = ($name === '') ? self::FALLBACK_NAME : $name; if ($quantity < 1 || $quantity > 99999) { throw new InvalidArgumentException('Количество позиции вне допустимых границ.'); } $max = Money::fromDecimal(self::PRICE_MAX)->toMinorUnits(); if ($price->toMinorUnits() > $max || $this->total()->toMinorUnits() > $max) { throw new InvalidArgumentException('Цена позиции превышает потолок кассы.'); } } public function total(): Money { return $this->price->multiply($this->quantity); } /** * Элемент `items` для JSON-ответа Check URL: числа — числа, ставка — строкой `vat`. * Цена подставляется меткой, чтобы в JSON осталось ровно два знака (`100.00`). * * @return array */ public function toCheckItem(): array { return [ 'name' => $this->name, 'price' => JsonNumber::placeholder($this->price), 'quantity' => $this->quantity, 'measure' => self::MEASURE, 'paymentMethod' => $this->paymentMethod->value, 'paymentObject' => $this->paymentObject->value, 'vat' => $this->vat->value, ]; } /** * Объект `inventPositions` для атрибута `INVENTORY`: цена и количество — * строками, как в примере спецификации Moneta. * * @return array */ public function toInventoryPosition(): array { return [ 'name' => $this->name, 'price' => $this->price->toDecimal(), 'quantity' => (string) $this->quantity, 'measure' => self::MEASURE, 'vatTag' => $this->vat->tag(), 'pm' => $this->paymentMethod->value, 'po' => $this->paymentObject->value, ]; } /** * @return array */ public function toArray(): array { return [ 'name' => $this->name, 'price' => $this->price->toDecimal(), 'quantity' => $this->quantity, 'vat' => $this->vat->value, 'paymentMethod' => $this->paymentMethod->value, 'paymentObject' => $this->paymentObject->value, ]; } /** * @param array $data */ public static function fromArray(array $data): self { return new self( name: (string) ($data['name'] ?? ''), price: Money::fromDecimal((string) ($data['price'] ?? '')), quantity: (int) ($data['quantity'] ?? 0), vat: Vat::from((string) ($data['vat'] ?? '')), paymentMethod: PaymentMethod::from((string) ($data['paymentMethod'] ?? '')), paymentObject: PaymentObject::from((string) ($data['paymentObject'] ?? '')), ); } }