Skip to content

Commit

Permalink
Change the sales order data mapper to a composite implementation instead
Browse files Browse the repository at this point in the history
  • Loading branch information
loevgaard committed Apr 12, 2024
1 parent 5646506 commit e3b3780
Show file tree
Hide file tree
Showing 8 changed files with 77 additions and 36 deletions.
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
"knplabs/knp-menu": "^3.4",
"ocramius/doctrine-batch-utils": "^2.4",
"psr/event-dispatcher": "^1.0",
"setono/composite-compiler-pass": "^1.1",
"setono/doctrine-object-manager-trait": "^1.1",
"setono/shipmondo-php-sdk": "^1.0@beta",
"sylius/core": "^1.0",
Expand Down
22 changes: 22 additions & 0 deletions src/DataMapper/CompositeSalesOrderDataMapper.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

declare(strict_types=1);

namespace Setono\SyliusShipmondoPlugin\DataMapper;

use Setono\CompositeCompilerPass\CompositeService;
use Setono\Shipmondo\Request\SalesOrders\SalesOrder;
use Setono\SyliusShipmondoPlugin\Model\OrderInterface;

/**
* @extends CompositeService<SalesOrderDataMapperInterface>
*/
final class CompositeSalesOrderDataMapper extends CompositeService implements SalesOrderDataMapperInterface
{
public function map(OrderInterface $order, SalesOrder $salesOrder): void
{
foreach ($this->services as $service) {
$service->map($order, $salesOrder);
}
}
}
63 changes: 31 additions & 32 deletions src/DataMapper/SalesOrderDataMapper.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,37 +23,38 @@ public function __construct(private readonly EventDispatcherInterface $eventDisp
{
}

public function map(OrderInterface $order): SalesOrder
public function map(OrderInterface $order, SalesOrder $salesOrder): void
{
$salesOrder = new SalesOrder(
orderId: (string) $order->getNumber(),
orderedAt: $order->getCheckoutCompletedAt(),
sourceName: 'Sylius',
orderNote: $order->getNotes(),
shipTo: new Address(
name: $order->getShippingAddress()?->getFullName(),
address1: $order->getShippingAddress()?->getStreet(),
zipCode: $order->getShippingAddress()?->getPostcode(),
city: $order->getShippingAddress()?->getCity(),
countryCode: $order->getShippingAddress()?->getCountryCode(),
email: $order->getCustomer()?->getEmail(),
mobile: $order->getShippingAddress()?->getPhoneNumber(),
),
billTo: new Address(
name: $order->getBillingAddress()?->getFullName(),
address1: $order->getBillingAddress()?->getStreet(),
zipCode: $order->getBillingAddress()?->getPostcode(),
city: $order->getBillingAddress()?->getCity(),
countryCode: $order->getBillingAddress()?->getCountryCode(),
email: $order->getCustomer()?->getEmail(),
mobile: $order->getBillingAddress()?->getPhoneNumber(),
),
paymentDetails: new PaymentDetails(
amountIncludingVat: self::formatAmount($order->getTotal()), // todo this is not necessarily correct
currencyCode: $order->getCurrencyCode(),
vatAmount: self::formatAmount($order->getTaxTotal()),
paymentMethod: self::getPaymentMethod($order),
),
$salesOrder->orderId = (string) $order->getNumber();
$salesOrder->orderedAt = $order->getCheckoutCompletedAt();
$salesOrder->sourceName = 'Sylius';
$salesOrder->orderNote = $order->getNotes();

$salesOrder->shipTo = new Address(
name: $order->getShippingAddress()?->getFullName(),
address1: $order->getShippingAddress()?->getStreet(),
zipCode: $order->getShippingAddress()?->getPostcode(),
city: $order->getShippingAddress()?->getCity(),
countryCode: $order->getShippingAddress()?->getCountryCode(),
email: $order->getCustomer()?->getEmail(),
mobile: $order->getShippingAddress()?->getPhoneNumber(),
);

$salesOrder->billTo = new Address(
name: $order->getBillingAddress()?->getFullName(),
address1: $order->getBillingAddress()?->getStreet(),
zipCode: $order->getBillingAddress()?->getPostcode(),
city: $order->getBillingAddress()?->getCity(),
countryCode: $order->getBillingAddress()?->getCountryCode(),
email: $order->getCustomer()?->getEmail(),
mobile: $order->getBillingAddress()?->getPhoneNumber(),
);

$salesOrder->paymentDetails = new PaymentDetails(
amountIncludingVat: self::formatAmount($order->getTotal()), // todo this is not necessarily correct
currencyCode: $order->getCurrencyCode(),
vatAmount: self::formatAmount($order->getTaxTotal()),
paymentMethod: self::getPaymentMethod($order),
);

foreach ($order->getItems() as $orderItem) {
Expand Down Expand Up @@ -99,8 +100,6 @@ public function map(OrderInterface $order): SalesOrder
}

$this->eventDispatcher->dispatch(new MapSalesOrderEvent($salesOrder, $order));

return $salesOrder;
}

private static function formatAmount(int $amount): string
Expand Down
2 changes: 1 addition & 1 deletion src/DataMapper/SalesOrderDataMapperInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,5 @@ interface SalesOrderDataMapperInterface
/**
* Maps an order to a Shipmondo sales order
*/
public function map(OrderInterface $order): SalesOrder;
public function map(OrderInterface $order, SalesOrder $salesOrder): void;
}
4 changes: 3 additions & 1 deletion src/Message/CommandHandler/UploadOrderHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
namespace Setono\SyliusShipmondoPlugin\Message\CommandHandler;

use Setono\Shipmondo\Client\ClientInterface;
use Setono\Shipmondo\Request\SalesOrders\SalesOrder;
use Setono\SyliusShipmondoPlugin\DataMapper\SalesOrderDataMapperInterface;
use Setono\SyliusShipmondoPlugin\Message\Command\UploadOrder;
use Setono\SyliusShipmondoPlugin\Model\OrderInterface;
Expand Down Expand Up @@ -38,7 +39,8 @@ public function __invoke(UploadOrder $message): void
throw new UnrecoverableMessageHandlingException(sprintf('Order with id %s has been updated since it was tried to be uploaded', (string) $message->order));
}

$salesOrder = $this->salesOrderDataMapper->map($order);
$salesOrder = new SalesOrder();
$this->salesOrderDataMapper->map($order, $salesOrder);

$response = $this->shipmondoClient->salesOrders()->create($salesOrder);

Expand Down
7 changes: 6 additions & 1 deletion src/Resources/config/services/data_mapper.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,14 @@
<container xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://symfony.com/schema/dic/services"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
<services>
<service id="setono_sylius_shipmondo.data_mapper.sales_order"
<service id="setono_sylius_shipmondo.data_mapper.sales_order.composite"
class="Setono\SyliusShipmondoPlugin\DataMapper\CompositeSalesOrderDataMapper"/>

<service id="setono_sylius_shipmondo.data_mapper.sales_order.default"
class="Setono\SyliusShipmondoPlugin\DataMapper\SalesOrderDataMapper">
<argument type="service" id="event_dispatcher"/>

<tag name="setono_sylius_shipmondo.sales_order_data_mapper"/>
</service>
</services>
</container>
2 changes: 1 addition & 1 deletion src/Resources/config/services/message.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
class="Setono\SyliusShipmondoPlugin\Message\CommandHandler\UploadOrderHandler">
<argument type="service" id="sylius.repository.order"/>
<argument type="service" id="setono_sylius_shipmondo.client"/>
<argument type="service" id="setono_sylius_shipmondo.data_mapper.sales_order"/>
<argument type="service" id="setono_sylius_shipmondo.data_mapper.sales_order.composite"/>
<argument type="service" id="state_machine.setono_sylius_shipmondo__order"/>

<tag name="messenger.message_handler"/>
Expand Down
12 changes: 12 additions & 0 deletions src/SetonoSyliusShipmondoPlugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,26 @@

namespace Setono\SyliusShipmondoPlugin;

use Setono\CompositeCompilerPass\CompositeCompilerPass;
use Sylius\Bundle\CoreBundle\Application\SyliusPluginTrait;
use Sylius\Bundle\ResourceBundle\AbstractResourceBundle;
use Sylius\Bundle\ResourceBundle\SyliusResourceBundle;
use Symfony\Component\DependencyInjection\ContainerBuilder;

final class SetonoSyliusShipmondoPlugin extends AbstractResourceBundle
{
use SyliusPluginTrait;

public function build(ContainerBuilder $container): void
{
parent::build($container);

$container->addCompilerPass(new CompositeCompilerPass(
'setono_sylius_shipmondo.data_mapper.sales_order.composite',
'setono_sylius_shipmondo.sales_order_data_mapper',
));
}

public function getSupportedDrivers(): array
{
return [
Expand Down

0 comments on commit e3b3780

Please sign in to comment.