Major incomplete Change

This commit is contained in:
Omair Saleh
2019-03-04 03:01:20 +08:00
parent c4c20493cd
commit 829394cc1d
58 changed files with 1836 additions and 698 deletions
@@ -3,7 +3,7 @@
namespace App\Classes\Modules\Accounts\Services;
use App\Classes\Modules\Accounts\DataTransferObjects\UserObject;
use App\Classes\Modules\Accounts\Exceptions\CannotCreateUserException;
use App\Classes\Modules\Accounts\Exceptions\CannotCreateOrderException;
use App\Classes\Modules\ControllerLogic\Exceptions\ResourceConflictException;
use App\Models\User;
use App\Traits\DeterminesIfUserPasswordMatchesRequirements;
@@ -34,7 +34,7 @@ class CreatesUserAccount {
* @param UserObject $object
*
* @return User
* @throws CannotCreateUserException
* @throws CannotCreateOrderException
*/
public function execute(UserObject $object): ?User {
@@ -60,8 +60,7 @@ class CreatesUserAccount {
return $user;
} catch (\Exception $exception) {
dd($exception);
throw new CannotCreateUserException($exception->getMessage());
throw new CannotCreateOrderException($exception->getMessage());
}
}
}
@@ -5,12 +5,10 @@ namespace App\Classes\Modules\ControllersLogic\Accounts;
use App\Classes\Modules\Accounts\DataTransferObjects\UserInvitationObject;
use App\Classes\Modules\Accounts\DataTransferObjects\UserObject;
use App\Classes\Modules\Accounts\Exceptions\CannotCreateUserException;
use App\Classes\Modules\Accounts\Exceptions\CannotCreateOrderException;
use App\Classes\Modules\Accounts\Services\CreatesUserAccount;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
use App\Classes\Modules\ControllerLogic\Exceptions\MalformedRequestException;
use App\Classes\ValueObjects\Constants\HttpStatus;
use App\Events\Accounts\UserHasRegistered;
use App\Models\UserInvitation;
use App\Traits\DeterminesIfUserPasswordMatchesRequirements;
use Illuminate\Http\JsonResponse;
@@ -74,7 +72,7 @@ class RegisterAccountLogic
return redirect()->route('dashboard');
} catch (CannotCreateUserException $exception) {
} catch (CannotCreateOrderException $exception) {
throw new InternalServerErrorException("Failed to create user because {$exception->getMessage()}");
}
}
@@ -0,0 +1,73 @@
<?php
namespace App\Classes\Modules\ControllersLogic\Orders;
use App\Classes\Modules\Accounts\Exceptions\CannotConfirmOrderException;
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\Services\SetsOrderWarehouse;
use App\Classes\Modules\Orders\Services\UpdatesOrderSteps;
use App\Classes\ValueObjects\Constants\HttpStatus;
use App\Models\Order;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class ConfirmOrderLogic
{
/** @var Order */
private $repository;
/** @var ConfirmsOrder */
private $confirmOrder;
/** @var UpdatesOrderSteps */
private $updatesOrderSteps;
/**
* ConfirmOrderLogic constructor.
* @param Order $repository
* @param SetsOrderWarehouse $setOrderWarehouse
* @param ConfirmsOrder $confirmOrder
* @param UpdatesOrderSteps $updatesOrderSteps
*/
public function __construct(Order $repository, SetsOrderWarehouse $setOrderWarehouse, ConfirmsOrder $confirmOrder, UpdatesOrderSteps $updatesOrderSteps)
{
$this->repository = $repository;
$this->setOrderWarehouse = $setOrderWarehouse;
$this->confirmOrder = $confirmOrder;
$this->updatesOrderSteps = $updatesOrderSteps;
}
/**
* @param int $orderId
* @param Request $request
* @return JsonResponse
* @throws InternalServerErrorException
* @throws \App\Classes\Modules\Accounts\Exceptions\CannotUpdateOrderWarehouseException
*/
public function execute(int $orderId, Request $request) {
try {
$order = $this->repository->findOrFail($orderId);
$orderObject = new OrderObject($orderId, null, $request->input('warehouse_id'));
if($orderObject->getWarehouseId()){
$this->setOrderWarehouse->execute($orderObject);
}
$this->confirmOrder->execute($orderObject);
return new JsonResponse("Order has been confirmed", HttpStatus::OK);
} catch (CannotConfirmOrderException $exception){
throw new InternalServerErrorException("Failed to confirm order because {$exception->getMessage()}");
}
}
}
@@ -0,0 +1,44 @@
<?php
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\Services\CreatesOrder;
use Illuminate\Http\Request;
class CreateOrderLogic
{
/** @var CreatesOrder */
private $createOrder;
/**
* CreateOrderLogic constructor.
* @param CreatesOrder $createOrder
*/
public function __construct(CreatesOrder $createOrder)
{
$this->createOrder = $createOrder;
}
/**
* @param int $companyId
* @param Request $request
* @return \App\Models\Order|null
* @throws InternalServerErrorException
*/
public function execute(int $companyId, Request $request) {
try {
$order = new OrderObject($request->input('marking'), $companyId);
return $this->createOrder->execute($order);
} catch (CannotCreateOrderException $exception){
throw new InternalServerErrorException("Failed to create order because {$exception->getMessage()}");
}
}
}
@@ -0,0 +1,51 @@
<?php
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\Models\Order;
use Illuminate\Http\Request;
class UpdateOrderStepLogic
{
/** @var Order */
private $repository;
/** @var UpdatesOrderSteps */
private $updateOrderSteps;
/**
* UpdateOrderStepLogic constructor.
* @param Order $repository
* @param UpdatesOrderSteps $updateOrderSteps
*/
public function __construct(Order $repository, UpdatesOrderSteps $updateOrderSteps)
{
$this->repository = $repository;
$this->updateOrderSteps = $updateOrderSteps;
}
/**
* @param int $orderId
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function execute(int $orderId, Request $request) {
$repository = $this->repository->findOrFail($orderId);
$orderObject = new OrderObject($orderId);
$stepObject = new StepObject($repository->current_step);
return $this->updateOrderSteps->execute($orderObject, $stepObject, $request);
}
}
@@ -0,0 +1,66 @@
<?php
namespace App\Classes\Modules\Orders\DataTransferObjects;
class OrderObject
{
/** @var string */
private $orderId;
/** @var int|null */
private $companyId;
/** @var int|null */
private $warehouseId;
/**
* OrderObject constructor.
* @param string $orderId
* @param int|null $companyId
* @param int|null $warehouseId
*/
public function __construct(string $orderId, ?int $companyId = null, ?int $warehouseId = null)
{
$this->orderId = $orderId;
$this->companyId = $companyId;
$this->warehouseId = $warehouseId;
}
/**
* @return string
*/
public function getOrderId(): string
{
return $this->orderId;
}
/**
* @return int|null
*/
public function getCompanyId(): ?int
{
return $this->companyId;
}
/**
* @return int|null
*/
public function getWarehouseId(): ?int
{
return $this->warehouseId;
}
/**
* @param int|null $warehouseId
*/
public function setWarehouseId(?int $warehouseId): void
{
$this->warehouseId = $warehouseId;
}
}
@@ -0,0 +1,38 @@
<?php
/**
* Created by PhpStorm.
* User: Omair Saleh
* Date: 27/2/2019
* Time: 3:28 PM
*/
namespace App\Classes\Modules\Orders\DataTransferObjects;
class OrderStepObject
{
/** @var string */
protected $orderId;
/** @var string */
protected $currentStep;
/** @var null|string */
protected $nextStep;
/**
* OrderStepObject constructor.
* @param string $orderId
* @param string $currentStep
* @param null|string $nextStep
*/
public function __construct(string $orderId, string $currentStep, ?string $nextStep)
{
$this->orderId = $orderId;
$this->currentStep = $this->getCurrentStep();
$this->currentStep = $this->getCurrentStep();
}
}
@@ -0,0 +1,82 @@
<?php
namespace App\Classes\Modules\Orders\DataTransferObjects;
class PackageObject
{
/** @var string */
private $description;
/** @var integer */
private $quantity;
/** @var integer */
private $width;
/** @var integer */
private $height;
/** @var integer */
private $length;
/**
* PackageObject constructor.
* @param string $description
* @param int $quantity
* @param int $width
* @param int $height
* @param int $length
*/
public function __construct(string $description, int $quantity, int $width, int $height, int $length)
{
$this->description = $description;
$this->quantity = $quantity;
$this->width = $width;
$this->height = $height;
$this->length = $length;
}
/**
* @return string
*/
public function getDescription(): string
{
return $this->description;
}
/**
* @return int
*/
public function getQuantity(): int
{
return $this->quantity;
}
/**
* @return int
*/
public function getWidth(): int
{
return $this->width;
}
/**
* @return int
*/
public function getHeight(): int
{
return $this->height;
}
/**
* @return int
*/
public function getLength(): int
{
return $this->length;
}
}
@@ -0,0 +1,60 @@
<?php
namespace App\Classes\Modules\Orders\DataTransferObjects;
class PackingListObject
{
/** @var string */
private $referenceId;
/** @var boolean */
private $confirmed;
/** @var PackageObject[] */
private $packages;
/**
* PackingListObject constructor.
* @param string $referenceId
* @param bool $confirmed
* @param array $packages
*/
public function __construct(string $referenceId, bool $confirmed, array $packages)
{
$this->referenceId = $referenceId;
$this->confirmed = $confirmed;
$this->packages = $packages;
}
/**
* @return string
*/
public function getReferenceId(): string
{
return $this->referenceId;
}
/**
* @return bool
*/
public function isConfirmed(): bool
{
return $this->confirmed;
}
/**
* @return PackageObject[]
*/
public function getPackages()
{
return array_map(function($package){
return new PackageObject($package['description'], $package['quantity'], $package['width'], $package['height'], $package['length']);
}, $this->packages);
}
}
@@ -0,0 +1,47 @@
<?php
namespace App\Classes\Modules\Orders\DataTransferObjects;
use Illuminate\Support\Carbon;
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)
{
$this->trackingNumber = $trackingNumber;
$this->date = $date;
}
/**
* @return string
*/
public function getTrackingNumber(): string
{
return $this->trackingNumber;
}
/**
* @return Carbon
*/
public function getDate(): Carbon
{
return Carbon::parse($this->date);
}
}
@@ -0,0 +1,56 @@
<?php
namespace App\Classes\Modules\Orders\DataTransferObjects;
class StepObject
{
/** @var string */
protected $referenceId;
/** @var bool */
protected $isPrimary;
/** @var float */
protected $sequence;
/**
* StepObject constructor.
* @param string $referenceId
* @param bool $isPrimary
* @param float $sequence
*/
public function __construct(string $referenceId, bool $isPrimary = false, float $sequence = 0)
{
$this->referenceId = $referenceId;
$this->isPrimary = $isPrimary;
$this->sequence = $sequence;
}
/**
* @return string
*/
public function getReferenceId(): string
{
return $this->referenceId;
}
/**
* @return bool
*/
public function isPrimary(): bool
{
return $this->isPrimary;
}
/**
* @return float
*/
public function getSequence(): float
{
return $this->sequence;
}
}
@@ -0,0 +1,15 @@
<?php
namespace App\Classes\Modules\Accounts\Exceptions;
use App\Classes\Exceptions\Common\ErrorException;
use App\Classes\ValueObjects\Constants\HttpStatus;
final class CannotConfirmOrderException extends ErrorException {
/**
* @param string $message
*/
public function __construct(string $message) {
parent::__construct($message, HttpStatus::BAD_REQUEST);
}
}
@@ -0,0 +1,15 @@
<?php
namespace App\Classes\Modules\Accounts\Exceptions;
use App\Classes\Exceptions\Common\ErrorException;
use App\Classes\ValueObjects\Constants\HttpStatus;
final class CannotCreateOrderException extends ErrorException {
/**
* @param string $message
*/
public function __construct(string $message) {
parent::__construct($message, HttpStatus::BAD_REQUEST);
}
}
@@ -0,0 +1,15 @@
<?php
namespace App\Classes\Modules\Accounts\Exceptions;
use App\Classes\Exceptions\Common\ErrorException;
use App\Classes\ValueObjects\Constants\HttpStatus;
final class CannotCreateOrderStepsException extends ErrorException {
/**
* @param string $message
*/
public function __construct(string $message) {
parent::__construct($message, HttpStatus::BAD_REQUEST);
}
}
@@ -0,0 +1,15 @@
<?php
namespace App\Classes\Modules\Accounts\Exceptions;
use App\Classes\Exceptions\Common\ErrorException;
use App\Classes\ValueObjects\Constants\HttpStatus;
final class CannotUpdateOrderWarehouseException extends ErrorException {
/**
* @param string $message
*/
public function __construct(string $message) {
parent::__construct($message, HttpStatus::BAD_REQUEST);
}
}
@@ -1,11 +0,0 @@
<?php
namespace App\Classes\Modules\Orders;
use App\Classes\Interfaces\OrderPrimaryStep;
class InsertPrimaryStepsList implements OrderPrimaryStep
{
}
@@ -1,26 +0,0 @@
<?php
namespace App\Classes\Modules\Orders\ReceiveNotes;
use App\Classes\Objects\Orders\ReceiveNotes\ReceiveNoteObject;
use App\Models\ReceiveNote as ReceiveNoteModel;
class CreateReceiveNote
{
public function execute(ReceiveNoteObject $receiveNote){
$receiveNotes = new ReceiveNoteModel;
$receiveNotes->order_id = $receiveNote->getOrderId();
$receiveNotes->tracking_no = $receiveNote->getTrackingNo();
$receiveNotes->receive_date = $receiveNote->getReceiveDate();
if($receiveNotes->save()){
return true;
}
return false;
}
}
@@ -1,57 +0,0 @@
<?php
namespace App\Classes\Modules\Orders\ReceiveNotes;
use App\Http\Requests\ReceiveNoteValidator;
use Carbon\Carbon;
use Illuminate\Http\Request;
class ReceiveNote
{
/** @var int */
protected $orderId;
/** @var string */
protected $trackingNo;
/** @var Carbon */
protected $receiveDate;
/**
* AbstractReceiveNote constructor.
* @param int $orderId
* @param Request $request
*/
public function __construct(int $orderId, Request $request)
{
$this->orderId = $orderId;
$this->trackingNo = $request->input('tracking_no');
$this->receiveDate = Carbon::parse($request->input('receive_date'));
}
/**
* @return int
*/
public function getOrderId(): int
{
return $this->orderId;
}
/**
* @return string
*/
public function getTrackingNo(): string
{
return $this->trackingNo;
}
/**
* @return Carbon
*/
public function getReceiveDate(): Carbon
{
return $this->receiveDate;
}
}
@@ -0,0 +1,44 @@
<?php
namespace App\Classes\Modules\Orders\Services;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\DataTransferObjects\StepObject;
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
*/
public function execute(OrderObject $order, StepObject $step){
/** @var Order $repository */
$repository = $this->repository->findOrFail($order->getOrderId());
$orderStep = $repository->orderSteps()->where('reference_id', $step->getReferenceId())->firstOrFail();
$orderStep->complete = 1;
$orderStep->save();
}
}
@@ -0,0 +1,49 @@
<?php
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\Order;
class CreatesOrder
{
/** @var Order */
private $repository;
/**
* CreatesOrder constructor.
* @param Order $repository
*/
public function __construct(Order $repository)
{
$this->repository = $repository;
}
/**
* @param OrderObject $order
* @return Order
* @throws CannotCreateOrderException
*/
public function execute(OrderObject $order): ?Order {
try {
$this->repository->company_id = $order->getCompanyId();
$this->repository->marking = $order->getOrderId();
$this->repository->current_step = Constants::ORDER_PROCESSING_STEP;
$this->repository->save();
return $this->repository;
} catch (\Exception $exception){
throw new CannotCreateOrderException($exception->getMessage());
}
}
}
@@ -0,0 +1,49 @@
<?php
namespace App\Classes\Modules\Orders\Services;
use App\Classes\Modules\Accounts\Exceptions\CannotCreateOrderStepsException;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Models\Order;
class CreatesOrderSteps
{
/** @var Order */
private $repository;
/**
* CompletesOrderStep constructor.
* @param Order $repository
*/
public function __construct(Order $repository)
{
$this->repository = $repository;
}
/**
* @param OrderObject $order
* @param array $orderSteps
* @throws CannotCreateOrderStepsException
*/
public function execute(OrderObject $order, array $orderSteps){
try {
/** @var Order $repository */
$repository = $this->repository->findOrFail($order->getOrderId());
$repository->orderSteps()->delete();
$repository->orderSteps()->createMany($orderSteps);
} catch (\Exception $exception){
throw new CannotCreateOrderStepsException($exception->getMessage());
}
}
}
@@ -0,0 +1,15 @@
<?php
namespace App\Classes\Modules\Orders\Services;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
class CreatesPackingList
{
public function execute(OrderObject $order, $packingList){
}
}
@@ -0,0 +1,35 @@
<?php
namespace App\Classes\Modules\Orders\Services;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\DataTransferObjects\ReceiveNoteObject;
use App\Models\ReceiveNote;
class CreatesReceiveNote
{
/** @var ReceiveNote */
private $repository;
/**
* CreatesReceiveNote constructor.
* @param ReceiveNote $repository
*/
public function __construct(ReceiveNote $repository)
{
$this->repository = $repository;
}
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();
}
}
@@ -0,0 +1,62 @@
<?php
namespace App\Classes\Modules\Orders\Services;
use App\Classes\Constants;
use App\Models\Order;
use Illuminate\Support\Carbon;
use Illuminate\Support\Collection;
class ListsOrderHistory
{
public function execute(string $orderId, Carbon $createdAt, bool $complete, Carbon $lastUpdate){
/** @var Order $order */
$order = Order::findOrFail($orderId);
$orderSteps = $order->orderSteps()->where('complete', true)->orderBy('sequence')->get();
$history = new Collection();
$history->push(['date' => $createdAt->format('d-m-Y H:i'), 'description' => 'Order created']);
foreach ($orderSteps as $step){
switch ($step->reference_id){
case Constants::ORDER_PROCESSING_STEP:
$history->push(['date' => $step->updated_at->format('d-m-Y H:i'), 'description' => 'Order has been confirmed']);
break;
case Constants::ORDER_NO_WAREHOUSE_PENDING_SUPPLIER:
$history->push(['date' => $step->updated_at->format('d-m-Y H:i'), 'description' => 'Your Order is packed and is ready to ship']);
break;
case Constants::ORDER_WAREHOUSE_RECEIVING_STEP:
$history->push(['date' => $step->updated_at->format('d-m-Y H:i'), 'description' => 'Your Order has arrived at China\'s sorting centre']);
break;
case Constants::ORDER_WAREHOUSE_PACKING_STEP:
$history->push(['date' => $step->updated_at->format('d-m-Y H:i'), 'description' => 'Your Order is packed and is ready to ship']);
break;
case Constants::ORDER_SHIPPING_STEP:
$history->push(['date' => $step->updated_at->format('d-m-Y H:i'), 'description' => 'Your Order has been shipped successfully']);
break;
case Constants::ORDER_WAREHOUSE_ARRIVAL_STEP:
$history->push(['date' => $step->updated_at->format('d-m-Y H:i'), 'description' => 'Your Order has arrived at Malaysia\'s sorting centre']);
break;
case Constants::ORDER_WAREHOUSE_UNPACKING_STEP:
$history->push(['date' => $step->updated_at->format('d-m-Y H:i'), 'description' => 'Your Order has been unpacked and being prepared for delivery']);
break;
case Constants::ORDER_DELIVERY_STEP:
$history->push(['date' => $step->updated_at->format('d-m-Y H:i'), 'description' => 'Your Order is out for delivery']);
break;
}
}
if($complete){
$history->push(['date' => $lastUpdate->format('d-m-Y H:i'), 'description' => 'Your Order has successfully been delivered']);
}
return $history->reverse()->toArray();
}
}
@@ -0,0 +1,63 @@
<?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;
}
}
}
@@ -0,0 +1,79 @@
<?php
namespace App\Classes\Modules\Orders\Services\Processors;
use App\Classes\Constants;
use App\Classes\Modules\Accounts\Exceptions\CannotConfirmOrderException;
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;
}
}
}
@@ -0,0 +1,33 @@
<?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;
}
}
@@ -0,0 +1,33 @@
<?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;
}
}
@@ -0,0 +1,44 @@
<?php
namespace App\Classes\Modules\Orders\Services;
use App\Classes\Modules\Accounts\Exceptions\CannotUpdateOrderWarehouseException;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Models\Order;
class SetsOrderWarehouse
{
/** @var Order */
private $repository;
/**
* SetsOrderWarehouse constructor.
* @param Order $repository
*/
public function __construct(Order $repository)
{
$this->repository = $repository;
}
/**
* @param OrderObject $order
* @throws CannotUpdateOrderWarehouseException
*/
public function execute(OrderObject $order){
try {
/** @var Order $repository */
$repository = $this->repository->findOrFail($order->getOrderId());
$repository->warehouse_id = $order->getWarehouseId();
$repository->save();
} catch (\Exception $exception){
throw new CannotUpdateOrderWarehouseException($exception->getMessage());
}
}
}
@@ -0,0 +1,49 @@
<?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\Models\Order;
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())
->where('complete', 0)->orderBy('sequence')->first();
$nextStep = $orderStep ? $orderStep->reference_id : null;
$repository = $this->order->findOrFail($order->getOrderId());
$repository->current_step = $nextStep;
if($nextStep === null && $step !== Constants::ORDER_PROCESSING_STEP){
$repository->complete = true;
}
$repository->save();
}
}
@@ -0,0 +1,56 @@
<?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);
}
}
@@ -14,42 +14,29 @@ class GenerateOrderSteps
/** @var Collection */
protected $steps;
/** @var array */
protected $modules;
/**
* GenerateOrderSteps constructor.
* @param Collection $steps
*/
public function __construct(Collection $steps)
{
$this->steps = $steps;
}
/**
* @param array $modules
*/
public function __construct(array $modules)
{
$this->steps = collect([]);
$this->modules = $modules;
$this->primarySteps();
$this->modularSteps();
}
/**
* @return array
*/
public function getModules(): array
{
return $this->modules;
}
/**
* @return Collection
*/
public function getSteps(): Collection
public function getSteps(array $modules): Collection
{
$this->primarySteps();
$this->modularSteps($modules);
return $this->steps->sortBy('sequence');
}
public function modularSteps(){
$modularSteps = ModularStep::with('moduleGroups.steps')->whereIn('reference_id', $this->getModules())->get();
public function modularSteps(array $modules){
$modularSteps = ModularStep::with('moduleGroups.steps')->whereIn('reference_id', $modules)->get();
foreach ($modularSteps as $module){
foreach($module->moduleGroups as $group){
$i = 0;
@@ -13,11 +13,12 @@ class RegisterAccountController extends Controller
/**
* @param Request $request
* @param RegisterAccountLogic $logic
* @return RedirectResponse
* @return JsonResponse
* @throws \App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException
* @throws \App\Classes\Modules\ControllerLogic\Exceptions\MalformedRequestException
*/
public function register(Request $request, RegisterAccountLogic $logic): RedirectResponse {
public function register(Request $request, RegisterAccountLogic $logic): JsonResponse
{
return $logic->execute($request);
}
}
@@ -0,0 +1,22 @@
<?php
namespace App\Http\Controllers\Orders;
use App\Classes\Modules\ControllersLogic\Orders\ConfirmOrderLogic;
use Illuminate\Http\Request;
class ConfirmOrderController
{
/**
* @param int $orderId
* @param Request $request
* @param ConfirmOrderLogic $logic
* @return \Illuminate\Http\JsonResponse
* @throws \App\Classes\Modules\Accounts\Exceptions\CannotUpdateOrderWarehouseException
* @throws \App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException
*/
public function confirm(int $orderId, Request $request, ConfirmOrderLogic $logic){
return $logic->execute($orderId, $request);
}
}
@@ -0,0 +1,21 @@
<?php
namespace App\Http\Controllers\Orders;
use App\Classes\Modules\ControllersLogic\Orders\CreateOrderLogic;
use Illuminate\Http\Request;
class CreateOrderController
{
/**
* @param int $companyId
* @param Request $request
* @param CreateOrderLogic $logic
* @return \App\Models\Order|null
* @throws \App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException
*/
public function create(int $companyId, Request $request, CreateOrderLogic $logic){
return $logic->execute($companyId, $request);
}
}
@@ -3,9 +3,12 @@
namespace App\Http\Controllers\Orders;
use App\Classes\ControllersLogic\Orders\CreateOrder;
use App\Classes\ControllersLogic\Orders\UpdateOrderStep;
use App\Classes\Modules\ControllersLogic\Orders\UpdateOrderStepLogic;
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;
@@ -22,12 +25,9 @@ class OrderController extends Controller
return OrderResource::collection($orders);
}
public function insert(String $companyId, Request $request){
return (new CreateOrder())->execute($companyId, $request) ? 200 : 408;
}
public function updateStep(String $orderId, Request $request){
return (new UpdateOrderStep())->execute($orderId, $request) ? 200 : 408;
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){
@@ -74,5 +74,12 @@ class OrderController extends Controller
return 200;
}
public function delete(String $orderId){
/** @var Order $order */
$order = Order::findOrFail($orderId);
$order->delete();
}
}
@@ -0,0 +1,21 @@
<?php
namespace App\Http\Controllers\Orders;
use App\Classes\Modules\ControllersLogic\Orders\UpdateOrderStepLogic;
use Illuminate\Http\Request;
class UpdateOrderStepController
{
/**
* @param int $companyId
* @param Request $request
* @param UpdateOrderStepLogic $logic
* @return \App\Models\Order|null
* @throws \App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException
*/
public function create(int $companyId, Request $request, UpdateOrderStepLogic $logic){
return $logic->execute($companyId, $request);
}
}
+4 -2
View File
@@ -2,6 +2,7 @@
namespace App\Http\Resources;
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;
@@ -24,12 +25,13 @@ class Order extends JsonResource
'supplier_id' => $this->supplier_id,
'warehouse_id' => $this->warehouse_id,
'current_step' => $this->current_step,
'complete' => $this->complete,
'complete' => (float)$this->complete,
'date' => $this->created_at->format('d/m/Y'),
'steps' => [
'details' => (new GetStep())->execute($this->current_step),
'attachments' => (new StepAttachments())->execute($this->id, $this->current_step)
]
],
'details' => (new ListsOrderHistory())->execute($this->id, $this->created_at, $this->complete, $this->updated_at)
];
}
+5
View File
@@ -2,8 +2,13 @@
namespace App\Models;
use Illuminate\Database\Eloquent\SoftDeletes;
class Order extends AbstractModel
{
use SoftDeletes;
protected $table = 'orders';
protected $fillable = [
@@ -22,6 +22,7 @@ class CreateOrdersTable extends Migration
$table->string('warehouse_id')->nullable();
$table->string('current_step')->nullable();
$table->integer('complete')->default(0);
$table->softDeletes();
$table->timestamps();
$table->foreign('company_id')->references('id')->on('companies');
+22
View File
@@ -2043,6 +2043,28 @@ padding-right: 30px;
}
}
.order-history-border {
height: .1875rem;
width: 100%;
background-position-x: -1.875rem;
background-size: 7.25rem .1875rem;
background-image: repeating-linear-gradient(45deg,$color-complete,$color-complete 33px,transparent 0,transparent 41px,$color-primary 0,$color-primary 74px,transparent 0,transparent 82px);
}
.order-history {
.bullet-connector {
width: 2px;
height: 30px;
background: $color-master-light;
top: 10px;
left: 18px;
}
&:last-child {
.bullet-connector {
display: none !important;
}
}
}
@keyframes slideDown {
0% {
+2
View File
@@ -51,6 +51,7 @@ Vue.component('orders-list-component', require('./components/order/lists/OrdersL
//elements
Vue.component('account-component', require('./components/account/elements/AccountComponenet.vue'));
Vue.component('company-profile-component', require('./components/company/elements/CompanyProfileComponenet.vue'));
Vue.component('company-summary-component', require('./components/company/elements/CompanySummaryComponenet.vue'));
Vue.component('company-component', require('./components/company/elements/CompanyComponenet.vue'));
Vue.component('address-book-component', require('./components/company/elements/AddressBookComponenet.vue'));
@@ -61,6 +62,7 @@ Vue.component('warehouse-component', require('./components/warehouse/elements/Wa
Vue.component('warehouse-summary-component', require('./components/warehouse/elements/WarehouseSummaryComponenet.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'));
@@ -1,166 +0,0 @@
<template>
<div class="relative" style="min-height: 100%;">
<loading-component v-show="isLoading"></loading-component>
<div class="row">
<div class="col">
<div class="row">
<div class="col">
<div class="row bg-master-lightest hint-text no-margin p-t-10 p-b-10">
<div class="col-2">
<span class="muted hint-text">Reference</span>
</div>
<div class="col-5">
<span class="muted hint-text">Address</span>
</div>
<div class="col-2">
<span class="muted hint-text">Phone Number</span>
</div>
<div class="col-3">
</div>
</div>
</div>
</div>
<div class="row">
<div class="col">
<div class="row align-items-center justify-content-center no-margin p-t-10 p-b-10 b-grey" v-for="(address, index) in addresses" v-bind:key="address.id" :class="{'b-b': index != addresses.length - 1}">
<div class="col-2 ">
<span class="fs-12">{{address.reference}}</span>
</div>
<div class="col-5">
<span class="fs-12">{{address.street_one}} {{address.street_two}} {{address.city}} {{address.state}} {{address.post_code}} {{address.country}}</span>
</div>
<div class="col-2">
<span class="fs-12 text-complete">{{address.contact}}</span>
</div>
<div class="col-3 text-right">
<div class="row h-100">
<div class="col-auto text-right p-t-10 p-b-10 bg-master-lightest m-r-5 ml-auto">
<a href="#" class="requestDelete">
<div data-toggle="tooltip" title="" data-placement="bottom" class="row link align-items-center justify-content-center" data-original-title="Delete">
<div class="col">
<i class="fa fa-times text-danger"></i>
</div>
</div>
</a>
</div>
<div class="col-auto text-right p-t-10 p-b-10 m-r-5 bg-master-lightest">
<a href="#" class="requestDelete">
<div data-toggle="tooltip" class="row link align-items-center justify-content-center" >
<div class="col">
<i class="fa fa-star text-master-light"></i>
</div>
</div>
</a>
</div>
<div class="col-auto text-right p-t-10 p-b-10 bg-master-lightest">
<a href="#" class="requestDelete">
<div data-toggle="tooltip" title="" data-placement="bottom" class="row link align-items-center justify-content-center" data-original-title="Delete">
<div class="col">
<i class="fa fa-pencil text-info"></i>
</div>
</div>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row m-t-20">
<div class="col">
<div class="row">
<div class="col"></div>
<div class="col"></div>
</div>
<div class="row">
<div class="col">
<button class="btn btn-sm btn-success b-rad-none all-caps"><i class="fa fa-plus m-r-5"></i> Add New Address</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
props: ['companyId'],
data() {
return {
addresses: [],
address: {
id: '',
company_id: '',
reference: '',
contact: '',
street_one: '',
street_two: '',
city: '',
state: '',
post_code: '',
country: ''
},
current_page: '',
pagination: {},
isLoading: true
}
},
created() {
this.fetchAdresses();
},
mounted() {
Event.$on('updateAddressBookList', () => {
this.fetchAdresses();
});
},
methods: {
fetchAdresses(page = 1){
let vm = this;
//turn on loading animation
this.isLoading = true;
//set page to last if page requested is larger than last page
if(page > this.pagination.last_page){ page = this.pagination.last_page }
//update current page to requested page
this.current_page = page;
fetch(route('api.company.addressbook.list', {companyId: this.companyId}) + '?page='+ page).then(response => response.json())
.then(response => {
this.addresses = response.data;
vm.makePagination(response.meta, response.links);
//turn off loading animation
this.isLoading = false;
})
.catch(error => console.log(error))
},
makePagination(meta, links){
this.pagination = {
current_page: meta.current_page,
last_page: meta.last_page,
next_page_url: links.next,
previous_page_url: links.prev
};
},
deleteAddress(id){
fetch(route('api.company.delete', {'id': id}), {
method: 'delete'
}).then(response => response.json())
.then(data => {
this.fetchAdresses(this.current_page);
})
.catch(error => console.log(error))
}
}
}
</script>
@@ -1,128 +0,0 @@
<template>
<div class="row m-b-10 parentContainer">
<div class="col m-b-5">
<div class="row bg-white no-margin">
<div class="col p-t-5 p-b-5 b-b b-grey">
<div class="row">
<div class="col">
<div class="row">
<div class="col">
<p class="fs-12 semi-bold no-margin">{{this.company.name}}</p>
</div>
</div>
<div class="row">
<div class="col">
<small class="muted fs-9">{{this.company.street_one}} {{this.company.street_two}}, {{this.company.city}}, {{this.company.state}}, {{this.company.post_code}}, {{this.company.country}}</small>
</div>
</div>
</div>
</div>
</div>
<div class="col-auto">
<div class="row h-100">
<div class="col-auto text-right bg-danger">
<a href="#" class="requestDelete">
<div class="row link align-items-center justify-content-center h-100" data-toggle="tooltip" title="Delete" data-placement="bottom">
<div class="col">
<i class="fa fa-trash text-white"></i>
</div>
</div>
</a>
</div>
<div class="col-auto text-right bg-info">
<a class="pointer" @click='toggleEdit()' v-show="!isEditing">
<div class="row link align-items-center justify-content-center h-100" data-toggle="tooltip" title="Edit" data-placement="bottom">
<div class="col">
<i class="fa fa-pencil text-white"></i>
</div>
</div>
</a>
<a class="pointer" @click='closeEdit()' v-show="isEditing">
<div class="row link align-items-center justify-content-center h-100" data-toggle="tooltip" title="Edit" data-placement="bottom">
<div class="col">
<i class="fa fa-times text-white"></i>
</div>
</div>
</a>
</div>
<div class="col-auto text-right bg-master">
<a :href="route('companies.profile', {companyId: this.company.id})">
<div class="row link align-items-center justify-content-center h-100" data-toggle="tooltip" title="Manage" data-placement="bottom">
<div class="col">
<i class="fa fa-chevron-right text-white"></i>
</div>
</div>
</a>
</div>
</div>
</div>
</div>
<div class="row bg-white no-margin">
<div class="col no-padding">
<slide-up-down :active="isEditing" :duration="700">
<company-form-component v-on:collapseEdit="closeEdit()" :data="this.company"></company-form-component>
</slide-up-down>
</div>
</div>
<div class="modal fade stick-up deleteModal">
<div class="modal-dialog modal-sm">
<div class="modal-content-wrapper">
<div class="modal-content">
<div class="modal-header clearfix text-left">
<button type="button" class="close" data-dismiss="modal">
<i class="fa fa-times fs-14"></i>
</button>
<h6>Remove Company</h6>
</div>
<div class="modal-body">
<p class="no-margin">Are you sure you want to remove <strong>{{this.company.name}}</strong>?</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-sm btn-default" data-dismiss="modal">
Cancel
</button>
<button type="button" class="btn btn-sm btn-danger" data-dismiss="modal" @click="deleteCompany()">Delete Company</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
props: ['data'],
data() {
return {
company: this.data,
isEditing: false
}
},
mounted() {
Event.$on('collapseEdit', () => {
this.closeEdit();
});
},
methods: {
route: route,
deleteCompany(){
fetch(route('api.company.delete', {'id': this.company.id}), {
method: 'delete'
}).then(response => response.json())
.then(data => {
Event.$emit('updateCompanyList');
})
.catch(error => console.log(error))
},
closeEdit(){
this.isEditing = false;
},
toggleEdit(){
Event.$emit('collapseEdit');
this.isEditing = !this.isEditing;
}
}
}
</script>
@@ -0,0 +1,210 @@
<template>
<div class="panel">
<div class="row m-t-30">
<div class="col-3">
<div class="row">
<div class="col">
<company-summary-component :data="companyId"></company-summary-component>
</div>
</div>
<div class="row no-margin">
<div class="col">
<ul class="nav" role="tablist">
<li class="full-width side-tab">
<a href="#orders" class="active" data-toggle="tab" role="tab">
<div class="row m-b-10">
<div class="col">
<div class="row p-b-5 p-t-5 bg-white tab-container">
<div class="col text-master">
<div class="row align-items-center justify-content-center">
<div class="col-auto p-r-0">
<div class="btn-rounded bg-primary text-center text-white" style="width: 30px; height: 30px;">
<i class="fa fa-cube fs-12 lh-30"></i>
</div>
</div>
<div class="col all-caps fs-12">
My Orders
</div>
<div class="col-auto">
<i class="fa fa-angle-right fs-14 lh-25"></i>
</div>
</div>
</div>
</div>
</div>
</div>
</a>
</li>
<li class="full-width side-tab">
<a href="#profile" data-toggle="tab" role="tab">
<div class="row m-b-10">
<div class="col">
<div class="row p-b-5 p-t-5 bg-white tab-container">
<div class="col text-master">
<div class="row align-items-center justify-content-center">
<div class="col-auto p-r-0">
<div class="btn-rounded bg-complete text-center text-white" style="width: 30px; height: 30px;">
<i class="fa fa-book fs-12 lh-30"></i>
</div>
</div>
<div class="col all-caps fs-12">
Delivery Addresses
</div>
<div class="col-auto">
<i class="fa fa-angle-right fs-12 lh-25"></i>
</div>
</div>
</div>
</div>
</div>
</div>
</a>
</li>
<li class="full-width side-tab">
<a href="#profile" data-toggle="tab" role="tab">
<div class="row m-b-10">
<div class="col">
<div class="row p-b-5 p-t-5 bg-white tab-container">
<div class="col text-master">
<div class="row align-items-center justify-content-center">
<div class="col-auto p-r-0">
<div class="btn-rounded bg-warning text-center text-white" style="width: 30px; height: 30px;">
<i class="fa fa-cubes fs-12 lh-30"></i>
</div>
</div>
<div class="col all-caps fs-12">
Manage Company
</div>
<div class="col-auto">
<i class="fa fa-angle-right fs-12 lh-25"></i>
</div>
</div>
</div>
</div>
</div>
</div>
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="col-7">
<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">
<ul class="nav nav-tabs nav-tabs-simple" role="tablist" data-init-reponsive-tabs="dropdownfx">
<li>
<a class="active" data-toggle="tab" href="#processing">
Processing
</a>
</li>
<li>
<a data-toggle="tab" href="#ship">
To Ship
</a>
</li>
<li>
<a data-toggle="tab" href="#receive">
To Receive
</a>
</li>
<li>
<a data-toggle="tab" href="#complete">
Complete
</a>
</li>
</ul>
<div class="tab-content bg-transparent p-l-0 p-r-0">
<div class="tab-pane active" id="processing">
<orders-list-component :data="companyId"></orders-list-component>
</div>
<div class="tab-pane active" id="ship">
</div>
<div class="tab-pane active" id="receive">
</div>
<div class="tab-pane" id="complete">
</div>
</div>
</div>
<div class="tab-pane" id="profile">
<ul class="nav nav-tabs nav-tabs-simple" role="tablist" data-init-reponsive-tabs="dropdownfx">
<li>
<a class="active" data-toggle="tab" href="#about">
About
</a>
</li>
<li>
<a data-toggle="tab" href="#contacts">
Contacts
</a>
</li>
</ul>
<div class="tab-content bg-transparent p-l-0 p-r-0">
<div class="tab-pane active" id="about">
<company-form-component v-if="company !== null" :data="company"></company-form-component>
</div>
<div class="tab-pane" id="contacts">
<!--<contact-list-component :data="initContacts()"></contact-list-component>-->
</div>
</div>
</div>
</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>
<script>
export default {
props: ['data'],
data() {
return {
companyId: this.data,
company: null
}
},
created(){
this.fetchCompany();
},
methods: {
fetchCompany(){
fetch(route('api.company.profile', {'id': this.companyId})).then(response => response.json())
.then(response => {
this.company = response.data;
})
.catch(error => console.log(error))
},
initContacts(){
return {
'type': 'company',
'reference': this.company_id
}
}
}
}
</script>
@@ -32,17 +32,11 @@
headers: {
'content-type': 'application/json'
}
}).then(response => response.json()).then((response) => {
if(response === 200){
//turn off loading animation
this.isLoading = false;
}).then(() => {
//turn off loading animation
this.isLoading = false;
Event.$emit('updateOrdersList', true);
} else {
//failed to update;
this.isLoading = false;
}
Event.$emit('updateOrdersList', true);
})
@@ -0,0 +1,125 @@
<template>
<div class="inline">
<div class="btn btn-sm btn-success b-rad-none requestModal" data-type="receiveNote">Confirm Order</div>
<modal-component type="receiveNote">
<loading-component style="left: 0;" v-show="isLoading"></loading-component>
<div class="card card-default no-border">
<div class="card-block no-padding">
<div class="row p-t-30">
<div class="col no-padding">
<div class="b-l b-success p-l-15 m-b-15" style="border-left-width: 3px;">
<h6 class="bold all-caps no-margin text-success">Confirm Order</h6>
<div class="muted all-caps fs-12">Setup and confirm order</div>
</div>
</div>
</div>
<form method="post" @submit.prevent="addOrder">
<div class="row">
<div class="col no-padding">
<div class="row" v-show="this.showWarehouse">
<div class="col no-padding">
<div class="form-group form-group-default form-group-default-select2 m-b-0" >
<label class="muted" style="z-index: 10000;">Warehouse</label>
<select-component :options="this.warehouses" v-model="order.warehouse_id"></select-component>
</div>
</div>
<div class="col-auto padding-5 bg-master-lighter pointer" @click="toggleIncludeWarehouse()">
<div class="row align-items-center justify-content-center h-100">
<div class="col">
<i class="fa fa-times text-danger m-l-5 m-r-5"></i>
</div>
</div>
</div>
</div>
<div class="row m-b-20">
<div class="col no-padding">
<div v-show="!this.showWarehouse" @click="toggleIncludeWarehouse()" class="b-a b-grey pull-right bold text-complete all-caps fs-11 p-l-15 p-r-15 p-t-5 p-b-5 pointer"><i class="fa fa-plus m-r-5"></i>Add Warehouse</div>
</div>
</div>
<div class="row">
<div class="col text-right no-padding">
<div class="row">
<div class="col no-padding">
<button class="btn b-rad-none btn-default" data-dismiss="modal">Cancel</button>
<button type="submit" class="btn b-rad-none btn-primary" @click="confirmOrder()" data-dismiss="modal">Confirm Order</button>
</div>
</div>
</div>
</div>
</div>
</div>
</form>
</div>
</div>
</modal-component>
</div>
</template>
<script>
export default {
props: {
'data': {
type: String,
required: true
}
},
data() {
return {
order: {
warehouse_id: null
},
warehouses: [],
showWarehouse: false,
isLoading: false
}
},
created() {
this.fetchWarehouses();
},
methods: {
fetchWarehouses(){
//turn on loading animation
this.isLoading = true;
fetch(route('api.warehouse.list', {'all': true})).then(response => response.json())
.then(response => {
this.warehouses = $.map(response.data, function(value, key){
return {'id': value.id, 'text': value.name};
});
//turn off loading animation
this.isLoading = false;
})
.catch(error => console.log(error))
},
confirmOrder() {
//turn on loading animation
this.isLoading = true;
fetch(route('api.order.step.update', {orderId: this.data}), {
method: 'post',
body: JSON.stringify(this.order),
headers: {
'content-type': 'application/json'
}
}).then(() => {
this.clearForm();
//turn off loading animation
this.isLoading = false;
Event.$emit('updateOrdersList');
})
},
toggleIncludeWarehouse(){
this.order.warehouse_id = null;
this.showWarehouse = !this.showWarehouse;
},
clearForm(){
this.order.warehouse_id = null;
this.showWarehouse = false;
}
}
}
</script>
@@ -32,17 +32,11 @@
headers: {
'content-type': 'application/json'
}
}).then(response => response.json()).then((response) => {
if(response === 200){
//turn off loading animation
this.isLoading = false;
}).then(() => {
//turn off loading animation
this.isLoading = false;
Event.$emit('updateOrdersList', true);
} else {
//failed to update;
this.isLoading = false;
}
Event.$emit('updateOrdersList', true);
})
@@ -40,7 +40,9 @@
<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"></div>
<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>
@@ -48,7 +50,42 @@
</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 m-b-15 relative order-history" v-for="detail in this.order.details">
<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">
{{detail.date}}
</div>
<div class="col p-l-0 semi-bold">
{{detail.description}}
</div>
</div>
</div>
</div>
</div>
</div>
</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>
</template>
@@ -59,6 +96,9 @@
required: true
}
},
created(){
console.log(this.data);
},
data() {
return {
order: this.data,
@@ -74,8 +114,18 @@
}
},
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':
@@ -258,17 +258,11 @@
headers: {
'content-type': 'application/json'
}
}).then(response => response.json()).then((response) => {
if(response === 200){
//turn off loading animation
this.isLoading = false;
}).then(() => {
//turn off loading animation
this.isLoading = false;
Event.$emit('updateOrdersList', true);
} else {
//failed to update;
this.isLoading = false;
}
Event.$emit('updateOrdersList', true);
})
@@ -77,19 +77,13 @@
headers: {
'content-type': 'application/json'
}
}).then(response => response.json()).then((response) => {
if(response === 200){
this.clearForm();
}).then(() => {
this.clearForm();
//turn off loading animation
this.isLoading = false;
//turn off loading animation
this.isLoading = false;
Event.$emit('updateOrdersList', true);
} else {
//failed to update;
this.isLoading = false;
}
Event.$emit('updateOrdersList', true);
})
@@ -195,17 +195,12 @@
'content-type': 'application/json'
}
}).then(response => response.json()).then((response) => {
if(response === 200){
//turn off loading animation
this.isLoading = false;
this.arrangementExist = true;
//turn off loading animation
this.isLoading = false;
Event.$emit('updateOrdersList', true);
} else {
//failed to update;
this.isLoading = false;
}
Event.$emit('updateOrdersList', true);
})
@@ -244,17 +239,11 @@
headers: {
'content-type': 'application/json'
}
}).then(response => response.json()).then((response) => {
if(response === 200){
//turn off loading animation
this.isLoading = false;
}).then(() => {
//turn off loading animation
this.isLoading = false;
Event.$emit('updateOrdersList', true);
} else {
//failed to update;
this.isLoading = false;
}
Event.$emit('updateOrdersList', true);
})
@@ -32,17 +32,11 @@
headers: {
'content-type': 'application/json'
}
}).then(response => response.json()).then((response) => {
if(response === 200){
//turn off loading animation
this.isLoading = false;
}).then(() => {
//turn off loading animation
this.isLoading = false;
Event.$emit('updateOrdersList', true);
} else {
//failed to update;
this.isLoading = false;
}
Event.$emit('updateOrdersList', true);
})
@@ -32,18 +32,11 @@
headers: {
'content-type': 'application/json'
}
}).then(response => response.json()).then((response) => {
if(response === 200){
//turn off loading animation
this.isLoading = false;
Event.$emit('updateOrdersList', true);
} else {
//failed to update;
this.isLoading = false;
}
}).then(() => {
//turn off loading animation
this.isLoading = false;
Event.$emit('updateOrdersList', true);
})
}
@@ -30,26 +30,6 @@
</div>
</div>
</div>
<div class="row" v-show="this.showWarehouse">
<div class="col no-padding">
<div class="form-group form-group-default form-group-default-select2 m-b-0" >
<label class="muted" style="z-index: 10000;">Warehouse</label>
<select-component :options="this.warehouses" v-model="order.warehouse_id"></select-component>
</div>
</div>
<div class="col-auto padding-5 bg-master-lighter pointer" @click="toggleIncludeWarehouse()">
<div class="row align-items-center justify-content-center h-100">
<div class="col">
<i class="fa fa-times text-danger m-l-5 m-r-5"></i>
</div>
</div>
</div>
</div>
<div class="row m-b-20">
<div class="col no-padding">
<div v-show="!this.showWarehouse" @click="toggleIncludeWarehouse()" class="b-a b-grey pull-right bold text-complete all-caps fs-11 p-l-15 p-r-15 p-t-5 p-b-5 pointer"><i class="fa fa-plus m-r-5"></i>Add Warehouse</div>
</div>
</div>
<div class="row">
<div class="col text-right no-padding">
<div class="row">
@@ -77,35 +57,15 @@
data() {
return {
order: {
marking: '',
warehouse_id: null
marking: ''
},
warehouses: [],
showWarehouse: false,
isLoading: false
}
},
created() {
this.fetchWarehouses();
this.generateMarking();
},
methods: {
fetchWarehouses(){
//turn on loading animation
this.isLoading = true;
fetch(route('api.warehouse.list', {'all': true})).then(response => response.json())
.then(response => {
this.warehouses = $.map(response.data, function(value, key){
return {'id': value.id, 'text': value.name};
});
//turn off loading animation
this.isLoading = false;
})
.catch(error => console.log(error))
},
addOrder() {
//turn on loading animation
@@ -116,7 +76,7 @@
headers: {
'content-type': 'application/json'
}
}).then((response) => {
}).then(() => {
this.clearForm();
//turn off loading animation
this.isLoading = false;
@@ -128,14 +88,8 @@
generateMarking(){
this.order.marking = Math.floor(Math.random() * 799999) + 200000;
},
toggleIncludeWarehouse(){
this.order.warehouse_id = null;
this.showWarehouse = !this.showWarehouse;
},
clearForm(){
this.order.marking = '';
this.order.warehouse_id = null;
this.showWarehouse = false;
this.generateMarking();
}
}
}
@@ -1,44 +0,0 @@
<template>
<div class="row m-t-20">
<div class="col-7">
<companies-list-component></companies-list-component>
</div>
<div class="col">
<company-form-component type="create"></company-form-component>
</div>
</div>
</template>
<script>
export default {
provide() {
const countriesList = {};
Object.defineProperty(countriesList, 'countries', {
enumerable: true,
get: () => this.countries
});
return {
countriesList
}
},
data() {
return {
countries: []
}
},
created(){
this.fetchCountries();
},
methods: {
fetchCountries(){
fetch(route('service.list.countries')).then(response => response.json())
.then(response => {
this.countries = $.map(response, function(value, key){
return {'id': value.name, 'text': value.name};
});
})
.catch(error => console.log(error))
}
}
}
</script>
@@ -1,90 +1,91 @@
@extends('layouts.base_portal')
@section('inner_content')
<div class="row m-t-30">
<div class="col-3">
<div class="row">
<div class="col">
<company-summary-component data="{{$companyId}}"></company-summary-component>
</div>
</div>
</div>
<div class="col">
<div class="card no-border bg-transparent">
<ul class="nav nav-tabs nav-tabs-master nav-tabs-fillup b-b b-grey">
<li>
<a data-toggle="tab" class="active" href="#orders">
<span>
<i class="fa fa-truck v-align-middle inline"></i>
<div class="v-align-middle inline">Orders</div>
</span>
</a>
</li>
<li>
<a data-toggle="tab" href="#addressBook">
<span>
<i class="fa fa-location-arrow v-align-middle inline"></i>
<div class="v-align-middle inline">Address Book</div>
</span>
</a>
</li>
<li class="hide">
<a data-toggle="tab" href="#connections">
<span>
<i class="fa fa-vcard v-align-middle inline"></i>
<div class="v-align-middle inline">Connections</div>
</span>
</a>
</li>
<li>
<a data-toggle="tab" href="#contacts">
<span>
<i class="fa fa-address-book v-align-middle inline"></i>
<div class="v-align-middle inline">Contacts</div>
</span>
</a>
</li>
</ul>
<div class="tab-content bg-transparent p-l-0 p-r-0">
<div class="tab-pane active" id="orders">
<orders-list-component data="{{$companyId}}"></orders-list-component>
</div>
<div class="tab-pane" id="addressBook">
<div class="row">
<div class="col">
<address-book-list-component data="{{$companyId}}"></address-book-list-component>
</div>
</div>
</div>
<div class="tab-pane" id="connections">
</div>
<div class="tab-pane" id="contacts">
<contact-list-component :data="{'type': 'company', 'reference': '{{$companyId}}'}"></contact-list-component>
</div>
</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 class="row m-t-30">--}}
{{--<div class="col-3">--}}
{{--<div class="row">--}}
{{--<div class="col">--}}
{{--<company-summary-component data="{{$companyId}}"></company-summary-component>--}}
{{--</div>--}}
{{--</div>--}}
{{--</div>--}}
{{--<div class="col">--}}
{{--<div class="card no-border bg-transparent">--}}
{{--<ul class="nav nav-tabs nav-tabs-master nav-tabs-fillup b-b b-grey">--}}
{{--<li>--}}
{{--<a data-toggle="tab" class="active" href="#orders">--}}
{{--<span>--}}
{{--<i class="fa fa-truck v-align-middle inline"></i>--}}
{{--<div class="v-align-middle inline">Orders</div>--}}
{{--</span>--}}
{{--</a>--}}
{{--</li>--}}
{{--<li>--}}
{{--<a data-toggle="tab" href="#addressBook">--}}
{{--<span>--}}
{{--<i class="fa fa-location-arrow v-align-middle inline"></i>--}}
{{--<div class="v-align-middle inline">Address Book</div>--}}
{{--</span>--}}
{{--</a>--}}
{{--</li>--}}
{{--<li class="hide">--}}
{{--<a data-toggle="tab" href="#connections">--}}
{{--<span>--}}
{{--<i class="fa fa-vcard v-align-middle inline"></i>--}}
{{--<div class="v-align-middle inline">Connections</div>--}}
{{--</span>--}}
{{--</a>--}}
{{--</li>--}}
{{--<li>--}}
{{--<a data-toggle="tab" href="#contacts">--}}
{{--<span>--}}
{{--<i class="fa fa-address-book v-align-middle inline"></i>--}}
{{--<div class="v-align-middle inline">Contacts</div>--}}
{{--</span>--}}
{{--</a>--}}
{{--</li>--}}
{{--</ul>--}}
{{--<div class="tab-content bg-transparent p-l-0 p-r-0">--}}
{{--<div class="tab-pane active" id="orders">--}}
{{--<orders-list-component data="{{$companyId}}"></orders-list-component>--}}
{{--</div>--}}
{{--<div class="tab-pane" id="addressBook">--}}
{{--<div class="row">--}}
{{--<div class="col">--}}
{{--<address-book-list-component data="{{$companyId}}"></address-book-list-component>--}}
{{--</div>--}}
{{--</div>--}}
{{--</div>--}}
{{--<div class="tab-pane" id="connections">--}}
{{----}}
{{--</div>--}}
{{--<div class="tab-pane" id="contacts">--}}
{{--<contact-list-component :data="{'type': 'company', 'reference': '{{$companyId}}'}"></contact-list-component>--}}
{{--</div>--}}
{{--</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>--}}
<company-profile-component data="{{$companyId}}"></company-profile-component>
@endsection
+5 -3
View File
@@ -102,11 +102,13 @@ Route::group(['middleware' => 'api', 'prefix' => 'v1', 'as' => 'api.'], function
Route::group(['prefix' => 'order', 'as' => 'order.', 'namespace' => 'Orders'], function () {
// Create new warehouses
Route::post('/{companyId}/create', 'OrderController@insert')->name('create');
Route::get('/company/{companyId}/list', 'OrderController@listCompanyOrders')->name('company.list');
Route::post('/{orderId}', 'OrderController@updateStep')->name('step.update');
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}/packing-list', 'OrderController@updatePackingList')->name('packages.update');