large commit

This commit is contained in:
Omair Saleh
2019-05-18 12:14:31 +08:00
parent bfcbe76049
commit 43a9e0ca03
94 changed files with 1553 additions and 1130 deletions
@@ -1,12 +0,0 @@
<?php
namespace App\Classes\Interfaces\Order\Steps;
interface OrderRequirement
{
public function getOrderId();
public function getReferenceId();
}
@@ -2,12 +2,11 @@
namespace App\Classes\Modules\ControllersLogic\Orders;
use App\Classes\Modules\Accounts\Exceptions\CannotListCompanyOrdersException;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\Services\ConfirmsOrder;
use App\Classes\Modules\Orders\Processors\ConfirmsOrder;
use App\Classes\Modules\Orders\Services\SetsOrderWarehouse;
use App\Classes\Modules\Orders\Services\UpdatesOrderSteps;
use App\Classes\Modules\Orders\Services\Steps\UpdatesOrderSteps;
use App\Classes\ValueObjects\Constants\HttpStatus;
use App\Models\Order;
use Illuminate\Http\JsonResponse;
@@ -19,7 +18,8 @@ class ConfirmOrderLogic
/** @var Order */
private $repository;
/** @var SetsOrderWarehouse */
private $setOrderWarehouse;
/** @var ConfirmsOrder */
private $confirmOrder;
@@ -2,12 +2,9 @@
namespace App\Classes\Modules\ControllersLogic\Orders;
use App\Classes\Modules\Accounts\Exceptions\CannotCreateOrderException;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\DataTransferObjects\StepObject;
use App\Classes\Modules\Orders\Services\CreatesOrder;
use App\Classes\Modules\Orders\Services\UpdatesOrderSteps;
use App\Classes\Modules\Orders\Services\Steps\UpdatesOrderSteps;
use App\Models\Order;
use Illuminate\Http\Request;
@@ -36,14 +33,13 @@ class UpdateOrderStepLogic
* @param int $orderId
* @param Request $request
* @return \Illuminate\Http\JsonResponse
* @throws \ReflectionException
*/
public function execute(int $orderId, Request $request) {
$repository = $this->repository->findOrFail($orderId);
$orderObject = new OrderObject($orderId);
$stepObject = new StepObject($repository->current_step);
$stepObject = new StepObject($repository->current_step, $request->input('complete_date'));
return $this->updateOrderSteps->execute($orderObject, $stepObject, $request);
@@ -11,18 +11,13 @@ class ReceiveNoteObject
/** @var string */
private $trackingNumber;
/** @var string */
private $date;
/**
* ReceiveNoteObject constructor.
* @param string $trackingNumber
* @param string $date
*/
public function __construct(string $trackingNumber, string $date)
public function __construct(string $trackingNumber)
{
$this->trackingNumber = $trackingNumber;
$this->date = $date;
}
/**
@@ -33,15 +28,5 @@ class ReceiveNoteObject
return $this->trackingNumber;
}
/**
* @return Carbon
*/
public function getDate(): Carbon
{
return Carbon::parse($this->date);
}
}
@@ -3,29 +3,27 @@
namespace App\Classes\Modules\Orders\DataTransferObjects;
use Carbon\Carbon;
class StepObject
{
/** @var string */
protected $referenceId;
/** @var bool */
protected $isPrimary;
/** @var float */
protected $sequence;
/** @var null|string */
protected $complete_date;
/**
* StepObject constructor.
* @param string $referenceId
* @param bool $isPrimary
* @param float $sequence
* @param null|string $complete_date
*/
public function __construct(string $referenceId, bool $isPrimary = false, float $sequence = 0)
public function __construct(string $referenceId, ?string $complete_date = null)
{
$this->referenceId = $referenceId;
$this->isPrimary = $isPrimary;
$this->sequence = $sequence;
$this->complete_date = $complete_date;
}
/**
@@ -37,19 +35,11 @@ class StepObject
}
/**
* @return bool
* @return Carbon
*/
public function isPrimary(): bool
public function getCompleteDate(): Carbon
{
return $this->isPrimary;
}
/**
* @return float
*/
public function getSequence(): float
{
return $this->sequence;
return $this->complete_date ? Carbon::parse($this->complete_date) : Carbon::now();
}
@@ -0,0 +1,68 @@
<?php
namespace App\Classes\Modules\Orders\Processors;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\DataTransferObjects\StepObject;
use App\Classes\Modules\Orders\Services\Processors\updatesStep;
use App\Classes\Modules\Orders\Services\SetsOrderWarehouse;
use App\Classes\Modules\Orders\Services\Steps\GenerateOrderSteps;
use App\Classes\ValueObjects\Constants\HttpStatus;
use Illuminate\Http\JsonResponse;
class ConfirmsOrder
{
use updatesStep;
/** @var GenerateOrderSteps */
private $generateOrderSteps;
/** @var SetsOrderWarehouse */
private $setOrderWarehouse;
/**
* ConfirmsOrder constructor.
*/
public function __construct()
{
$this->setOrderWarehouse = new SetsOrderWarehouse();
$this->generateOrderSteps = new GenerateOrderSteps();
}
/**
* @param OrderObject $order
* @param StepObject $step
* @param int $warehouseId
* @return JsonResponse
* @throws InternalServerErrorException
*/
public function execute(OrderObject $order, StepObject $step, ?int $warehouseId = null){
try {
if($warehouseId){
$order->setWarehouseId($warehouseId);
$this->setOrderWarehouse->execute($order);
}
$this->generateOrderSteps->execute($order);
$this->completeStep($order, $step);
return new JsonResponse(null, HttpStatus::RESOURCE_CREATED);
} catch (\Exception $exception){
throw new InternalServerErrorException("Failed to update order step because {$exception->getMessage()}");
}
}
}
@@ -0,0 +1,39 @@
<?php
namespace App\Classes\Modules\Orders\Processors;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\DataTransferObjects\StepObject;
use App\Classes\Modules\Orders\Services\Processors\updatesStep;
use App\Classes\ValueObjects\Constants\HttpStatus;
use Illuminate\Http\JsonResponse;
class DeliverOrder
{
use updatesStep;
/**
* @param OrderObject $order
* @param StepObject $step
* @return JsonResponse
* @throws InternalServerErrorException
*/
public function execute(OrderObject $order, StepObject $step){
try {
$this->completeStep($order, $step);
return new JsonResponse(null, HttpStatus::REQUEST_ACCEPTED);
} catch (\Exception $exception) {
throw new InternalServerErrorException("Failed to update order step because {$exception->getMessage()}");
}
}
}
@@ -0,0 +1,38 @@
<?php
namespace App\Classes\Modules\Orders\Processors;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\DataTransferObjects\StepObject;
use App\Classes\Modules\Orders\Services\Processors\updatesStep;
use App\Classes\ValueObjects\Constants\HttpStatus;
use Illuminate\Http\JsonResponse;
class ShipOrder
{
use updatesStep;
/**
* @param OrderObject $order
* @param StepObject $step
* @return JsonResponse
* @throws InternalServerErrorException
*/
public function execute(OrderObject $order, StepObject $step){
try {
$this->completeStep($order, $step);
return new JsonResponse(null, HttpStatus::REQUEST_ACCEPTED);
} catch (\Exception $exception) {
throw new InternalServerErrorException("Failed to update order step because {$exception->getMessage()}");
}
}
}
@@ -0,0 +1,89 @@
<?php
namespace App\Classes\Modules\Orders\Processors;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\DataTransferObjects\StepObject;
use Carbon\Carbon;
use Illuminate\Support\Str;
class StepProcessMapper
{
/**
* @param $class
* @param array $valuesArray
* @return array
* @throws \ReflectionException
*/
public function map(string $class, array $valuesArray){
$arguments = [];
$reflection = new \ReflectionMethod($class, 'execute');
$parameters = $reflection->getParameters();
foreach ($parameters as $parameter){
if(!$parameter->getClass()){
$arguments[] = self::mapVariables($parameter->getType(), $valuesArray[Str::snake($parameter->getName())]?? null);
continue;
}
$className = $parameter->getClass()->getName();
if(!in_array($className, [OrderObject::class, StepObject::class, Carbon::class])){
$arguments[] = self::mapClassObjects($className, $valuesArray);
}
}
return $arguments;
}
/**
* @param string $type
* @param $value
* @return bool|float|int|string
*/
private function mapVariables(string $type, $value){
if($value === null){
return null;
}
switch ($type){
case 'float':
return (float) $value;
break;
case 'int':
case 'integer':
return (int) $value;
break;
case 'bool':
case 'boolean':
return (bool) $value;
break;
default:
return (string) $value;
}
}
/**
* @param string $class
* @param array $valuesArray
* @return mixed
* @throws \ReflectionException
*/
private function mapClassObjects(string $class, array $valuesArray){
$reflection = new \ReflectionClass($class);
$properties = $reflection->getProperties();
return new $class(...array_map(function ($property) use ($valuesArray) {
return $valuesArray[Str::snake($property->getName())] ?? null;
}, $properties));
}
}
@@ -0,0 +1,38 @@
<?php
namespace App\Classes\Modules\Orders\Processors;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\DataTransferObjects\StepObject;
use App\Classes\Modules\Orders\Services\Processors\updatesStep;
use App\Classes\ValueObjects\Constants\HttpStatus;
use Illuminate\Http\JsonResponse;
class WarehouseArrivalOrder
{
use updatesStep;
/**
* @param OrderObject $order
* @param StepObject $step
* @return JsonResponse
* @throws InternalServerErrorException
*/
public function execute(OrderObject $order, StepObject $step){
try {
$this->completeStep($order, $step);
return new JsonResponse(null, HttpStatus::REQUEST_ACCEPTED);
} catch (\Exception $exception) {
throw new InternalServerErrorException("Failed to update order step because {$exception->getMessage()}");
}
}
}
@@ -0,0 +1,46 @@
<?php
namespace App\Classes\Modules\Orders\Processors;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\DataTransferObjects\StepObject;
use App\Classes\Modules\Orders\Services\Processors\updatesStep;
use App\Classes\ValueObjects\Constants\HttpStatus;
use App\Models\PackingList;
use Illuminate\Http\JsonResponse;
class WarehousePackOrder
{
use updatesStep;
/**
* @param OrderObject $order
* @param StepObject $step
* @return JsonResponse
* @throws InternalServerErrorException
*/
public function execute(OrderObject $order, StepObject $step){
try {
$packingList = PackingList::where('order_id', $order->getOrderId())->firstOrFail();
if($packingList->confirmed) {
$this->completeStep($order, $step);
return new JsonResponse(null, HttpStatus::REQUEST_ACCEPTED);
}
return new JsonResponse(['message' => 'Failed to update order step because packing list is in complete'], HttpStatus::VALIDATION_FAILED);
} catch (\Exception $exception) {
throw new InternalServerErrorException("Failed to update order step because {$exception->getMessage()}");
}
}
}
@@ -0,0 +1,54 @@
<?php
namespace App\Classes\Modules\Orders\Processors;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\DataTransferObjects\ReceiveNoteObject;
use App\Classes\Modules\Orders\DataTransferObjects\StepObject;
use App\Classes\Modules\Orders\Services\Processors\updatesStep;
use App\Classes\Modules\Orders\Services\ReceiveNote\CreatesReceiveNote;
use App\Classes\ValueObjects\Constants\HttpStatus;
use Illuminate\Http\JsonResponse;
class WarehouseReceivesOrder
{
use updatesStep;
/** @var CreatesReceiveNote */
private $createsReceiveNote;
/**
* WarehouseReceivesOrder constructor.
*/
public function __construct()
{
$this->createsReceiveNote = new CreatesReceiveNote();
}
/**
* @param OrderObject $order
* @param StepObject $step
* @param ReceiveNoteObject $object
* @return JsonResponse
* @throws InternalServerErrorException
*/
public function execute(OrderObject $order, StepObject $step, ReceiveNoteObject $object){
try {
$this->createsReceiveNote->execute($order, $object);
$this->completeStep($order, $step);
return new JsonResponse(null, HttpStatus::RESOURCE_CREATED);
} catch (\Exception $exception){
throw new InternalServerErrorException("Failed to update order step because {$exception->getMessage()}");
}
}
}
@@ -0,0 +1,38 @@
<?php
namespace App\Classes\Modules\Orders\Processors;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\DataTransferObjects\StepObject;
use App\Classes\Modules\Orders\Services\Processors\updatesStep;
use App\Classes\ValueObjects\Constants\HttpStatus;
use Illuminate\Http\JsonResponse;
class WarehouseUnpackingOrder
{
use updatesStep;
/**
* @param OrderObject $order
* @param StepObject $step
* @return JsonResponse
* @throws InternalServerErrorException
*/
public function execute(OrderObject $order, StepObject $step){
try {
$this->completeStep($order, $step);
return new JsonResponse(null, HttpStatus::REQUEST_ACCEPTED);
} catch (\Exception $exception) {
throw new InternalServerErrorException("Failed to update order step because {$exception->getMessage()}");
}
}
}
@@ -6,6 +6,7 @@ namespace App\Classes\Modules\Orders\Services;
use App\Classes\Constants;
use App\Classes\Modules\Accounts\Exceptions\CannotCreateOrderException;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Models\AddressBook;
use App\Models\Order;
class CreatesOrder
@@ -32,8 +33,11 @@ class CreatesOrder
try {
$address = AddressBook::where('company_id', $order->getCompanyId())
->where('default', true)->firstOrFail();
$this->repository->company_id = $order->getCompanyId();
$this->repository->marking = $order->getOrderId();
$this->repository->address_id = $address->id;
$this->repository->current_step = Constants::ORDER_PROCESSING_STEP;
$this->repository->save();
@@ -1,15 +0,0 @@
<?php
namespace App\Classes\Modules\Orders\Services;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
class CreatesPackingList
{
public function execute(OrderObject $order, $packingList){
}
}
@@ -23,27 +23,28 @@ class ListsOrderHistory
$history = new Collection();
$history->push(['date' => $createdAt->format('d-m-Y H:i'), 'description' => 'Order number has been created']);
$history->push(['date' => $createdAt->format('d-m-Y'), 'description' => 'Order number has been created']);
foreach ($orderSteps as $step){
$completeDate = Carbon::parse($step->complete_date)->format('d-m-Y');
switch ($step->reference_id){
case Constants::ORDER_PROCESSING_STEP:
if($order->warehouse_id){
$history->push(['date' => $step->updated_at->format('d-m-Y H:i'), 'description' => Warehouse::find($order->warehouse_id)->first()->name.' confirmed as your order\'s warehouse']);
$history->push(['date' => $completeDate, 'description' => Warehouse::find($order->warehouse_id)->first()->name.' confirmed as your order\'s warehouse']);
}
break;
case Constants::ORDER_NO_WAREHOUSE_PENDING_SUPPLIER:
$history->push(['date' => $step->updated_at->format('d-m-Y H:i'), 'description' => 'Your Order has been loaded into container']);
$history->push(['date' => $completeDate, 'description' => 'Your Order has been loaded into container']);
break;
case Constants::ORDER_WAREHOUSE_RECEIVING_STEP:
$warehouse = Warehouse::find($order->warehouse_id)->first();
$history->push(['date' => $step->updated_at->format('d-m-Y H:i'), 'description' => 'Arrived at '.$warehouse ? $warehouse->name : null.' warehouse in china on: ['.Carbon::parse($order->receiveNotes()->firstOrFail()->receive_date)->format('d-m-Y').']']);
$history->push(['date' => $completeDate, 'description' => 'Arrived at '. $warehouse->name .' warehouse in china']);
break;
case Constants::ORDER_WAREHOUSE_PACKING_STEP:
$packages = $order->packingLists()->firstOrFail()->packages()->selectRaw(DB::raw('((width/100) * (height/100) * (length/100)) * quantity as cbm, quantity'))->get();
$history->push(['date' => $step->updated_at->format('d-m-Y H:i'), 'description' => '['.$packages->sum('quantity').' Packages, '.number_format((float)$packages->sum('cbm'), 2, '.', '').' CBM] Your order has been loaded into container']);
$history->push(['date' => $step->updated_at->format('d-m-Y H:i'), 'description' => 'Invoice has been issued, waiting for shipping payment']);
$history->push(['date' => $completeDate, 'description' => '['.$packages->sum('quantity').' Packages, '.number_format((float)$packages->sum('cbm'), 2, '.', '').' CBM] Your order has been loaded into container']);
$history->push(['date' => $completeDate, 'description' => 'Invoice has been issued, waiting for shipping payment']);
break;
case Constants::ORDER_SHIPPING_STEP:
$shippingArrangement = $order->shippingArrangement()->first();
@@ -53,26 +54,26 @@ class ListsOrderHistory
if($schedule->status === 2){
$customIssue = CustomIssues::where('schedule_id', $schedule->id)->first();
if($customIssue !== null){
$history->push(['date' => $step->updated_at->format('d-m-Y H:i'), 'description' => '[ETD: '.$schedule->ETD.', ETA: '.$schedule->ETA.'] Shipping Schedule failed due to: '.$customIssue->remark]);
$history->push(['date' => $completeDate, 'description' => '[ETD: '.$schedule->ETD.', ETA: '.$schedule->ETA.'] Shipping Schedule failed due to: '.$customIssue->remark]);
} else {
$history->push(['date' => $step->updated_at->format('d-m-Y H:i'), 'description' => '[ETD: '.$schedule->ETD.', ETA: '.$schedule->ETA.'] Shipping Schedule failed']);
$history->push(['date' => $completeDate, 'description' => '[ETD: '.$schedule->ETD.', ETA: '.$schedule->ETA.'] Shipping Schedule failed']);
}
} else {
$history->push(['date' => $step->updated_at->format('d-m-Y H:i'), 'description' => '[ETD: '.$schedule->ETD.', ETA: '.$schedule->ETA.'] Your Order has been scheduled for shipping ']);
$history->push(['date' => $completeDate, 'description' => '[ETD: '.$schedule->ETD.', ETA: '.$schedule->ETA.'] Your Order has been scheduled for shipping ']);
}
}
}
$history->push(['date' => $step->updated_at->format('d-m-Y H:i'), 'description' => 'Arrived to Malaysian port']);
$history->push(['date' => $step->updated_at->format('d-m-Y H:i'), 'description' => 'Custom clearance is successful']);
$history->push(['date' => $completeDate, 'description' => 'Arrived to Malaysian port']);
$history->push(['date' => $completeDate, 'description' => 'Custom clearance is successful']);
break;
case Constants::ORDER_WAREHOUSE_ARRIVAL_STEP:
$history->push(['date' => $step->updated_at->format('d-m-Y H:i'), 'description' => 'Arrived at Malaysia\'s warehouse']);
$history->push(['date' => $completeDate, 'description' => 'Arrived at Malaysia\'s warehouse']);
break;
case Constants::ORDER_WAREHOUSE_UNPACKING_STEP:
$history->push(['date' => $step->updated_at->format('d-m-Y H:i'), 'description' => 'Your Order has been unloaded and being prepared for delivery']);
$history->push(['date' => $completeDate, 'description' => 'Your Order has been unloaded and being prepared for delivery']);
break;
case Constants::ORDER_DELIVERY_STEP:
$history->push(['date' => $step->updated_at->format('d-m-Y H:i'), 'description' => 'Out for delivery']);
$history->push(['date' => $completeDate, 'description' => 'Out for delivery']);
break;
}
}
@@ -85,12 +86,12 @@ class ListsOrderHistory
if($schedule->status === 2){
$customIssue = CustomIssues::where('schedule_id', $schedule->id)->first();
if($customIssue !== null){
$history->push(['date' => $schedule->updated_at->format('d-m-Y H:i'), 'description' => '[ETD: '.$schedule->ETD.', ETA: '.$schedule->ETA.'] Shipping Schedule failed due to: '.$customIssue->remark]);
$history->push(['date' => $schedule->updated_at->format('d-m-Y'), 'description' => '[ETD: '.$schedule->ETD.', ETA: '.$schedule->ETA.'] Shipping Schedule failed due to: '.$customIssue->remark]);
} else {
$history->push(['date' => $schedule->updated_at->format('d-m-Y H:i'), 'description' => '[ETD: '.$schedule->ETD.', ETA: '.$schedule->ETA.'] Shipping Schedule failed']);
$history->push(['date' => $schedule->updated_at->format('d-m-Y'), 'description' => '[ETD: '.$schedule->ETD.', ETA: '.$schedule->ETA.'] Shipping Schedule failed']);
}
} else {
$history->push(['date' => $schedule->updated_at->format('d-m-Y H:i'), 'description' => '[ETD: '.$schedule->ETD.', ETA: '.$schedule->ETA.'] Your Order has been scheduled for shipping ']);
$history->push(['date' => $schedule->updated_at->format('d-m-Y'), 'description' => '[ETD: '.$schedule->ETD.', ETA: '.$schedule->ETA.'] Your Order has been scheduled for shipping ']);
}
}
}
@@ -98,7 +99,7 @@ class ListsOrderHistory
}
if($complete){
$history->push(['date' => $lastUpdate->format('d-m-Y H:i'), 'description' => 'Your Order has successfully been delivered']);
$history->push(['date' => $lastUpdate->format('d-m-Y'), 'description' => 'Your Order has successfully been delivered']);
}
return $history->reverse()->toArray();
@@ -1,63 +0,0 @@
<?php
namespace App\Classes\Modules\Orders\Services;
use App\Classes\Constants;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\DataTransferObjects\StepObject;
use App\Classes\Modules\Orders\Services\Processors\ConfirmsOrder;
use App\Classes\Modules\Orders\Services\Processors\WarehousePackingOrder;
use App\Classes\Modules\Orders\Services\Processors\WarehouseReceivesOrder;
use Illuminate\Http\Request;
class ProcessesOrderStep
{
/** @var ConfirmsOrder */
private $confirmOrder;
/** @var WarehouseReceivesOrder */
private $warehouseReceivesOrder;
/** @var WarehousePackingOrder */
private $warehousePackingOrder;
/**
* StepProcessor constructor.
* @param ConfirmsOrder $confirmOrder
* @param WarehouseReceivesOrder $warehouseReceivesOrder
* @param WarehousePackingOrder $warehousePackingOrder
*/
public function __construct(ConfirmsOrder $confirmOrder, WarehouseReceivesOrder $warehouseReceivesOrder, WarehousePackingOrder $warehousePackingOrder)
{
$this->confirmOrder = $confirmOrder;
$this->warehouseReceivesOrder = $warehouseReceivesOrder;
$this->warehousePackingOrder = $warehousePackingOrder;
}
public function execute(OrderObject $order, StepObject $step, Request $request): bool{
switch ($step->getReferenceId()){
case Constants::ORDER_PROCESSING_STEP:
return $this->confirmOrder->execute($order, $request);
case Constants::ORDER_NO_WAREHOUSE_PENDING_SUPPLIER:
return true;
case Constants::ORDER_WAREHOUSE_RECEIVING_STEP:
return $this->warehouseReceivesOrder->execute($order, $request);
case Constants::ORDER_WAREHOUSE_PACKING_STEP:
return $this->warehousePackingOrder->execute($order);
case Constants::ORDER_SHIPPING_STEP:
return true;
case Constants::ORDER_WAREHOUSE_ARRIVAL_STEP:
return true;
case Constants::ORDER_WAREHOUSE_UNPACKING_STEP:
return true;
case Constants::ORDER_DELIVERY_STEP:
return true;
default:
return false;
}
}
}
@@ -1,79 +0,0 @@
<?php
namespace App\Classes\Modules\Orders\Services\Processors;
use App\Classes\Constants;
use App\Classes\Modules\Accounts\Exceptions\CannotListCompanyOrdersException;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\DataTransferObjects\StepObject;
use App\Classes\Modules\Orders\Services\CreatesOrderSteps;
use App\Classes\Modules\Orders\Services\SetsOrderWarehouse;
use App\Classes\Modules\Orders\Steps\GenerateOrderSteps;
use App\Classes\Modules\Steps\ModularStep;
use App\Models\Order;
use Illuminate\Http\Request;
use Illuminate\Support\Collection;
class ConfirmsOrder
{
/** @var SetsOrderWarehouse */
private $setOrderWarehouse;
/** @var GenerateOrderSteps */
private $generateOrderSteps;
/** @var CreatesOrderSteps */
private $createsOrderSteps;
/**
* ConfirmsOrder constructor.
* @param SetsOrderWarehouse $setOrderWarehouse
* @param GenerateOrderSteps $generateOrderSteps
* @param CreatesOrderSteps $createsOrderSteps
*/
public function __construct(SetsOrderWarehouse $setOrderWarehouse, GenerateOrderSteps $generateOrderSteps, CreatesOrderSteps $createsOrderSteps)
{
$this->setOrderWarehouse = $setOrderWarehouse;
$this->generateOrderSteps = $generateOrderSteps;
$this->createsOrderSteps = $createsOrderSteps;
}
/**
* @param OrderObject $order
* @param Request $request
* @return bool
*/
public function execute(OrderObject $order, Request $request){
try {
if($request->input('warehouse_id')){
$order->setWarehouseId($request->input('warehouse_id'));
$this->setOrderWarehouse->execute($order);
}
$modules = new Collection();
$order->getWarehouseId() ? $modules->push(Constants::ORDER_MODULE_WAREHOUSE) : $modules->push(Constants::ORDER_MODULE_NO_WAREHOUSE);
$orderSteps = $this->generateOrderSteps->getSteps($modules->toArray())->toArray();
$this->createsOrderSteps->execute($order, $orderSteps);
return true;
} catch (\Exception $exception){
return false;
}
}
}
@@ -1,33 +0,0 @@
<?php
namespace App\Classes\Modules\Orders\Services\Processors;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Models\PackingList;
class WarehousePackingOrder
{
/** @var PackingList */
private $repository;
/**
* WarehousePackingOrder constructor.
* @param PackingList $repository
*/
public function __construct(PackingList $repository)
{
$this->repository = $repository;
}
public function execute(OrderObject $order){
$packingList = $this->repository->where('order_id', $order->getOrderId())->firstOrFail();
if($packingList->confirmed) {
return true;
}
return false;
}
}
@@ -1,33 +0,0 @@
<?php
namespace App\Classes\Modules\Orders\Services\Processors;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\DataTransferObjects\ReceiveNoteObject;
use App\Classes\Modules\Orders\Services\CreatesReceiveNote;
use Illuminate\Http\Request;
class WarehouseReceivesOrder
{
/** @var CreatesReceiveNote */
private $createsReceiveNote;
/**
* WarehouseReceiveOrder constructor.
* @param CreatesReceiveNote $createsReceiveNote
*/
public function __construct(CreatesReceiveNote $createsReceiveNote)
{
$this->createsReceiveNote = $createsReceiveNote;
}
public function execute(OrderObject $order, Request $request){
$object = new ReceiveNoteObject($request->input('tracking_no'), $request->input('receive_date'));
$this->createsReceiveNote->execute($order, $object);
return true;
}
}
@@ -1,6 +1,6 @@
<?php
namespace App\Classes\Modules\Orders\Services;
namespace App\Classes\Modules\Orders\Services\ReceiveNote;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
@@ -13,21 +13,15 @@ class CreatesReceiveNote
/** @var ReceiveNote */
private $repository;
/**
* CreatesReceiveNote constructor.
* @param ReceiveNote $repository
*/
public function __construct(ReceiveNote $repository)
public function __construct()
{
$this->repository = $repository;
$this->repository = new ReceiveNote();
}
public function execute(OrderObject $order , ReceiveNoteObject $receiveNote){
$this->repository->order_id = $order->getOrderId();
$this->repository->tracking_no = $receiveNote->getTrackingNumber();
$this->repository->receive_date = $receiveNote->getDate();
$this->repository->save();
@@ -15,11 +15,10 @@ class SetsOrderWarehouse
/**
* SetsOrderWarehouse constructor.
* @param Order $repository
*/
public function __construct(Order $repository)
public function __construct()
{
$this->repository = $repository;
$this->repository = new Order();
}
@@ -1,6 +1,6 @@
<?php
namespace App\Classes\Modules\Orders\Services;
namespace App\Classes\Modules\Orders\Services\Steps;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
@@ -9,19 +9,6 @@ use App\Models\Order;
class CompletesOrderStep {
/** @var Order */
private $repository;
/**
* CompletesOrderStep constructor.
* @param Order $repository
*/
public function __construct(Order $repository)
{
$this->repository = $repository;
}
/**
* @param OrderObject $order
* @param StepObject $step
@@ -29,11 +16,12 @@ class CompletesOrderStep {
public function execute(OrderObject $order, StepObject $step){
/** @var Order $repository */
$repository = $this->repository->findOrFail($order->getOrderId());
$repository = Order::findOrFail($order->getOrderId());
$orderStep = $repository->orderSteps()->where('reference_id', $step->getReferenceId())->firstOrFail();
$orderStep->complete = 1;
$orderStep->complete_date = $step->getCompleteDate();
$orderStep->save();
@@ -1,6 +1,6 @@
<?php
namespace App\Classes\Modules\Orders\Services;
namespace App\Classes\Modules\Orders\Services\Steps;
use App\Classes\Modules\Accounts\Exceptions\CannotCreateOrderStepsException;
@@ -15,11 +15,10 @@ class CreatesOrderSteps
/**
* CompletesOrderStep constructor.
* @param Order $repository
*/
public function __construct(Order $repository)
public function __construct()
{
$this->repository = $repository;
$this->repository = new Order();
}
/**
@@ -1,28 +1,54 @@
<?php
namespace App\Classes\Modules\Orders\Steps;
namespace App\Classes\Modules\Orders\Services\Steps;
use App\Classes\Constants;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Objects\Orders\OrderStepObject;
use App\Models\ModularStep;
use App\Models\Order;
use App\Models\PrimaryStep;
use Illuminate\Support\Collection;
class GenerateOrderSteps
{
/**
* @var Order
*/
private $repository;
/** @var CreatesOrderSteps */
private $createsOrderSteps;
/** @var Collection */
protected $steps;
/**
* GenerateOrderSteps constructor.
* @param Collection $steps
*/
public function __construct(Collection $steps)
public function __construct()
{
$this->steps = $steps;
$this->repository = new Order();
$this->steps = new Collection();
$this->createsOrderSteps = new CreatesOrderSteps();
}
/**
* @param OrderObject $order
* @throws \App\Classes\Modules\Accounts\Exceptions\CannotCreateOrderStepsException
*/
public function execute(OrderObject $order){
$modules = new Collection();
$order->getWarehouseId() ? $modules->push(Constants::ORDER_MODULE_WAREHOUSE) : $modules->push(Constants::ORDER_MODULE_NO_WAREHOUSE);
$orderSteps = $this->getSteps([$this->repository->findOrFail($order->getOrderId())->pluck('warehouse_id') ? Constants::ORDER_MODULE_WAREHOUSE : Constants::ORDER_MODULE_NO_WAREHOUSE]);
$this->createsOrderSteps->execute($order, $orderSteps->toArray());
}
/**
* @param array $modules
@@ -1,7 +1,6 @@
<?php
namespace App\Classes\Modules\Orders\Services;
namespace App\Classes\Modules\Orders\Services\Steps;
use App\Classes\Constants;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
@@ -12,32 +11,14 @@ use App\Models\OrderStep;
class UpdatesOrderCurrentStep
{
/** @var Order */
private $order;
/** @var OrderStep */
private $orderStep;
/**
* UpdatesOrderCurrentStep constructor.
* @param Order $order
* @param OrderStep $orderStep
*/
public function __construct(Order $order, OrderStep $orderStep)
{
$this->order = $order;
$this->orderStep = $orderStep;
}
public function execute(OrderObject $order, StepObject $step){
$orderStep = $this->orderStep->where('order_id', $order->getOrderId())
$orderStep = OrderStep::where('order_id', $order->getOrderId())
->where('complete', 0)->orderBy('sequence')->first();
$nextStep = $orderStep ? $orderStep->reference_id : null;
$repository = $this->order->findOrFail($order->getOrderId());
$repository = order::findOrFail($order->getOrderId());
$repository->current_step = $nextStep;
if($nextStep === null && $step !== Constants::ORDER_PROCESSING_STEP){
@@ -0,0 +1,30 @@
<?php
namespace App\Classes\Modules\Orders\Services\Steps;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\DataTransferObjects\StepObject;
use App\Classes\Modules\Orders\Processors\StepProcessMapper;
use App\Classes\ValueObjects\Constants\OrderSteps;
use Illuminate\Http\Request;
class UpdatesOrderSteps
{
/**
* @param OrderObject $order
* @param StepObject $step
* @param Request $request
* @return mixed
* @throws \ReflectionException
*/
public function execute(OrderObject $order, StepObject $step, Request $request) {
$class = OrderSteps::STEP_PROCESSOR[$step->getReferenceId()];
$arguments = (new StepProcessMapper())->map($class, $request->all());
return (new $class())->execute($order, $step,...$arguments);
}
}
@@ -1,56 +0,0 @@
<?php
namespace App\Classes\Modules\Orders\Services;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\DataTransferObjects\StepObject;
use App\Classes\ValueObjects\Constants\HttpStatus;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class UpdatesOrderSteps
{
/** @var ProcessesOrderStep */
private $processesOrderStep;
/** @var CompletesOrderStep */
private $completesOrderStep;
/** @var UpdatesOrderCurrentStep */
private $updatesOrderCurrentStep;
/**
* UpdatesOrderSteps constructor.
* @param ProcessesOrderStep $processesOrderStep
* @param CompletesOrderStep $completesOrderStep
* @param UpdatesOrderCurrentStep $updatesOrderCurrentStep
*/
public function __construct(ProcessesOrderStep $processesOrderStep, CompletesOrderStep $completesOrderStep, UpdatesOrderCurrentStep $updatesOrderCurrentStep)
{
$this->processesOrderStep = $processesOrderStep;
$this->completesOrderStep = $completesOrderStep;
$this->updatesOrderCurrentStep = $updatesOrderCurrentStep;
}
/**
* @param OrderObject $order
* @param StepObject $step
* @param Request $request
* @return JsonResponse
*/
public function execute(OrderObject $order, StepObject $step, Request $request) {
if($this->processesOrderStep->execute($order, $step, $request)){
$this->completesOrderStep->execute($order, $step);
$this->updatesOrderCurrentStep->execute($order, $step);
}
return new JsonResponse(null, HttpStatus::OK);
}
}
@@ -1,76 +0,0 @@
<?php
namespace App\Classes\Modules\Orders\Steps;
use App\Models\Order;
use App\Models\OrderStep;
use Illuminate\Http\Request;
abstract class AbstractOrderStep
{
/** @var string */
protected $orderId;
/** @var string */
protected $currentStep;
/** @var null|string */
protected $nextStep;
/**
* AbstractOrderStep constructor.
* @param string $orderId
* @param Request|null $request
*/
public function __construct(string $orderId, ?Request $request = null)
{
$this->orderId = $orderId;
$this->currentStep = $this->getCurrentStep();
$this->currentStep = $this->getCurrentStep();
}
/**
* @return string
*/
public function getOrderId(): string
{
return $this->orderId;
}
/**
* @return string
*/
public function getCurrentStep(): string
{
return Order::findOrFail($this->getOrderId())->current_step;
}
/**
* @param string $currentStep
*/
public function setCurrentStep(string $currentStep): void
{
$this->currentStep = $currentStep;
}
/**
* @return null|string
*/
public function getNextStep(): ?string
{
$nextStep = OrderStep::where('order_id', $this->getOrderId())
->where('complete', 0)->orderBy('sequence')->first();
return $nextStep ? $nextStep->reference_id : null;
}
/**
* @param null|string $nextStep
*/
public function setNextStep(?string $nextStep): void
{
$this->nextStep = $nextStep;
}
}
@@ -1,54 +0,0 @@
<?php
namespace App\Classes\Modules\Orders\Steps;
use App\Classes\Interfaces\Order\Steps\OrderStep as OrderStepInterface;
class OrderStep implements OrderStepInterface
{
/** @var bool */
protected $isPrimary;
/** @var string */
protected $referenceId;
/** @var float */
protected $sequence;
/**
* AbstractOrderStep constructor.
* @param bool $isPrimary
* @param string $referenceId
* @param float $sequence
*/
public function __construct(bool $isPrimary, string $referenceId, float $sequence)
{
$this->isPrimary = $isPrimary;
$this->referenceId = $referenceId;
$this->sequence = $sequence;
}
/**
* @return bool
*/
public function isPrimary(): bool
{
return $this->isPrimary;
}
/**
* @return string
*/
public function getReferenceId(): string
{
return $this->referenceId;
}
/**
* @return float
*/
public function getSequence(): float
{
return $this->sequence;
}
}
@@ -1,23 +0,0 @@
<?php
namespace App\Classes\Modules\Orders\Steps;
use App\Traits\OrderStepTrait;
use Illuminate\Http\Request;
class OrderStepUpdate extends AbstractOrderStep
{
use OrderStepTrait;
public function execute(?Request $request){
if($this->ProcessStep($request)){
return $this->CompleteOrderCurrentStep();
}
return false;
}
}
@@ -1,15 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: accountadmin2
* Date: 11/27/2018
* Time: 12:25 PM
*/
namespace App\Classes\Modules\Orders\Steps;
class ProcessStep
{
}
@@ -1,63 +0,0 @@
<?php
namespace App\Classes\Modules\Orders\Steps\Processors;
use App\Classes\Interfaces\Order\Steps\OrderRequirement;
use App\Models\OrderStep;
abstract class AbstractOrderRequirement implements OrderRequirement
{
/** @var string */
protected $orderId;
/** @var string */
protected $referenceId;
/**
* AbstractOrderRequirement constructor.
* @param string $orderId
* @param string $referenceId
*/
public function __construct(string $orderId, string $referenceId)
{
$this->orderId = $orderId;
$this->referenceId = $referenceId;
}
/**
* @return string
*/
public function getOrderId(): string
{
return $this->orderId;
}
/**
* @return string
*/
public function getReferenceId(): string
{
return $this->referenceId;
}
/**
* @return bool
*/
public function completeStep(): bool {
$orderStep = OrderStep::where('order_id', $this->getOrderId())
->where('reference_id', $this->getReferenceId())->firstOrFail();
$orderStep->complete = 1;
if($orderStep->save()){
return true;
}
return false;
}
}
@@ -1,10 +0,0 @@
<?php
namespace App\Classes\Modules\Orders\Steps\Processors;
class Delivery extends AbstractOrderRequirement
{
public function execute(): bool {
return $this->completeStep();
}
}
@@ -1,10 +0,0 @@
<?php
namespace App\Classes\Modules\Orders\Steps\Processors;
class OrderProcessing extends AbstractOrderRequirement
{
public function execute(): bool {
return $this->completeStep();
}
}
@@ -1,10 +0,0 @@
<?php
namespace App\Classes\Modules\Orders\Steps\Processors;
class Shipping extends AbstractOrderRequirement
{
public function execute(): bool {
return $this->completeStep();
}
}
@@ -1,10 +0,0 @@
<?php
namespace App\Classes\Modules\Orders\Steps\Processors;
class SupplierPacking extends AbstractOrderRequirement
{
public function execute(): bool {
return $this->completeStep();
}
}
@@ -1,17 +0,0 @@
<?php
namespace App\Classes\Modules\Orders\Steps\Processors\Validation;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
class ReceiveNoteValidation
{
public function execute(Request $request): bool {
return !(Validator::make($request->all(), [
'tracking_no' => 'required',
'receive_date' => 'required|date'
]))->fails();
}
}
@@ -1,10 +0,0 @@
<?php
namespace App\Classes\Modules\Orders\Steps\Processors;
class WarehouseArrival extends AbstractOrderRequirement
{
public function execute(): bool {
return $this->completeStep();
}
}
@@ -1,22 +0,0 @@
<?php
namespace App\Classes\Modules\Orders\Steps\Processors;
use App\Models\PackingList;
class WarehousePacking extends AbstractOrderRequirement
{
public function execute(): bool {
$packingList = PackingList::where('order_id', $this->getOrderId())->first();
if($packingList){
if($packingList->confirmed){
return $this->completeStep();
}
}
return false;
}
}
@@ -1,24 +0,0 @@
<?php
namespace App\Classes\Modules\Orders\Steps\Processors;
use App\Classes\Modules\Orders\ReceiveNotes\CreateReceiveNote;
use App\Classes\Modules\Orders\Steps\Processors\Validation\ReceiveNoteValidation;
use App\Classes\Objects\Orders\ReceiveNotes\ReceiveNoteObject;
use Illuminate\Http\Request;
class WarehouseReceive extends AbstractOrderRequirement
{
public function execute(Request $request): bool {
if((new ReceiveNoteValidation())->execute($request)){
if((new CreateReceiveNote())->execute(new ReceiveNoteObject($this->getOrderId(), $request))){
return $this->completeStep();
}
}
return false;
}
}
@@ -1,10 +0,0 @@
<?php
namespace App\Classes\Modules\Orders\Steps\Processors;
class WarehouseUnpacking extends AbstractOrderRequirement
{
public function execute(): bool {
return $this->completeStep();
}
}
@@ -1,64 +0,0 @@
<?php
namespace App\Classes\Modules\Orders\Steps\Requirements;
use App\Classes\Constants;
use App\Classes\Modules\Orders\Steps\Processors\Delivery;
use App\Classes\Modules\Orders\Steps\Processors\OrderProcessing;
use App\Classes\Modules\Orders\Steps\Processors\Shipping;
use App\Classes\Modules\Orders\Steps\Processors\SupplierPacking;
use App\Classes\Modules\Orders\Steps\Processors\WarehouseArrival;
use App\Classes\Modules\Orders\Steps\Processors\WarehousePacking;
use App\Classes\Modules\Orders\Steps\Processors\WarehouseReceive;
use App\Classes\Modules\Orders\Steps\Processors\WarehouseUnpacking;
use Illuminate\Http\Request;
class StepManager
{
/** @var string */
protected $orderId;
/** @var string */
protected $step;
/** @var null|Request */
protected $request;
/**
* StepManager constructor.
* @param string $orderId
* @param string $step
* @param Request|null $request
*/
public function __construct(string $orderId, string $step, ?Request $request)
{
$this->orderId = $orderId;
$this->step = $step;
$this->request = $request;
}
public function execute(): bool{
switch ($this->step){
case Constants::ORDER_PROCESSING_STEP:
return (new OrderProcessing($this->orderId, $this->step))->execute();
case Constants::ORDER_WAREHOUSE_RECEIVING_STEP:
return (new WarehouseReceive($this->orderId, $this->step))->execute($this->request);
case Constants::ORDER_WAREHOUSE_PACKING_STEP:
return (new WarehousePacking($this->orderId, $this->step))->execute($this->request);
case Constants::ORDER_NO_WAREHOUSE_PENDING_SUPPLIER:
return (new SupplierPacking($this->orderId, $this->step))->execute();
case Constants::ORDER_SHIPPING_STEP:
return (new Shipping($this->orderId, $this->step))->execute();
case Constants::ORDER_WAREHOUSE_ARRIVAL_STEP:
return (new WarehouseArrival($this->orderId, $this->step))->execute();
case Constants::ORDER_WAREHOUSE_UNPACKING_STEP:
return (new WarehouseUnpacking($this->orderId, $this->step))->execute();
case Constants::ORDER_DELIVERY_STEP:
return (new Delivery($this->orderId, $this->step))->execute();
}
}
}
@@ -4,6 +4,13 @@ namespace App\Classes\ValueObjects\Constants;
use App\Classes\Constants;
use App\Classes\Modules\Orders\Processors\ConfirmsOrder;
use App\Classes\Modules\Orders\Processors\DeliverOrder;
use App\Classes\Modules\Orders\Processors\ShipOrder;
use App\Classes\Modules\Orders\Processors\WarehouseArrivalOrder;
use App\Classes\Modules\Orders\Processors\WarehousePackOrder;
use App\Classes\Modules\Orders\Processors\WarehouseReceivesOrder;
use App\Classes\Modules\Orders\Processors\WarehouseUnpackingOrder;
class OrderSteps
{
@@ -52,4 +59,14 @@ class OrderSteps
Constants::ORDER_DELIVERY_STEP
];
public const STEP_PROCESSOR = [
Constants::ORDER_PROCESSING_STEP => ConfirmsOrder::class,
Constants::ORDER_WAREHOUSE_RECEIVING_STEP => WarehouseReceivesOrder::class,
Constants::ORDER_WAREHOUSE_PACKING_STEP => WarehousePackOrder::class,
Constants::ORDER_SHIPPING_STEP => ShipOrder::class,
Constants::ORDER_WAREHOUSE_ARRIVAL_STEP => WarehouseArrivalOrder::class,
Constants::ORDER_WAREHOUSE_UNPACKING_STEP => WarehouseUnpackingOrder::class,
Constants::ORDER_DELIVERY_STEP => DeliverOrder::class,
];
}
@@ -18,8 +18,8 @@ class CompanyController extends Controller
* Display a listing of the resource.
*
*/
public function index() {
return (new ListCompanies())->execute();
public function index(?bool $pagination = true) {
return (new ListCompanies())->execute($pagination);
}
/**
@@ -0,0 +1,27 @@
<?php
namespace App\Http\Controllers\Orders;
use App\Classes\Modules\ControllersLogic\Orders\UpdateOrderStepLogic;
use Illuminate\Http\Request;
class BulkReceiveNotesController
{
/**
* @param Request $request
* @param UpdateOrderStepLogic $logic
* @return void
* @throws \ReflectionException
*/
public function create(Request $request, UpdateOrderStepLogic $logic){
$receiveDate = $request->input('receive_date');
foreach ($request->input('orders') as $note){
$requestObject = new Request();
$requestObject->merge(['tracking_number' => $note['tracking_number'], 'receive_date' => $receiveDate]);
$logic->execute($note['id'], $requestObject);
}
}
}
@@ -1,10 +1,4 @@
<?php
/**
* Created by PhpStorm.
* User: user
* Date: 22/03/2019
* Time: 10:00 AM
*/
namespace App\Http\Controllers\Orders;
@@ -14,7 +8,6 @@ use App\Classes\Modules\ControllersLogic\Orders\ListOrderLogic;
class ListOrderController
{
public function list(String $category,ListOrderLogic $logic){
return $logic->execute($category);
}
@@ -8,7 +8,6 @@ use App\Classes\Modules\Orders\DataTransferObjects\PackageObject;
use App\Classes\Modules\Orders\DataTransferObjects\PackingListObject;
use App\Models\CustomIssues;
use App\Models\Order;
use App\Models\OrderStep;
use App\Models\PackingList;
use App\Models\ShippingArrangement;
use Carbon\Carbon;
@@ -19,6 +18,11 @@ use App\Http\Resources\Order as OrderResource;
class OrderController extends Controller
{
public function show($id){
$order = Order::findOrFail($id)->first();
return new OrderResource($order);
}
public function listCompanyOrders(String $companyId){
$orders = Order::where('company_id', $companyId)->orderBy('created_at', 'DESC')
->paginate(100);
@@ -31,11 +35,6 @@ class OrderController extends Controller
return OrderResource::collection($orders);
}
public function updateStep(String $orderId, Request $request, UpdateOrderStepLogic $logic){
return $logic->execute($orderId, $request);
// return (new UpdateOrderStepLogic())->execute($orderId, $request) ? 200 : 408;
}
public function updatePackingList(String $orderId, Request $request){
$packingList = PackingList::updateOrCreate(['order_id' => $orderId],['reference_no' => $request->input('reference_no')]);
$confirmed = true;
@@ -9,12 +9,13 @@ class UpdateOrderStepController
{
/**
* @param int $companyId
* @param String $orderId
* @param Request $request
* @param UpdateOrderStepLogic $logic
* @return \Illuminate\Http\JsonResponse
* @throws \ReflectionException
*/
public function create(int $companyId, Request $request, UpdateOrderStepLogic $logic){
return $logic->execute($companyId, $request);
public function update(String $orderId, Request $request, UpdateOrderStepLogic $logic){
return $logic->execute($orderId, $request);
}
}
+3
View File
@@ -6,6 +6,7 @@ use App\Classes\Modules\Orders\Services\ListsOrderHistory;
use App\Classes\Modules\Steps\GetStep;
use App\Classes\Modules\Steps\StepAttachments;
use Illuminate\Http\Resources\Json\JsonResource;
use App\Models\AddressBook;
class Order extends JsonResource
{
@@ -17,6 +18,7 @@ class Order extends JsonResource
*/
public function toArray($request)
{
$addressBook = AddressBook::find($this->address_id)->first();
return [
'id' => $this->id,
'company_id' => $this->company_id,
@@ -24,6 +26,7 @@ class Order extends JsonResource
'forwarder_id' => $this->forwarder_id,
'supplier_id' => $this->supplier_id,
'warehouse_id' => $this->warehouse_id,
'address' => new \App\Http\Resources\AddressBook($addressBook),
'current_step' => $this->current_step,
'complete' => (float)$this->complete,
'date' => $this->created_at->format('d/m/Y'),
+1 -1
View File
@@ -12,7 +12,7 @@ class Order extends AbstractModel
protected $table = 'orders';
protected $fillable = [
'company_id', 'marking', 'forwarder_id', 'supplier_id', 'warehouse_id', 'current_step', 'complete'
'company_id', 'marking', 'forwarder_id', 'supplier_id', 'warehouse_id', 'address_id', 'current_step', 'complete'
];
public function orderSteps()
+1 -1
View File
@@ -8,7 +8,7 @@ class OrderStep extends AbstractModel
protected $table = 'order_steps';
protected $fillable = [
'order_id', 'reference_id', 'primary', 'sequence', 'complete'
'order_id', 'reference_id', 'primary', 'sequence', 'complete', 'complete_date'
];
public function order()
+27
View File
@@ -0,0 +1,27 @@
<?php
namespace App\Classes\Modules\Orders\Services\Processors;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\DataTransferObjects\StepObject;
use App\Classes\Modules\Orders\Services\Steps\CompletesOrderStep;
use App\Classes\Modules\Orders\Services\Steps\UpdatesOrderCurrentStep;
trait updatesStep
{
public function completeStep(OrderObject $order, StepObject $step){
$this->CompleteOrderStep($order, $step);
$this->updatesOrderCurrentStep($order, $step);
}
public function CompleteOrderStep(OrderObject $order, StepObject $step){
(new CompletesOrderStep())->execute($order, $step);
}
public function updatesOrderCurrentStep(OrderObject $order, StepObject $step){
(new UpdatesOrderCurrentStep())->execute($order, $step);
}
}
@@ -15,9 +15,10 @@ class CreateCompaniesTable extends Migration
{
Schema::create('companies', function (Blueprint $table) {
$table->increments('id');
$table->string('name', 50);
$table->string('name', 80);
$table->string('marking', 80)->unique();
$table->string('email', 80)->nullable();
$table->string('wechat_id', 80)->nullable();
$table->string('registration_no', 25)->nullable();
$table->string('tax_no', 25)->nullable();
$table->double('rate')->default(0);
@@ -20,6 +20,7 @@ class CreateOrdersTable extends Migration
$table->string('forwarder_id')->nullable();
$table->string('supplier_id')->nullable();
$table->string('warehouse_id')->nullable();
$table->string('address_id');
$table->string('current_step')->nullable();
$table->integer('complete')->default(0);
$table->softDeletes();
@@ -20,6 +20,7 @@ class CreateOrderStepsTable extends Migration
$table->integer('primary')->default(0);
$table->decimal('sequence');
$table->integer('complete')->default(0);
$table->date('complete_date')->nullable();
$table->timestamps();
$table->foreign('order_id')->references('id')->on('orders');
@@ -17,7 +17,6 @@ class CreateReceiveNotesTable extends Migration
$table->increments('id');
$table->integer('order_id')->unsigned()->index();
$table->string('tracking_no');
$table->date('receive_date');
$table->timestamps();
$table->foreign('order_id')->references('id')->on('orders');
+3 -3
View File
@@ -15,9 +15,9 @@ class DatabaseSeeder extends Seeder
$this->call(AddressBookTableSeeder::class);
$this->call(ContactsTableSeeder::class);
$this->call(WarehousesTableSeeder::class);
$this->call(OrdersTableSeeder::class);
$this->call(PackingListsTableSeeder::class);
$this->call(PackagesTableSeeder::class);
// $this->call(OrdersTableSeeder::class);
// $this->call(PackingListsTableSeeder::class);
// $this->call(PackagesTableSeeder::class);
}
$this->call(PrimaryStepsTableSeeder::class);
+1
View File
@@ -1,4 +1,5 @@
$(function() {
$('.page-container').scrollbar().addClass('scrollbar-macosx');
$.fn.selectListTrigger = function(eventName) {
return this.each(function() {
var el = $(this).get(0);
+38
View File
@@ -2006,6 +2006,44 @@ padding-right: 30px;
z-index: 1050 !important;
}
.select2-container--open .select2-dropdown {
border-radius: 0px !important;
border: none !important;
}
.select2-dropdown {
box-shadow: none !important;
&.select2-dark {
background-color: $color-master !important;
.select2-search--dropdown .select2-search__field {
background-color: $color-master-dark !important;
color: $color-master-lightest;
}
.select2-results {
li {
color: $color-master-lighter !important;
&.select2-results__option--highlighted {
color: $color-white !important;
background-color: $color-master-darkest !important;
}
}
}
}
}
.select2-dark {
.select2-container--default {
.select2-selection__arrow b {
border-color: #fff transparent transparent transparent !important;
}
}
.select2-container--open {
.select2-selection__arrow b {
border-color: transparent transparent #fff transparent !important;
}
}
}
.side-tab {
.tab-container {
border-left: solid 3px transparent !important;
+20 -10
View File
@@ -53,7 +53,8 @@ Vue.component('contact-list-component', require('./components/contact/list/Conta
Vue.component('warehouses-list-component', require('./components/warehouse/lists/WarehousesListComponenet.vue'));
Vue.component('orders-list-component', require('./components/order/lists/OrdersListComponenet.vue'));
Vue.component('orders-list-component', require('./components/order/lists/OrdersListComponent.vue'));
Vue.component('orders-select-list-component', require('./components/order/lists/OrdersSelectListComponent.vue'));
//elements
@@ -76,16 +77,23 @@ Vue.component('warehouse-summary-component', require('./components/warehouse/ele
Vue.component('order-page-component', require('./components/order/elements/OrdersPageComponent.vue'));
Vue.component('order-select-component', require('./components/order/elements/OrderSelectComponent.vue'));
Vue.component('order-component', require('./components/order/elements/OrderComponenet.vue'));
Vue.component('confirm-order-component', require('./components/order/elements/ConfirmOrderComponent.vue'));
Vue.component('receive-step-component', require('./components/order/elements/ReceiveStepComponenet.vue'));
Vue.component('packing-step-component', require('./components/order/elements/PackingStepComponenet.vue'));
Vue.component('supplier-packing-step-component', require('./components/order/elements/SupplierPackingStepComponenet.vue'));
Vue.component('shipping-step-component', require('./components/order/elements/ShippingStepComponenet.vue'));
Vue.component('arrival-step-component', require('./components/order/elements/ArrivalStepComponenet.vue'));
Vue.component('unpacking-step-component', require('./components/order/elements/UnpackingStepComponenet.vue'));
Vue.component('delivery-step-component', require('./components/order/elements/DeliveryStepComponenet.vue'));
Vue.component('complete-order-component', require('./components/order/elements/CompleteOrderComponenet.vue'));
Vue.component('order-profile-component', require('./components/order/elements/OrdersProfileComponent.vue'));
Vue.component('order-header-component', require('./components/order/elements/OrderHeaderComponenet.vue'));
Vue.component('order-action-component', require('./components/order/elements/OrderActionComponenet.vue'));
Vue.component('order-history-component', require('./components/order/elements/OrderHistoryComponenet.vue'));
Vue.component('confirm-order-component', require('./components/order/elements/steps/ConfirmOrderComponent.vue'));
Vue.component('receive-step-component', require('./components/order/elements/steps/ReceiveStepComponenet.vue'));
Vue.component('packing-step-component', require('./components/order/elements/steps/PackingStepComponenet.vue'));
Vue.component('supplier-packing-step-component', require('./components/order/elements/steps/SupplierPackingStepComponenet.vue'));
Vue.component('shipping-step-component', require('./components/order/elements/steps/ShippingStepComponenet.vue'));
Vue.component('arrival-step-component', require('./components/order/elements/steps/ArrivalStepComponenet.vue'));
Vue.component('unpacking-step-component', require('./components/order/elements/steps/UnpackingStepComponenet.vue'));
Vue.component('delivery-step-component', require('./components/order/elements/steps/DeliveryStepComponenet.vue'));
//forms
Vue.component('invite-account-form-component', require('./components/account/forms/InviteAccountFormComponent.vue'));
@@ -98,6 +106,8 @@ Vue.component('contact-form-component', require('./components/contact/forms/Cont
Vue.component('warehouse-form-component', require('./components/warehouse/forms/WarehouseFormComponent.vue'));
Vue.component('order-form-component', require('./components/order/forms/OrderFormComponent.vue'));
Vue.component('addon-order-form-component', require('./components/order/forms/AddonOrderFormComponent.vue'));
Vue.component('warehouse-receive-note-form-component', require('./components/order/forms/WarehouseReceiveNoteFormComponent.vue'));
Vue.component('notification-component', require('./components/common/NotificationComponent.vue'));
@@ -89,7 +89,7 @@
</div>
</div>
</div>
<div class="col-7">
<div class="col-9">
<div class="card no-border bg-transparent">
<div class="tab-content bg-transparent p-l-0 p-r-0">
<div class="tab-pane active" id="orders">
@@ -158,26 +158,26 @@
</div>
</div>
</div>
<div class="col-2 p-t-40 p-r-0 p-l-0">
<div class="row m-b-15 parentContainer">
<div class="col">
<button class="btn btn-sm btn-block btn-primary b-rad-none all-caps bold p-t-10 p-b-10 requestModal" data-type="newOrder"><i class="fa fa-shopping-basket fs-14 m-r-5"></i> New Order</button>
<modal-component type="newOrder">
<order-form-component :data="companyId"></order-form-component>
</modal-component>
</div>
</div>
<div class="row m-b-15">
<div class="col">
<button class="btn btn-sm btn-block btn-info b-rad-none all-caps bold p-t-10 p-b-10"><i class="fa fa-envelope-open-o fs-14 m-r-5"></i> Send Invite</button>
</div>
</div>
<div class="row">
<div class="col">
<button class="btn btn-sm btn-block btn-info bg-master bg-master b-rad-none all-caps bold p-t-10 p-b-10"><i class="fa fa-line-chart fs-14 m-r-5"></i> Reports</button>
</div>
</div>
</div>
<!--<div class="col-2 p-t-40 p-r-0 p-l-0">-->
<!--<div class="row m-b-15 parentContainer">-->
<!--<div class="col">-->
<!--<button class="btn btn-sm btn-block btn-primary b-rad-none all-caps bold p-t-10 p-b-10 requestModal" data-type="newOrder"><i class="fa fa-shopping-basket fs-14 m-r-5"></i> New Order</button>-->
<!--<modal-component type="newOrder">-->
<!--<order-form-component :data="companyId"></order-form-component>-->
<!--</modal-component>-->
<!--</div>-->
<!--</div>-->
<!--<div class="row m-b-15">-->
<!--<div class="col">-->
<!--<button class="btn btn-sm btn-block btn-info b-rad-none all-caps bold p-t-10 p-b-10"><i class="fa fa-envelope-open-o fs-14 m-r-5"></i> Send Invite</button>-->
<!--</div>-->
<!--</div>-->
<!--<div class="row">-->
<!--<div class="col">-->
<!--<button class="btn btn-sm btn-block btn-info bg-master bg-master b-rad-none all-caps bold p-t-10 p-b-10"><i class="fa fa-line-chart fs-14 m-r-5"></i> Reports</button>-->
<!--</div>-->
<!--</div>-->
<!--</div>-->
</div>
</div>
</template>
@@ -24,7 +24,8 @@
<small class="muted fs-10 all-caps">Registration No:</small>
</div>
<div class="col-auto p-r-0">
<small class="text-complete fs-10 bold">{{this.company.registration_no}}</small>
<small v-if="this.company.registration_no !==''" class="text-complete fs-10 bold">{{this.company.registration_no}}</small>
<small v-else class="muted fs-8 hint-text">Empty</small>
</div>
</div>
<div class="row p-t-5 p-b-5 b-b b-grey">
@@ -32,8 +33,8 @@
<small class="muted fs-10 all-caps">Tax No:</small>
</div>
<div class="col-auto p-r-0">
<small :if="this.company.tax_no !==''" class="text-complete fs-10 bold">{{this.company.tax_no}}</small>
<small class="muted fs-8 hint-text">Empty</small>
<small v-if="this.company.tax_no !==''" class="text-complete fs-10 bold">{{this.company.tax_no}}</small>
<small v-else class="muted fs-8 hint-text">Empty</small>
</div>
</div>
<div class="row p-t-5 p-b-5">
@@ -41,8 +42,8 @@
<small class="muted fs-10 all-caps">Email:</small>
</div>
<div class="col-auto p-r-0">
<small :if="this.company.email !==''" class="text-complete fs-10 bold">{{this.company.email}}</small>
<small class="muted fs-8 hint-text">Empty</small>
<small v-if="this.company.email !==''" class="text-complete fs-10 bold">{{this.company.email}}</small>
<small v-else class="muted fs-8 hint-text">Empty</small>
</div>
</div>
</div>
@@ -48,7 +48,7 @@
</div>
</template>
<script>
import notificationConstant from '../../../constant/notification'
import notificationConstant from '../../../../js/notification'
export default {
props: {
'id': {
@@ -61,7 +61,7 @@
</div>
</template>
<script>
import notificationConstant from '../../../constant/notification';
import notificationConstant from '../../../../js/notification';
export default {
props: {
'data': {
@@ -61,7 +61,7 @@
</div>
</template>
<script>
import notificationConstant from '../../../constant/notification';
import notificationConstant from '../../../../js/notification';
export default {
props: {
'type': {
@@ -9,11 +9,20 @@
mounted(){
var vm = this;
$(this.$el)
.select2({data: this.options})
.select2({
data: this.options,
containerCssClass: "error",
dropdownCssClass: "select2-dark"
})
.val(this.value)
.trigger('change')
.on('change', function(){
vm.$emit('input', this.value);
}).on('select2:open', function(){
if($(this).parents('.select2-dark').length){
$('.select2-dropdown').addClass('select2-dark');
}
$('.select2-results__options').scrollbar().parent().addClass('scrollbar-inner');
});
},
watch: {
@@ -1,10 +0,0 @@
<template>
<div class="inline">
</div>
</template>
<script>
</script>
@@ -0,0 +1,75 @@
<template>
<div class="row">
<div class="col p-t-10 p-b-10">
<div class="row no-margin align-items-center justify-content-center">
<div class="col">
<small class="text-danger fs-10 requestModal pointer" data-type="delete"><i class="fa fa-times"></i> delete order</small>
</div>
<div class="col-auto">
<component :is="stepComponent(this.order.current_step)" :attachments="this.order.steps.attachments" :data="this.order.id"></component>
<div class="btn btn-sm btn-default b-rad-none">View Details</div>
</div>
</div>
<confirm-modal-component
title="Cancel Order"
:message="'Are you sure you want to cancel this order ?'"
type="delete"
danger
v-on:confirm="deleteOrder()"></confirm-modal-component>
</div>
</div>
</template>
<script>
export default {
props: {
'data': {
required: true
}
},
data() {
return {
order: this.data,
}
},
watch: {
'data': function() {
this.order = this.data;
}
},
methods: {
deleteOrder(){
fetch(route('api.order.delete', {'id': this.data}), {
method: 'delete'
}).then(() => {
Event.$emit('updateOrdersList');
})
.catch(error => console.log(error))
},
stepComponent(stepReference){
switch (stepReference) {
case 'PS_PROCESSING':
return 'confirm-order-component';
case 'MS_WAREHOUSE_RECEIVING':
return 'receive-step-component';
case 'MS_WAREHOUSE_PACKING':
return 'packing-step-component';
case 'MS_NO_WAREHOUSE_PENDING_SUPPLIER':
return 'supplier-packing-step-component';
case 'PS_SHIPPING':
return 'shipping-step-component';
case 'MS_WAREHOUSE_ARRIVAL':
return 'arrival-step-component';
case 'MS_WAREHOUSE_UNPACKING':
return 'unpacking-step-component';
case 'PS_DELIVERY':
if(this.order.complete){
return 'complete-order-component';
}
return 'delivery-step-component';
}
}
}
}
</script>
@@ -1,89 +1,10 @@
<template>
<div class="row m-b-10 parentContainer bg-white">
<div class="col">
<div class="row no-margin">
<div class="col">
<div class="row no-margin p-t-10 p-b-10 b-b b-grey">
<div class="col p-l-0">
<div class="row">
<div class="col">
<div class="bold">
<span class="v-align-middle">#{{this.order.marking}} </span>
</div>
</div>
</div>
<div class="row">
<div class="col">
<div class="fs-10 muted">Created: <span class="text-success semi-bold">{{this.order.date}}</span></div>
</div>
</div>
</div>
<div class="col-auto p-r-0">
<div class="row">
<div class="col"></div>
<div class="col-auto">
<span class="fs-11 muted">Status: </span>
<span class="text-capitalize bold text-danger fs-11" v-if="!this.order.complete">{{this.order.steps.details.initial_name}}</span>
<span class="text-capitalize bold text-success fs-11" v-if="this.order.complete">Complete</span>
</div>
</div>
<div class="row" >
<div class="col text-right muted">
<span class="fs-11 inline v-align-middle" v-if="!this.order.complete">{{this.order.steps.details.description}}</span>
<span class="fs-11 inline v-align-middle" v-if="this.order.complete">Order has been delivered</span>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col p-t-10 p-b-10">
<div class="row no-margin align-items-center justify-content-center">
<div class="col">
<small class="text-danger fs-10 requestModal pointer" data-type="delete"><i class="fa fa-times"></i> delete order</small>
</div>
<div class="col-auto">
<component :is="stepComponent(this.order.current_step)" :attachments="this.order.steps.attachments" :data="this.order.id"></component>
<div class="btn btn-sm btn-default b-rad-none">View Details</div>
</div>
</div>
</div>
</div>
<div class="row m-t-5">
<div class="col">
<div class="row">
<div class="col">
<div class="order-history-border"></div>
</div>
</div>
<div class="row fs-12 p-t-15 p-b-15 ">
<div class="col">
<div class="row m-l-0 m-r-0 p-b-15 relative order-history" v-for="detail in this.order.details">
<div class="absolute bullet-connector hint-text"></div>
<div class="col">
<div class="row align-items-center justify-content-center">
<div class="col-auto p-r-10">
<div class="bg-master-light btn-rounded hint-text" style="width: 8px;height: 8px;" ></div>
</div>
<div class="col-auto hint-text p-l-0">
{{detail.date}}
</div>
<div class="col p-l-0 semi-bold lh-25" v-html="detail.description"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<order-header-component :data="this.data"></order-header-component>
<order-action-component :data="this.data"></order-action-component>
<order-history-component :data="this.data"></order-history-component>
</div>
<confirm-modal-component
title="Cancel Order"
:message="'Are you sure you want to cancel this order ?'"
type="delete"
danger
v-on:confirm="deleteOrder()"></confirm-modal-component>
</div>
</template>
@@ -97,49 +18,12 @@
data() {
return {
order: this.data,
receiveNote: {
tracking_no: '',
receive_date: ''
}
}
},
watch: {
'data': function() {
this.order = this.data;
}
},
methods: {
deleteOrder(){
fetch(route('api.order.delete', {'id': this.data}), {
method: 'delete'
}).then(() => {
Event.$emit('updateOrdersList');
})
.catch(error => console.log(error))
},
stepComponent(stepReference){
switch (stepReference) {
case 'PS_PROCESSING':
return 'confirm-order-component';
case 'MS_WAREHOUSE_RECEIVING':
return 'receive-step-component';
case 'MS_WAREHOUSE_PACKING':
return 'packing-step-component';
case 'MS_NO_WAREHOUSE_PENDING_SUPPLIER':
return 'supplier-packing-step-component';
case 'PS_SHIPPING':
return 'shipping-step-component';
case 'MS_WAREHOUSE_ARRIVAL':
return 'arrival-step-component';
case 'MS_WAREHOUSE_UNPACKING':
return 'unpacking-step-component';
case 'PS_DELIVERY':
if(this.order.complete){
return 'complete-order-component';
}
return 'delivery-step-component';
}
}
}
}
</script>
@@ -0,0 +1,58 @@
<template>
<div class="row no-margin">
<div class="col">
<div class="row no-margin p-t-10 p-b-10 b-b b-grey">
<div class="col p-l-0">
<div class="row">
<div class="col">
<div class="bold">
<span class="v-align-middle">#{{this.order.marking}} </span>
</div>
</div>
</div>
<div class="row">
<div class="col">
<div class="fs-10 muted">Created: <span class="text-success semi-bold">{{this.order.date}}</span></div>
</div>
</div>
</div>
<div class="col-auto p-r-0">
<div class="row">
<div class="col"></div>
<div class="col-auto">
<span class="fs-11 muted">Status: </span>
<span class="text-capitalize bold text-danger fs-11" v-if="!this.order.complete">{{this.order.steps.details.initial_name}}</span>
<span class="text-capitalize bold text-success fs-11" v-if="this.order.complete">Complete</span>
</div>
</div>
<div class="row" >
<div class="col text-right muted">
<span class="fs-11 inline v-align-middle" v-if="!this.order.complete">{{this.order.steps.details.description}}</span>
<span class="fs-11 inline v-align-middle" v-if="this.order.complete">Order has been delivered</span>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
props: {
'data': {
required: true
}
},
data() {
return {
order: this.data,
}
},
watch: {
'data': function() {
this.order = this.data;
}
},
}
</script>
@@ -0,0 +1,74 @@
<template>
<div class="row m-t-5">
<div class="col">
<div class="row">
<div class="col">
<div class="order-history-border"></div>
</div>
</div>
<div class="row fs-12 p-t-15 p-b-15 m-l-0 m-r-0 ">
<div class="col">
<div class="row m-b-15">
<div class="col">
<small class="muted all-caps">Delivery Address</small>
</div>
</div>
<div class="row">
<div class="col">
<div class="bold m-b-5">{{this.order.address.reference}}</div>
<div class="hint-text semi-bold">{{this.order.address.contact}}</div>
<div class="m-t-15 m-b-15 hint-text">{{this.order.address.street_one || ''}} {{ this.order.address.street_two || '' }} {{this.order.address.city || '' }} {{this.order.address.post_code || ''}} {{this.order.address.state || ''}} {{this.order.address.country || ''}}</div>
<small class="block text-complete text-underline pointer">Change Address</small>
</div>
</div>
</div>
<div class="col-9 p-l-0">
<div class="row m-l-0 m-r-0 m-b-15">
<div class="col p-l-0">
<small class="muted all-caps">Order History</small>
</div>
</div>
<div class="row">
<div class="col p-l-0">
<div class="row m-l-0 m-r-0 p-b-15 relative order-history" v-for="detail in this.order.details">
<div class="absolute bullet-connector hint-text"></div>
<div class="col">
<div class="row align-items-center justify-content-center">
<div class="col-auto p-r-10">
<div class="bg-master-light btn-rounded hint-text" style="width: 8px;height: 8px;" ></div>
</div>
<div class="col-auto hint-text p-l-0">
{{detail.date}}
</div>
<div class="col p-l-0 semi-bold lh-20" v-html="detail.description"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
props: {
'data': {
required: true
}
},
data() {
return {
order: this.data,
}
},
watch: {
'data': function() {
this.order = this.data;
}
},
}
</script>
@@ -0,0 +1,77 @@
<template>
<div class="row m-b-10">
<div class="col" :class="[{ 'bg-success': selected }, { 'bg-white': !selected }]">
<div class="row no-margin p-t-10 p-b-10 align-items-center justify-content-center">
<div class="col p-l-0">
<div class="row">
<div class="col">
<div class="bold fs-12 text-master"><span class="v-align-middle">#{{this.order.marking}} </span></div>
</div>
</div>
<div class="row">
<div class="col" :class="[{ 'hint-text': selected }]">
<div class="fs-10" :class="[{ 'muted': !selected }]">Created: <span class="semi-bold" :class="[{ 'text-success': !selected }]">{{this.order.date}}</span></div>
</div>
</div>
</div>
<div class=" p-r-0" :class="[{ 'col-auto': selected }, { 'col-4': !selected }]">
<button type="button" class="btn btn-xs btn-block all-caps b-rad-none pointer no-border" @mouseenter="mouseOver()" @mouseleave="mouseOver()" @click="selectOrder()" :class="[{ 'btn-default': !selected }, {'bg-master-light': !selected}, { 'btn-success': selected }, {'bg-success-darker': selected}]">
<span v-show="!selected">Select</span>
<span v-show="selected">
<i class="fa fa-check fa-fw" v-show="ishover"></i>
<i class="fa fa-times text-danger-light fa-fw" v-show="!ishover"></i>
</span>
</button>
</div>
</div>
<div class="row" v-show="selected">
<div class="col">
<div class="form-group form-group-default bg-success-lighter">
<label class="muted">Tracking Number</label>
<input class="form-control" @keyup="updateSelection" v-model="tracking_no">
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
props: {
'data': {
required: true
}
},
data() {
return {
order: this.data,
selected: false,
tracking_number: '',
ishover: true
}
},
watch: {
'data': function() {
this.order = this.data;
}
},
methods: {
mouseOver(){
this.ishover = !this.ishover;
},
selectOrder(){
this.selected = !this.selected;
this.updateSelection();
},
updateSelection(){
Event.$emit('orderSelected', {
id: this.order.id,
marking: this.order.marking,
tracking_number: this.tracking_number,
selected: this.selected
});
}
}
}
</script>
@@ -0,0 +1,43 @@
<template>
<div class="row m-t-50">
<div class="col">
<div class="row">
<div class="col-6 bg-white">
<order-header-component :data="this.order"></order-header-component>
</div>
</div>
<div class="row m-t-30">
<div class="col-9 bg-white">
<order-history-component :data="this.order"></order-history-component>
</div>
<div class="col">
<order-action-component :data="this.order"></order-action-component>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
props: ['data'],
data() {
return {
orderId: this.data,
order: null
}
},
created(){
this.fetchOrder();
},
methods: {
fetchOrder(){
fetch(route('api.order.profile', {'id': this.orderId})).then(response => response.json())
.then(response => {
this.order = response.data;
})
.catch(error => console.log(error))
}
}
}
</script>
@@ -12,7 +12,7 @@
</template>
<script>
import notificationConstant from '../../../constant/notification';
import notificationConstant from '../../../../../js/notification';
export default {
props: {
'data': {
@@ -56,7 +56,7 @@
</div>
</template>
<script>
import notificationConstant from '../../../constant/notification';
import notificationConstant from '../../../../../js/notification';
export default {
props: {
'data': {
@@ -12,7 +12,7 @@
</template>
<script>
import notificationConstant from '../../../constant/notification';
import notificationConstant from '../../../../../js/notification';
export default {
props: {
'data': {
@@ -161,6 +161,12 @@
</div>
<div class="row m-b-20">
<div class="col no-padding bg-master-lightest">
<div class="form-group form-group-default input-group" style=" overflow: visible; ">
<div class="form-input-group">
<label>Action Date</label>
<date-picker-component name="complete_date" v-on:updateDate="setCompleteDate($event)"></date-picker-component>
</div>
</div>
<div class="row">
<div class="col p-t-10 p-b-10 b-b b-grey bg-master-lighter">
<p class="no-margin text-info"><small class="muted all-caps fs-12 m-r-5">Packing List No:</small> {{packingList.reference_no}}</p>
@@ -197,7 +203,7 @@
</template>
<script>
import notificationConstant from '../../../constant/notification';
import notificationConstant from '../../../../../js/notification';
export default {
props: {
'data': {
@@ -220,6 +226,9 @@
height: 0.0,
length: 0.0
}]
},
actionData: {
complete_date: ''
}
}
},
@@ -265,6 +274,7 @@
this.isLoading = true;
fetch(route('api.order.step.update', {orderId: this.data}), {
method: 'post',
body: JSON.stringify(this.actionData),
headers: {
'content-type': 'application/json'
}
@@ -318,6 +328,9 @@
total += (((object.width/100) * (object.length/100) * (object.height/100)) * object.quantity)
});
return total.toFixed(5);
},
setCompleteDate(date){
this.actionData.complete_date = date;
}
}
}
@@ -21,14 +21,14 @@
<div class="row w-100">
<div class="col no-padding">
<label class="muted block">Tracking Number</label>
<input class="form-control block" name="tracking_no" v-model="receiveNote.tracking_no">
<input class="form-control block" name="tracking_number" v-model="receiveNote.tracking_number">
</div>
</div>
</div>
<div class="form-group form-group-default input-group" style=" overflow: visible; ">
<div class="form-input-group">
<label>Date Received</label>
<date-picker-component name="receive_date" v-on:updateDate="setReceiveNote($event, 'receiveNote.receive_date')"></date-picker-component>
<date-picker-component name="complete_date" v-on:updateDate="setCompleteDate($event)"></date-picker-component>
</div>
</div>
<div class="row">
@@ -52,7 +52,7 @@
</template>
<script>
import notificationConstant from '../../../constant/notification';
import notificationConstant from '../../../../../js/notification';
export default {
props: {
'data': {
@@ -62,8 +62,8 @@
data() {
return {
receiveNote: {
tracking_no: '',
receive_date: ''
tracking_number: '',
complete_date: ''
},
isLoading: false
}
@@ -71,8 +71,8 @@
mounted: function() {
$(this.$el).find('.receiveForm').validate({
rules: {
tracking_no: "required",
receive_date: "required"
tracking_number: "required",
complete_date: "required"
},
errorPlacement: function ( error, element ) {
@@ -93,9 +93,9 @@
},
methods: {
setReceiveNote(date){
setCompleteDate(date){
$(this.$el).find('.receiveForm').valid();
this.receiveNote.receive_date = date;
this.receiveNote.complete_date = date;
},
createReceiveNote() {
@@ -130,13 +130,9 @@
})
}
},
updateReceiveDate(value){
//alert(value);
this.receiveNote.receive_date = value;
},
clearForm(){
this.receiveNote.tracking_no = '';
this.receiveNote.receive_date = '';
this.receiveNote.tracking_number = '';
this.receiveNote.complete_date = '';
}
}
}
@@ -152,7 +152,7 @@
<script>
import moment from 'moment';
import notificationConstant from '../../../constant/notification';
import notificationConstant from '../../../../../js/notification';
export default {
props: {
'data': {
@@ -12,7 +12,7 @@
</template>
<script>
import notificationConstant from '../../../constant/notification';
import notificationConstant from '../../../../../js/notification';
export default {
props: {
'data': {
@@ -12,7 +12,7 @@
</template>
<script>
import notificationConstant from '../../../constant/notification';
import notificationConstant from '../../../../../js/notification';
export default {
props: {
'data': {
@@ -0,0 +1,158 @@
<template>
<div class="row m-b-15">
<div class="col">
<loading-component v-show="isLoading"></loading-component>
<div class="row" v-show="isAdding">
<div class="col bg-info">
<div class="row">
<div class="col-7 bg-master" style="height: 3px;"></div>
<div class="col"></div>
</div>
<div class="row p-b-5 m-b-5">
<div class="col p-l-0">
<div class="b-l b-master p-l-15 p-t-15 p-b-10 m-b-5" style="border-left-width: 2px;">
<h6 class="bold all-caps no-margin text-white hint-text">New Order</h6>
<div class="muted all-caps fs-12">Create A New Order</div>
</div>
</div>
</div>
<form @submit.prevent="addOrder()">
<div class="row">
<div class="col no-padding">
<div class="row m-b-15">
<div class="col no-padding">
<div class="form-group form-group-default input-group bg-info-light no-border">
<div class="row w-100">
<div class="col no-padding">
<label class="text-white block fade">Order No.</label>
<input class="form-control block text-white" name="marking" v-model="order.marking">
</div>
<div class="col-auto no-padding" @click="generateMarking()">
<div class="input-group-addon pointer inline bg-info-darker">
<div class="row align-items-center justify-content-center h-100">
<div class="col">
<i class="fa fa-random text-white hint-text"></i>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="form-group form-group-default form-group-default-select2 select2-dark bg-info-light m-b-0">
<label class="muted">Importer</label>
<select-component :options="companies" v-model="order.companyId"></select-component>
</div>
</div>
</div>
<div class="row">
<div class="col no-padding">
<div class="row">
<div class="col text-right no-padding">
<button type="button" class="btn btn-sm b-rad-none btn-default bg-info-darker text-white no-border all-caps" @click="isAdding = false">Cancel</button>
<button type="submit" class="btn btn-sm b-rad-none btn-primary bg-master-darkest no-border all-caps">Create Order</button>
</div>
</div>
</div>
</div>
</div>
</div>
</form>
<div class="row p-t-15 b-r b-master" style="height: 30px; border-right-width: 2px; margin-top: -15px;">
<div class="col"></div>
</div>
<div class="row">
<div class="col bg-info-light"></div>
<div class="col-1 bg-master" style="height: 3px;"></div>
</div>
</div>
</div>
<div class="row" v-show="!isAdding">
<div class="col no-padding">
<button type="button" class="btn btn-sm btn-block btn-default bg-info text-white no-border b-rad-none all-caps" @click="isAdding = true">New Orders</button>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
props: {
'data': {
type: String,
required: true
}
},
data() {
return {
order: {
marking: '',
companyId: ''
},
companies: [],
isAdding: false,
isLoading: false
}
},
created() {
this.fetchCompanies();
this.generateMarking()
},
methods: {
fetchCompanies(){
//turn on loading animation
this.isLoading = true;
fetch(route('api.company.list', {'pagination': 0})).then(response => response.json())
.then(response => {
this.companies = $.map(response, function(company) {
return {id: company.id, text: company.name};
});
//turn off loading animation
this.isLoading = false;
})
.catch(error => console.log(error))
},
addOrder() {
//turn on loading animation
this.isLoading = true;
fetch(route('api.order.create', {companyId: this.order.companyId}), {
method: 'post',
body: JSON.stringify(this.order),
headers: {
'content-type': 'application/json'
}
}).then(response => response.json())
.then(response => {
//turn off loading animation
this.isLoading = false;
this.ConfirmWarehouse(response.id);
})
},
ConfirmWarehouse(orderId){
this.isLoading = true;
fetch(route('api.order.step.update', {orderId: orderId}), {
method: 'post',
body: JSON.stringify({warehouse_id: this.data}),
headers: {
'content-type': 'application/json'
}
}).then(() => {
this.resetForm();
Event.$emit('updateOrdersSelectList');
this.isLoading = false;
this.isAdding = false;
})
},
generateMarking(){
this.order.marking = Math.floor(Math.random() * 799999) + 200000;
},
resetForm(){
this.generateMarking();
this.companyId = '';
}
}
}
</script>
@@ -48,7 +48,7 @@
</div>
</template>
<script>
import notificationConstant from '../../../constant/notification';
import notificationConstant from '../../../../js/notification';
export default {
props: {
'data': {
@@ -0,0 +1,174 @@
<template>
<div class="row">
<div class="col">
<div class="row">
<div class="col">
<div class="row">
<div class="col">
<h3 class="all-caps hint-text">Receive Note</h3>
</div>
</div>
<div class="row m-t-15">
<div class="col">
<div class="row justify-content-between">
<div class="col-6">
<div class="row">
<div class="col">
<small class="all-caps fs-12 no-margin hint-text">Warehouse</small>
</div>
</div>
<div class="row">
<div class="col">
<h6 class="bold m-t-5">{{this.warehouse.name}}</h6>
</div>
</div>
<div class="row">
<div class="col">
<small>{{this.warehouse.street_one}} {{this.warehouse.street_two}}, {{this.warehouse.city}}, {{this.warehouse.state}}, {{this.warehouse.post_code}}, {{this.warehouse.country}}</small>
</div>
</div>
</div>
<div class="col-5 text-right">
<div class="row m-b-10">
<div class="col">
<small class="all-caps fs-12 no-margin hint-text">Receive Date</small>
</div>
</div>
<div class="row">
<div class="col">
<div class="form-group m-b-0">
<div class="input-group">
<date-picker-component class="no-border" placeholder="Select Date" v-on:updateDate="updateReceiveDate($event)"></date-picker-component>
<span class="input-group-addon bg-info text-white no-border b-rad-none">
<i class="fa fa-calendar-o fa-align-justify"></i>
</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row m-t-50">
<div class="col">
<div class="row no-margin" v-show="!receive_note.orders.length">
<div class="col bg-master-lightest text-center p-t-20 p-b-20">
<div class="row">
<div class="col">
<h6 class="bold all-caps m-t-0 fs-12 text-primary">You have no orders selected</h6>
</div>
</div>
<div class="row justify-content-center">
<div class="col-8">
<small class="muted fs-10 all-caps">Select at least one order from the list on the left to proceed with creating a receive note.</small>
</div>
</div>
</div>
</div>
<div class="row" v-show="receive_note.orders.length">
<div class="col">
<div class="row m-b-10 m-l-0 m-r-0">
<div class="col p-b-5 p-l-0 b-b b-grey">
<small class="fs-10 all-caps muted">Received Orders</small>
</div>
</div>
<div class="row m-b-10 m-l-0 m-r-0" v-for="(order, index) in receive_note.orders" v-bind:key="index" >
<div class="col bg-master-lighter p-t-10 p-b-10">
<div class="row align-items-center justify-content-center">
<div class="col">
<div class="row">
<div class="col">
<div class="bold fs-12 text-master">
<span class="v-align-middle">#{{ order.marking }} </span>
</div>
</div>
</div>
<div class="row">
<div class="col">
<div class="fs-11 all-caps muted">Tracking No: <span class="semi-bold text-success" v-if="order.tracking_no">{{ order.tracking_no }}</span><span class="muted all-caps fs-10" v-else>Empty</span></div>
</div>
</div>
</div>
<!--<div class="col-auto">-->
<!--<i class="fa fa-times muted"></i>-->
<!--</div>-->
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row m-t-30">
<div class="col text-right">
<div class="btn btn-sm btn-primary b-rad-none all-caps pointer" v-show="receive_note.orders.length" @click="createReceiveNotes()">Confirm Receive Note</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
props: {
'id': {
type: String,
required: false
}
},
data() {
return {
warehouse: '',
receive_note: {
receive_date: null,
orders: []
},
}
},
created() {
this.fetchWarehouse()
},
mounted(){
Event.$on('orderSelected', (order) => {
this.updateSelection(order);
});
},
methods: {
updateReceiveDate(date){
this.receive_note.receive_date = date;
},
fetchWarehouse(){
fetch(route('api.warehouse.profile', {'id': this.id})).then(response => response.json())
.then(response => {
this.warehouse = response.data;
})
.catch(error => console.log(error))
},
updateSelection(order){
let index = this.receive_note.orders.findIndex(x => x.id === order.id);
if(index === -1){
this.receive_note.orders.push(order);
} else {
if(order.selected){
Vue.set(this.receive_note.orders, index, order)
} else {
this.receive_note.orders.splice(index, 1)
}
}
},
createReceiveNotes(){
fetch(route('api.order.bulk.receive.update'), {
method: 'post',
body: JSON.stringify(this.receive_note),
headers: {
'content-type': 'application/json'
}
})
}
}
}
</script>
@@ -0,0 +1,92 @@
<template>
<div class="relative">
<loading-component v-show="isLoading"></loading-component>
<div class="row" v-if="!orders.length && isLoading === false">
<div class="col text-center p-t-30 p-b-30 bg-white">
<div class="row">
<div class="col text-center">
<img src="https://static.thenounproject.com/png/10066-200.png" width="60" class="hint-text">
</div>
</div>
<div class="row">
<div class="col">
<div class="bold all-caps p-t-15 fs-12 text-primary">Order list is empty</div>
</div>
</div>
<div class="row">
<div class="col">
<small class="all-caps fs-10 muted">No orders matching your criteria</small>
</div>
</div>
</div>
</div>
<order-select-component v-for="order in orders" v-bind:key="order.id" :data="order"></order-select-component>
<pagination-component class="m-b-20" ref="pagination" v-on:changePage="fetchOrders($event)"></pagination-component>
</div>
</template>
<script>
export default {
props: {
'type': {
type: String,
default: 'company'
},
'id': {
type: String,
required: false
},
'category': {
type: String,
required: true
}
},
data() {
return {
orders: [],
isLoading: true
}
},
created() {
this.fetchOrders();
},
mounted() {
Event.$on('updateOrdersSelectList', (current) => {
this.fetchOrders(current ? this.$refs.pagination.pagination.current_page : 1);
});
},
methods: {
fetchOrders(page = 1){
//turn on loading animation
this.isLoading = true;
let url = route('api.company.order.list', {id: this.id, category: this.category});
if(this.type === 'warehouse'){
url = route('api.warehouse.order.list', {id: this.id, category: this.category});
}
if(this.type === 'forwarder'){
url = route('api.order.list', {category: this.category});
}
fetch(url + '?page='+ page)
.then(response => response.json())
.then(response => {
this.orders = response.data;
//turn off loading animation
this.isLoading = false;
this.$refs.pagination.makePagination(response.meta, response.links);
})
.catch(error => console.log(error))
},
updateSelectedOrders(order){
console.log(order);
}
}
}
</script>
@@ -126,6 +126,13 @@
</div>
</div>
</div>
<div class="col">
<div class="row m-b-15 parentContainer">
<div class="col">
<a :href="route('order.bulk.receive_note', {warehouseId: warehouseId})" class="btn btn-sm btn-block btn-primary b-rad-none all-caps fs-10 bold p-t-10 p-b-10 requestModal">Warehouse List</a>
</div>
</div>
</div>
</div>
</div>
</template>
@@ -143,6 +150,7 @@
this.fetchWarehouse();
},
methods: {
route: route,
fetchWarehouse(){
fetch(route('api.warehouse.profile', {'id': this.warehouseId})).then(response => response.json())
.then(response => {
@@ -39,7 +39,7 @@
</div>
</template>
<script>
import notificationConstant from '../../../constant/notification';
import notificationConstant from '../../../../js/notification';
export default {
props: {
'data': {
+1 -77
View File
@@ -1,81 +1,5 @@
@extends('layouts.base_portal')
@section('inner_content')
<div class="row p-t-20 p-b-20">
<div class="col">
<div class="row">
<div class="col">
<div class="row bg-white p-t-15 p-b-15 m-b-20">
<div class="col">
<div class="row m-b-5">
<div class="col bold fs-15">
Order #216718963296916
</div>
</div>
<div class="row">
<div class="col muted">
Placed on 05 Mar 2019 16:40:08
</div>
</div>
</div>
<div class="col-auto text-right">
<div class="row">
<div class="col">
<span class="muted">Status: </span>
<span class="text-success">Complete</span>
</div>
</div>
<div class="row">
<div class="col">
<span class="muted">Order has been delivered</span>
</div>
</div>
</div>
</div>
<div class="row bg-white">
<div class="col">
<div class="row m-t-5"><div class="col"><div class="row"><div class="col no-padding"><div class="order-history-border"></div></div></div> <div class="row fs-12 p-t-15 p-b-15 "><div class="col"><div class="row m-l-0 m-r-0 m-b-15 relative order-history"><div class="absolute bullet-connector"></div> <div class="col"><div class="row align-items-center justify-content-center"><div class="col-auto p-r-10"><div class="bg-master-light btn-rounded" style="width: 8px; height: 8px;"></div></div> <div class="col-auto hint-text p-l-0">
05-03-2019 17:05
</div> <div class="col p-l-0 semi-bold">
Your Order has successfully been delivered
</div></div></div></div><div class="row m-l-0 m-r-0 m-b-15 relative order-history"><div class="absolute bullet-connector"></div> <div class="col"><div class="row align-items-center justify-content-center"><div class="col-auto p-r-10"><div class="bg-master-light btn-rounded" style="width: 8px; height: 8px;"></div></div> <div class="col-auto hint-text p-l-0">
05-03-2019 17:05
</div> <div class="col p-l-0 semi-bold">
Your Order is out for delivery
</div></div></div></div><div class="row m-l-0 m-r-0 m-b-15 relative order-history"><div class="absolute bullet-connector"></div> <div class="col"><div class="row align-items-center justify-content-center"><div class="col-auto p-r-10"><div class="bg-master-light btn-rounded" style="width: 8px; height: 8px;"></div></div> <div class="col-auto hint-text p-l-0">
05-03-2019 17:05
</div> <div class="col p-l-0 semi-bold">
Your Order has been unpacked and being prepared for delivery
</div></div></div></div><div class="row m-l-0 m-r-0 m-b-15 relative order-history"><div class="absolute bullet-connector"></div> <div class="col"><div class="row align-items-center justify-content-center"><div class="col-auto p-r-10"><div class="bg-master-light btn-rounded" style="width: 8px; height: 8px;"></div></div> <div class="col-auto hint-text p-l-0">
05-03-2019 17:05
</div> <div class="col p-l-0 semi-bold">
Your Order has arrived at Malaysia's sorting centre
</div></div></div></div><div class="row m-l-0 m-r-0 m-b-15 relative order-history"><div class="absolute bullet-connector"></div> <div class="col"><div class="row align-items-center justify-content-center"><div class="col-auto p-r-10"><div class="bg-master-light btn-rounded" style="width: 8px; height: 8px;"></div></div> <div class="col-auto hint-text p-l-0">
05-03-2019 17:05
</div> <div class="col p-l-0 semi-bold">
Your Order has been shipped successfully
</div></div></div></div><div class="row m-l-0 m-r-0 m-b-15 relative order-history"><div class="absolute bullet-connector"></div> <div class="col"><div class="row align-items-center justify-content-center"><div class="col-auto p-r-10"><div class="bg-master-light btn-rounded" style="width: 8px; height: 8px;"></div></div> <div class="col-auto hint-text p-l-0">
05-03-2019 17:05
</div> <div class="col p-l-0 semi-bold">
Your Order is packed and is ready to ship
</div></div></div></div><div class="row m-l-0 m-r-0 m-b-15 relative order-history"><div class="absolute bullet-connector"></div> <div class="col"><div class="row align-items-center justify-content-center"><div class="col-auto p-r-10"><div class="bg-master-light btn-rounded" style="width: 8px; height: 8px;"></div></div> <div class="col-auto hint-text p-l-0">
05-03-2019 17:05
</div> <div class="col p-l-0 semi-bold">
Your Order has arrived at China's sorting centre
</div></div></div></div><div class="row m-l-0 m-r-0 m-b-15 relative order-history"><div class="absolute bullet-connector"></div> <div class="col"><div class="row align-items-center justify-content-center"><div class="col-auto p-r-10"><div class="bg-master-light btn-rounded" style="width: 8px; height: 8px;"></div></div> <div class="col-auto hint-text p-l-0">
05-03-2019 17:04
</div> <div class="col p-l-0 semi-bold">
Order has been confirmed
</div></div></div></div><div class="row m-l-0 m-r-0 m-b-15 relative order-history"><div class="absolute bullet-connector"></div> <div class="col"><div class="row align-items-center justify-content-center"><div class="col-auto p-r-10"><div class="bg-master-light btn-rounded" style="width: 8px; height: 8px;"></div></div> <div class="col-auto hint-text p-l-0">
05-03-2019 17:02
</div> <div class="col p-l-0 semi-bold">
Order created
</div></div></div></div></div></div></div></div>
</div>
</div>
</div>
<div class="col-4"></div>
</div>
</div>
</div>
<order-profile-component data="{{$orderId}}"></order-profile-component>
@endsection
@@ -0,0 +1,27 @@
@extends('layouts.base_portal')
@section('inner_content')
<div class="row m-t-30">
<div class="col-4">
<div class="row">
<div class="col">
<addon-order-form-component data="{{$warehouseId}}"></addon-order-form-component>
</div>
</div>
<div class="row" >
<div class="col">
<orders-select-list-component id="{{$warehouseId}}" type="warehouse" category="receiving" class="m-b-10"></orders-select-list-component>
</div>
</div>
</div>
<div class="col-6">
<div class="card card-default">
<div class="card-block">
<warehouse-receive-note-form-component id="{{$warehouseId}}"></warehouse-receive-note-form-component>
</div>
</div>
</div>
</div>
@endsection
+6 -2
View File
@@ -32,7 +32,7 @@ Route::group(['middleware' => 'api', 'prefix' => 'v1', 'as' => 'api.'], function
Route::group(['prefix' => 'company', 'as' => 'company.', 'namespace' => 'Companies'], function () {
// List companies
Route::get('/list', 'CompanyController@index')->name('list');
Route::get('/list/{pagination?}', 'CompanyController@index')->name('list');
// search companies
Route::get('/search', 'CompanyController@search')->name('search');
@@ -115,13 +115,15 @@ Route::group(['middleware' => 'api', 'prefix' => 'v1', 'as' => 'api.'], function
Route::group(['prefix' => 'order', 'as' => 'order.', 'namespace' => 'Orders'], function () {
Route::get('{id}/profile', 'OrderController@show')->name('profile');
Route::get('/company/{companyId}/list', 'OrderController@listCompanyOrders')->name('company.list');
Route::post('/{companyId}/create', 'CreateOrderController@create')->name('create');
Route::delete('/{orderId}/delete', 'OrderController@delete')->name('delete');
Route::post('/{orderId}/update', 'OrderController@updateStep')->name('step.update');
Route::post('/{orderId}/update', 'updateOrderStepController@update')->name('step.update');
Route::post('/{orderId}/packing-list', 'OrderController@updatePackingList')->name('packages.update');
@@ -132,6 +134,8 @@ Route::group(['middleware' => 'api', 'prefix' => 'v1', 'as' => 'api.'], function
Route::post('/search','SearchOrderController@search')->name('search');
Route::post('/bulk-receive-notes', 'BulkReceiveNotesController@create')->name('bulk.receive.update');
});
// Service Routes
+6 -2
View File
@@ -54,13 +54,17 @@ Route::group(['middleware' => ['secure', 'clearcache']], function (): void {
return view('pages.warehouses.profile', ['warehouseId' => $warehouseId]);
})->name('warehouses.profile');
Route::get('/order/profile', function(){
return view('pages.orders.profile');
Route::get('/order/{orderId}/profile', function($orderId){
return view('pages.orders.profile', ['orderId' => $orderId]);
})->name('order.profile');
Route::get('/order', function(){
return view('pages.orders.index');
})->name('order');
Route::get('/order/{warehouseId}/receive_note', function($warehouseId){
return view('pages.orders.receive_note', ['warehouseId' => $warehouseId]);
})->name('order.bulk.receive_note');
});