195 lines
4.8 KiB
PHP
195 lines
4.8 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace MonetaPhpShop\order;
|
|
|
|
use InvalidArgumentException;
|
|
use MonetaPhpShop\Money;
|
|
|
|
/**
|
|
* Ñíèìîê çàêàçà PHPShop (`phpshop_orders`) — òî, ÷òî ìîäóëþ íóæíî äëÿ ôîðìû è êîëáýêîâ.
|
|
* Ñòðîêè â êîäèðîâêå âèòðèíû (cp1251).
|
|
*/
|
|
final class Order
|
|
{
|
|
/**
|
|
* Àíîíèìíîìó ïîêóïàòåëþ áåç email ÿäðî ïîäñòàâëÿåò `guest@<äîìåí>`
|
|
* (`PHPShopDone::send_to_order()`) — ýòî íå àäðåñ ïîêóïàòåëÿ.
|
|
*/
|
|
private const GUEST_EMAIL_PREFIX = 'guest@';
|
|
|
|
/** @var int */
|
|
private $id;
|
|
|
|
/** @var string */
|
|
private $uid;
|
|
|
|
/** @var Money */
|
|
private $amount;
|
|
|
|
/** @var int */
|
|
private $statusId;
|
|
|
|
/** @var bool */
|
|
private $paid;
|
|
|
|
/** @var int */
|
|
private $paymentMethodId;
|
|
|
|
/** @var string */
|
|
private $email;
|
|
|
|
/** @var string */
|
|
private $phone;
|
|
|
|
/** @var string */
|
|
private $customerName;
|
|
|
|
/** @var int */
|
|
private $userId;
|
|
|
|
/** @var array<string, mixed> */
|
|
private $cart;
|
|
|
|
/** @var float */
|
|
private $discountPercent;
|
|
|
|
/** @var int */
|
|
private $deliveryMethodId;
|
|
|
|
private function __construct() {}
|
|
|
|
/**
|
|
* @param array<string, mixed> $row ñòðîêà `phpshop_orders`
|
|
* @param array<string, mixed> $details ðàñïàêîâàííîå ïîëå `orders`: `['Cart' => ..., 'Person' => ...]`
|
|
*/
|
|
public static function fromRow(array $row, array $details): self
|
|
{
|
|
$id = (int) ($row['id'] ?? 0);
|
|
$uid = (string) ($row['uid'] ?? '');
|
|
if (($id <= 0) || ($uid === '')) {
|
|
throw new InvalidArgumentException('Ñòðîêà çàêàçà áåç id èëè uid.');
|
|
}
|
|
|
|
$person = isset($details['Person']) && is_array($details['Person']) ? $details['Person'] : [];
|
|
$cart = isset($details['Cart']) && is_array($details['Cart']) ? $details['Cart'] : [];
|
|
|
|
$order = new self();
|
|
$order->id = $id;
|
|
$order->uid = $uid;
|
|
$order->amount = Money::fromFloat((float) ($row['sum'] ?? 0));
|
|
$order->statusId = (int) ($row['statusi'] ?? 0);
|
|
$order->paid = (int) ($row['paid'] ?? 0) === 1;
|
|
$order->paymentMethodId = (int) ($person['order_metod'] ?? 0);
|
|
$order->email = self::email((string) ($person['mail'] ?? ''));
|
|
$order->phone = trim((string) ($row['tel'] ?? ''));
|
|
$order->customerName = trim((string) ($row['fio'] ?? ''));
|
|
$order->userId = (int) ($row['user'] ?? 0);
|
|
$order->cart = $cart;
|
|
$order->discountPercent = (float) ($person['discount'] ?? 0);
|
|
$order->deliveryMethodId = (int) ($person['dostavka_metod'] ?? 0);
|
|
|
|
return $order;
|
|
}
|
|
|
|
public function getId(): int
|
|
{
|
|
return $this->id;
|
|
}
|
|
|
|
/**
|
|
* Íîìåð çàêàçà, êîòîðûé âèäèò ïîêóïàòåëü (`4-36`).
|
|
*/
|
|
public function getUid(): string
|
|
{
|
|
return $this->uid;
|
|
}
|
|
|
|
/**
|
|
* Èòîã çàêàçà (`phpshop_orders.sum`): òîâàðû ñî ñêèäêàìè, áîíóñû è äîñòàâêà óæå ó÷òåíû ÿäðîì.
|
|
*/
|
|
public function getAmount(): Money
|
|
{
|
|
return $this->amount;
|
|
}
|
|
|
|
public function getStatusId(): int
|
|
{
|
|
return $this->statusId;
|
|
}
|
|
|
|
public function isPaidFlag(): bool
|
|
{
|
|
return $this->paid;
|
|
}
|
|
|
|
public function getPaymentMethodId(): int
|
|
{
|
|
return $this->paymentMethodId;
|
|
}
|
|
|
|
/**
|
|
* Email ïîêóïàòåëÿ èëè ïóñòàÿ ñòðîêà (ãîñòåâîé `guest@...` íå ñ÷èòàåòñÿ).
|
|
*/
|
|
public function getEmail(): string
|
|
{
|
|
return $this->email;
|
|
}
|
|
|
|
public function getPhone(): string
|
|
{
|
|
return $this->phone;
|
|
}
|
|
|
|
public function getCustomerName(): string
|
|
{
|
|
return $this->customerName;
|
|
}
|
|
|
|
/**
|
|
* ID ïîêóïàòåëÿ PHPShop (`phpshop_shopusers.id`), 0 — íåò.
|
|
*/
|
|
public function getUserId(): int
|
|
{
|
|
return $this->userId;
|
|
}
|
|
|
|
/**
|
|
* Êîðçèíà çàêàçà êàê å¸ õðàíèò ÿäðî (`Cart`: `cart`, `dostavka`, `sum`...) — äëÿ ÷åêà.
|
|
*
|
|
* @return array<string, mixed>
|
|
*/
|
|
public function getCart(): array
|
|
{
|
|
return $this->cart;
|
|
}
|
|
|
|
/**
|
|
* Ñêèäêà ïîêóïàòåëÿ â ïðîöåíòàõ (`Person.discount`): ÿäðî ïðèìåíÿåò å¸ êî âñåì òîâàðàì,
|
|
* êðîìå òîâàðîâ ñ ïðîìî-öåíîé.
|
|
*/
|
|
public function getDiscountPercent(): float
|
|
{
|
|
return $this->discountPercent;
|
|
}
|
|
|
|
/**
|
|
* Ñïîñîá äîñòàâêè (`phpshop_delivery.id`), 0 — íå âûáðàí.
|
|
*/
|
|
public function getDeliveryMethodId(): int
|
|
{
|
|
return $this->deliveryMethodId;
|
|
}
|
|
|
|
private static function email(string $raw): string
|
|
{
|
|
$email = trim($raw);
|
|
if (($email === '') || stripos($email, self::GUEST_EMAIL_PREFIX) === 0) {
|
|
return '';
|
|
}
|
|
|
|
return (filter_var($email, FILTER_VALIDATE_EMAIL) !== false) ? $email : '';
|
|
}
|
|
}
|