Merge branch 'master' of https://github.com/bagisto/bagisto into development
This commit is contained in:
commit
b612b9b5a0
|
|
@ -5,7 +5,6 @@
|
|||
/public/js
|
||||
/public/vendor
|
||||
/public/themes
|
||||
/storage/*.key
|
||||
/vendor
|
||||
/.idea
|
||||
/.vscode
|
||||
|
|
@ -20,3 +19,6 @@ composer.lock
|
|||
yarn.lock
|
||||
package-lock.json
|
||||
yarn.lock
|
||||
.php_cs.cache
|
||||
storage/
|
||||
storage/*.key
|
||||
|
|
|
|||
|
|
@ -18,7 +18,6 @@
|
|||
"ext-pdo_mysql": "*",
|
||||
"ext-tokenizer": "*",
|
||||
"astrotomic/laravel-translatable": "^11.0.0",
|
||||
"alkhachatryan/laravel-web-console": "1.5.1",
|
||||
"barryvdh/laravel-dompdf": "0.8.3",
|
||||
"doctrine/dbal": "2.9.2",
|
||||
"fideloper/proxy": "^4.0",
|
||||
|
|
|
|||
|
|
@ -1,51 +0,0 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| User accesses
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This file contains the connection settings with your custom user.
|
||||
|
|
||||
|
|
||||
| !!!!! ATTENTION !!!!!
|
||||
|
|
||||
| These user credentials ARE NOT your server user credentials.
|
||||
| You can type here everything you want.
|
||||
| This method of custom login is a small addition in the protection.
|
||||
| Anyway you can disable it.
|
||||
|
|
||||
|
|
||||
|
|
||||
| The preferred type of editing the accesses is to edit your .env file
|
||||
| Kindly add the following lines in your .env file
|
||||
| CONSOLE_USER_NAME={name}
|
||||
| CONSOLE_USER_PASSWORD={password}
|
||||
|
|
||||
*/
|
||||
|
||||
// Disable login (don't ask for credentials, be careful)
|
||||
'no_login' => false,
|
||||
|
||||
// Single-user credentials (REQUIRED)
|
||||
'user' => [
|
||||
'name' => env('CONSOLE_USER_NAME', 'root'),
|
||||
'password' => env('CONSOLE_USER_PASSWORD', 'root'),
|
||||
],
|
||||
|
||||
// Multi-user credentials (OPTIONAL)
|
||||
// Example: 'user' => 'password', 'user1' => 'password1'
|
||||
'accounts' => [
|
||||
// 'user' => 'password',
|
||||
],
|
||||
|
||||
// Hash incoming password
|
||||
// By default it's sha256
|
||||
'password_hash_algorithm' => '',
|
||||
|
||||
// Home directory (multi-user mode supported)
|
||||
// Example: 'home_dir' => '/tmp';
|
||||
// 'home_dir' => array('user1' => '/home/user1', 'user2' => '/home/user2');
|
||||
'home_dir' => '',
|
||||
];
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace Webkul\Admin\Http\Controllers\Development;
|
||||
|
||||
use Alkhachatryan\LaravelWebConsole\LaravelWebConsole;
|
||||
use Webkul\Admin\Http\Controllers\Controller;
|
||||
|
||||
/**
|
||||
* WebConsole controller
|
||||
*
|
||||
* @author Alexey Khachatryan <info@khachatryan.org>
|
||||
* @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
|
||||
*/
|
||||
class WebConsoleController extends Controller
|
||||
{
|
||||
/**
|
||||
* Show the Web Console.
|
||||
*
|
||||
* @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory
|
||||
*/
|
||||
public function index(){
|
||||
return LaravelWebConsole::show();
|
||||
}
|
||||
}
|
||||
|
|
@ -765,10 +765,7 @@ Route::group(['middleware' => ['web']], function () {
|
|||
Route::prefix('development')->group(function () {
|
||||
Route::get('/', 'Webkul\Admin\Http\Controllers\Development\DashboardController@index')
|
||||
->name('admin.development.index');
|
||||
|
||||
Route::get('webconsole', 'Webkul\Admin\Http\Controllers\Development\WebConsoleController@index')
|
||||
->name('admin.development.webconsole');
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@
|
|||
</select>
|
||||
|
||||
@if ($familyId)
|
||||
<input type="hidden" name="type" value="configurable"/>
|
||||
<input type="hidden" name="type" value="{{ app('request')->input('type') }}"/>
|
||||
@endif
|
||||
<span class="control-error" v-if="errors.has('type')">@{{ errors.first('type') }}</span>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -48,6 +48,8 @@
|
|||
<div class="page-content">
|
||||
|
||||
<tabs>
|
||||
{!! view_render_event('sales.order.tabs.before', ['order' => $order]) !!}
|
||||
|
||||
<tab name="{{ __('admin::app.sales.orders.info') }}" :selected="true">
|
||||
<div class="sale-container">
|
||||
|
||||
|
|
@ -506,8 +508,10 @@
|
|||
</div>
|
||||
|
||||
</tab>
|
||||
|
||||
{!! view_render_event('sales.order.tabs.after', ['order' => $order]) !!}
|
||||
</tabs>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@stop
|
||||
@stop
|
||||
|
|
|
|||
|
|
@ -211,7 +211,13 @@ class Core
|
|||
if ($locale)
|
||||
return $locale;
|
||||
|
||||
return $locale = $this->localeRepository->findOneByField('code', app()->getLocale());
|
||||
$locale = $this->localeRepository->findOneByField('code', app()->getLocale());
|
||||
|
||||
if(!$locale) {
|
||||
$locale = $this->localeRepository->findOneByField('code', config('app.fallback_locale'));
|
||||
}
|
||||
|
||||
return $locale;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -9,6 +9,6 @@
|
|||
</>
|
||||
|
||||
Welcome to the <info>Bagisto</info> project! Bagisto Community is an <comment>open-source e-commerce ecosystem </comment>
|
||||
which is built on top of top of Laravel and Vue.js.
|
||||
which is built on top of Laravel and Vue.js.
|
||||
|
||||
Made with 💖 by the Bagisto Team. Happy helping :)
|
||||
|
|
|
|||
|
|
@ -143,9 +143,15 @@ class Configurable extends AbstractType
|
|||
];
|
||||
}
|
||||
|
||||
$typeOfVariants = 'simple';
|
||||
$productInstance = app(config('product_types.' . $product->type . '.class'));
|
||||
if (isset($productInstance->variantsType) && ! in_array($productInstance->variantsType , ['bundle', 'configurable', 'grouped'])) {
|
||||
$typeOfVariants = $productInstance->variantsType;
|
||||
}
|
||||
|
||||
$variant = $this->productRepository->getModel()->create([
|
||||
'parent_id' => $product->id,
|
||||
'type' => 'simple',
|
||||
'type' => $typeOfVariants,
|
||||
'attribute_family_id' => $product->attribute_family_id,
|
||||
'sku' => $data['sku'],
|
||||
]);
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
namespace Webkul\Sales\Repositories;
|
||||
|
||||
use Illuminate\Container\Container as App;
|
||||
use Illuminate\Support\Facades\Event;
|
||||
use Webkul\Core\Eloquent\Repository;
|
||||
use Webkul\Sales\Contracts\OrderItem;
|
||||
|
||||
|
|
@ -51,7 +52,7 @@ class OrderItemRepository extends Repository
|
|||
|
||||
$totalInvoiced = $baseTotalInvoiced = 0;
|
||||
$taxInvoiced = $baseTaxInvoiced = 0;
|
||||
|
||||
|
||||
$totalRefunded = $baseTotalRefunded = 0;
|
||||
$taxRefunded = $baseTaxRefunded = 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -3,15 +3,15 @@
|
|||
namespace Webkul\Sales\Repositories;
|
||||
|
||||
use Illuminate\Container\Container as App;
|
||||
use Illuminate\Support\Facades\Event;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Event;
|
||||
use Webkul\Core\Eloquent\Repository;
|
||||
use Webkul\Sales\Contracts\Order;
|
||||
use Webkul\Sales\Repositories\OrderItemRepository;
|
||||
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>
|
||||
* @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
|
||||
|
|
@ -35,16 +35,16 @@ class OrderRepository extends Repository
|
|||
/**
|
||||
* Create a new repository instance.
|
||||
*
|
||||
* @param Webkul\Sales\Repositories\OrderItemRepository $orderItemRepository
|
||||
* @param Webkul\Sales\Repositories\DownloadableLinkPurchasedRepository $downloadableLinkPurchasedRepository
|
||||
* @param Webkul\Sales\Repositories\OrderItemRepository $orderItemRepository
|
||||
* @param Webkul\Sales\Repositories\DownloadableLinkPurchasedRepository $downloadableLinkPurchasedRepository
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(
|
||||
OrderItemRepository $orderItemRepository,
|
||||
DownloadableLinkPurchasedRepository $downloadableLinkPurchasedRepository,
|
||||
App $app
|
||||
)
|
||||
{
|
||||
) {
|
||||
$this->orderItemRepository = $orderItemRepository;
|
||||
|
||||
$this->downloadableLinkPurchasedRepository = $downloadableLinkPurchasedRepository;
|
||||
|
|
@ -58,13 +58,14 @@ class OrderRepository extends Repository
|
|||
* @return Mixed
|
||||
*/
|
||||
|
||||
function model()
|
||||
public function model()
|
||||
{
|
||||
return Order::class;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $data
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function create(array $data)
|
||||
|
|
@ -95,12 +96,15 @@ class OrderRepository extends Repository
|
|||
|
||||
$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['billing_address']);
|
||||
|
||||
foreach ($data['items'] as $item) {
|
||||
Event::fire('checkout.order.orderitem.save.before', $data);
|
||||
|
||||
$orderItem = $this->orderItemRepository->create(array_merge($item, ['order_id' => $order->id]));
|
||||
|
||||
if (isset($item['children']) && $item['children']) {
|
||||
|
|
@ -112,6 +116,8 @@ class OrderRepository extends Repository
|
|||
$this->orderItemRepository->manageInventory($orderItem);
|
||||
|
||||
$this->downloadableLinkPurchasedRepository->saveLinks($orderItem, 'available');
|
||||
|
||||
Event::fire('checkout.order.orderitem.save.after', $data);
|
||||
}
|
||||
|
||||
Event::fire('checkout.order.save.after', $order);
|
||||
|
|
@ -128,20 +134,23 @@ class OrderRepository extends Repository
|
|||
|
||||
/**
|
||||
* @param int $orderId
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function cancel($orderId)
|
||||
{
|
||||
$order = $this->findOrFail($orderId);
|
||||
|
||||
if (! $order->canCancel())
|
||||
if (! $order->canCancel()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Event::fire('sales.order.cancel.before', $order);
|
||||
|
||||
foreach ($order->items as $item) {
|
||||
if (! $item->qty_to_cancel)
|
||||
if (! $item->qty_to_cancel) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$orderItems = [];
|
||||
|
||||
|
|
@ -152,11 +161,12 @@ class OrderRepository extends Repository
|
|||
} else {
|
||||
$orderItems[] = $item;
|
||||
}
|
||||
|
||||
|
||||
foreach ($orderItems as $orderItem) {
|
||||
if ($orderItem->product)
|
||||
if ($orderItem->product) {
|
||||
$this->orderItemRepository->returnQtyToProductInventory($orderItem);
|
||||
|
||||
}
|
||||
|
||||
if ($orderItem->qty_ordered) {
|
||||
$orderItem->qty_canceled += $orderItem->qty_to_cancel;
|
||||
$orderItem->save();
|
||||
|
|
@ -188,19 +198,21 @@ class OrderRepository extends Repository
|
|||
{
|
||||
$config = new CoreConfig();
|
||||
|
||||
$invoiceNumberPrefix = $config->where('code','=',"sales.orderSettings.order_number.order_number_prefix")->first()
|
||||
? $config->where('code','=',"sales.orderSettings.order_number.order_number_prefix")->first()->value : false;
|
||||
|
||||
$invoiceNumberLength = $config->where('code','=',"sales.orderSettings.order_number.order_number_length")->first()
|
||||
? $config->where('code','=',"sales.orderSettings.order_number.order_number_length")->first()->value : false;
|
||||
|
||||
$invoiceNumberSuffix = $config->where('code','=',"sales.orderSettings.order_number.order_number_suffix")->first()
|
||||
? $config->where('code','=',"sales.orderSettings.order_number.order_number_suffix")->first()->value: false;
|
||||
foreach ([
|
||||
'Prefix' => 'prefix',
|
||||
'Length' => 'length',
|
||||
'Suffix' => 'suffix',
|
||||
] as $varSuffix => $confKey) {
|
||||
$var = "invoiceNumber{$varSuffix}";
|
||||
$$var = $config
|
||||
->where('code', '=', "sales.orderSettings.order_number.order_number_{$confKey}")
|
||||
->first() ?: false;
|
||||
}
|
||||
|
||||
$lastOrder = $this->model->orderBy('id', 'desc')->limit(1)->first();
|
||||
$lastId = $lastOrder ? $lastOrder->id : 0;
|
||||
|
||||
if ($invoiceNumberLength && ( $invoiceNumberPrefix || $invoiceNumberSuffix) ) {
|
||||
if ($invoiceNumberLength && ($invoiceNumberPrefix || $invoiceNumberSuffix)) {
|
||||
$invoiceNumber = $invoiceNumberPrefix . sprintf("%0{$invoiceNumberLength}d", 0) . ($lastId + 1) . $invoiceNumberSuffix;
|
||||
} else {
|
||||
$invoiceNumber = $lastId + 1;
|
||||
|
|
@ -211,13 +223,14 @@ class OrderRepository extends Repository
|
|||
|
||||
/**
|
||||
* @param mixed $order
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function isInCompletedState($order)
|
||||
{
|
||||
$totalQtyOrdered = $totalQtyInvoiced = $totalQtyShipped = $totalQtyRefunded = $totalQtyCanceled = 0;
|
||||
|
||||
foreach ($order->items()->get() as $item) {
|
||||
foreach ($order->items()->get() as $item) {
|
||||
$totalQtyOrdered += $item->qty_ordered;
|
||||
$totalQtyInvoiced += $item->qty_invoiced;
|
||||
|
||||
|
|
@ -233,14 +246,16 @@ class OrderRepository extends Repository
|
|||
|
||||
if ($totalQtyOrdered != ($totalQtyRefunded + $totalQtyCanceled)
|
||||
&& $totalQtyOrdered == $totalQtyInvoiced + $totalQtyCanceled
|
||||
&& $totalQtyOrdered == $totalQtyShipped + $totalQtyRefunded + $totalQtyCanceled)
|
||||
&& $totalQtyOrdered == $totalQtyShipped + $totalQtyRefunded + $totalQtyCanceled) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $order
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function isInCanceledState($order)
|
||||
|
|
@ -257,13 +272,14 @@ class OrderRepository extends Repository
|
|||
|
||||
/**
|
||||
* @param mixed $order
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function isInClosedState($order)
|
||||
{
|
||||
$totalQtyOrdered = $totalQtyRefunded = $totalQtyCanceled = 0;
|
||||
|
||||
foreach ($order->items()->get() as $item) {
|
||||
foreach ($order->items()->get() as $item) {
|
||||
$totalQtyOrdered += $item->qty_ordered;
|
||||
$totalQtyRefunded += $item->qty_refunded;
|
||||
$totalQtyCanceled += $item->qty_canceled;
|
||||
|
|
@ -274,19 +290,22 @@ class OrderRepository extends Repository
|
|||
|
||||
/**
|
||||
* @param mixed $order
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function updateOrderStatus($order)
|
||||
{
|
||||
$status = 'processing';
|
||||
|
||||
if ($this->isInCompletedState($order))
|
||||
if ($this->isInCompletedState($order)) {
|
||||
$status = 'completed';
|
||||
}
|
||||
|
||||
if ($this->isInCanceledState($order))
|
||||
if ($this->isInCanceledState($order)) {
|
||||
$status = 'canceled';
|
||||
else if ($this->isInClosedState($order))
|
||||
} elseif ($this->isInClosedState($order)) {
|
||||
$status = 'closed';
|
||||
}
|
||||
|
||||
$order->status = $status;
|
||||
$order->save();
|
||||
|
|
@ -294,6 +313,7 @@ class OrderRepository extends Repository
|
|||
|
||||
/**
|
||||
* @param mixed $order
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function collectTotals($order)
|
||||
|
|
@ -352,4 +372,4 @@ class OrderRepository extends Repository
|
|||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,14 +1,21 @@
|
|||
<script>
|
||||
export default {
|
||||
bind(el, binding, vnode) {
|
||||
let handler = function(e) {
|
||||
setTimeout(function() {
|
||||
e.target.value = e.target.value.toString().toLowerCase()
|
||||
.replace(/[^\w- ]+/g,'')
|
||||
.trim()
|
||||
.replace(/ +/g,'-');
|
||||
let handler = function (e) {
|
||||
setTimeout(function () {
|
||||
e.target.value = e.target.value
|
||||
.toString()
|
||||
.toLowerCase()
|
||||
.replace(/[^\w- ]+/g, '')
|
||||
|
||||
// replace whitespaces with dashes
|
||||
.replace(/ +/g, '-')
|
||||
|
||||
// avoid having multiple dashes (---- translates into -)
|
||||
.replace('![-\s]+!u', '-')
|
||||
.trim();
|
||||
}, 100);
|
||||
}
|
||||
};
|
||||
|
||||
el.addEventListener('input', handler);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue