Merge pull request #1775 from thyseus/introduce-order-item-events

introduce 'checkout.order.orderitem.save.[before/after]' events
This commit is contained in:
Jitendra Singh 2019-12-03 14:39:11 +05:30 committed by GitHub
commit b7b3441607
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 97 additions and 33 deletions

1
.gitignore vendored
View File

@ -20,3 +20,4 @@ composer.lock
yarn.lock yarn.lock
package-lock.json package-lock.json
yarn.lock yarn.lock
.php_cs.cache

View File

@ -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

View File

@ -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;

View File

@ -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;
} }
} }

View File

@ -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);
}
}