sarga/packages/Webkul/Sales/src/Repositories/OrderRepository.php

128 lines
3.3 KiB
PHP
Raw Normal View History

<?php
namespace Webkul\Sales\Repositories;
use Illuminate\Container\Container as App;
2018-10-04 06:42:06 +00:00
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\DB;
2018-10-05 06:18:58 +00:00
use Illuminate\Database\Eloquent\Model;
use Webkul\Core\Eloquent\Repository;
use Webkul\Sales\Repositories\OrderItemRepository;
use Webkul\Sales\Repositories\OrderItemInventoryRepository;
/**
* Order Reposotory
*
* @author Jitendra Singh <jitendra@webkul.com>
* @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
*/
class OrderRepository extends Repository
{
/**
* OrderItemRepository object
*
* @var Object
*/
protected $orderItem;
2018-10-05 06:18:58 +00:00
/**
* OrderItemInventoryRepository object
*
* @var Object
*/
protected $orderItemInventory;
/**
* Create a new repository instance.
*
2018-10-05 06:18:58 +00:00
* @param Webkul\Sales\Repositories\OrderItemRepository $orderItem
* @param Webkul\Sales\Repositories\OrderItemInventoryRepository $orderItemInventory
* @return void
*/
public function __construct(
OrderItemRepository $orderItem,
2018-10-05 06:18:58 +00:00
OrderItemInventoryRepository $orderItemInventory,
App $app
)
{
$this->orderItem = $orderItem;
2018-10-05 06:18:58 +00:00
$this->orderItemInventory = $orderItemInventory;
parent::__construct($app);
}
/**
* Specify Model class name
*
* @return Mixed
*/
function model()
{
return 'Webkul\Sales\Contracts\Order';
}
/**
* @param array $data
* @return mixed
*/
public function create(array $data)
{
2018-10-04 06:42:06 +00:00
DB::beginTransaction();
try {
Event::fire('checkout.order.save.before', $data);
2018-10-05 06:18:58 +00:00
if(isset($data['customer']) && $data['customer'] instanceof Model) {
$data['customer_id'] = $data['customer']->id;
$data['customer_type'] = get_class($data['customer']);
2018-10-05 11:59:43 +00:00
} else {
unset($data['customer']);
2018-10-05 06:18:58 +00:00
}
2018-10-05 11:59:43 +00:00
$data['status'] = core()->getConfigData('paymentmethods.' . $data['payment']['method'] . '.status') ?? 'pending';
2018-10-05 06:18:58 +00:00
$order = $this->model->create(array_merge($data, ['increment_id' => $this->generateIncrementId()]));
2018-10-04 06:42:06 +00:00
2018-10-05 06:18:58 +00:00
$order->payment()->create($data['payment']);
$order->addresses()->create($data['shipping_address']);
$order->addresses()->create($data['billing_address']);
foreach($data['items'] as $item) {
$orderItem = $this->orderItem->create(array_merge($item, ['order_id' => $order->id]));
if(isset($item['child']) && $item['child']) {
2018-10-05 11:59:43 +00:00
$orderItem->child = $this->orderItem->create(array_merge($item['child'], ['order_id' => $order->id, 'parent_id' => $orderItem->id]));
2018-10-05 06:18:58 +00:00
}
2018-10-05 11:59:43 +00:00
$this->orderItemInventory->create(['orderItem' => $orderItem]);
2018-10-05 06:18:58 +00:00
}
2018-10-04 06:42:06 +00:00
} catch (\Exception $e) {
DB::rollBack();
throw $e;
}
DB::commit();
Event::fire('checkout.order.save.after', $order);
return $order;
}
2018-10-05 06:18:58 +00:00
/**
* @inheritDoc
*/
public function generateIncrementId()
{
2018-10-05 11:59:43 +00:00
$lastOrder = $this->model->orderBy('id', 'desc')->limit(1)->first();
2018-10-05 06:18:58 +00:00
$lastId = $lastOrder ? $lastOrder->id : 0;
2018-10-05 11:59:43 +00:00
return $lastId + 1;
2018-10-05 06:18:58 +00:00
}
}