<?php
declare(strict_types=1);
namespace BitBag\OpenMarketplace\Component\Core\Vendor\EventListener;
use BitBag\OpenMarketplace\Component\Customer\Model\CustomerInterface;
use BitBag\OpenMarketplace\Component\Organization\Entity\OrganizationInterface;
use BitBag\OpenMarketplace\Component\Vendor\Entity\Address;
use BitBag\OpenMarketplace\Component\Vendor\Entity\VendorInterface;
use BitBag\OpenMarketplace\Component\Vendor\Profile\Factory\ProfileFactoryInterface;
use Doctrine\ORM\EntityManager;
use Sylius\Bundle\ResourceBundle\Event\ResourceControllerEvent;
use Sylius\Component\Addressing\Model\CountryInterface;
use Sylius\Component\Core\Formatter\StringInflector;
use Sylius\Component\Resource\Repository\RepositoryInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class OrganizationVendorRegisterListener implements EventSubscriberInterface
{
public function __construct(
private ProfileFactoryInterface $profileFactory,
private EntityManager $entityManager,
private RepositoryInterface $countryRepository,
) {
}
public static function getSubscribedEvents(): array
{
return [
'sylius.customer.post_register' => ['onOrganizationVendorCreate', 99],
];
}
public function onOrganizationVendorCreate(ResourceControllerEvent $event): void
{
/** @var CustomerInterface $customer */
$customer = $event->getSubject();
/** @var OrganizationInterface $organization */
$organization = $customer->getOrganization();
if (true === $organization->isVendorRegister()) {
$billingData = $organization->getBillingData();
/** @var CountryInterface $country */
$country = $this->countryRepository->findOneBy(
['code' => $billingData->getCountry()],
);
$vendorAddress = new Address();
$vendorAddress->setPostalCode($billingData->getPostcode());
$vendorAddress->setCountry($country);
$vendorAddress->setCity($billingData->getCity());
$vendorAddress->setStreet($billingData->getStreet());
/** @var VendorInterface $vendor */
$vendor = $this->profileFactory->createVendor(
$organization->getName(),
$billingData->getTaxId(),
$organization->getPhoneNumber(),
$vendorAddress
);
$vendor->setSlug(
StringInflector::nameToSlug($organization->getName())
);
$vendor->setOrganization($organization);
$this->entityManager->persist($vendor);
$organization->setVendor($vendor);
$this->entityManager->persist($organization);
$this->entityManager->flush();
}
}
}