Merge pull request #1775 from thyseus/introduce-order-item-events
introduce 'checkout.order.orderitem.save.[before/after]' events
This commit is contained in:
commit
b7b3441607
|
|
@ -20,3 +20,4 @@ composer.lock
|
||||||
yarn.lock
|
yarn.lock
|
||||||
package-lock.json
|
package-lock.json
|
||||||
yarn.lock
|
yarn.lock
|
||||||
|
.php_cs.cache
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,8 @@
|
||||||
<div class="page-content">
|
<div class="page-content">
|
||||||
|
|
||||||
<tabs>
|
<tabs>
|
||||||
|
{!! view_render_event('sales.order.tabs.before', ['order' => $order]) !!}
|
||||||
|
|
||||||
<tab name="{{ __('admin::app.sales.orders.info') }}" :selected="true">
|
<tab name="{{ __('admin::app.sales.orders.info') }}" :selected="true">
|
||||||
<div class="sale-container">
|
<div class="sale-container">
|
||||||
|
|
||||||
|
|
@ -506,8 +508,10 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</tab>
|
</tab>
|
||||||
|
|
||||||
|
{!! view_render_event('sales.order.tabs.after', ['order' => $order]) !!}
|
||||||
</tabs>
|
</tabs>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@stop
|
@stop
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
namespace Webkul\Sales\Repositories;
|
namespace Webkul\Sales\Repositories;
|
||||||
|
|
||||||
use Illuminate\Container\Container as App;
|
use Illuminate\Container\Container as App;
|
||||||
|
use Illuminate\Support\Facades\Event;
|
||||||
use Webkul\Core\Eloquent\Repository;
|
use Webkul\Core\Eloquent\Repository;
|
||||||
use Webkul\Sales\Contracts\OrderItem;
|
use Webkul\Sales\Contracts\OrderItem;
|
||||||
|
|
||||||
|
|
@ -51,7 +52,7 @@ class OrderItemRepository extends Repository
|
||||||
|
|
||||||
$totalInvoiced = $baseTotalInvoiced = 0;
|
$totalInvoiced = $baseTotalInvoiced = 0;
|
||||||
$taxInvoiced = $baseTaxInvoiced = 0;
|
$taxInvoiced = $baseTaxInvoiced = 0;
|
||||||
|
|
||||||
$totalRefunded = $baseTotalRefunded = 0;
|
$totalRefunded = $baseTotalRefunded = 0;
|
||||||
$taxRefunded = $baseTaxRefunded = 0;
|
$taxRefunded = $baseTaxRefunded = 0;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,15 +3,15 @@
|
||||||
namespace Webkul\Sales\Repositories;
|
namespace Webkul\Sales\Repositories;
|
||||||
|
|
||||||
use Illuminate\Container\Container as App;
|
use Illuminate\Container\Container as App;
|
||||||
use Illuminate\Support\Facades\Event;
|
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
|
use Illuminate\Support\Facades\Event;
|
||||||
use Webkul\Core\Eloquent\Repository;
|
use Webkul\Core\Eloquent\Repository;
|
||||||
use Webkul\Sales\Contracts\Order;
|
|
||||||
use Webkul\Sales\Repositories\OrderItemRepository;
|
|
||||||
use Webkul\Core\Models\CoreConfig;
|
use Webkul\Core\Models\CoreConfig;
|
||||||
|
use Webkul\Sales\Contracts\Order;
|
||||||
|
use Webkul\Sales\Models\Order as OrderModel;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Order Reposotory
|
* Order Repository
|
||||||
*
|
*
|
||||||
* @author Jitendra Singh <jitendra@webkul.com>
|
* @author Jitendra Singh <jitendra@webkul.com>
|
||||||
* @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
|
* @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
|
||||||
|
|
@ -35,16 +35,16 @@ class OrderRepository extends Repository
|
||||||
/**
|
/**
|
||||||
* Create a new repository instance.
|
* Create a new repository instance.
|
||||||
*
|
*
|
||||||
* @param Webkul\Sales\Repositories\OrderItemRepository $orderItemRepository
|
* @param Webkul\Sales\Repositories\OrderItemRepository $orderItemRepository
|
||||||
* @param Webkul\Sales\Repositories\DownloadableLinkPurchasedRepository $downloadableLinkPurchasedRepository
|
* @param Webkul\Sales\Repositories\DownloadableLinkPurchasedRepository $downloadableLinkPurchasedRepository
|
||||||
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function __construct(
|
public function __construct(
|
||||||
OrderItemRepository $orderItemRepository,
|
OrderItemRepository $orderItemRepository,
|
||||||
DownloadableLinkPurchasedRepository $downloadableLinkPurchasedRepository,
|
DownloadableLinkPurchasedRepository $downloadableLinkPurchasedRepository,
|
||||||
App $app
|
App $app
|
||||||
)
|
) {
|
||||||
{
|
|
||||||
$this->orderItemRepository = $orderItemRepository;
|
$this->orderItemRepository = $orderItemRepository;
|
||||||
|
|
||||||
$this->downloadableLinkPurchasedRepository = $downloadableLinkPurchasedRepository;
|
$this->downloadableLinkPurchasedRepository = $downloadableLinkPurchasedRepository;
|
||||||
|
|
@ -58,13 +58,14 @@ class OrderRepository extends Repository
|
||||||
* @return Mixed
|
* @return Mixed
|
||||||
*/
|
*/
|
||||||
|
|
||||||
function model()
|
public function model()
|
||||||
{
|
{
|
||||||
return Order::class;
|
return Order::class;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param array $data
|
* @param array $data
|
||||||
|
*
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
public function create(array $data)
|
public function create(array $data)
|
||||||
|
|
@ -95,12 +96,15 @@ class OrderRepository extends Repository
|
||||||
|
|
||||||
$order->payment()->create($data['payment']);
|
$order->payment()->create($data['payment']);
|
||||||
|
|
||||||
if (isset($data['shipping_address']))
|
if (isset($data['shipping_address'])) {
|
||||||
$order->addresses()->create($data['shipping_address']);
|
$order->addresses()->create($data['shipping_address']);
|
||||||
|
}
|
||||||
|
|
||||||
$order->addresses()->create($data['billing_address']);
|
$order->addresses()->create($data['billing_address']);
|
||||||
|
|
||||||
foreach ($data['items'] as $item) {
|
foreach ($data['items'] as $item) {
|
||||||
|
Event::fire('checkout.order.orderitem.save.before', $data);
|
||||||
|
|
||||||
$orderItem = $this->orderItemRepository->create(array_merge($item, ['order_id' => $order->id]));
|
$orderItem = $this->orderItemRepository->create(array_merge($item, ['order_id' => $order->id]));
|
||||||
|
|
||||||
if (isset($item['children']) && $item['children']) {
|
if (isset($item['children']) && $item['children']) {
|
||||||
|
|
@ -112,6 +116,8 @@ class OrderRepository extends Repository
|
||||||
$this->orderItemRepository->manageInventory($orderItem);
|
$this->orderItemRepository->manageInventory($orderItem);
|
||||||
|
|
||||||
$this->downloadableLinkPurchasedRepository->saveLinks($orderItem, 'available');
|
$this->downloadableLinkPurchasedRepository->saveLinks($orderItem, 'available');
|
||||||
|
|
||||||
|
Event::fire('checkout.order.orderitem.save.after', $data);
|
||||||
}
|
}
|
||||||
|
|
||||||
Event::fire('checkout.order.save.after', $order);
|
Event::fire('checkout.order.save.after', $order);
|
||||||
|
|
@ -128,20 +134,23 @@ class OrderRepository extends Repository
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param int $orderId
|
* @param int $orderId
|
||||||
|
*
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
public function cancel($orderId)
|
public function cancel($orderId)
|
||||||
{
|
{
|
||||||
$order = $this->findOrFail($orderId);
|
$order = $this->findOrFail($orderId);
|
||||||
|
|
||||||
if (! $order->canCancel())
|
if (! $order->canCancel()) {
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
Event::fire('sales.order.cancel.before', $order);
|
Event::fire('sales.order.cancel.before', $order);
|
||||||
|
|
||||||
foreach ($order->items as $item) {
|
foreach ($order->items as $item) {
|
||||||
if (! $item->qty_to_cancel)
|
if (! $item->qty_to_cancel) {
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
$orderItems = [];
|
$orderItems = [];
|
||||||
|
|
||||||
|
|
@ -152,11 +161,12 @@ class OrderRepository extends Repository
|
||||||
} else {
|
} else {
|
||||||
$orderItems[] = $item;
|
$orderItems[] = $item;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($orderItems as $orderItem) {
|
foreach ($orderItems as $orderItem) {
|
||||||
if ($orderItem->product)
|
if ($orderItem->product) {
|
||||||
$this->orderItemRepository->returnQtyToProductInventory($orderItem);
|
$this->orderItemRepository->returnQtyToProductInventory($orderItem);
|
||||||
|
}
|
||||||
|
|
||||||
if ($orderItem->qty_ordered) {
|
if ($orderItem->qty_ordered) {
|
||||||
$orderItem->qty_canceled += $orderItem->qty_to_cancel;
|
$orderItem->qty_canceled += $orderItem->qty_to_cancel;
|
||||||
$orderItem->save();
|
$orderItem->save();
|
||||||
|
|
@ -188,19 +198,21 @@ class OrderRepository extends Repository
|
||||||
{
|
{
|
||||||
$config = new CoreConfig();
|
$config = new CoreConfig();
|
||||||
|
|
||||||
$invoiceNumberPrefix = $config->where('code','=',"sales.orderSettings.order_number.order_number_prefix")->first()
|
foreach ([
|
||||||
? $config->where('code','=',"sales.orderSettings.order_number.order_number_prefix")->first()->value : false;
|
'Prefix' => 'prefix',
|
||||||
|
'Length' => 'length',
|
||||||
$invoiceNumberLength = $config->where('code','=',"sales.orderSettings.order_number.order_number_length")->first()
|
'Suffix' => 'suffix',
|
||||||
? $config->where('code','=',"sales.orderSettings.order_number.order_number_length")->first()->value : false;
|
] as $varSuffix => $confKey) {
|
||||||
|
$var = "invoiceNumber{$varSuffix}";
|
||||||
$invoiceNumberSuffix = $config->where('code','=',"sales.orderSettings.order_number.order_number_suffix")->first()
|
$$var = $config
|
||||||
? $config->where('code','=',"sales.orderSettings.order_number.order_number_suffix")->first()->value: false;
|
->where('code', '=', "sales.orderSettings.order_number.order_number_{$confKey}")
|
||||||
|
->first() ?: false;
|
||||||
|
}
|
||||||
|
|
||||||
$lastOrder = $this->model->orderBy('id', 'desc')->limit(1)->first();
|
$lastOrder = $this->model->orderBy('id', 'desc')->limit(1)->first();
|
||||||
$lastId = $lastOrder ? $lastOrder->id : 0;
|
$lastId = $lastOrder ? $lastOrder->id : 0;
|
||||||
|
|
||||||
if ($invoiceNumberLength && ( $invoiceNumberPrefix || $invoiceNumberSuffix) ) {
|
if ($invoiceNumberLength && ($invoiceNumberPrefix || $invoiceNumberSuffix)) {
|
||||||
$invoiceNumber = $invoiceNumberPrefix . sprintf("%0{$invoiceNumberLength}d", 0) . ($lastId + 1) . $invoiceNumberSuffix;
|
$invoiceNumber = $invoiceNumberPrefix . sprintf("%0{$invoiceNumberLength}d", 0) . ($lastId + 1) . $invoiceNumberSuffix;
|
||||||
} else {
|
} else {
|
||||||
$invoiceNumber = $lastId + 1;
|
$invoiceNumber = $lastId + 1;
|
||||||
|
|
@ -211,13 +223,14 @@ class OrderRepository extends Repository
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param mixed $order
|
* @param mixed $order
|
||||||
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function isInCompletedState($order)
|
public function isInCompletedState($order)
|
||||||
{
|
{
|
||||||
$totalQtyOrdered = $totalQtyInvoiced = $totalQtyShipped = $totalQtyRefunded = $totalQtyCanceled = 0;
|
$totalQtyOrdered = $totalQtyInvoiced = $totalQtyShipped = $totalQtyRefunded = $totalQtyCanceled = 0;
|
||||||
|
|
||||||
foreach ($order->items()->get() as $item) {
|
foreach ($order->items()->get() as $item) {
|
||||||
$totalQtyOrdered += $item->qty_ordered;
|
$totalQtyOrdered += $item->qty_ordered;
|
||||||
$totalQtyInvoiced += $item->qty_invoiced;
|
$totalQtyInvoiced += $item->qty_invoiced;
|
||||||
|
|
||||||
|
|
@ -233,14 +246,16 @@ class OrderRepository extends Repository
|
||||||
|
|
||||||
if ($totalQtyOrdered != ($totalQtyRefunded + $totalQtyCanceled)
|
if ($totalQtyOrdered != ($totalQtyRefunded + $totalQtyCanceled)
|
||||||
&& $totalQtyOrdered == $totalQtyInvoiced + $totalQtyCanceled
|
&& $totalQtyOrdered == $totalQtyInvoiced + $totalQtyCanceled
|
||||||
&& $totalQtyOrdered == $totalQtyShipped + $totalQtyRefunded + $totalQtyCanceled)
|
&& $totalQtyOrdered == $totalQtyShipped + $totalQtyRefunded + $totalQtyCanceled) {
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param mixed $order
|
* @param mixed $order
|
||||||
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function isInCanceledState($order)
|
public function isInCanceledState($order)
|
||||||
|
|
@ -257,13 +272,14 @@ class OrderRepository extends Repository
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param mixed $order
|
* @param mixed $order
|
||||||
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function isInClosedState($order)
|
public function isInClosedState($order)
|
||||||
{
|
{
|
||||||
$totalQtyOrdered = $totalQtyRefunded = $totalQtyCanceled = 0;
|
$totalQtyOrdered = $totalQtyRefunded = $totalQtyCanceled = 0;
|
||||||
|
|
||||||
foreach ($order->items()->get() as $item) {
|
foreach ($order->items()->get() as $item) {
|
||||||
$totalQtyOrdered += $item->qty_ordered;
|
$totalQtyOrdered += $item->qty_ordered;
|
||||||
$totalQtyRefunded += $item->qty_refunded;
|
$totalQtyRefunded += $item->qty_refunded;
|
||||||
$totalQtyCanceled += $item->qty_canceled;
|
$totalQtyCanceled += $item->qty_canceled;
|
||||||
|
|
@ -274,19 +290,22 @@ class OrderRepository extends Repository
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param mixed $order
|
* @param mixed $order
|
||||||
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function updateOrderStatus($order)
|
public function updateOrderStatus($order)
|
||||||
{
|
{
|
||||||
$status = 'processing';
|
$status = 'processing';
|
||||||
|
|
||||||
if ($this->isInCompletedState($order))
|
if ($this->isInCompletedState($order)) {
|
||||||
$status = 'completed';
|
$status = 'completed';
|
||||||
|
}
|
||||||
|
|
||||||
if ($this->isInCanceledState($order))
|
if ($this->isInCanceledState($order)) {
|
||||||
$status = 'canceled';
|
$status = 'canceled';
|
||||||
else if ($this->isInClosedState($order))
|
} elseif ($this->isInClosedState($order)) {
|
||||||
$status = 'closed';
|
$status = 'closed';
|
||||||
|
}
|
||||||
|
|
||||||
$order->status = $status;
|
$order->status = $status;
|
||||||
$order->save();
|
$order->save();
|
||||||
|
|
@ -294,6 +313,7 @@ class OrderRepository extends Repository
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param mixed $order
|
* @param mixed $order
|
||||||
|
*
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
public function collectTotals($order)
|
public function collectTotals($order)
|
||||||
|
|
@ -352,4 +372,4 @@ class OrderRepository extends Repository
|
||||||
|
|
||||||
return $order;
|
return $order;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,38 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Webkul\Sales\Models\Order;
|
||||||
|
use Webkul\Sales\Repositories\OrderRepository;
|
||||||
|
|
||||||
|
class OrderRepositoryCest
|
||||||
|
{
|
||||||
|
private $repository;
|
||||||
|
|
||||||
|
public function _before()
|
||||||
|
{
|
||||||
|
// @see https://stackoverflow.com/a/8457580
|
||||||
|
$reflection = new ReflectionClass(OrderRepository::class);
|
||||||
|
|
||||||
|
$property = $reflection->getProperty('model');
|
||||||
|
$property->setAccessible(true);
|
||||||
|
|
||||||
|
$this->repository = $reflection->newInstanceWithoutConstructor();
|
||||||
|
$property->setValue($this->repository, new Order());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGenerateIncrementIdOnEmptyDatabase(UnitTester $I)
|
||||||
|
{
|
||||||
|
$result = $this->repository->generateIncrementId();
|
||||||
|
|
||||||
|
$I->assertEquals(1, $result);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGenerateIncrementIdOnFilledDatabase(UnitTester $I)
|
||||||
|
{
|
||||||
|
$order = new Order(['id' => rand(666, 1337)]);
|
||||||
|
$order->save();
|
||||||
|
|
||||||
|
$result = $this->repository->generateIncrementId();
|
||||||
|
|
||||||
|
$I->assertEquals($order->id + 1, $result);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue