Completed
Push — master ( 33a95e...daccbb )
by Aimeos
09:31
created

Standard::getName()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 4
rs 10
cc 1
eloc 2
nc 1
nop 0
1
<?php
2
3
/**
4
 * @copyright Metaways Infosystems GmbH, 2014
5
 * @license LGPLv3, http://opensource.org/licenses/LGPL-3.0
6
 * @copyright Aimeos (aimeos.org), 2015
7
 * @package Controller
8
 * @subpackage Order
9
 */
10
11
12
namespace Aimeos\Controller\Jobs\Order\Email\Delivery;
13
14
15
/**
16
 * Order delivery e-mail job controller.
17
 *
18
 * @package Controller
19
 * @subpackage Order
20
 */
21
class Standard
22
	extends \Aimeos\Controller\Jobs\Base
23
	implements \Aimeos\Controller\Jobs\Iface
24
{
25
	/**
26
	 * Returns the localized name of the job.
27
	 *
28
	 * @return string Name of the job
29
	 */
30
	public function getName()
31
	{
32
		return $this->getContext()->getI18n()->dt( 'controller/jobs', 'Order delivery related e-mails' );
33
	}
34
35
36
	/**
37
	 * Returns the localized description of the job.
38
	 *
39
	 * @return string Description of the job
40
	 */
41
	public function getDescription()
42
	{
43
		return $this->getContext()->getI18n()->dt( 'controller/jobs', 'Sends order delivery status update e-mails' );
44
	}
45
46
47
	/**
48
	 * Executes the job.
49
	 *
50
	 * @throws \Aimeos\Controller\Jobs\Exception If an error occurs
51
	 */
52
	public function run()
53
	{
54
		$aimeos = $this->getAimeos();
55
		$context = $this->getContext();
56
		$config = $context->getConfig();
57
		$mailer = $context->getMail();
58
		$view = $context->getView();
59
60
		$templatePaths = $aimeos->getCustomPaths( 'client/html/templates' );
61
62
		$helper = new \Aimeos\MW\View\Helper\Config\Standard( $view, $config );
63
		$view->addHelper( 'config', $helper );
64
65
		$client = \Aimeos\Client\Html\Email\Delivery\Factory::createClient( $context, $templatePaths );
66
67
		$orderManager = \Aimeos\MShop\Order\Manager\Factory::createManager( $context );
68
		$orderStatusManager = $orderManager->getSubManager( 'status' );
69
		$orderBaseManager = $orderManager->getSubManager( 'base' );
70
71
		/** controller/jobs/order/email/delivery/standard/limit-days
72
		 * Only send delivery e-mails of orders that were created in the past within the configured number of days
73
		 *
74
		 * The delivery e-mails are normally send immediately after the delivery
75
		 * status has changed. This option prevents e-mails for old order from
76
		 * being send in case anything went wrong or an update failed to avoid
77
		 * confusion of customers.
78
		 *
79
		 * @param integer Number of days
80
		 * @since 2014.03
81
		 * @category User
82
		 * @category Developer
83
		 * @see controller/jobs/order/email/delivery/standard/status
84
		 * @see controller/jobs/order/email/payment/standard/limit-days
85
		 * @see controller/jobs/service/delivery/process/limit-days
86
		 */
87
		$limit = $config->get( 'controller/jobs/order/email/delivery/standard/limit-days', 90 );
88
		$limitDate = date( 'Y-m-d H:i:s', time() - $limit * 86400 );
89
90
		$default = array(
91
			\Aimeos\MShop\Order\Item\Base::STAT_PROGRESS,
92
			\Aimeos\MShop\Order\Item\Base::STAT_DISPATCHED,
93
			\Aimeos\MShop\Order\Item\Base::STAT_REFUSED,
94
			\Aimeos\MShop\Order\Item\Base::STAT_RETURNED,
95
		);
96
97
		/** controller/jobs/order/email/delivery/standard/status
98
		 * Only send order delivery notification e-mails for these delivery status values
99
		 *
100
		 * Notification e-mail about delivery status changes can be sent for these
101
		 * status values:
102
		 * * 0: deleted
103
		 * * 1: pending
104
		 * * 2: progress
105
		 * * 3: dispatched
106
		 * * 4: delivered
107
		 * * 5: lost
108
		 * * 6: refused
109
		 * * 7: returned
110
		 *
111
		 * User-defined status values are possible but should be in the private
112
		 * block of values between 30000 and 32767.
113
		 *
114
		 * @param integer Delivery status constant
115
		 * @since 2014.03
116
		 * @category User
117
		 * @category Developer
118
		 * @see controller/jobs/order/email/payment/standard/status
119
		 * @see controller/jobs/order/email/delivery/standard/limit-days
120
		 */
121
		foreach( (array) $config->get( 'controller/jobs/order/email/delivery/standard/status', $default ) as $status )
122
		{
123
			$orderSearch = $orderManager->createSearch();
124
125
			$param = array( \Aimeos\MShop\Order\Item\Status\Base::EMAIL_DELIVERY, $status );
126
			$orderFunc = $orderSearch->createFunction( 'order.containsStatus', $param );
127
128
			$expr = array(
129
				$orderSearch->compare( '>=', 'order.mtime', $limitDate ),
130
				$orderSearch->compare( '==', 'order.statusdelivery', $status ),
131
				$orderSearch->compare( '==', $orderFunc, 0 ),
132
			);
133
			$orderSearch->setConditions( $orderSearch->combine( '&&', $expr ) );
134
135
			$start = 0;
136
137
			do
138
			{
139
				$items = $orderManager->searchItems( $orderSearch );
140
141
				foreach( $items as $id => $item )
142
				{
143
					try
144
					{
145
						$orderBaseItem = $orderBaseManager->load( $item->getBaseId() );
146
147
						try {
148
							$addr = $orderBaseItem->getAddress( \Aimeos\MShop\Order\Item\Base\Address\Base::TYPE_DELIVERY );
149
						} catch( \Exception $e ) {
150
							$addr = $orderBaseItem->getAddress( \Aimeos\MShop\Order\Item\Base\Address\Base::TYPE_PAYMENT );
151
						}
152
153
						$view->extAddressItem = $addr;
154
						$view->extOrderBaseItem = $orderBaseItem;
155
						$view->extOrderItem = $item;
156
157
						$helper = new \Aimeos\MW\View\Helper\Translate\Standard( $view, $context->getI18n( $addr->getLanguageId() ) );
158
						$view->addHelper( 'translate', $helper );
159
160
						$message = $mailer->createMessage();
161
						$helper = new \Aimeos\MW\View\Helper\Mail\Standard( $view, $message );
162
						$view->addHelper( 'mail', $helper );
163
164
						$client->setView( $view );
165
						$client->getHeader();
166
						$client->getBody();
167
168
						$mailer->send( $message );
169
170
						$statusItem = $orderStatusManager->createItem();
171
						$statusItem->setParentId( $id );
172
						$statusItem->setType( \Aimeos\MShop\Order\Item\Status\Base::EMAIL_DELIVERY );
173
						$statusItem->setValue( $status );
174
175
						$orderStatusManager->saveItem( $statusItem );
176
					}
177
					catch( \Exception $e )
178
					{
179
						$str = 'Error while trying to send delivery e-mail for order ID "%1$s" and status "%2$s": %3$s';
180
						$msg = sprintf( $str, $item->getId(), $item->getDeliveryStatus(), $e->getMessage() );
181
						$context->getLogger()->log( $msg );
182
					}
183
				}
184
185
				$count = count( $items );
186
				$start += $count;
187
				$orderSearch->setSlice( $start );
188
			}
189
			while( $count >= $orderSearch->getSliceSize() );
190
		}
191
	}
192
}
193