Skip to content

Commit

Permalink
MAGETWO-56495: Introduce and implement ShipmentNotifier
Browse files Browse the repository at this point in the history
  • Loading branch information
Dmytro Voskoboinikov committed Aug 11, 2016
1 parent 04474e5 commit 0b4d732
Show file tree
Hide file tree
Showing 5 changed files with 611 additions and 0 deletions.
41 changes: 41 additions & 0 deletions app/code/Magento/Sales/Model/Order/Shipment/Notifier.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?php
/**
* Copyright © 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Sales\Model\Order\Shipment;

/**
* Shipment notifier.
*
* @api
*/
class Notifier implements \Magento\Sales\Model\Order\Shipment\NotifierInterface
{
/**
* @var \Magento\Sales\Model\Order\Shipment\SenderInterface[]
*/
private $senders;

/**
* @param \Magento\Sales\Model\Order\Shipment\SenderInterface[] $senders
*/
public function __construct(array $senders = [])
{
$this->senders = $senders;
}

/**
* {@inheritdoc}
*/
public function notify(
\Magento\Sales\Api\Data\OrderInterface $order,
\Magento\Sales\Api\Data\ShipmentInterface $shipment,
\Magento\Sales\Api\Data\ShipmentCommentCreationInterface $comment = null,
$forceSyncMode = false
) {
foreach ($this->senders as $sender) {
$sender->send($order, $shipment, $comment, $forceSyncMode);
}
}
}
31 changes: 31 additions & 0 deletions app/code/Magento/Sales/Model/Order/Shipment/NotifierInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php
/**
* Copyright © 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Sales\Model\Order\Shipment;

/**
* Interface for Shipment notifier.
*
* @api
*/
interface NotifierInterface
{
/**
* Notifies customer.
*
* @param \Magento\Sales\Api\Data\OrderInterface $order
* @param \Magento\Sales\Api\Data\ShipmentInterface $shipment
* @param \Magento\Sales\Api\Data\ShipmentCommentCreationInterface|null $comment
* @param bool $forceSyncMode
*
* @return void
*/
public function notify(
\Magento\Sales\Api\Data\OrderInterface $order,
\Magento\Sales\Api\Data\ShipmentInterface $shipment,
\Magento\Sales\Api\Data\ShipmentCommentCreationInterface $comment = null,
$forceSyncMode = false
);
}
149 changes: 149 additions & 0 deletions app/code/Magento/Sales/Model/Order/Shipment/Sender/EmailSender.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
<?php
/**
* Copyright © 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Sales\Model\Order\Shipment\Sender;

use Magento\Sales\Model\Order\Email\Sender;
use Magento\Sales\Model\Order\Shipment\SenderInterface;

/**
* Email notification sender for Shipment.
*/
class EmailSender extends Sender implements SenderInterface
{
/**
* @var \Magento\Payment\Helper\Data
*/
private $paymentHelper;

/**
* @var \Magento\Sales\Model\ResourceModel\Order\Shipment
*/
private $shipmentResource;

/**
* @var \Magento\Framework\App\Config\ScopeConfigInterface
*/
private $globalConfig;

/**
* @var \Magento\Framework\Event\ManagerInterface
*/
private $eventManager;

/**
* @param \Magento\Sales\Model\Order\Email\Container\Template $templateContainer
* @param \Magento\Sales\Model\Order\Email\Container\ShipmentIdentity $identityContainer
* @param \Magento\Sales\Model\Order\Email\SenderBuilderFactory $senderBuilderFactory
* @param \Psr\Log\LoggerInterface $logger
* @param \Magento\Sales\Model\Order\Address\Renderer $addressRenderer
* @param \Magento\Payment\Helper\Data $paymentHelper
* @param \Magento\Sales\Model\ResourceModel\Order\Shipment $shipmentResource
* @param \Magento\Framework\App\Config\ScopeConfigInterface $globalConfig
* @param \Magento\Framework\Event\ManagerInterface $eventManager
*/
public function __construct(
\Magento\Sales\Model\Order\Email\Container\Template $templateContainer,
\Magento\Sales\Model\Order\Email\Container\ShipmentIdentity $identityContainer,
\Magento\Sales\Model\Order\Email\SenderBuilderFactory $senderBuilderFactory,
\Psr\Log\LoggerInterface $logger,
\Magento\Sales\Model\Order\Address\Renderer $addressRenderer,
\Magento\Payment\Helper\Data $paymentHelper,
\Magento\Sales\Model\ResourceModel\Order\Shipment $shipmentResource,
\Magento\Framework\App\Config\ScopeConfigInterface $globalConfig,
\Magento\Framework\Event\ManagerInterface $eventManager
) {
parent::__construct(
$templateContainer,
$identityContainer,
$senderBuilderFactory,
$logger,
$addressRenderer
);

$this->paymentHelper = $paymentHelper;
$this->shipmentResource = $shipmentResource;
$this->globalConfig = $globalConfig;
$this->eventManager = $eventManager;
}

/**
* Sends order shipment email to the customer.
*
* Email will be sent immediately in two cases:
*
* - if asynchronous email sending is disabled in global settings
* - if $forceSyncMode parameter is set to TRUE
*
* Otherwise, email will be sent later during running of
* corresponding cron job.
*
* @param \Magento\Sales\Api\Data\OrderInterface $order
* @param \Magento\Sales\Api\Data\ShipmentInterface $shipment
* @param \Magento\Sales\Api\Data\ShipmentCommentCreationInterface|null $comment
* @param bool $forceSyncMode
*
* @return bool
*/
public function send(
\Magento\Sales\Api\Data\OrderInterface $order,
\Magento\Sales\Api\Data\ShipmentInterface $shipment,
\Magento\Sales\Api\Data\ShipmentCommentCreationInterface $comment = null,
$forceSyncMode = false
) {
$shipment->setSendEmail(true);

if (!$this->globalConfig->getValue('sales_email/general/async_sending') || $forceSyncMode) {
$transport = [
'order' => $order,
'shipment' => $shipment,
'comment' => $comment ? $comment->getComment() : '',
'billing' => $order->getBillingAddress(),
'payment_html' => $this->getPaymentHtml($order),
'store' => $order->getStore(),
'formattedShippingAddress' => $this->getFormattedShippingAddress($order),
'formattedBillingAddress' => $this->getFormattedBillingAddress($order)
];

$this->eventManager->dispatch(
'email_shipment_set_template_vars_before',
['sender' => $this, 'transport' => $transport]
);

$this->templateContainer->setTemplateVars($transport);

if ($this->checkAndSend($order)) {
$shipment->setEmailSent(true);

$this->shipmentResource->saveAttribute($shipment, ['send_email', 'email_sent']);

return true;
}
} else {
$shipment->setEmailSent(null);

$this->shipmentResource->saveAttribute($shipment, 'email_sent');
}

$this->shipmentResource->saveAttribute($shipment, 'send_email');

return false;
}

/**
* Returns payment info block as HTML.
*
* @param \Magento\Sales\Api\Data\OrderInterface $order
*
* @return string
*/
private function getPaymentHtml(\Magento\Sales\Api\Data\OrderInterface $order)
{
return $this->paymentHelper->getInfoBlockHtml(
$order->getPayment(),
$this->identityContainer->getStore()->getStoreId()
);
}
}
29 changes: 29 additions & 0 deletions app/code/Magento/Sales/Model/Order/Shipment/SenderInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php
/**
* Copyright © 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Sales\Model\Order\Shipment;

/**
* Interface for notification sender for Shipment.
*/
interface SenderInterface
{
/**
* Sends notification to a customer.
*
* @param \Magento\Sales\Api\Data\OrderInterface $order
* @param \Magento\Sales\Api\Data\ShipmentInterface $shipment
* @param \Magento\Sales\Api\Data\ShipmentCommentCreationInterface|null $comment
* @param bool $forceSyncMode
*
* @return bool
*/
public function send(
\Magento\Sales\Api\Data\OrderInterface $order,
\Magento\Sales\Api\Data\ShipmentInterface $shipment,
\Magento\Sales\Api\Data\ShipmentCommentCreationInterface $comment = null,
$forceSyncMode = false
);
}
Loading

0 comments on commit 0b4d732

Please sign in to comment.