168 lines
4.8 KiB
PHP
168 lines
4.8 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace KupShop\UserAddressesBundle\Util;
|
|
|
|
use Doctrine\DBAL\Exception;
|
|
use KupShop\KupShopBundle\Config;
|
|
use KupShop\KupShopBundle\Context\UserContext;
|
|
use KupShop\KupShopBundle\Util\Entity\EntityUtil;
|
|
use KupShop\UserAddressesBundle\Entity\DeliveryAddressEntity;
|
|
use Query\Operator;
|
|
|
|
class UserAddressesUtil
|
|
{
|
|
public function __construct(
|
|
protected UserContext $userContext,
|
|
protected EntityUtil $entityUtil,
|
|
protected DeliveryAddressConverter $deliveryAddressConverter,
|
|
) {
|
|
}
|
|
|
|
/**
|
|
* @return DeliveryAddressEntity[]
|
|
*/
|
|
public function getDeliveryAddresses(): array
|
|
{
|
|
if (($userId = $this->userContext->getActiveId()) === null) {
|
|
return [];
|
|
}
|
|
|
|
$addressesQb = sqlQueryBuilder()->select('*')
|
|
->from('users_addresses')
|
|
->andWhere(Operator::equals(['id_user' => $userId]))
|
|
->orderBy('delivery_firm, delivery_surname, delivery_name');
|
|
|
|
$entities = [];
|
|
foreach ($addressesQb->execute() as $address) {
|
|
$entities[] = $this->entityUtil->createEntity($address, DeliveryAddressEntity::class, $this->deliveryAddressConverter);
|
|
}
|
|
|
|
return $entities;
|
|
}
|
|
|
|
public function getDeliveryAddressesForUsers(array $userIds): array
|
|
{
|
|
if (empty($userIds)) {
|
|
return [];
|
|
}
|
|
|
|
$qb = sqlQueryBuilder()->select('*')
|
|
->from('users_addresses')
|
|
->where(Operator::inIntArray($userIds, 'id_user'))
|
|
->orderBy('delivery_firm, delivery_surname, delivery_name');
|
|
|
|
$userAddresses = [];
|
|
|
|
foreach ($qb->execute() as $address) {
|
|
$userAddresses[$address['id_user']][] = $this->entityUtil->createEntity($address,
|
|
DeliveryAddressEntity::class, $this->deliveryAddressConverter);
|
|
}
|
|
|
|
return $userAddresses;
|
|
}
|
|
|
|
public function getDeliveryAddressesIds(): array
|
|
{
|
|
if (($userId = $this->userContext->getActiveId()) === null) {
|
|
return [];
|
|
}
|
|
|
|
return sqlQueryBuilder()->select('id')
|
|
->from('users_addresses')
|
|
->andWhere(Operator::equals(['id_user' => $userId]))
|
|
->execute()->fetchFirstColumn();
|
|
}
|
|
|
|
public function getDeliveryAddress(int $addressId): ?DeliveryAddressEntity
|
|
{
|
|
$address = sqlQueryBuilder()->select('*')
|
|
->from('users_addresses')
|
|
->andWhere(Operator::equals(['id' => $addressId]))
|
|
->execute()->fetchAssociative();
|
|
|
|
if ($address === false) {
|
|
return null;
|
|
}
|
|
|
|
return $this->entityUtil->createEntity($address, DeliveryAddressEntity::class, $this->deliveryAddressConverter);
|
|
}
|
|
|
|
/**
|
|
* @return bool true if new address was created
|
|
*
|
|
* @throws Exception
|
|
*/
|
|
public function saveDeliveryAddress(DeliveryAddressEntity $address): bool
|
|
{
|
|
$fields = [
|
|
'id_user' => $address->getIdUser(),
|
|
'delivery_name' => $address->getName(),
|
|
'delivery_surname' => $address->getSurname(),
|
|
'delivery_firm' => $address->getFirm(),
|
|
'delivery_street' => $address->getStreet(),
|
|
'delivery_city' => $address->getCity(),
|
|
'delivery_zip' => $address->getZip(),
|
|
'delivery_country' => $address->getCountry(),
|
|
'delivery_phone' => $address->getPhone(),
|
|
'delivery_state' => $address->getState(),
|
|
'delivery_email' => $address->getEmail(),
|
|
'delivery_custom_address' => $address->getCustomAddress(),
|
|
];
|
|
|
|
$qb = sqlQueryBuilder();
|
|
|
|
if ($address->getId() !== null) {
|
|
$qb->update('users_addresses')
|
|
->where(Operator::equals(['id' => $address->getId()]));
|
|
} else {
|
|
$qb->insert('users_addresses');
|
|
}
|
|
|
|
$qb->directValues($fields)->execute();
|
|
|
|
if ($address->getId() === null) {
|
|
$address->setId(sqlInsertId());
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public function isAllowed(): bool
|
|
{
|
|
$cfg = Config::get();
|
|
|
|
if (empty($cfg['Modules']['user_addresses']['user_types'])) {
|
|
return false;
|
|
}
|
|
|
|
foreach ($cfg['Modules']['user_addresses']['user_types'] as $type) {
|
|
if ($this->userContext->isType($type)) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public function deleteAddress(int $addressId, bool $checkUser = true): void
|
|
{
|
|
$qb = sqlQueryBuilder()
|
|
->delete('users_addresses')
|
|
->where(Operator::equals(['id' => $addressId]));
|
|
|
|
if ($checkUser) {
|
|
if (($userId = $this->userContext->getActiveId()) === null) {
|
|
return;
|
|
}
|
|
|
|
$qb->andWhere(Operator::equals(['id_user' => $userId]));
|
|
}
|
|
|
|
$qb->execute();
|
|
}
|
|
}
|