$row строка таблицы настроек */ public static function fromRow(array $row): self { $settings = new self(); $settings->accountId = trim(self::string($row, 'account_id')); $settings->integrityCode = self::string($row, 'integrity_code'); $settings->paymentServer = PaymentServer::fromSetting(self::string($row, 'payment_server')); $settings->testMode = self::string($row, 'test_mode') === '1'; $settings->fiscalization = self::string($row, 'fiscalization') === '1'; $settings->receiptEmail = trim(self::string($row, 'receipt_email')); $settings->paymentDescription = trim(self::string($row, 'title_end')); $settings->paymentMethod = PaymentMethod::fromSetting(self::string($row, 'payment_method')); $settings->paymentObject = PaymentObject::fromSetting(self::string($row, 'payment_object')); $settings->taxSystem = TaxSystem::fromSetting(self::string($row, 'sno')); $settings->goodsVat = VatSetting::fromSetting(self::string($row, 'goods_vat')); $settings->deliveryVat = VatSetting::fromSetting(self::string($row, 'delivery_vat')); $settings->payableStatus = (int) self::string($row, 'status'); $paidStatus = (int) self::string($row, 'paid_status'); $settings->paidStatus = ($paidStatus > 0) ? $paidStatus : self::STATUS_PAID_BY_GATEWAY; $settings->version = self::string($row, 'version'); return $settings; } /** * Можно принимать оплату: задан номер счёта (только цифры) и код проверки целостности данных. */ public function isConfigured(): bool { return preg_match('/\A[0-9]{1,20}\z/', $this->accountId) === 1 && $this->integrityCode !== ''; } public function getAccountId(): string { return $this->accountId; } public function signature(): Signature { return new Signature($this->integrityCode); } /** * Код проверки целостности данных не выводится в var_dump()/print_r() и журналы, как у {@see Signature}; * видно только, задан ли он. * * @return array */ public function __debugInfo(): array { $properties = get_object_vars($this); $properties['integrityCode'] = ($this->integrityCode === '') ? '' : '***'; return $properties; } public function getPaymentServer(): PaymentServer { return $this->paymentServer; } public function isTestMode(): bool { return $this->testMode; } public function isFiscalization(): bool { return $this->fiscalization; } public function getReceiptEmail(): string { return $this->receiptEmail; } /** * «Описание оплаты» (колонка `title_end`, как у штатных модулей PHPShop и встроенной «Монеты»): * текст над суммой и кнопкой оплаты. Обычный текст в кодировке БД; пусто — без текста. */ public function getPaymentDescription(): string { return $this->paymentDescription; } public function getPaymentMethod(): PaymentMethod { return $this->paymentMethod; } public function getPaymentObject(): PaymentObject { return $this->paymentObject; } public function getTaxSystem(): TaxSystem { return $this->taxSystem; } public function getGoodsVat(): VatSetting { return $this->goodsVat; } public function getDeliveryVat(): VatSetting { return $this->deliveryVat; } /** * Статус, при котором покупателю доступна оплата; {@see self::STATUS_NEW} — сразу после оформления. */ public function getPayableStatus(): int { return $this->payableStatus; } public function isPayableRightAfterCheckout(): bool { return $this->payableStatus === self::STATUS_NEW; } /** * Статус, в который модуль переводит заказ после подтверждения оплаты. */ public function getPaidStatus(): int { return $this->paidStatus; } public function getVersion(): string { return $this->version; } /** * @param array $row */ private static function string(array $row, string $key): string { $value = $row[$key] ?? ''; return is_scalar($value) ? (string) $value : ''; } }