Files

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 : '';
}
}