large commit

This commit is contained in:
Omair Saleh
2019-06-03 10:29:08 +08:00
parent 2546b4a7fa
commit 919e0252f7
113 changed files with 2556 additions and 1815 deletions
+5 -4
View File
@@ -9,7 +9,8 @@ class Constants {
'supplier' => 1, 'supplier' => 1,
'warehouse' => 2, 'warehouse' => 2,
'forwarder' => 3, 'forwarder' => 3,
'order' => 4 'order' => 4,
'driver' => 5,
]; ];
@@ -59,14 +60,14 @@ class Constants {
'sequence' => 0 'sequence' => 0
], ],
Constants::ORDER_SHIPPING_STEP => [ Constants::ORDER_SHIPPING_STEP => [
'initial_name' => 'ready to ship', 'initial_name' => 'shipping',
'final_name' => 'shipped out', 'final_name' => 'shipped out',
'description' => 'Order is Loaded to Container, waiting for Shipment', 'description' => 'Order is Loaded to Container, waiting for Shipment',
'sequence' => 1 'sequence' => 1
], ],
Constants::ORDER_DELIVERY_STEP => [ Constants::ORDER_DELIVERY_STEP => [
'initial_name' => 'ready to deliver', 'initial_name' => 'delivery',
'final_name' => 'to receive', 'final_name' => 'Received',
'description' => 'Order out for delivery soon', 'description' => 'Order out for delivery soon',
'sequence' => 2 'sequence' => 2
], ],
@@ -1,10 +1,4 @@
<?php <?php
/**
* Created by PhpStorm.
* User: user
* Date: 08/03/2019
* Time: 4:35 PM
*/
namespace App\Classes\Modules\Accounts\Services; namespace App\Classes\Modules\Accounts\Services;
@@ -1,10 +1,4 @@
<?php <?php
/**
* Created by PhpStorm.
* User: Omair Saleh
* Date: 6/3/2019
* Time: 3:12 PM
*/
namespace App\Classes\Modules\Accounts\Validation; namespace App\Classes\Modules\Accounts\Validation;
@@ -28,9 +28,9 @@ class ListsCompany
} }
public function execute(){ public function execute(bool $pagination){
$companies = $this->repository->orderBy('created_at')->paginate(10); $companies = $pagination ? $this->repository->orderBy('created_at')->paginate(10) : $this->repository->orderBy('created_at')->get();
return CompanyResource::collection($companies); return CompanyResource::collection($companies);
@@ -14,32 +14,32 @@ class ContactObject
/** @var string */ /** @var string */
private $name; private $name;
/** @var string */ /** @var null|string */
private $designation;
/** @var string */
private $contact; private $contact;
/** @var string */ /** @var null|string */
private $email; private $email;
/** @var null|string */
private $designation;
/** /**
* ContactObject constructor. * ContactObject constructor.
* @param int $type * @param int $type
* @param int $referenceId * @param int $referenceId
* @param string $name * @param string $name
* @param string $designation * @param null|string $contact
* @param string $contact * @param null|string $email
* @param string $email * @param null|string $designation
*/ */
public function __construct(int $type, int $referenceId, string $name, string $designation, string $contact, string $email) public function __construct(int $type, int $referenceId, string $name, ?string $contact = null, ?string $email = null, ?string $designation = null)
{ {
$this->type = $type; $this->type = $type;
$this->referenceId = $referenceId; $this->referenceId = $referenceId;
$this->name = $name; $this->name = $name;
$this->designation = $designation;
$this->contact = $contact; $this->contact = $contact;
$this->email = $email; $this->email = $email;
$this->designation = $designation;
} }
/** /**
@@ -67,32 +67,28 @@ class ContactObject
} }
/** /**
* @return string * @return null|string
*/ */
public function getDesignation(): string public function getContact(): ?string
{
return $this->designation;
}
/**
* @return string
*/
public function getContact(): string
{ {
return $this->contact; return $this->contact;
} }
/** /**
* @return string * @return null|string
*/ */
public function getEmail(): string public function getEmail(): ?string
{ {
return $this->email; return $this->email;
} }
/**
* @return null|string
*/
public function getDesignation(): ?string
{
return $this->designation;
}
} }
@@ -4,12 +4,6 @@ namespace App\Classes\Modules\Contacts\Exceptions;
use App\Classes\Exceptions\Common\ErrorException; use App\Classes\Exceptions\Common\ErrorException;
use App\Classes\ValueObjects\Constants\HttpStatus; use App\Classes\ValueObjects\Constants\HttpStatus;
/**
* Created by PhpStorm.
* User: user
* Date: 07/03/2019
* Time: 3:25 PM
*/
final class CannotCreateContactException extends ErrorException final class CannotCreateContactException extends ErrorException
{ {
/** @param string $message */ /** @param string $message */
@@ -26,6 +26,7 @@ class CreatesContact
* @param int $type * @param int $type
* @param int $referenceId * @param int $referenceId
* @return Contact * @return Contact
* @throws CannotCreateContactException
*/ */
public function execute(ContactObject $contact, int $type, int $referenceId) public function execute(ContactObject $contact, int $type, int $referenceId)
{ {
@@ -1,10 +1,4 @@
<?php <?php
/**
* Created by PhpStorm.
* User: user
* Date: 06/03/2019
* Time: 4:57 PM
*/
namespace App\Classes\Modules\Contacts\Services; namespace App\Classes\Modules\Contacts\Services;
@@ -20,8 +20,8 @@ class ListCompanyLogic
} }
public function execute(){ public function execute(bool $pagination){
return $this->ListCompany->execute(); return $this->ListCompany->execute($pagination);
} }
} }
@@ -27,7 +27,7 @@ class CreateContactLogic
{ {
try{ try{
$object = new ContactObject($type, $referenceId, $request->input('name'), $request->input('designation'), $request->input('contact'), $request->input('email')); $object = new ContactObject($type, $referenceId, $request->input('name'), $request->input('contact'), $request->input('email'), $request->input('designation'));
return $this->createContact->execute($object, $type, $referenceId); return $this->createContact->execute($object, $type, $referenceId);
} }
@@ -1,10 +1,4 @@
<?php <?php
/**
* Created by PhpStorm.
* User: user
* Date: 06/03/2019
* Time: 4:56 PM
*/
namespace App\Modules\ControllerLogic\Contacts; namespace App\Modules\ControllerLogic\Contacts;
@@ -1,10 +1,4 @@
<?php <?php
/**
* Created by PhpStorm.
* User: user
* Date: 05/03/2019
* Time: 2:35 PM
*/
namespace App\Modules\ControllerLogic\Contacts; namespace App\Modules\ControllerLogic\Contacts;
@@ -30,7 +24,7 @@ class UpdateContactLogic
public function execute(int $id, string $referenceId, int $type, Request $request) public function execute(int $id, string $referenceId, int $type, Request $request)
{ {
$object = new ContactObject($type, $referenceId, $request->input('name'), $request->input('designation'), $request->input('contact'), $request->input('email')); $object = new ContactObject($type, $referenceId, $request->input('name'), $request->input('contact'), $request->input('email'), $request->input('designation'));
return $this->updateContact->execute($id, $object); return $this->updateContact->execute($id, $object);
} }
} }
@@ -0,0 +1,93 @@
<?php
namespace App\Classes\Modules\ControllersLogic\Orders\Attachments;
use App\Classes\Constants;
use App\Classes\Modules\Contacts\DataTransferObjects\ContactObject;
use App\Classes\Modules\Contacts\Services\CreatesContact;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
use App\Classes\Modules\Orders\DataTransferObjects\DeliveryArrangementObject;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\DataTransferObjects\ScheduleObject;
use App\Classes\Modules\Orders\DataTransferObjects\TrackingNumberObject;
use App\Classes\Modules\Orders\Services\Attachments\UpdatesDeliveryArrangement;
use App\Classes\Modules\Orders\Services\Attachments\UpdatesSchedule;
use App\Classes\Modules\Orders\Services\Attachments\UpdatesTrackingNumber;
use App\Classes\ValueObjects\Constants\HttpStatus;
use App\Models\Contact;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class UpdateDeliveryArrangementLogic
{
/** @var UpdatesDeliveryArrangement */
private $updatesDeliveryArrangement;
/** @var UpdatesSchedule */
private $updatesSchedule;
/** @var CreatesContact */
private $createsContact;
/** @var UpdatesTrackingNumber */
private $updatesTrackingNumber;
/**
* UpdateDeliveryArrangementLogic constructor.
* @param UpdatesDeliveryArrangement $updatesDeliveryArrangement
* @param UpdatesSchedule $updatesSchedule
* @param CreatesContact $createsContact
* @param UpdatesTrackingNumber $updatesTrackingNumber
*/
public function __construct(UpdatesDeliveryArrangement $updatesDeliveryArrangement, UpdatesSchedule $updatesSchedule, CreatesContact $createsContact, UpdatesTrackingNumber $updatesTrackingNumber)
{
$this->updatesDeliveryArrangement = $updatesDeliveryArrangement;
$this->updatesSchedule = $updatesSchedule;
$this->createsContact = $createsContact;
$this->updatesTrackingNumber = $updatesTrackingNumber;
}
/**
* @param String $orderId
* @param Request $request
* @return JsonResponse
* @throws InternalServerErrorException
*/
public function execute(String $orderId, Request $request){
try {
$orderObject = new OrderObject($orderId);
$deliveryArrangementObject = new DeliveryArrangementObject($request->input('type'), $request->input('vehicle_no'));
$arrangementId = $this->updatesDeliveryArrangement->execute($orderObject, $deliveryArrangementObject);
$scheduleObject = new ScheduleObject($request->input('schedule')['ETA'], $request->input('schedule')['ETD'], 1, $request->input('schedule')['remark']);
$this->updatesSchedule->execute($arrangementId, $scheduleObject);
if($deliveryArrangementObject->getType() === 0){
$contactObject = new ContactObject(Constants::MODULE_TYPES['driver'], $arrangementId, $request->input('name'), $request->input('contact'));
Contact::updateOrCreate(['type' => $contactObject->getType(), 'reference_id' => $contactObject->getReferenceId()],
['name' => $contactObject->getName(), 'contact' => $contactObject->getContact()]);
$this->createsContact->execute($contactObject, Constants::MODULE_TYPES['driver'], $arrangementId);
}
if($deliveryArrangementObject->getType() === 1){
$trackingNumberObject = new TrackingNumberObject(1, $request->input('tracking_number'), $request->input('courier'));
$this->updatesTrackingNumber->execute($orderObject, $trackingNumberObject);
}
return new JsonResponse(null, HttpStatus::RESOURCE_CREATED);
} catch (\Exception $exception){
throw new InternalServerErrorException("Failed to update order's shipping arrangement because {$exception->getMessage()}");
}
}
}
@@ -1,11 +1,11 @@
<?php <?php
namespace App\Classes\Modules\ControllersLogic\Orders\PackingList; namespace App\Classes\Modules\ControllersLogic\Orders\Attachments;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException; use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject; use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\DataTransferObjects\PackingListObject; use App\Classes\Modules\Orders\DataTransferObjects\PackingListObject;
use App\Classes\Modules\Orders\Services\PackingList\UpdatesPackingList; use App\Classes\Modules\Orders\Services\Attachments\UpdatesPackingList;
use App\Classes\ValueObjects\Constants\HttpStatus; use App\Classes\ValueObjects\Constants\HttpStatus;
use App\Traits\ChecksIfPackingListIsComplete; use App\Traits\ChecksIfPackingListIsComplete;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
@@ -44,7 +44,6 @@ class UpdatePackingListLogic
$packingListObject = new PackingListObject($request->input('reference_no'), $request->input('packages')); $packingListObject = new PackingListObject($request->input('reference_no'), $request->input('packages'));
$confirmed = $this->checkPackingListIsComplete($packingListObject->getPackages()); $confirmed = $this->checkPackingListIsComplete($packingListObject->getPackages());
dd($confirmed);
$this->updatesPackingList->execute($orderObject, $packingListObject, $confirmed); $this->updatesPackingList->execute($orderObject, $packingListObject, $confirmed);
@@ -0,0 +1,67 @@
<?php
namespace App\Classes\Modules\ControllersLogic\Orders\Attachments;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\DataTransferObjects\ScheduleObject;
use App\Classes\Modules\Orders\DataTransferObjects\ShippingArrangementObject;
use App\Classes\Modules\Orders\DataTransferObjects\TrackingNumberObject;
use App\Classes\Modules\Orders\Services\Attachments\UpdatesSchedule;
use App\Classes\Modules\Orders\Services\Attachments\UpdatesShippingArrangement;
use App\Classes\Modules\Orders\Services\Attachments\UpdatesTrackingNumber;
use App\Classes\ValueObjects\Constants\HttpStatus;
use App\Models\ShippingArrangement;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class UpdateShippingArrangementLogic
{
/** @var UpdatesShippingArrangement */
private $updatesShippingArrangement;
/** @var UpdatesSchedule */
private $updatesSchedule;
/**
* UpdateShippingArrangementLogic constructor.
* @param UpdatesShippingArrangement $updatesShippingArrangement
* @param UpdatesSchedule $updatesSchedule
*/
public function __construct(UpdatesShippingArrangement $updatesShippingArrangement, UpdatesSchedule $updatesSchedule)
{
$this->updatesShippingArrangement = $updatesShippingArrangement;
$this->updatesSchedule = $updatesSchedule;
}
/**
* @param String $orderId
* @param Request $request
* @return JsonResponse
* @throws InternalServerErrorException
*/
public function execute(String $orderId, Request $request){
try {
$orderObject = new OrderObject($orderId);
$shippingArrangementObject = new ShippingArrangementObject($request->input('container_no'), $request->input('seal_no'));
$arrangementId = $this->updatesShippingArrangement->execute($orderObject, $shippingArrangementObject);
$scheduleObject = new ScheduleObject($request->input('schedule')['ETA'], $request->input('schedule')['ETD'], 0, $request->input('schedule')['remark']);
$this->updatesSchedule->execute($arrangementId, $scheduleObject);
return new JsonResponse(null, HttpStatus::RESOURCE_CREATED);
} catch (\Exception $exception){
throw new InternalServerErrorException("Failed to update order's shipping arrangement because {$exception->getMessage()}");
}
}
}
@@ -0,0 +1,51 @@
<?php
namespace App\Classes\Modules\ControllersLogic\Orders\Attachments;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\DataTransferObjects\TrackingNumberObject;
use App\Classes\Modules\Orders\Services\Attachments\UpdatesTrackingNumber;
use App\Classes\ValueObjects\Constants\HttpStatus;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class UpdateTrackingNumberLogic
{
/** @var UpdatesTrackingNumber */
private $updatesTrackingNumber;
/**
* UpdateTrackingNumberLogic constructor.
* @param UpdatesTrackingNumber $updatesTrackingNumber
*/
public function __construct(UpdatesTrackingNumber $updatesTrackingNumber)
{
$this->updatesTrackingNumber = $updatesTrackingNumber;
}
/**
* @param String $orderId
* @param Request $request
* @return JsonResponse
* @throws InternalServerErrorException
*/
public function execute(String $orderId, Request $request){
try {
$orderObject = new OrderObject($orderId);
$trackingNumberObject = new TrackingNumberObject($request->input('type'), $request->input('tracking_number'), $request->input('courier'));
$this->updatesTrackingNumber->execute($orderObject, $trackingNumberObject);
return new JsonResponse(null, HttpStatus::RESOURCE_CREATED);
} catch (\Exception $exception){
throw new InternalServerErrorException("Failed to update order's receive note tracking number because {$exception->getMessage()}");
}
}
}
@@ -1,73 +0,0 @@
<?php
namespace App\Classes\Modules\ControllersLogic\Orders;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\Processors\ConfirmsOrder;
use App\Classes\Modules\Orders\Services\SetsOrderWarehouse;
use App\Classes\Modules\Orders\Services\Steps\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 SetsOrderWarehouse */
private $setOrderWarehouse;
/** @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 (CannotListCompanyOrdersException $exception){
throw new InternalServerErrorException("Failed to confirm order because {$exception->getMessage()}");
}
}
}
@@ -11,20 +11,15 @@ use Illuminate\Http\Request;
class UpdateOrderStepLogic class UpdateOrderStepLogic
{ {
/** @var Order */
private $repository;
/** @var UpdatesOrderSteps */ /** @var UpdatesOrderSteps */
private $updateOrderSteps; private $updateOrderSteps;
/** /**
* UpdateOrderStepLogic constructor. * UpdateOrderStepLogic constructor.
* @param Order $repository
* @param UpdatesOrderSteps $updateOrderSteps * @param UpdatesOrderSteps $updateOrderSteps
*/ */
public function __construct(Order $repository, UpdatesOrderSteps $updateOrderSteps) public function __construct(UpdatesOrderSteps $updateOrderSteps)
{ {
$this->repository = $repository;
$this->updateOrderSteps = $updateOrderSteps; $this->updateOrderSteps = $updateOrderSteps;
} }
@@ -33,15 +28,10 @@ class UpdateOrderStepLogic
* @param int $orderId * @param int $orderId
* @param Request $request * @param Request $request
* @return \Illuminate\Http\JsonResponse * @return \Illuminate\Http\JsonResponse
* @throws \ReflectionException
*/ */
public function execute(int $orderId, Request $request) { public function execute(int $orderId, Request $request) {
$repository = $this->repository->findOrFail($orderId);
$orderObject = new OrderObject($orderId); return $this->updateOrderSteps->execute($orderId, $request);
$stepObject = new StepObject($repository->current_step, $request->input('complete_date'));
return $this->updateOrderSteps->execute($orderObject, $stepObject, $request);
} }
} }
@@ -0,0 +1,52 @@
<?php
namespace App\Classes\Modules\ControllersLogic\Orders;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\Services\SetsOrderWarehouse;
use App\Classes\ValueObjects\Constants\HttpStatus;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class UpdateWarehouseLogic
{
/** @var SetsOrderWarehouse */
private $setsOrderWarehouse;
/**
* UpdateWarehouseLogic constructor.
* @param SetsOrderWarehouse $setsOrderWarehouse
*/
public function __construct(SetsOrderWarehouse $setsOrderWarehouse)
{
$this->setsOrderWarehouse = $setsOrderWarehouse;
}
/**
* @param String $orderId
* @param Request $request
* @return JsonResponse
* @throws InternalServerErrorException
*/
public function execute(String $orderId, Request $request){
try {
$order = new OrderObject($orderId);
$order->setWarehouseId($request->input('warehouse_id'));
$this->setsOrderWarehouse->execute($order);
return new JsonResponse(null, HttpStatus::REQUEST_ACCEPTED);
} catch (\Exception $exception){
throw new InternalServerErrorException("Failed to update order's packing list because {$exception->getMessage()}");
}
}
}
@@ -0,0 +1,45 @@
<?php
namespace App\Classes\Modules\Orders\DataTransferObjects;
class DeliveryArrangementObject
{
/** @var int */
private $type;
/** @var null|string */
private $vehicleNumber;
/**
* DeliveryArrangementObject constructor.
* @param int $type
* @param null|string $vehicleNumber
*/
public function __construct(int $type, ?string $vehicleNumber)
{
$this->type = $type;
$this->vehicleNumber = $vehicleNumber;
}
/**
* @return int
*/
public function getType(): int
{
return $this->type;
}
/**
* @return null|string
*/
public function getVehicleNumber(): ?string
{
return $this->vehicleNumber;
}
}
@@ -6,18 +6,18 @@ namespace App\Classes\Modules\Orders\DataTransferObjects;
class PackingListObject class PackingListObject
{ {
/** @var string */ /** @var null|string */
private $referenceId; private $referenceId;
/** @var PackageObject[] */ /** @var array */
private $packages; private $packages;
/** /**
* PackingListObject constructor. * PackingListObject constructor.
* @param string $referenceId * @param null|string $referenceId
* @param PackageObject[] $packages * @param array $packages
*/ */
public function __construct(string $referenceId, array $packages) public function __construct(?string $referenceId, array $packages)
{ {
$this->referenceId = $referenceId; $this->referenceId = $referenceId;
$this->packages = $packages; $this->packages = $packages;
@@ -25,9 +25,9 @@ class PackingListObject
/** /**
* @return string * @return null|string
*/ */
public function getReferenceId(): string public function getReferenceId(): ? string
{ {
return $this->referenceId; return $this->referenceId;
} }
@@ -1,32 +0,0 @@
<?php
namespace App\Classes\Modules\Orders\DataTransferObjects;
use Illuminate\Support\Carbon;
class ReceiveNoteObject
{
/** @var string */
private $trackingNumber;
/**
* ReceiveNoteObject constructor.
* @param string $trackingNumber
*/
public function __construct(string $trackingNumber)
{
$this->trackingNumber = $trackingNumber;
}
/**
* @return string
*/
public function getTrackingNumber(): string
{
return $this->trackingNumber;
}
}
@@ -0,0 +1,73 @@
<?php
namespace App\Classes\Modules\Orders\DataTransferObjects;
use Carbon\Carbon;
class ScheduleObject
{
/** @var string */
private $ETA;
/** @var string */
private $ETD;
/** @var int */
private $type;
/** @var null|string */
private $issue;
/**
* ScheduleObject constructor.
* @param string $ETA
* @param string $ETD
* @param int $type
* @param null|string $issue
*/
public function __construct(string $ETA, string $ETD, int $type, ?string $issue = null)
{
$this->ETA = $ETA;
$this->ETD = $ETD;
$this->type = $type;
$this->issue = $issue;
}
/**
* @return Carbon
*/
public function getETA(): Carbon
{
return Carbon::parse( $this->ETA);
}
/**
* @return Carbon
*/
public function getETD(): Carbon
{
return Carbon::parse($this->ETD);
}
/**
* @return int
*/
public function getType(): int
{
return $this->type;
}
/**
* @return null|string
*/
public function getIssue(): ?string
{
return $this->issue;
}
}
@@ -0,0 +1,44 @@
<?php
namespace App\Classes\Modules\Orders\DataTransferObjects;
class ShippingArrangementObject
{
/** @var string */
private $containerNumber;
/** @var string */
private $sealNumber;
/**
* ShippingArrangementObject constructor.
* @param string $containerNumber
* @param string $sealNumber
*/
public function __construct(string $containerNumber, string $sealNumber)
{
$this->containerNumber = $containerNumber;
$this->sealNumber = $sealNumber;
}
/**
* @return string
*/
public function getContainerNumber(): string
{
return $this->containerNumber;
}
/**
* @return string
*/
public function getSealNumber(): string
{
return $this->sealNumber;
}
}
@@ -0,0 +1,54 @@
<?php
namespace App\Classes\Modules\Orders\DataTransferObjects;
class TrackingNumberObject
{
/** @var int */
private $type;
/** @var string */
private $trackingNumber;
/** @var null|string */
private $courier;
/**
* TrackingNumberObject constructor.
* @param int $type
* @param string $trackingNumber
* @param null|string $courier
*/
public function __construct(int $type, string $trackingNumber, ?string $courier = null)
{
$this->type = $type;
$this->trackingNumber = $trackingNumber;
$this->courier = $courier;
}
/**
* @return int
*/
public function getType(): int
{
return $this->type;
}
/**
* @return string
*/
public function getTrackingNumber(): string
{
return $this->trackingNumber;
}
/**
* @return null|string
*/
public function getCourier(): ?string
{
return $this->courier;
}
}
@@ -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\Steps\CompletesOrderStep;
use App\Classes\ValueObjects\Constants\HttpStatus;
use Illuminate\Http\JsonResponse;
abstract class AbstractStepProcessor
{
abstract function validator(): bool;
abstract function execute(): JsonResponse;
/**
* @param OrderObject $order
* @param StepObject $step
* @return JsonResponse
* @throws InternalServerErrorException
*/
public function handler(OrderObject $order, StepObject $step) {
try {
if(!$this->validator()){
return new JsonResponse(['message' => 'Updating step validation has failed due to missing requirements'], HttpStatus::VALIDATION_FAILED);
}
(new CompletesOrderStep())->execute($order, $step);
/** notification */
return new JsonResponse(null, HttpStatus::REQUEST_ACCEPTED);
} catch (\Exception $exception){
throw new InternalServerErrorException("Failed to update order step because {$exception->getMessage()}");
}
}
}
@@ -3,66 +3,55 @@
namespace App\Classes\Modules\Orders\Processors; namespace App\Classes\Modules\Orders\Processors;
use App\Classes\Constants;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException; use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject; use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\DataTransferObjects\StepObject; 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\Modules\Orders\Services\Steps\GenerateOrderSteps;
use App\Classes\ValueObjects\Constants\HttpStatus;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
class ConfirmsOrder class ConfirmsOrder extends AbstractStepProcessor
{ {
use updatesStep; /** @var string */
const STEP_REFERENCE = Constants::ORDER_PROCESSING_STEP;
/** @var GenerateOrderSteps */ /** @var OrderObject */
private $generateOrderSteps; private $order;
/** @var SetsOrderWarehouse */
private $setOrderWarehouse;
/** @var StepObject */
private $step;
/** /**
* ConfirmsOrder constructor. * WarehousePackOrder constructor.
* @param int $orderId
* @param string $completeDate
*/ */
public function __construct() public function __construct(int $orderId, string $completeDate = null)
{ {
$this->setOrderWarehouse = new SetsOrderWarehouse(); $this->order = new OrderObject($orderId);
$this->generateOrderSteps = new GenerateOrderSteps(); $this->step = new StepObject(self::STEP_REFERENCE, $completeDate);
}
/**
* @return bool
*/
public function validator(): bool {
return true;
} }
/** /**
* @param OrderObject $order
* @param StepObject $step
* @param int $warehouseId
* @return JsonResponse * @return JsonResponse
* @throws InternalServerErrorException * @throws InternalServerErrorException
* @throws \App\Classes\Modules\Accounts\Exceptions\CannotCreateOrderStepsException
*/ */
public function execute(OrderObject $order, StepObject $step, ?int $warehouseId = null){ public function execute(): JsonResponse {
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()}");
}
(new generateOrderSteps())->execute($this->order);
return $this->handler($this->order, $this->step);
} }
} }
@@ -3,37 +3,56 @@
namespace App\Classes\Modules\Orders\Processors; namespace App\Classes\Modules\Orders\Processors;
use App\Classes\Constants;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException; use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject; use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\DataTransferObjects\StepObject; use App\Classes\Modules\Orders\DataTransferObjects\StepObject;
use App\Classes\Modules\Orders\Services\Processors\updatesStep; use App\Models\DeliveryArrangement;
use App\Classes\ValueObjects\Constants\HttpStatus;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
class DeliverOrder class DeliverOrder extends AbstractStepProcessor
{ {
use updatesStep; /** @var string */
const STEP_REFERENCE = Constants::ORDER_DELIVERY_STEP;
/** @var OrderObject */
private $order;
/** @var StepObject */
private $step;
/** /**
* @param OrderObject $order * DeliverOrder constructor.
* @param StepObject $step * @param int $orderId
* @return JsonResponse * @param string $completeDate
* @throws InternalServerErrorException
*/ */
public function execute(OrderObject $order, StepObject $step){ public function __construct(int $orderId, string $completeDate = null)
{
try { $this->order = new OrderObject($orderId);
$this->step = new StepObject(self::STEP_REFERENCE, $completeDate);
$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()}");
}
} }
/**
* @return bool
*/
public function validator(): bool {
if(!DeliveryArrangement::where('order_id', $this->order->getOrderId())->exists()) {
return false;
}
return true;
}
/**
* @return JsonResponse
* @throws InternalServerErrorException
*/
public function execute(): JsonResponse {
return $this->handler($this->order, $this->step);
}
} }
@@ -3,35 +3,56 @@
namespace App\Classes\Modules\Orders\Processors; namespace App\Classes\Modules\Orders\Processors;
use App\Classes\Constants;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException; use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject; use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\DataTransferObjects\StepObject; use App\Classes\Modules\Orders\DataTransferObjects\StepObject;
use App\Classes\Modules\Orders\Services\Processors\updatesStep; use App\Models\ShippingArrangement;
use App\Classes\ValueObjects\Constants\HttpStatus;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
class ShipOrder class ShipOrder extends AbstractStepProcessor
{ {
use updatesStep; /** @var string */
const STEP_REFERENCE = Constants::ORDER_SHIPPING_STEP;
/** @var OrderObject */
private $order;
/** @var StepObject */
private $step;
/**
* WarehousePackOrder constructor.
* @param int $orderId
* @param string $completeDate
*/
public function __construct(int $orderId, string $completeDate = null)
{
$this->order = new OrderObject($orderId);
$this->step = new StepObject(self::STEP_REFERENCE, $completeDate);
}
/**
* @return bool
*/
public function validator(): bool {
if(!ShippingArrangement::where('order_id', $this->order->getOrderId())->exists()) {
return false;
}
return true;
}
/** /**
* @param OrderObject $order
* @param StepObject $step
* @return JsonResponse * @return JsonResponse
* @throws InternalServerErrorException * @throws InternalServerErrorException
*/ */
public function execute(OrderObject $order, StepObject $step){ public function execute(): JsonResponse {
return $this->handler($this->order, $this->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()}");
}
} }
@@ -1,89 +0,0 @@
<?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));
}
}
@@ -3,35 +3,50 @@
namespace App\Classes\Modules\Orders\Processors; namespace App\Classes\Modules\Orders\Processors;
use App\Classes\Constants;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException; use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject; use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\DataTransferObjects\StepObject; 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; use Illuminate\Http\JsonResponse;
class WarehouseArrivalOrder class WarehouseArrivalOrder extends AbstractStepProcessor
{ {
use updatesStep; /** @var string */
const STEP_REFERENCE = Constants::ORDER_WAREHOUSE_ARRIVAL_STEP;
/** @var OrderObject */
private $order;
/** @var StepObject */
private $step;
/**
* WarehousePackOrder constructor.
* @param int $orderId
* @param string $completeDate
*/
public function __construct(int $orderId, string $completeDate = null)
{
$this->order = new OrderObject($orderId);
$this->step = new StepObject(self::STEP_REFERENCE, $completeDate);
}
/**
* @return bool
*/
public function validator(): bool {
return true;
}
/** /**
* @param OrderObject $order
* @param StepObject $step
* @return JsonResponse * @return JsonResponse
* @throws InternalServerErrorException * @throws InternalServerErrorException
*/ */
public function execute(OrderObject $order, StepObject $step){ public function execute(): JsonResponse {
return $this->handler($this->order, $this->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()}");
}
} }
@@ -3,44 +3,59 @@
namespace App\Classes\Modules\Orders\Processors; namespace App\Classes\Modules\Orders\Processors;
use App\Classes\Constants;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException; use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject; use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\DataTransferObjects\StepObject; 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 App\Models\PackingList;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
class WarehousePackOrder class WarehousePackOrder extends AbstractStepProcessor
{ {
use updatesStep; /** @var string */
const STEP_REFERENCE = Constants::ORDER_WAREHOUSE_PACKING_STEP;
/** @var OrderObject */
private $order;
/** @var StepObject */
private $step;
/** /**
* @param OrderObject $order * WarehousePackOrder constructor.
* @param StepObject $step * @param int $orderId
* @return JsonResponse * @param string $completeDate
* @throws InternalServerErrorException
*/ */
public function execute(OrderObject $order, StepObject $step){ public function __construct(int $orderId, string $completeDate = null)
{
try { $this->order = new OrderObject($orderId);
$packingList = PackingList::where('order_id', $order->getOrderId())->firstOrFail(); $this->step = new StepObject(self::STEP_REFERENCE, $completeDate);
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()}");
}
} }
/**
* @return bool
*/
public function validator(): bool {
$packingList = PackingList::where('order_id', $this->order->getOrderId())->first();
if(!$packingList->confirmed) {
return false;
}
return true;
}
/**
* @return JsonResponse
* @throws InternalServerErrorException
*/
public function execute(): JsonResponse {
return $this->handler($this->order, $this->step);
}
} }
@@ -3,52 +3,50 @@
namespace App\Classes\Modules\Orders\Processors; namespace App\Classes\Modules\Orders\Processors;
use App\Classes\Constants;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException; use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject; 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\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; use Illuminate\Http\JsonResponse;
class WarehouseReceivesOrder class WarehouseReceivesOrder extends AbstractStepProcessor
{ {
use updatesStep; /** @var string */
const STEP_REFERENCE = Constants::ORDER_WAREHOUSE_RECEIVING_STEP;
/** @var CreatesReceiveNote */ /** @var OrderObject */
private $createsReceiveNote; private $order;
/** @var StepObject */
private $step;
/** /**
* WarehouseReceivesOrder constructor. * WarehousePackOrder constructor.
* @param int $orderId
* @param string $completeDate
*/ */
public function __construct() public function __construct(int $orderId, string $completeDate = null)
{ {
$this->createsReceiveNote = new CreatesReceiveNote(); $this->order = new OrderObject($orderId);
$this->step = new StepObject(self::STEP_REFERENCE, $completeDate);
} }
/** /**
* @param OrderObject $order * @return bool
* @param StepObject $step */
* @param ReceiveNoteObject $object public function validator(): bool {
return true;
}
/**
* @return JsonResponse * @return JsonResponse
* @throws InternalServerErrorException * @throws InternalServerErrorException
*/ */
public function execute(OrderObject $order, StepObject $step, ReceiveNoteObject $object){ public function execute(): JsonResponse {
try { return $this->handler($this->order, $this->step);
$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()}");
}
} }
} }
@@ -3,36 +3,50 @@
namespace App\Classes\Modules\Orders\Processors; namespace App\Classes\Modules\Orders\Processors;
use App\Classes\Constants;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException; use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject; use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\DataTransferObjects\StepObject; 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; use Illuminate\Http\JsonResponse;
class WarehouseUnpackingOrder class WarehouseUnpackingOrder extends AbstractStepProcessor
{ {
use updatesStep; /** @var string */
const STEP_REFERENCE = Constants::ORDER_WAREHOUSE_UNPACKING_STEP;
/** @var OrderObject */
private $order;
/** @var StepObject */
private $step;
/** /**
* @param OrderObject $order * WarehousePackOrder constructor.
* @param StepObject $step * @param int $orderId
* @return JsonResponse * @param string $completeDate
* @throws InternalServerErrorException
*/ */
public function execute(OrderObject $order, StepObject $step){ public function __construct(int $orderId, string $completeDate = null)
{
try { $this->order = new OrderObject($orderId);
$this->step = new StepObject(self::STEP_REFERENCE, $completeDate);
$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()}");
}
} }
/**
* @return bool
*/
public function validator(): bool {
return true;
}
/**
* @return JsonResponse
* @throws InternalServerErrorException
*/
public function execute(): JsonResponse {
return $this->handler($this->order, $this->step);
}
} }
@@ -0,0 +1,34 @@
<?php
namespace App\Classes\Modules\Orders\Services\Attachments;
use App\Classes\Modules\Orders\DataTransferObjects\DeliveryArrangementObject;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Models\DeliveryArrangement;
class UpdatesDeliveryArrangement
{
/** @var DeliveryArrangement */
private $repository;
/**
* UpdatesDeliveryArrangement constructor.
* @param DeliveryArrangement $repository
*/
public function __construct(DeliveryArrangement $repository)
{
$this->repository = $repository;
}
public function execute(OrderObject $order, DeliveryArrangementObject $arrangement){
$arrangement = $this->repository->updateOrCreate(['order_id' => $order->getOrderId()],
['type' => $arrangement->getType(), 'vehicle_no' => $arrangement->getVehicleNumber()]);
return $arrangement->id;
}
}
@@ -1,6 +1,6 @@
<?php <?php
namespace App\Classes\Modules\Orders\Services\PackingList; namespace App\Classes\Modules\Orders\Services\Attachments;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject; use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
@@ -25,7 +25,7 @@ class UpdatesPackingList
public function execute(OrderObject $orderObject, PackingListObject $packingListObject, bool $confirmed){ public function execute(OrderObject $orderObject, PackingListObject $packingListObject, bool $confirmed){
$packingList = $this->repository->firstOrCreate(['order_id' => $orderObject->getOrderId()], $packingList = $this->repository->updateOrCreate(['order_id' => $orderObject->getOrderId()],
[ [
'reference_no' => $packingListObject->getReferenceId(), 'reference_no' => $packingListObject->getReferenceId(),
'confirmed' => $confirmed 'confirmed' => $confirmed
@@ -0,0 +1,40 @@
<?php
namespace App\Classes\Modules\Orders\Services\Attachments;
use App\Classes\Modules\Orders\DataTransferObjects\ScheduleObject;
use App\Models\Schedule;
class UpdatesSchedule
{
/** @var Schedule */
private $repository;
/**
* UpdatesSchedule constructor.
* @param Schedule $repository
*/
public function __construct(Schedule $repository)
{
$this->repository = $repository;
}
public function execute(int $arrangementId, ScheduleObject $schedule){
$this->repository->where('arrangement_id', $arrangementId)->where('type', $schedule->getType())->where('status', 0)
->update(['status' => 2, 'issue_remark' => $schedule->getIssue()]);
$this->repository->arrangement_id = $arrangementId;
$this->repository->type = $schedule->getType();
$this->repository->ETA = $schedule->getETA();
$this->repository->ETD = $schedule->getETD();
$this->repository->save();
}
}
@@ -0,0 +1,33 @@
<?php
namespace App\Classes\Modules\Orders\Services\Attachments;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\DataTransferObjects\ShippingArrangementObject;
use App\Models\ShippingArrangement;
class UpdatesShippingArrangement
{
/** @var ShippingArrangement */
private $repository;
/**
* UpdatesShippingArrangement constructor.
* @param ShippingArrangement $repository
*/
public function __construct(ShippingArrangement $repository)
{
$this->repository = $repository;
}
public function execute(OrderObject $order, ShippingArrangementObject $arrangement){
$arrangement = $this->repository->updateOrCreate(['order_id' => $order->getOrderId()],
['container_no' => $arrangement->getContainerNumber(), 'seal_no' => $arrangement->getSealNumber()]);
return $arrangement->id;
}
}
@@ -0,0 +1,35 @@
<?php
namespace App\Classes\Modules\Orders\Services\Attachments;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\DataTransferObjects\TrackingNumberObject;
use App\Models\TrackingNumber;
class UpdatesTrackingNumber
{
/** @var TrackingNumber */
private $repository;
/**
* UpdatesTrackingNumber constructor.
* @param TrackingNumber $repository
*/
public function __construct(TrackingNumber $repository)
{
$this->repository = $repository;
}
public function execute(OrderObject $orderObject, TrackingNumberObject $trackingNumberObject){
$this->repository->updateOrCreate(['order_id' => $orderObject->getOrderId(), 'type' => $trackingNumberObject->getType()],
[
'tracking_no' => $trackingNumberObject->getTrackingNumber(),
'courier' => $trackingNumberObject->getCourier()
]);
}
}
@@ -35,6 +35,7 @@ class CreatesOrder
$address = AddressBook::where('company_id', $order->getCompanyId()) $address = AddressBook::where('company_id', $order->getCompanyId())
->where('default', true)->firstOrFail(); ->where('default', true)->firstOrFail();
$this->repository->company_id = $order->getCompanyId(); $this->repository->company_id = $order->getCompanyId();
$this->repository->marking = $order->getOrderId(); $this->repository->marking = $order->getOrderId();
$this->repository->address_id = $address->id; $this->repository->address_id = $address->id;
@@ -4,8 +4,8 @@ namespace App\Classes\Modules\Orders\Services;
use App\Classes\Constants; use App\Classes\Constants;
use App\Models\CustomIssues;
use App\Models\Order; use App\Models\Order;
use App\Models\Schedule;
use App\Models\Warehouse; use App\Models\Warehouse;
use Carbon\Carbon; use Carbon\Carbon;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
@@ -13,6 +13,16 @@ use Illuminate\Support\Collection;
class ListsOrderHistory class ListsOrderHistory
{ {
/** @var Collection */
private $history;
/**
* ListsOrderHistory constructor.
*/
public function __construct()
{
$this->history = new Collection();
}
public function execute(string $orderId, Carbon $createdAt, bool $complete, Carbon $lastUpdate){ public function execute(string $orderId, Carbon $createdAt, bool $complete, Carbon $lastUpdate){
@@ -21,9 +31,7 @@ class ListsOrderHistory
$orderSteps = $order->orderSteps()->where('complete', true)->orderBy('sequence')->get(); $orderSteps = $order->orderSteps()->where('complete', true)->orderBy('sequence')->get();
$history = new Collection(); $this->history->push(['type' => 1, 'date' => $createdAt->format('d-m-Y'), 'description' => 'Order number has been created']);
$history->push(['date' => $createdAt->format('d-m-Y'), 'description' => 'Order number has been created']);
foreach ($orderSteps as $step){ foreach ($orderSteps as $step){
@@ -31,78 +39,76 @@ class ListsOrderHistory
switch ($step->reference_id){ switch ($step->reference_id){
case Constants::ORDER_PROCESSING_STEP: case Constants::ORDER_PROCESSING_STEP:
if($order->warehouse_id){ if($order->warehouse_id){
$history->push(['date' => $completeDate, 'description' => Warehouse::find($order->warehouse_id)->first()->name.' confirmed as your order\'s warehouse']); $this->history->push(['type' => 1, 'date' => $completeDate, 'description' => Warehouse::find($order->warehouse_id)->first()->name.' confirmed as your order\'s warehouse']);
} }
break; break;
case Constants::ORDER_NO_WAREHOUSE_PENDING_SUPPLIER: case Constants::ORDER_NO_WAREHOUSE_PENDING_SUPPLIER:
$history->push(['date' => $completeDate, 'description' => 'Your Order has been loaded into container']); $this->history->push(['type' => 1, 'date' => $completeDate, 'description' => 'Your Order has been loaded into container']);
break; break;
case Constants::ORDER_WAREHOUSE_RECEIVING_STEP: case Constants::ORDER_WAREHOUSE_RECEIVING_STEP:
$warehouse = Warehouse::find($order->warehouse_id)->first(); $warehouse = Warehouse::find($order->warehouse_id)->first();
$history->push(['date' => $completeDate, 'description' => 'Arrived at '. $warehouse->name .' warehouse in china']); $this->history->push(['type' => 1, 'date' => $completeDate, 'description' => 'Arrived at '. $warehouse->name .' warehouse in china']);
break; break;
case Constants::ORDER_WAREHOUSE_PACKING_STEP: 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(); $packages = $order->packingLists()->firstOrFail()->packages()->selectRaw(DB::raw('((width/100) * (height/100) * (length/100)) * quantity as cbm, quantity'))->get();
$history->push(['date' => $completeDate, 'description' => '['.$packages->sum('quantity').' Packages, '.number_format((float)$packages->sum('cbm'), 2, '.', '').' CBM] Your order has been loaded into container']); $this->history->push(['type' => 1, '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']); $this->history->push(['type' => 1, 'date' => $completeDate, 'description' => 'Invoice has been issued, waiting for shipping payment']);
break; break;
case Constants::ORDER_SHIPPING_STEP: case Constants::ORDER_SHIPPING_STEP:
$shippingArrangement = $order->shippingArrangement()->first(); $this->shippingArrangment($order);
if($shippingArrangement){ $this->history->push(['type' => 1, 'date' => $completeDate, 'description' => 'Arrived to Malaysian port']);
$shippingSchedules = $shippingArrangement->shippingSchedule()->get(); $this->history->push(['type' => 1, 'date' => $completeDate, 'description' => 'Custom clearance is successful']);
foreach ($shippingSchedules as $schedule){
if($schedule->status === 2){
$customIssue = CustomIssues::where('schedule_id', $schedule->id)->first();
if($customIssue !== null){
$history->push(['date' => $completeDate, 'description' => '[ETD: '.$schedule->ETD.', ETA: '.$schedule->ETA.'] Shipping Schedule failed due to: '.$customIssue->remark]);
} else {
$history->push(['date' => $completeDate, 'description' => '[ETD: '.$schedule->ETD.', ETA: '.$schedule->ETA.'] Shipping Schedule failed']);
}
} else {
$history->push(['date' => $completeDate, 'description' => '[ETD: '.$schedule->ETD.', ETA: '.$schedule->ETA.'] Your Order has been scheduled for shipping ']);
}
}
}
$history->push(['date' => $completeDate, 'description' => 'Arrived to Malaysian port']);
$history->push(['date' => $completeDate, 'description' => 'Custom clearance is successful']);
break; break;
case Constants::ORDER_WAREHOUSE_ARRIVAL_STEP: case Constants::ORDER_WAREHOUSE_ARRIVAL_STEP:
$history->push(['date' => $completeDate, 'description' => 'Arrived at Malaysia\'s warehouse']); $this->history->push(['type' => 1, 'date' => $completeDate, 'description' => 'Arrived at Malaysia\'s warehouse']);
break; break;
case Constants::ORDER_WAREHOUSE_UNPACKING_STEP: case Constants::ORDER_WAREHOUSE_UNPACKING_STEP:
$history->push(['date' => $completeDate, 'description' => 'Your Order has been unloaded and being prepared for delivery']); $this->history->push(['type' => 1, 'date' => $completeDate, 'description' => 'Your Order has been unloaded and being prepared for delivery']);
break; break;
case Constants::ORDER_DELIVERY_STEP: case Constants::ORDER_DELIVERY_STEP:
$history->push(['date' => $completeDate, 'description' => 'Out for delivery']); $this->deliveryArrangment($order);
$this->history->push(['type' => 2, 'date' => $completeDate, 'description' => 'Your Order has successfully been delivered']);
break; break;
} }
} }
if($order->current_step === Constants::ORDER_SHIPPING_STEP){ if($order->current_step === Constants::ORDER_SHIPPING_STEP){
$shippingArrangement = $order->shippingArrangement()->first(); $this->shippingArrangment($order);
if($shippingArrangement){ }
$shippingSchedules = $shippingArrangement->shippingSchedule()->get();
foreach ($shippingSchedules as $schedule){ if($order->current_step === Constants::ORDER_DELIVERY_STEP){
if($schedule->status === 2){ $this->deliveryArrangment($order);
$customIssue = CustomIssues::where('schedule_id', $schedule->id)->first(); }
if($customIssue !== null){
$history->push(['date' => $schedule->updated_at->format('d-m-Y'), 'description' => '[ETD: '.$schedule->ETD.', ETA: '.$schedule->ETA.'] Shipping Schedule failed due to: '.$customIssue->remark]); return $this->history->reverse()->toArray();
} else { }
$history->push(['date' => $schedule->updated_at->format('d-m-Y'), 'description' => '[ETD: '.$schedule->ETD.', ETA: '.$schedule->ETA.'] Shipping Schedule failed']);
} private function shippingArrangment(Order $order){
} else { $shippingArrangement = $order->shippingArrangement()->first();
$history->push(['date' => $schedule->updated_at->format('d-m-Y'), 'description' => '[ETD: '.$schedule->ETD.', ETA: '.$schedule->ETA.'] Your Order has been scheduled for shipping ']); if($shippingArrangement){
} $shippingSchedules = Schedule::where('arrangement_id', $shippingArrangement->id)->where('type', 0)->get();
foreach ($shippingSchedules as $schedule){
if((int)$schedule->status === 2){
$this->history->push(['type' => 0, 'date' => carbon::parse($schedule->ETD)->format('d-m-Y'), 'description' => $schedule->issue_remark ? 'Scheduled Shipping has failed due to: '.$schedule->issue_remark : 'Scheduled Shipping has failed']);
} else {
$this->history->push(['type' => 1, 'date' => carbon::parse($schedule->ETD)->format('d-m-Y'), 'description' => '[ETD: '.carbon::parse($schedule->ETD)->format('d-m-Y').', ETA: '.carbon::parse($schedule->ETA)->format('d-m-Y').'] Your Order has been scheduled for shipping ']);
} }
} }
} }
}
if($complete){ private function deliveryArrangment(Order $order){
$history->push(['date' => $lastUpdate->format('d-m-Y'), 'description' => 'Your Order has successfully been delivered']); $deliveryArrangement = $order->deliveryArrangement()->first();
if($deliveryArrangement){
$deliverySchedules = Schedule::where('arrangement_id', $deliveryArrangement->id)->where('type', 1)->get();
foreach ($deliverySchedules as $schedule){
if((int)$schedule->status === 2){
$this->history->push(['type' => 0, 'date' => carbon::parse($schedule->ETD)->format('d-m-Y'), 'description' => $schedule->issue_remark ? 'Scheduled delivery has failed due to: '.$schedule->issue_remark : 'Scheduled delivery has failed']);
} else {
$this->history->push(['type' => 1, 'date' => carbon::parse($schedule->ETD)->format('d-m-Y'), 'description' => '[ETD: '.carbon::parse($schedule->ETD)->format('d-m-Y').', ETA: '.carbon::parse($schedule->ETA)->format('d-m-Y').'] Your Order has been scheduled for delivery ']);
}
}
} }
return $history->reverse()->toArray();
} }
} }
@@ -1,29 +0,0 @@
<?php
namespace App\Classes\Modules\Orders\Services\ReceiveNote;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\DataTransferObjects\ReceiveNoteObject;
use App\Models\ReceiveNote;
class CreatesReceiveNote
{
/** @var ReceiveNote */
private $repository;
public function __construct()
{
$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->save();
}
}
@@ -15,10 +15,11 @@ class SetsOrderWarehouse
/** /**
* SetsOrderWarehouse constructor. * SetsOrderWarehouse constructor.
* @param Order $repository
*/ */
public function __construct() public function __construct(Order $repository)
{ {
$this->repository = new Order(); $this->repository = $repository;
} }
@@ -23,7 +23,9 @@ class CompletesOrderStep {
$orderStep->complete = 1; $orderStep->complete = 1;
$orderStep->complete_date = $step->getCompleteDate(); $orderStep->complete_date = $step->getCompleteDate();
$orderStep->save(); if($orderStep->save()){
(new updatesOrderCurrentStep())->execute($order,$step);
}
} }
@@ -41,10 +41,6 @@ class GenerateOrderSteps
*/ */
public function execute(OrderObject $order){ 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]); $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()); $this->createsOrderSteps->execute($order, $orderSteps->toArray());
@@ -3,27 +3,38 @@
namespace App\Classes\Modules\Orders\Services\Steps; 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 App\Classes\ValueObjects\Constants\OrderSteps;
use App\Models\Order;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class UpdatesOrderSteps class UpdatesOrderSteps
{ {
/** @var Order */
private $repository;
/** /**
* @param OrderObject $order * UpdatesOrderSteps constructor.
* @param StepObject $step * @param Order $repository
*/
public function __construct(Order $repository)
{
$this->repository = $repository;
}
/**
* @param int $orderId
* @param Request $request * @param Request $request
* @return mixed * @return mixed
* @throws \ReflectionException
*/ */
public function execute(OrderObject $order, StepObject $step, Request $request) { public function execute(int $orderId, Request $request) {
$class = OrderSteps::STEP_PROCESSOR[$step->getReferenceId()]; $repository = $this->repository->findOrFail($orderId);
$arguments = (new StepProcessMapper())->map($class, $request->all());
return (new $class())->execute($order, $step,...$arguments); $class = OrderSteps::STEP_PROCESSOR[$repository->current_step];
return (new $class($orderId, $request->input('complete_date')))->execute();
} }
@@ -5,6 +5,8 @@ namespace App\Classes\Modules\Steps;
use App\Classes\Constants; use App\Classes\Constants;
use App\Http\Resources\PackingList as PackingListResource; use App\Http\Resources\PackingList as PackingListResource;
use App\Http\Resources\ShippingArrangement as ShippingArrangementResource; use App\Http\Resources\ShippingArrangement as ShippingArrangementResource;
use App\Http\Resources\DeliveryArrangement as DeliveryArrangementResource;
use App\Models\DeliveryArrangement;
use App\Models\PackingList; use App\Models\PackingList;
use App\Models\ShippingArrangement; use App\Models\ShippingArrangement;
@@ -17,7 +19,7 @@ class StepAttachments
case Constants::ORDER_SHIPPING_STEP: case Constants::ORDER_SHIPPING_STEP:
return new ShippingArrangementResource(ShippingArrangement::where('order_id', $order_id)->first()); return new ShippingArrangementResource(ShippingArrangement::where('order_id', $order_id)->first());
case Constants::ORDER_DELIVERY_STEP: case Constants::ORDER_DELIVERY_STEP:
return new ShippingArrangementResource(ShippingArrangement::where('order_id', $order_id)->first()); return new DeliveryArrangementResource(DeliveryArrangement::where('order_id', $order_id)->first());
default: default:
return null; return null;
} }
@@ -6,9 +6,9 @@ use App\Classes\Modules\ControllersLogic\Companies\ListCompanyLogic;
class ListCompanyController class ListCompanyController
{ {
public function list(ListCompanyLogic $logic){ public function list(ListCompanyLogic $logic, bool $pagination = true ){
return $logic->execute(); return $logic->execute($pagination);
} }
} }
@@ -1,10 +1,4 @@
<?php <?php
/**
* Created by PhpStorm.
* User: user
* Date: 06/03/2019
* Time: 5:11 PM
*/
namespace App\Http\Controllers\Contacts; namespace App\Http\Controllers\Contacts;
@@ -1,10 +1,4 @@
<?php <?php
/**
* Created by PhpStorm.
* User: user
* Date: 05/03/2019
* Time: 2:30 PM
*/
namespace App\Http\Controllers\Contacts; namespace App\Http\Controllers\Contacts;
@@ -1,10 +1,4 @@
<?php <?php
/**
* Created by PhpStorm.
* User: ayen
* Date: 19/03/2019
* Time: 10:17 AM
*/
namespace App\Http\Controllers\Dashboard; namespace App\Http\Controllers\Dashboard;
@@ -0,0 +1,22 @@
<?php
namespace App\Http\Controllers\Orders\Attachments;
use App\Classes\Modules\ControllersLogic\Orders\Attachments\UpdateDeliveryArrangementLogic;
use Illuminate\Http\Request;
class UpdateDeliveryArrangementController
{
/**
* @param String $orderId
* @param Request $request
* @param UpdateDeliveryArrangementLogic $logic
* @throws \App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException
*/
public function update(String $orderId, Request $request , UpdateDeliveryArrangementLogic $logic){
$logic->execute($orderId, $request);
}
}
@@ -1,8 +1,8 @@
<?php <?php
namespace App\Http\Controllers\Orders; namespace App\Http\Controllers\Orders\Attachments;
use App\Classes\Modules\ControllersLogic\Orders\PackingList\UpdatePackingListLogic; use App\Classes\Modules\ControllersLogic\Orders\Attachments\UpdatePackingListLogic;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class UpdatePackingListController class UpdatePackingListController
@@ -0,0 +1,22 @@
<?php
namespace App\Http\Controllers\Orders\Attachments;
use App\Classes\Modules\ControllersLogic\Orders\Attachments\UpdateShippingArrangementLogic;
use Illuminate\Http\Request;
class UpdateShippingArrangementController
{
/**
* @param String $orderId
* @param Request $request
* @param UpdateShippingArrangementLogic $logic
* @throws \App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException
*/
public function update(String $orderId, Request $request , UpdateShippingArrangementLogic $logic){
$logic->execute($orderId, $request);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\Orders\Attachments;
use App\Classes\Modules\ControllersLogic\Orders\Attachments\UpdateTrackingNumberLogic;
use Illuminate\Http\Request;
class UpdateTrackingNumberController
{
/**
* @param String $orderId
* @param Request $request
* @param UpdateTrackingNumberLogic $logic
* @throws \App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException
*/
public function update(String $orderId, Request $request , UpdateTrackingNumberLogic $logic){
$logic->execute($orderId, $request);
}
}
@@ -2,7 +2,13 @@
namespace App\Http\Controllers\Orders; namespace App\Http\Controllers\Orders;
use App\Classes\Modules\ControllersLogic\Orders\UpdateOrderStepLogic; use App\Classes\Constants;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\DataTransferObjects\TrackingNumberObject;
use App\Classes\Modules\Orders\DataTransferObjects\StepObject;
use App\Classes\Modules\Orders\Processors\WarehouseReceivesOrder;
use App\Classes\Modules\Orders\Services\Attachments\UpdatesTrackingNumber;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class BulkReceiveNotesController class BulkReceiveNotesController
@@ -10,16 +16,22 @@ class BulkReceiveNotesController
/** /**
* @param Request $request * @param Request $request
* @param UpdateOrderStepLogic $logic * @param UpdatesTrackingNumber $updatesTrackingNumber
* @return void * @throws InternalServerErrorException
* @throws \ReflectionException
*/ */
public function create(Request $request, UpdateOrderStepLogic $logic){ public function create(Request $request, UpdatesTrackingNumber $updatesTrackingNumber) {
$receiveDate = $request->input('receive_date');
foreach ($request->input('orders') as $note){ try{
$requestObject = new Request(); foreach ($request->input('orders') as $note){
$requestObject->merge(['tracking_number' => $note['tracking_number'], 'receive_date' => $receiveDate]); $orderObject = new OrderObject($note['id']);
$logic->execute($note['id'], $requestObject);
$trackingNumberObject = new TrackingNumberObject(0, $note['tracking_number']);
$updatesTrackingNumber->execute($orderObject, $trackingNumberObject);
(new WarehouseReceivesOrder($note['id'], $request->input('receive_date')))->execute();
}
} catch (\Exception $exception){
throw new InternalServerErrorException($exception->getMessage());
} }
} }
@@ -1,22 +0,0 @@
<?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,20 @@
<?php
namespace App\Http\Controllers\Orders;
use App\Classes\Modules\ControllersLogic\Orders\UpdateWarehouseLogic;
use Illuminate\Http\Request;
class UpdateWarehouseController
{
/**
* @param String $orderId
* @param Request $request
* @param UpdateWarehouseLogic $logic
* @throws \App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException
*/
public function update(String $orderId, Request $request , UpdateWarehouseLogic $logic){
$logic->execute($orderId, $request);
}
}
+1 -3
View File
@@ -14,7 +14,6 @@ class Contact extends JsonResource
*/ */
public function toArray($request) public function toArray($request)
{ {
$comapny = \App\Models\Company::findOrFail($this->reference_id);
return [ return [
'id' => $this->id, 'id' => $this->id,
'type' => $this->type, 'type' => $this->type,
@@ -22,8 +21,7 @@ class Contact extends JsonResource
'name' => $this->name, 'name' => $this->name,
'designation' => $this->designation, 'designation' => $this->designation,
'contact' => $this->contact, 'contact' => $this->contact,
'email' => $this->email, 'email' => $this->email
'company' => Company::make($comapny)
]; ];
} }
} }
@@ -0,0 +1,29 @@
<?php
namespace App\Http\Resources;
use App\Classes\Constants;
use App\Models\Schedule as ScheduleModel;
use App\Models\Contact as ContactModel;
use App\Models\TrackingNumber;
use Illuminate\Http\Resources\Json\JsonResource;
class DeliveryArrangement extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'type' => (int)$this->type,
'vehicle_no' => $this->vehicle_no,
'schedule' => Schedule::collection(ScheduleModel::where('arrangement_id', $this->id)->where('type', 1)->orderBy('created_at', 'desc')->get()),
'tracking' => TrackingNumber::where('order_id', $this->order_id)->where('type', 1)->first(),
'contact' => new Contact(ContactModel::where('type', Constants::MODULE_TYPES['driver'])->where('reference_id', $this->id)->first())
];
}
}
+11 -6
View File
@@ -8,7 +8,10 @@ use App\Classes\Modules\Steps\StepAttachments;
use App\Models\OrderStep; use App\Models\OrderStep;
use App\Http\Resources\OrderStep as OrderStepResource; use App\Http\Resources\OrderStep as OrderStepResource;
use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Http\Resources\Json\JsonResource;
use App\Models\AddressBook; use App\Models\AddressBook as AddressBookModel;
use App\Models\DeliveryArrangement as DeliveryArrangementModel;
use App\Models\PackingList as PackingListModel;
use App\Models\ShippingArrangement as ShippingArrangementModel;
class Order extends JsonResource class Order extends JsonResource
{ {
@@ -20,23 +23,25 @@ class Order extends JsonResource
*/ */
public function toArray($request) public function toArray($request)
{ {
$addressBook = AddressBook::find($this->address_id)->first(); $addressBook = AddressBookModel::where('id', $this->address_id)->first();
return [ return [
'id' => $this->id, 'id' => $this->id,
'company_id' => $this->company_id,
'marking' => $this->marking, 'marking' => $this->marking,
'forwarder_id' => $this->forwarder_id, 'forwarder_id' => $this->forwarder_id,
'supplier_id' => $this->supplier_id, 'supplier_id' => $this->supplier_id,
'warehouse_id' => $this->warehouse_id, 'warehouse_id' => $this->warehouse_id,
'address' => new \App\Http\Resources\AddressBook($addressBook), 'address' => new AddressBook($addressBook),
'complete' => (float)$this->complete, 'complete' => (int)$this->complete,
'date' => $this->created_at->format('d/m/Y'), 'date' => $this->created_at->format('d/m/Y'),
'current_step' => [ 'current_step' => [
'details' => (new GetStep())->execute($this->current_step), 'details' => (new GetStep())->execute($this->current_step),
'attachments' => (new StepAttachments())->execute($this->id, $this->current_step) 'attachments' => (new StepAttachments())->execute($this->id, $this->current_step)
], ],
'steps' => OrderStepResource::collection(OrderStep::where('order_id', $this->id)->orderBy('sequence')->get()), 'steps' => OrderStepResource::collection(OrderStep::where('order_id', $this->id)->orderBy('sequence')->get()),
'details' => (new ListsOrderHistory())->execute($this->id, $this->created_at, $this->complete, $this->updated_at) 'details' => (new ListsOrderHistory())->execute($this->id, $this->created_at, $this->complete, $this->updated_at),
'packing_list' => new PackingList(PackingListModel::where('order_id', $this->id)->first()),
'shipping_arrangement' => new ShippingArrangement(ShippingArrangementModel::where('order_id', $this->id)->first()),
'delivery_arrangement' => new DeliveryArrangement(DeliveryArrangementModel::where('order_id', $this->id)->first())
]; ];
} }
+5 -4
View File
@@ -16,10 +16,11 @@ class Package extends JsonResource
{ {
return [ return [
'description' => $this->description, 'description' => $this->description,
'width' => $this->width, 'type' => (int)$this->type,
'length' => $this->length, 'width' => (float)$this->width,
'height' => $this->height, 'length' => (float)$this->length,
'quantity' => $this->quantity 'height' => (float)$this->height,
'quantity' => (int)$this->quantity
]; ];
} }
} }
+1 -1
View File
@@ -17,7 +17,7 @@ class PackingList extends JsonResource
{ {
return [ return [
'reference_no' => $this->reference_no, 'reference_no' => $this->reference_no,
'confirmed' => $this->confirmed, 'confirmed' => (int)$this->confirmed,
'packages' => Package::collection(PackageModel::where('list_id', $this->id)->get()) 'packages' => Package::collection(PackageModel::where('list_id', $this->id)->get())
]; ];
} }
@@ -2,9 +2,10 @@
namespace App\Http\Resources; namespace App\Http\Resources;
use Carbon\Carbon;
use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Http\Resources\Json\JsonResource;
class ShippingSchedule extends JsonResource class Schedule extends JsonResource
{ {
/** /**
* Transform the resource into an array. * Transform the resource into an array.
@@ -15,9 +16,10 @@ class ShippingSchedule extends JsonResource
public function toArray($request) public function toArray($request)
{ {
return [ return [
'ETD' => $this->ETD, 'ETD' => carbon::parse($this->ETD)->format('d-m-Y'),
'ETA' => $this->ETA, 'ETA' => carbon::parse($this->ETA)->format('d-m-Y'),
'status' => $this->status 'status' => (int)$this->status,
'issue_remark' => $this->issue_remark
]; ];
} }
} }
+2 -2
View File
@@ -2,7 +2,7 @@
namespace App\Http\Resources; namespace App\Http\Resources;
use App\Models\ShippingSchedule as ShippingScheduleModel; use App\Models\Schedule as ScheduleModel;
use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Http\Resources\Json\JsonResource;
class ShippingArrangement extends JsonResource class ShippingArrangement extends JsonResource
@@ -18,7 +18,7 @@ class ShippingArrangement extends JsonResource
return [ return [
'container_no' => $this->container_no, 'container_no' => $this->container_no,
'seal_no' => $this->seal_no, 'seal_no' => $this->seal_no,
'schedule' => ShippingSchedule::collection(ShippingScheduleModel::where('arrangement_id', $this->id)->where('status', 0)->get()) 'schedule' => Schedule::collection(ScheduleModel::where('arrangement_id', $this->id)->where('type', 0)->orderBy('created_at', 'desc')->get())
]; ];
} }
} }
+1 -1
View File
@@ -13,6 +13,6 @@ class CustomIssues extends AbstractModel
public function shippingSchedule() public function shippingSchedule()
{ {
return $this->belongsTo(ShippingSchedule::class, 'schedule_id'); return $this->belongsTo(Schedule::class, 'schedule_id');
} }
} }
@@ -4,18 +4,16 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
class ReceiveNote extends Model class DeliveryArrangement extends Model
{ {
protected $table = 'delivery_arrangements';
protected $table = 'receive_notes';
protected $fillable = [ protected $fillable = [
'order_id', 'tracking_no', 'receive_date' 'order_id', 'type', 'vehicle_no'
]; ];
public function order() public function order()
{ {
return $this->belongsTo(Order::class, 'order_id'); return $this->belongsTo(Order::class, 'order_id');
} }
} }
+5 -5
View File
@@ -20,11 +20,6 @@ class Order extends AbstractModel
return $this->hasMany(OrderStep::class, 'order_id'); return $this->hasMany(OrderStep::class, 'order_id');
} }
public function receiveNotes()
{
return $this->hasOne(ReceiveNote::class, 'order_id');
}
public function packingLists() public function packingLists()
{ {
return $this->hasOne(PackingList::class, 'order_id'); return $this->hasOne(PackingList::class, 'order_id');
@@ -34,4 +29,9 @@ class Order extends AbstractModel
{ {
return $this->hasOne(ShippingArrangement::class, 'order_id'); return $this->hasOne(ShippingArrangement::class, 'order_id');
} }
public function deliveryArrangement()
{
return $this->hasOne(DeliveryArrangement::class, 'order_id');
}
} }
+1 -1
View File
@@ -8,7 +8,7 @@ class Package extends AbstractModel
protected $table = 'packages'; protected $table = 'packages';
protected $fillable = [ protected $fillable = [
'list_id', 'description', 'width', 'length', 'height', 'quantity' 'list_id', 'description', 'type', 'width', 'length', 'height', 'weight', 'quantity'
]; ];
public function packingList() public function packingList()
@@ -3,13 +3,13 @@
namespace App\Models; namespace App\Models;
class ShippingSchedule extends AbstractModel class Schedule extends AbstractModel
{ {
protected $table = 'shipping_schedules'; protected $table = 'schedules';
protected $fillable = [ protected $fillable = [
'arrangement_id', 'ETD', 'ETA', 'status' 'arrangement_id', 'type', 'ETD', 'ETA', 'status', 'issue_remark'
]; ];
public function shippingArrangement() public function shippingArrangement()
-5
View File
@@ -11,11 +11,6 @@ class ShippingArrangement extends AbstractModel
'order_id', 'container_no', 'seal_no' 'order_id', 'container_no', 'seal_no'
]; ];
public function shippingSchedule()
{
return $this->hasMany(ShippingSchedule::class, 'arrangement_id');
}
public function order() public function order()
{ {
return $this->belongsTo(Order::class, 'order_id'); return $this->belongsTo(Order::class, 'order_id');
+21
View File
@@ -0,0 +1,21 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class TrackingNumber extends Model
{
protected $table = 'tracking_numbers';
protected $fillable = [
'order_id', 'type', 'courier', 'tracking_no'
];
public function order()
{
return $this->belongsTo(Order::class, 'order_id');
}
}
-27
View File
@@ -1,27 +0,0 @@
<?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,12 +15,12 @@ class CreateContactsTable extends Migration
{ {
Schema::create('contacts', function (Blueprint $table) { Schema::create('contacts', function (Blueprint $table) {
$table->increments('id'); $table->increments('id');
$table->string('type'); $table->integer('type');
$table->string('reference_id'); $table->string('reference_id');
$table->string('name'); $table->string('name');
$table->string('designation'); $table->string('designation')->nullable();
$table->string('contact'); $table->string('contact');
$table->string('email'); $table->string('email')->nullable();
$table->timestamps(); $table->timestamps();
}); });
} }
@@ -22,7 +22,7 @@ class CreateOrdersTable extends Migration
$table->string('warehouse_id')->nullable(); $table->string('warehouse_id')->nullable();
$table->string('address_id'); $table->string('address_id');
$table->string('current_step')->nullable(); $table->string('current_step')->nullable();
$table->integer('complete')->default(0); $table->boolean('complete')->default(0);
$table->softDeletes(); $table->softDeletes();
$table->timestamps(); $table->timestamps();
@@ -18,8 +18,8 @@ class CreateOrderStepsTable extends Migration
$table->integer('order_id')->unsigned()->index(); $table->integer('order_id')->unsigned()->index();
$table->string('reference_id'); $table->string('reference_id');
$table->integer('primary')->default(0); $table->integer('primary')->default(0);
$table->decimal('sequence'); $table->decimal('sequence', 4, 2);
$table->integer('complete')->default(0); $table->boolean('complete')->default(0);
$table->date('complete_date')->nullable(); $table->date('complete_date')->nullable();
$table->timestamps(); $table->timestamps();
@@ -4,7 +4,7 @@ use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Migrations\Migration;
class CreateReceiveNotesTable extends Migration class CreateTrackingNumbersTable extends Migration
{ {
/** /**
* Run the migrations. * Run the migrations.
@@ -13,9 +13,11 @@ class CreateReceiveNotesTable extends Migration
*/ */
public function up() public function up()
{ {
Schema::create('receive_notes', function (Blueprint $table) { Schema::create('tracking_numbers', function (Blueprint $table) {
$table->increments('id'); $table->increments('id');
$table->integer('order_id')->unsigned()->index(); $table->integer('order_id')->unsigned()->index();
$table->integer('type');
$table->string('courier')->nullable();
$table->string('tracking_no'); $table->string('tracking_no');
$table->timestamps(); $table->timestamps();
@@ -17,10 +17,11 @@ class CreatePackages extends Migration
$table->increments('id'); $table->increments('id');
$table->integer('list_id')->unsigned()->index(); $table->integer('list_id')->unsigned()->index();
$table->integer('type')->default(0); $table->integer('type')->default(0);
$table->string('description'); $table->string('description')->nullable();
$table->integer('width'); $table->decimal('width', 5, 3);
$table->integer('length'); $table->decimal('length', 5, 3);
$table->integer('height'); $table->decimal('height', 5, 3);
$table->integer('weight')->default(0);
$table->integer('quantity'); $table->integer('quantity');
$table->timestamps(); $table->timestamps();
@@ -16,6 +16,7 @@ class CreateShippingArrangementsTable extends Migration
Schema::create('shipping_arrangements', function (Blueprint $table) { Schema::create('shipping_arrangements', function (Blueprint $table) {
$table->increments('id'); $table->increments('id');
$table->integer('order_id')->unsigned()->index(); $table->integer('order_id')->unsigned()->index();
$table->integer('type')->default(0);
$table->string('container_no'); $table->string('container_no');
$table->string('seal_no'); $table->string('seal_no');
$table->timestamps(); $table->timestamps();
@@ -4,7 +4,7 @@ use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Migrations\Migration;
class CreateShippingSchedulesTable extends Migration class CreateSchedulesTable extends Migration
{ {
/** /**
* Run the migrations. * Run the migrations.
@@ -13,15 +13,16 @@ class CreateShippingSchedulesTable extends Migration
*/ */
public function up() public function up()
{ {
Schema::create('shipping_schedules', function (Blueprint $table) { Schema::create('schedules', function (Blueprint $table) {
$table->increments('id'); $table->increments('id');
$table->integer('arrangement_id')->unsigned()->index(); $table->integer('type');
$table->integer('arrangement_id');
$table->date('ETD'); $table->date('ETD');
$table->date('ETA'); $table->date('ETA');
$table->integer('status')->default(0); $table->integer('status')->default(0);
$table->string('issue_remark')->nullable();
$table->timestamps(); $table->timestamps();
$table->foreign('arrangement_id')->references('id')->on('shipping_arrangements');
}); });
} }
@@ -4,7 +4,7 @@ use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Migrations\Migration;
class CreateCustomIssuesTable extends Migration class CreateDeliveryArrangements extends Migration
{ {
/** /**
* Run the migrations. * Run the migrations.
@@ -13,13 +13,14 @@ class CreateCustomIssuesTable extends Migration
*/ */
public function up() public function up()
{ {
Schema::create('custom_issues', function (Blueprint $table) { Schema::create('delivery_arrangements', function (Blueprint $table) {
$table->increments('id'); $table->increments('id');
$table->integer('schedule_id')->unsigned()->index(); $table->integer('order_id')->unsigned()->index();
$table->text('remark'); $table->integer('type')->default(0);
$table->string('vehicle_no')->nullable();
$table->timestamps(); $table->timestamps();
// $table->foreign('schedule_id')->references('id')->on('shipping_schedule'); $table->foreign('order_id')->references('id')->on('orders');
}); });
} }
@@ -30,6 +31,6 @@ class CreateCustomIssuesTable extends Migration
*/ */
public function down() public function down()
{ {
Schema::dropIfExists('custom_issues'); Schema::dropIfExists('delivery_arrangements');
} }
} }
+1 -1
View File
@@ -49,7 +49,7 @@
"devDependencies": { "devDependencies": {
"axios": "^0.18", "axios": "^0.18",
"bootstrap": "^4.0.0", "bootstrap": "^4.0.0",
"cross-env": "^5.1", "cross-env": "^5.2.0",
"del": "^3.0.0", "del": "^3.0.0",
"fancy-log": "^1.3.0", "fancy-log": "^1.3.0",
"gulp": "^3.9.1", "gulp": "^3.9.1",
+46 -42
View File
@@ -1,52 +1,56 @@
export default Object.freeze({ export default Object.freeze({
ORDER: Object.freeze({ ORDER: Object.freeze({
ORDER_CREATED: Object.freeze({ CREATED: Object.freeze({
TITLE: 'Orders Created Successfully', TITLE: 'Create order',
MESSAGE: 'Orders have been created successfully' MESSAGE: 'Orders has been created successfully'
}), }),
ORDER_WAREHOUSE_CONFIRMED: Object.freeze({ WAREHOUSE_CONFIRMED: Object.freeze({
TITLE: 'Warehouse Successfully confirmed', TITLE: 'Confirm warehouse',
MESSAGE: 'Warehouse have been confirmed successfully' MESSAGE: 'Order\'s warehouse has been confirmed successfully'
}),
PACKING_LIST_NOTIFICATION: Object.freeze({
TITLE: 'Packing list Successfully created',
MESSAGE: 'Packing list have been created',
UPDATE: Object.freeze({
TITLE: 'Packing list Successfully Updated',
MESSAGE: 'Packing list have been updated'
})
}),
ORDER_PACKED: Object.freeze({
TITLE: 'Order Successfully Packed',
MESSAGE: 'Order have been packed successfully'
}),
SHIPPING_ARRANGEMENT: Object.freeze({
TITLE: 'Shipping Arrangement Successfully Created',
MESSAGE: 'Shipping Arrangement have been created successfully',
RESCHEDULE: Object.freeze({
TITLE: 'Shipping Arrangement Successfully Rescheduled',
MESSAGE: 'Shipping Arrangement have been rescheduled successfully'
})
}),
PORT_ARRIVAL: Object.freeze({
TITLE: 'Port Arrival Successfully Confirmed',
MESSAGE: 'Port Arrival have been confirmed successfully'
}),
WAREHOUSE_ARRIVAL: Object.freeze({
TITLE: 'Warehouse Arrival Successfully Confirmed',
MESSAGE: 'Warehouse Arrival have been confirmed successfully'
}), }),
WAREHOUSE_RECEIVE: Object.freeze({ WAREHOUSE_RECEIVE: Object.freeze({
TITLE: 'Warehouse Received Confirmed', TITLE: 'Receive note',
MESSAGE: 'Warehouse Received have been confirmed' MESSAGE: 'Warehouse has received the order successfully'
}), }),
ORDER_UNPACKED: Object.freeze({ PACKING_LIST: Object.freeze({
TITLE: 'Order Successfully Unpacked', TITLE: 'Packing list',
MESSAGE: 'Order have been unpacked successfully' MESSAGE: 'Packing list has been updated successfully'
}), }),
OUT_FOR_DELIVERY: Object.freeze({ PACKED: Object.freeze({
TITLE: 'Out For Delivery Successfully Confirmed', TITLE: 'Pack order',
MESSAGE: 'Out For Delivery have been confirmed successfully' MESSAGE: 'Order has been packed successfully'
}),
SHIPPING_ARRANGEMENT: Object.freeze({
TITLE: 'Shipping arrangement',
MESSAGE: 'Shipping arrangement has been updated successfully'
}),
SHIPPING_RESCHEDULE: Object.freeze({
TITLE: 'Reschedule shipping arrangement',
MESSAGE: 'Shipping arrangement has been rescheduled successfully'
}),
PORT_ARRIVAL: Object.freeze({
TITLE: 'Port arrival',
MESSAGE: 'Order has arrived to port successfully'
}),
WAREHOUSE_ARRIVAL: Object.freeze({
TITLE: 'Warehouse arrival',
MESSAGE: 'Order has arrived to warehouse successfully'
}),
UNPACKED: Object.freeze({
TITLE: 'Unpack Order',
MESSAGE: 'Order has been unpacked successfully'
}),
DELIVERY_ARRANGEMENT: Object.freeze({
TITLE: 'Delivery arrangement',
MESSAGE: 'Delivery arrangement has been updated successfully'
}),
DELIVERY_RESCHEDULE: Object.freeze({
TITLE: 'Reschedule delivery arrangement',
MESSAGE: 'Delivery arrangement has been rescheduled successfully'
}),
COMPLETE: Object.freeze({
TITLE: 'Order complete',
MESSAGE: 'Order has been delivered successfully'
}) })
}), }),
IMPORTER: Object.freeze({ IMPORTER: Object.freeze({
+12 -9
View File
@@ -26,13 +26,16 @@ $(function() {
if(type){ $(this).parents('.parentContainer').find('.modalContainer[data-type="'+type+'"]').modal('show'); } if(type){ $(this).parents('.parentContainer').find('.modalContainer[data-type="'+type+'"]').modal('show'); }
}); });
VANTA.BIRDS({ if($('#maintenanceContainer').length >0 ){
el: "#maintenanceContainer", VANTA.BIRDS({
backgroundColor: 0xf9f9f9, el: "#maintenanceContainer",
wingSpan: 40.00, backgroundColor: 0xf9f9f9,
separation: 100.00, wingSpan: 40.00,
alignment: 100.00, separation: 100.00,
cohesion: 100.00, alignment: 100.00,
quantity: 2.00 cohesion: 100.00,
}) quantity: 2.00
})
}
}); });
+4
View File
@@ -4,6 +4,10 @@ $(function() {
return regex.test(value); return regex.test(value);
}, "Please enter a valid email address"); }, "Please enter a valid email address");
$.validator.addMethod("minDate", function(value, element, params) {
return (moment(value, "DD-MM-YYYY") > moment(params, "DD-MM-YYYY"))
});
$("#registration-form").validate({ $("#registration-form").validate({
rules: { rules: {
first_name: "required", first_name: "required",
+44 -34
View File
@@ -84,9 +84,12 @@ Vue.component('order-profile-component', require('./components/order/elements/Or
Vue.component('order-header-component', require('./components/order/elements/OrderHeaderComponenet.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-action-component', require('./components/order/elements/OrderActionComponenet.vue'));
Vue.component('order-delivery-address-component', require('./components/order/elements/OrderDeliveryAddressComponenet.vue')); Vue.component('order-delivery-address-component', require('./components/order/elements/OrderDeliveryAddressComponenet.vue'));
Vue.component('order-history-component', require('./components/order/elements/OrderHistoryComponenet.vue'));
Vue.component('order-quick-view-component', require('./components/order/elements/OrderQuickViewComponenet.vue')); Vue.component('order-quick-view-component', require('./components/order/elements/OrderQuickViewComponenet.vue'));
Vue.component('action-date-component', require('./components/order/elements/steps/ActionDateComponenet.vue'));
Vue.component('confirm-order-component', require('./components/order/elements/steps/ConfirmOrderComponent.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('receive-step-component', require('./components/order/elements/steps/ReceiveStepComponenet.vue'));
Vue.component('packing-step-component', require('./components/order/elements/steps/PackingStepComponenet.vue')); Vue.component('packing-step-component', require('./components/order/elements/steps/PackingStepComponenet.vue'));
@@ -109,6 +112,9 @@ Vue.component('warehouse-form-component', require('./components/warehouse/forms/
Vue.component('order-form-component', require('./components/order/forms/OrderFormComponent.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('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('warehouse-receive-note-form-component', require('./components/order/forms/WarehouseReceiveNoteFormComponent.vue'));
Vue.component('packing-list-form-component', require('./components/order/forms/PackingFormComponenet.vue'));
Vue.component('shipping-arrangement-form-component', require('./components/order/forms/ShippingArrangmentFormComponenet.vue'));
Vue.component('delivery-arrangement-form-component', require('./components/order/forms/DeliveryArrangmentFormComponenet.vue'));
Vue.component('notification-component', require('./components/common/NotificationComponent.vue')); Vue.component('notification-component', require('./components/common/NotificationComponent.vue'));
@@ -122,39 +128,43 @@ Vue.component('order-status-chart-component', require('./components/dashboard/el
window.Event = new Vue(); window.Event = new Vue();
const header = new Vue({ if($('#header').length >0 ) {
el: '#header' const header = new Vue({
}); el: '#header'
});
}
const app = new Vue({ if($('#app').length >0 ) {
el: '#app', const app = new Vue({
provide() { el: '#app',
const countriesList = {}; provide() {
Object.defineProperty(countriesList, 'countries', { const countriesList = {};
enumerable: true, Object.defineProperty(countriesList, 'countries', {
get: () => this.countries enumerable: true,
}); get: () => this.countries
return { });
countriesList return {
countriesList
}
},
data() {
return {
countries: []
}
},
created() {
this.fetchCountries();
},
methods: {
fetchCountries() {
fetch(route('api.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))
}
} }
}, });
data() { }
return {
countries: []
}
},
created(){
this.fetchCountries();
},
methods: {
fetchCountries(){
fetch(route('api.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))
}
}
});
@@ -10,7 +10,16 @@
<h6 v-html="this.title"></h6> <h6 v-html="this.title"></h6>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<p class="no-margin" v-html="this.message"></p> <div class="row">
<div class="col">
<p class="no-margin" v-html="this.message"></p>
</div>
</div>
<div class="row">
<div class="col">
<slot></slot>
</div>
</div>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-sm btn-default" data-dismiss="modal"> <button type="button" class="btn btn-sm btn-default" data-dismiss="modal">
@@ -1,9 +1,15 @@
<template> <template>
<input type="text" class="form-control" :value="value"> <input type="text" class="form-control" :value="date">
</template> </template>
<script> <script>
export default { export default {
props: ['value'],
data() {
return {
date: this.value
}
},
mounted: function() { mounted: function() {
let vm = this; let vm = this;
$(this.$el).datepicker({ $(this.$el).datepicker({
@@ -12,12 +18,13 @@
todayBtn: true, todayBtn: true,
todayHighlight: true todayHighlight: true
}).on('changeDate',function(event){ }).on('changeDate',function(event){
if(event.target.value !== ''){ vm.$emit('input', event.target.value);
vm.$emit('updateDate', event.target.value)
}
}) })
}, },
props: ['value'] watch: {
'value': function() {
this.date = this.value;
}
},
} }
</script> </script>
@@ -1,6 +1,6 @@
<template> <template>
<div class="modal fade modalContainer" :class="this.effect" :data-type="this.type"> <div class="modal fade modalContainer" :class="this.effect" :data-type="this.type">
<div class="modal-dialog" v-bind:class="{'modal-lg': this.large}" > <div class="modal-dialog" v-bind:class="[{'modal-lg': this.large}, {'modal-sm': this.small}]" >
<div class="modal-content-wrapper"> <div class="modal-content-wrapper">
<div class="modal-content"> <div class="modal-content">
<div class="modal-body"> <div class="modal-body">
@@ -22,6 +22,10 @@
type: Boolean, type: Boolean,
default: false default: false
}, },
'small': {
type: Boolean,
default: false
},
'effect': { 'effect': {
type: String, type: String,
default: "stick-up" default: "stick-up"
@@ -16,6 +16,7 @@
export default { export default {
data() { data() {
return { return {
type: 'success',
title: '', title: '',
message: '' message: ''
} }
@@ -28,7 +29,7 @@
let content = this.$refs.content; let content = this.$refs.content;
new Noty({ new Noty({
type: 'success', type: this.type,
text: content.innerHTML.toString(), text: content.innerHTML.toString(),
timeout: 5000, timeout: 5000,
closeWith: ['button'], closeWith: ['button'],
@@ -141,7 +141,7 @@
</div> </div>
</div> </div>
<div class="tab-pane" id="address-book"> <div class="tab-pane" id="address-book">
<address-list-componenet :data="companyId"></address-list-componenet> <address-book-list-component :data="companyId"></address-book-list-component>
</div> </div>
<div class="tab-pane" id="profile"> <div class="tab-pane" id="profile">
<ul class="nav nav-tabs nav-tabs-simple" role="tablist" data-init-reponsive-tabs="dropdownfx"> <ul class="nav nav-tabs nav-tabs-simple" role="tablist" data-init-reponsive-tabs="dropdownfx">
@@ -173,9 +173,7 @@
</template> </template>
<script> <script>
import AddressListComponenet from "../lists/AddressListComponenet";
export default { export default {
components: {AddressListComponenet},
props: ['data'], props: ['data'],
data() { data() {
return { return {
@@ -1,13 +1,14 @@
<template> <template>
<div class="row"> <div class="row">
<notification-component ref="notification"></notification-component>
<div class="col p-t-10 p-b-10"> <div class="col p-t-10 p-b-10">
<div class="row no-margin align-items-center justify-content-center"> <div class="row no-margin align-items-center justify-content-center">
<div class="col"> <div class="col">
<small class="text-danger fs-10 requestModal pointer" data-type="delete"><i class="fa fa-times"></i> delete order</small> <small class="text-danger fs-10 requestModal pointer" data-type="delete"><i class="fa fa-times"></i> delete order</small>
</div> </div>
<div class="col-auto"> <div class="col-auto">
<component :is="stepComponent(this.order.current_step.details.reference_id)" :attachments="this.order.current_step.attachments" :data="this.order.id"></component> <component v-if="this.order.current_step.details" v-on:updateStep="updateOrderStep($event)" :is="stepComponent(this.order.current_step.details.reference_id)" :attachments="this.order.current_step.attachments" :data="this.order.id"></component>
<div class="btn btn-sm btn-default b-rad-none">View Details</div> <a class="btn btn-sm btn-default b-rad-none" :href="route('order.profile', {orderId: this.order.id})">View Details</a>
</div> </div>
</div> </div>
<confirm-modal-component <confirm-modal-component
@@ -22,6 +23,7 @@
</template> </template>
<script> <script>
import notificationConstant from '../../../../js/notification';
export default { export default {
props: { props: {
'data': { 'data': {
@@ -36,9 +38,42 @@
watch: { watch: {
'data': function() { 'data': function() {
this.order = this.data; this.order = this.data;
},
'data.current_step.attachments': function() {
this.order = this.data;
} }
}, },
methods: { methods: {
route: route,
updateOrderStep(event){
let notification = this.$refs.notification;
fetch(route('api.order.step.update', {orderId: this.data}), {
method: 'post',
responseType: 'json',
body: JSON.stringify({'complete_date': event.complete_date}),
headers: {
'content-type': 'application/json'
}
}).then(response => {
if(!response.ok){ throw response }
return response.json()
}).then( () => {
notification.title = notificationConstant.ORDER[event.type].TITLE;
notification.message = notificationConstant.ORDER[event.type].MESSAGE;
notification.execute();
Event.$emit('updateOrdersList');
}).catch(error => {
error.json().then( error => {
notification.type = 'error';
notification.title = notificationConstant.ORDER[event.type].TITLE;
notification.message = error.message;
notification.execute();
})
})
},
deleteOrder(){ deleteOrder(){
fetch(route('api.order.delete', {'id': this.data}), { fetch(route('api.order.delete', {'id': this.data}), {
method: 'delete' method: 'delete'
@@ -0,0 +1,40 @@
<template>
<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" :class="[{'text-danger': detail.type === 0}, {'text-success': detail.type === 2}, {'bold': detail.type === 2}]">
<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 lh-20" v-html="detail.description"></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>
@@ -1,12 +1,12 @@
<template> <template>
<div class="row m-t-30"> <div class="row m-t-30 p-b-20" v-if="this.order">
<div class="col"> <div class="col">
<div class="row m-b-50"> <div class="row m-b-50">
<div class="col"> <div class="col">
<div class="row m-b-30"> <div class="row m-b-30">
<div class="col text-center"> <div class="col text-center">
<h2 class="all-caps">Order No: <span class="text-primary bold">#{{this.order.marking}}</span></h2> <h2 class="all-caps">Order No: <span class="text-primary bold">#{{this.order.marking}}</span></h2>
<p class="all-caps">{{this.order.current_step.details.description}}</p> <p class="all-caps" v-if="order.current_step.details">{{this.order.current_step.details.description}}</p>
</div> </div>
</div> </div>
<div class="row align-items-center justify-content-center"> <div class="row align-items-center justify-content-center">
@@ -172,23 +172,23 @@
<div class="tab-pane fade show active" id="overview"> <div class="tab-pane fade show active" id="overview">
<div class="row no-margin"> <div class="row no-margin">
<div class="col"> <div class="col">
<div class="row fs-12"> <div class="row fs-12 parentContainer ">
<div class="col"> <div class="col">
<div class="row bg-white all-caps muted p-t-10 p-b-10 b-b b-grey"> <div class="row bg-white all-caps muted p-t-10 p-b-10 b-b b-grey">
<div class="col"> <div class="col">
<small class="bold all-caps">Packing List</small> <small class="bold all-caps">Packing List</small>
</div> </div>
<div class="col text-right"> <div class="col text-right">
<small class="all-caps text-complete pointer">Edit List</small> <small class="all-caps text-complete pointer requestModal" data-type="packingList">Edit List</small>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<div class="row align-items-center justify-content-center b-b b-grey"> <div class="row align-items-center justify-content-center b-b b-grey" v-for="(package, index) in order.packing_list.packages">
<div class="col-4 bg-white p-t-15 p-b-15 b-r b-grey"><small class="text-info bold all-caps">1. 玄关/家</small></div> <div class="col-4 bg-white p-t-15 p-b-15 b-r b-grey"><small class="text-info bold all-caps">{{index + 1}}. {{package.description}}</small></div>
<div class="col-1"></div> <div class="col-1"></div>
<div class="col-3"> <div class="col-3">
<svg xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" width="15" height="15" viewBox="0 0 192 192" style="fill: rgb(0, 0, 0);"> <svg v-if="package.type === 0" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" width="15" height="15" viewBox="0 0 192 192" style="fill: rgb(0, 0, 0);">
<g fill="none" fill-rule="nonzero" stroke="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="10" stroke-dasharray="" stroke-dashoffset="0" font-family="none" font-weight="none" font-size="none" text-anchor="none" style="mix-blend-mode: normal;"> <g fill="none" fill-rule="nonzero" stroke="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="10" stroke-dasharray="" stroke-dashoffset="0" font-family="none" font-weight="none" font-size="none" text-anchor="none" style="mix-blend-mode: normal;">
<path d="M0,192v-192h192v192z" fill="none"></path> <path d="M0,192v-192h192v192z" fill="none"></path>
<g fill="#4d6286"> <g fill="#4d6286">
@@ -196,50 +196,7 @@
</g> </g>
</g> </g>
</svg> </svg>
<small class="m-l-5 m-r-5 text-info hint-text">x</small> <svg v-if="package.type === 1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" width="15" height="15" viewBox="0 0 192 192" style=" fill:#000000;">
<small class="bold text-info">12</small>
</div>
<div class="col text-right"><small class="muted bold">300 x 300 x 300 cm</small></div>
</div>
<div class="row align-items-center justify-content-center b-b b-grey">
<div class="col-4 bg-white p-t-15 p-b-15 b-r b-grey"><small class="text-info bold all-caps">1. 玄关/家</small></div>
<div class="col-1"></div>
<div class="col-3">
<svg xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" width="15" height="15" viewBox="0 0 192 192" style="fill: rgb(0, 0, 0);">
<g fill="none" fill-rule="nonzero" stroke="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="10" stroke-dasharray="" stroke-dashoffset="0" font-family="none" font-weight="none" font-size="none" text-anchor="none" style="mix-blend-mode: normal;">
<path d="M0,192v-192h192v192z" fill="none"></path>
<g fill="#4d6286">
<path d="M187.5,43.05l-50.7,-18c-1.2,-0.45 -2.4,-0.3 -3.45,0.15c-1.65,0.75 -89.85,31.95 -89.85,31.95c-2.25,0.75 -3.75,2.85 -3.75,5.25v21c0,1.95 1.2,3.6 3,4.2l11.7,4.2c3,1.05 6,-1.05 6,-4.2v-17.55c0,-2.4 1.5,-4.5 3.75,-5.25l79.65,-27.6l28.8,10.2l-78.15,27.45v0c-1.65,0.6 -3,2.25 -3,4.2v91.2l-81,-28.65v-91.2l87,-30.75c2.4,-0.9 3.6,-3.45 2.7,-5.7c-0.9,-2.4 -3.45,-3.6 -5.7,-2.7l-90,31.8c-1.8,0.6 -3,2.4 -3,4.2v97.5c0,1.95 1.2,3.6 3,4.2l90,31.8c0.45,0.15 1.05,0.3 1.5,0.3c0.3,0 0.45,0 0.75,0h0.15c0.15,0 0.3,-0.15 0.6,-0.15v0l90,-31.8c1.8,-0.6 3,-2.4 3,-4.2v-97.5v0c0,-2.1 -1.2,-3.75 -3,-4.35z"></path>
</g>
</g>
</svg>
<small class="m-l-5 m-r-5 text-info hint-text">x</small>
<small class="bold text-info">12</small>
</div>
<div class="col text-right"><small class="muted bold">300 x 300 x 300 cm</small></div>
</div>
<div class="row align-items-center justify-content-center b-b b-grey">
<div class="col-4 bg-white p-t-15 p-b-15 b-r b-grey"><small class="text-info bold all-caps">1. 玄关/家</small></div>
<div class="col-1"></div>
<div class="col-3">
<svg xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" width="15" height="15" viewBox="0 0 192 192" style="fill: rgb(0, 0, 0);">
<g fill="none" fill-rule="nonzero" stroke="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="10" stroke-dasharray="" stroke-dashoffset="0" font-family="none" font-weight="none" font-size="none" text-anchor="none" style="mix-blend-mode: normal;">
<path d="M0,192v-192h192v192z" fill="none"></path>
<g fill="#4d6286">
<path d="M187.5,43.05l-50.7,-18c-1.2,-0.45 -2.4,-0.3 -3.45,0.15c-1.65,0.75 -89.85,31.95 -89.85,31.95c-2.25,0.75 -3.75,2.85 -3.75,5.25v21c0,1.95 1.2,3.6 3,4.2l11.7,4.2c3,1.05 6,-1.05 6,-4.2v-17.55c0,-2.4 1.5,-4.5 3.75,-5.25l79.65,-27.6l28.8,10.2l-78.15,27.45v0c-1.65,0.6 -3,2.25 -3,4.2v91.2l-81,-28.65v-91.2l87,-30.75c2.4,-0.9 3.6,-3.45 2.7,-5.7c-0.9,-2.4 -3.45,-3.6 -5.7,-2.7l-90,31.8c-1.8,0.6 -3,2.4 -3,4.2v97.5c0,1.95 1.2,3.6 3,4.2l90,31.8c0.45,0.15 1.05,0.3 1.5,0.3c0.3,0 0.45,0 0.75,0h0.15c0.15,0 0.3,-0.15 0.6,-0.15v0l90,-31.8c1.8,-0.6 3,-2.4 3,-4.2v-97.5v0c0,-2.1 -1.2,-3.75 -3,-4.35z"></path>
</g>
</g>
</svg>
<small class="m-l-5 m-r-5 text-info hint-text">x</small>
<small class="bold text-info">12</small>
</div>
<div class="col text-right"><small class="muted bold">300 x 300 x 300 cm</small></div>
</div>
<div class="row align-items-center justify-content-center b-b b-grey">
<div class="col-4 bg-white p-t-15 p-b-15 b-r b-grey"><small class="text-info bold all-caps">1. 玄关/家</small></div>
<div class="col-1"></div>
<div class="col-3">
<svg xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" width="15" height="15" viewBox="0 0 192 192" style=" fill:#000000;">
<g fill="none" fill-rule="nonzero" stroke="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="10" stroke-dasharray="" stroke-dashoffset="0" font-family="none" font-weight="none" font-size="none" text-anchor="none" style="mix-blend-mode: normal"> <g fill="none" fill-rule="nonzero" stroke="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="10" stroke-dasharray="" stroke-dashoffset="0" font-family="none" font-weight="none" font-size="none" text-anchor="none" style="mix-blend-mode: normal">
<path d="M0,192v-192h192v192z" fill="none"></path> <path d="M0,192v-192h192v192z" fill="none"></path>
<g fill="#4d6286"> <g fill="#4d6286">
@@ -250,12 +207,19 @@
</g> </g>
</svg> </svg>
<small class="m-l-5 m-r-5 text-info hint-text">x</small> <small class="m-l-5 m-r-5 text-info hint-text">x</small>
<small class="bold text-info">3</small> <small class="bold text-info">{{package.quantity}}</small>
</div> </div>
<div class="col text-right"><small class="muted bold">300 x 300 x 300 cm</small></div> <div class="col text-right"><small class="muted bold">{{package.length}} x {{package.width}} x {{package.height}} cm</small></div>
</div> </div>
</div> </div>
</div> </div>
<modal-component type="packingList" large>
<div class="card card-default no-border">
<div class="card-block no-padding">
<packing-list-form-component :attachments="this.order.packing_list" :data="this.orderId"></packing-list-form-component>
</div>
</div>
</modal-component>
</div> </div>
</div> </div>
</div> </div>
@@ -274,13 +238,13 @@
</div> </div>
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<div class="row m-b-5 align-items-center justify-content-center"> <div class="row m-b-5 align-items-center justify-content-center" v-for="(schedule, index) in order.shipping_arrangement.schedule">
<div class="col-auto p-r-0"> <div class="col-auto p-r-0">
<div class="row"> <div class="row">
<div class="col"><small class="muted">ETD</small></div> <div class="col"><small class="muted">ETD</small></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col"><small class="bold">06-05-2019</small></div> <div class="col"><small class="bold">{{schedule.ETD}}</small></div>
</div> </div>
</div> </div>
<div class="col-auto"> <div class="col-auto">
@@ -288,29 +252,10 @@
<div class="col"><small class="muted">ETA</small></div> <div class="col"><small class="muted">ETA</small></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col"><small class="bold">10-05-2019</small></div> <div class="col"><small class="bold">{{schedule.ETA}}</small></div>
</div> </div>
</div> </div>
<div class="col-auto ml-auto p-l-0"><i class="fa fa-circle text-success fs-8"></i></div> <div class="col-auto ml-auto p-l-0"><i class="fa fa-circle text-success fs-8" :class="[{'text-success': schedule.status === 0}, {'text-danger': schedule.status === 2}]"></i></div>
</div>
<div class="row m-b-5 align-items-center justify-content-center">
<div class="col-auto p-r-0">
<div class="row">
<div class="col"><small class="muted">ETD</small></div>
</div>
<div class="row">
<div class="col"><small class="bold">06-05-2019</small></div>
</div>
</div>
<div class="col-auto">
<div class="row">
<div class="col"><small class="muted">ETA</small></div>
</div>
<div class="row">
<div class="col"><small class="bold">10-05-2019</small></div>
</div>
</div>
<div class="col-auto ml-auto p-l-0"><i class="fa fa-circle text-danger fs-8"></i></div>
</div> </div>
</div> </div>
</div> </div>
@@ -330,13 +275,13 @@
</div> </div>
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<div class="row m-b-10 align-items-center justify-content-center"> <div class="row m-b-5 align-items-center justify-content-center" v-for="(schedule, index) in order.delivery_arrangement.schedule">
<div class="col-auto p-r-0"> <div class="col-auto p-r-0">
<div class="row"> <div class="row">
<div class="col"><small class="muted">ETD</small></div> <div class="col"><small class="muted">ETD</small></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col"><small class="bold">06-05-2019</small></div> <div class="col"><small class="bold">{{schedule.ETD}}</small></div>
</div> </div>
</div> </div>
<div class="col-auto"> <div class="col-auto">
@@ -344,10 +289,10 @@
<div class="col"><small class="muted">ETA</small></div> <div class="col"><small class="muted">ETA</small></div>
</div> </div>
<div class="row"> <div class="row">
<div class="col"><small class="bold">10-05-2019</small></div> <div class="col"><small class="bold">{{schedule.ETA}}</small></div>
</div> </div>
</div> </div>
<div class="col-auto ml-auto p-l-0"><i class="fa fa-circle text-success fs-8"></i></div> <div class="col-auto ml-auto p-l-0"><i class="fa fa-circle text-success fs-8" :class="[{'text-success': schedule.status === 0}, {'text-danger': schedule.status === 2}]"></i></div>
</div> </div>
</div> </div>
</div> </div>
@@ -357,29 +302,16 @@
</div> </div>
</div> </div>
<div class="tab-pane fade" id="timeline"> <div class="tab-pane fade" id="timeline">
<div class="row fs-12 m-l-0 m-r-0 m-b-20"><div class="col p-l-0 p-r-0 bg-white"> <div class="row fs-12 m-l-0 m-r-0 m-b-20">
<div class="row all-caps muted m-l-0 m-r-0 m-b-15 p-t-10 p-b-10 b-b b-grey"> <div class="col p-l-0 p-r-0 bg-white">
<div class="col"> <div class="row all-caps muted m-l-0 m-r-0 m-b-15 p-t-10 p-b-10 b-b b-grey">
<small class="bold all-caps">Order's History</small> <div class="col">
<small class="bold all-caps">Order's History</small>
</div>
</div> </div>
<order-history-component :data="this.orders"></order-history-component>
</div> </div>
<div class="row m-l-0 m-r-0 p-b-15 relative order-history"><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"> </div>
23-05-2019
</div> <div class="col p-l-0 semi-bold lh-20">Custom clearance is successful</div></div></div></div><div class="row m-l-0 m-r-0 p-b-15 relative order-history"><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">
23-05-2019
</div> <div class="col p-l-0 semi-bold lh-20">Arrived to Malaysian port</div></div></div></div><div class="row m-l-0 m-r-0 p-b-15 relative order-history"><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">
23-05-2019
</div> <div class="col p-l-0 semi-bold lh-20">[ETD: 2019-05-06, ETA: 2019-05-09] Your Order has been scheduled for shipping </div></div></div></div><div class="row m-l-0 m-r-0 p-b-15 relative order-history"><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">
09-05-2019
</div> <div class="col p-l-0 semi-bold lh-20">Invoice has been issued, waiting for shipping payment</div></div></div></div><div class="row m-l-0 m-r-0 p-b-15 relative order-history"><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">
09-05-2019
</div> <div class="col p-l-0 semi-bold lh-20">[44 Packages, 32.30 CBM] Your order has been loaded into container</div></div></div></div><div class="row m-l-0 m-r-0 p-b-15 relative order-history"><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">
06-05-2019
</div> <div class="col p-l-0 semi-bold lh-20">Arrived at Collier-Fadel warehouse in china</div></div></div></div><div class="row m-l-0 m-r-0 p-b-15 relative order-history"><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">
21-05-2019
</div> <div class="col p-l-0 semi-bold lh-20">Collier-Fadel confirmed as your order's warehouse</div></div></div></div><div class="row m-l-0 m-r-0 p-b-15 relative order-history"><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">
21-05-2019
</div> <div class="col p-l-0 semi-bold lh-20">Order number has been created</div></div></div></div></div></div>
</div> </div>
<div class="tab-pane fade" id="payments"> <div class="tab-pane fade" id="payments">
<div class="row m-b-20"> <div class="row m-b-20">
@@ -704,7 +636,7 @@
<div class="col fs-11"> <div class="col fs-11">
<div class="row p-t-5 p-b-5 no-margin"> <div class="row p-t-5 p-b-5 no-margin">
<div class="col no-padding"><small class="all-caps ">Date Created:</small></div> <div class="col no-padding"><small class="all-caps ">Date Created:</small></div>
<div class="col-auto no-padding text-right"><small class="bold">02-05-2019</small></div> <div class="col-auto no-padding text-right"><small class="bold">{{order.date}}</small></div>
</div> </div>
</div> </div>
</div> </div>
@@ -712,7 +644,7 @@
<div class="col fs-11"> <div class="col fs-11">
<div class="row p-t-5 p-b-5 no-margin"> <div class="row p-t-5 p-b-5 no-margin">
<div class="col no-padding"><small class="all-caps ">Total CBM:</small></div> <div class="col no-padding"><small class="all-caps ">Total CBM:</small></div>
<div class="col-auto no-padding text-right"><small class="bold">3.12</small></div> <div class="col-auto no-padding text-right"><small class="bold">{{totalCBM()}}</small></div>
</div> </div>
</div> </div>
</div> </div>
@@ -720,7 +652,7 @@
<div class="col fs-11"> <div class="col fs-11">
<div class="row p-t-5 p-b-5 no-margin"> <div class="row p-t-5 p-b-5 no-margin">
<div class="col no-padding"><small class="all-caps">Number of Packages:</small></div> <div class="col no-padding"><small class="all-caps">Number of Packages:</small></div>
<div class="col-auto no-padding text-right"><small class="bold">14</small></div> <div class="col-auto no-padding text-right"><small class="bold">{{totalPackages()}}</small></div>
</div> </div>
</div> </div>
</div> </div>
@@ -799,7 +731,7 @@
data() { data() {
return { return {
orderId: this.data, orderId: this.data,
order: null order: null,
} }
}, },
created(){ created(){
@@ -811,6 +743,11 @@
fetch(route('api.order.profile', {'id': this.orderId})).then(response => response.json()) fetch(route('api.order.profile', {'id': this.orderId})).then(response => response.json())
.then(response => { .then(response => {
this.order = response.data; this.order = response.data;
if(!response.data.current_step.details){
this.order.current_step.details = {
'reference_id': ''
};
}
}) })
.catch(error => console.log(error)) .catch(error => console.log(error))
}, },
@@ -824,6 +761,20 @@
} }
return '#bababa'; return '#bababa';
},
totalCBM(){
let total = 0;
$.each(this.order.packing_list.packages, function(key, object){
total += (((object.width/100) * (object.length/100) * (object.height/100)) * object.quantity)
});
return total.toFixed(2);
},
totalPackages(){
let total = 0;
$.each(this.order.packing_list.packages, function(key, object){
total += object.quantity
});
return total;
} }
} }
} }
@@ -1,4 +1,4 @@
<template> <template>
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<div class="row"> <div class="row">
@@ -13,7 +13,7 @@
<small class="muted all-caps">Delivery Address</small> <small class="muted all-caps">Delivery Address</small>
</div> </div>
</div> </div>
<order-delivery-address-componenet :data="this.data"></order-delivery-address-componenet> <order-delivery-address-component :data="this.data"></order-delivery-address-component>
</div> </div>
<div class="col-9 p-l-0"> <div class="col-9 p-l-0">
<div class="row m-l-0 m-r-0 m-b-15"> <div class="row m-l-0 m-r-0 m-b-15">
@@ -21,25 +21,7 @@
<small class="muted all-caps">Order History</small> <small class="muted all-caps">Order History</small>
</div> </div>
</div> </div>
<div class="row"> <order-history-component :data="this.data"></order-history-component>
<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>
</div> </div>
@@ -47,9 +29,7 @@
</template> </template>
<script> <script>
import OrderDeliveryAddressComponenet from "./OrderDeliveryAddressComponenet";
export default { export default {
components: {OrderDeliveryAddressComponenet},
props: { props: {
'data': { 'data': {
required: true required: true
@@ -18,8 +18,8 @@
<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}]"> <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">Select</span>
<span v-show="selected"> <span v-show="selected">
<i class="fa fa-check fa-fw" v-show="ishover"></i> <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> <i class="fa fa-times text-danger-light fa-fw" v-show="!isHover"></i>
</span> </span>
</button> </button>
</div> </div>
@@ -28,7 +28,7 @@
<div class="col"> <div class="col">
<div class="form-group form-group-default bg-success-lighter"> <div class="form-group form-group-default bg-success-lighter">
<label class="muted">Tracking Number</label> <label class="muted">Tracking Number</label>
<input class="form-control" @keyup="updateSelection" v-model="tracking_no"> <input class="form-control" @keyup="updateSelection" v-model="tracking_number">
</div> </div>
</div> </div>
</div> </div>
@@ -47,8 +47,8 @@
return { return {
order: this.data, order: this.data,
selected: false, selected: false,
tracking_number: '', tracking_number: null,
ishover: true isHover: true
} }
}, },
watch: { watch: {
@@ -58,7 +58,7 @@
}, },
methods: { methods: {
mouseOver(){ mouseOver(){
this.ishover = !this.ishover; this.isHover = !this.isHover;
}, },
selectOrder(){ selectOrder(){
this.selected = !this.selected; this.selected = !this.selected;
@@ -0,0 +1,44 @@
<template>
<div class="row">
<div class="col no-padding">
<div class="row" v-show="this.showCompleteDate">
<div class="col p-l-0 p-r-0">
<div class="form-group form-group-default input-group b-rad-none m-b-0" style=" overflow: visible; ">
<div class="form-input-group">
<label class="muted">Action Date</label>
<date-picker-component v-on:input="updateActionDate($event)"></date-picker-component>
</div>
</div>
</div>
<div class="col-auto padding-5 bg-master-lighter pointer" @click="showCompleteDate = !showCompleteDate; complete_date = null">
<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" >
<div class="col no-padding">
<div v-if="!this.showCompleteDate" @click="showCompleteDate = !showCompleteDate; complete_date = null" class="btn btn-xs btn-default b-a lh-20 b-complete b-rad-none text-complete all-caps"><i class="fa fa-calendar m-r-5"></i> Set Action Date</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
showCompleteDate: false
}
},
methods: {
updateActionDate(value) {
this.$emit('input', value);
}
}
}
</script>
@@ -6,13 +6,18 @@
title="Order Arrival" title="Order Arrival"
:message="'Are you sure this order has arrived to warehouse?'" :message="'Are you sure this order has arrived to warehouse?'"
type="arrival" type="arrival"
v-on:confirm="completeArrival()"></confirm-modal-component> v-on:confirm="completeArrival()">
<div class="card card-default no-border m-b-0 m-t-15">
<div class="card-block no-padding">
<action-date-component v-model="complete_date"></action-date-component>
</div>
</div>
</confirm-modal-component>
</div> </div>
</template> </template>
<script> <script>
import notificationConstant from '../../../../../js/notification';
export default { export default {
props: { props: {
'data': { 'data': {
@@ -21,35 +26,13 @@
}, },
data() { data() {
return { return {
isLoading: false isLoading: false,
complete_date: null
} }
}, },
methods: { methods: {
completeArrival() { completeArrival() {
this.$emit('updateStep', {'complete_date': this.complete_date, 'type': 'WAREHOUSE_ARRIVAL'});
//turn on loading animation
this.isLoading = true;
fetch(route('api.order.step.update', {orderId: this.data}), {
method: 'post',
headers: {
'content-type': 'application/json'
}
}).then(() => {
//turn off loading animation
this.isLoading = false;
let notification = this.$refs.notification;
notification.title = notificationConstant.ORDER.WAREHOUSE_ARRIVAL.TITLE;
notification.message = notificationConstant.ORDER.WAREHOUSE_ARRIVAL.MESSAGE;
notification.execute();
Event.$emit('updateOrdersList', true);
})
} }
} }
} }
@@ -1,8 +1,7 @@
<template> <template>
<div class="inline"> <div class="inline">
<div class="btn btn-sm btn-success b-rad-none requestModal" data-type="receiveNote">Confirm Warehouse</div> <div class="btn btn-sm btn-success b-rad-none requestModal" data-type="confirmOrder">Confirm Warehouse</div>
<modal-component type="receiveNote"> <modal-component type="confirmOrder">
<notification-component ref="notification"></notification-component>
<loading-component style="left: 0;" v-show="isLoading"></loading-component> <loading-component style="left: 0;" v-show="isLoading"></loading-component>
<div class="card card-default no-border"> <div class="card card-default no-border">
<div class="card-block no-padding"> <div class="card-block no-padding">
@@ -17,24 +16,24 @@
<form method="post" @submit.prevent="addOrder"> <form method="post" @submit.prevent="addOrder">
<div class="row"> <div class="row">
<div class="col no-padding"> <div class="col no-padding">
<div class="row" v-show="this.showWarehouse"> <div class="row m-b-10">
<div class="col no-padding"> <div class="col no-padding">
<div class="form-group form-group-default form-group-default-select2 m-b-0" > <div class="row m-b-10" v-show="this.showWarehouse">
<label class="muted" style="z-index: 10000;">Warehouse</label> <div class="col no-padding">
<select-component :options="this.warehouses" v-model="order.warehouse_id"></select-component> <div class="form-group form-group-default form-group-default-select2 b-rad-none m-b-0" >
</div> <label class="muted" style="z-index: 10000;">Warehouse</label>
</div> <select-component :options="this.warehouses" v-model="order.warehouse_id"></select-component>
<div class="col-auto padding-5 bg-master-lighter pointer" @click="toggleIncludeWarehouse()"> </div>
<div class="row align-items-center justify-content-center h-100"> </div>
<div class="col"> <div class="col-auto padding-5 bg-master-lighter pointer hide" @click="showWarehouse = !showWarehouse; order.warehouse_id = null">
<i class="fa fa-times text-danger m-l-5 m-r-5"></i> <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> </div>
</div> <action-date-component v-model="complete_date"></action-date-component>
</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> </div>
<div class="row"> <div class="row">
@@ -56,21 +55,22 @@
</div> </div>
</template> </template>
<script> <script>
import notificationConstant from '../../../../../js/notification';
export default { export default {
props: { props: {
'data': { 'data': {
type: String, type: Number,
required: true required: true
} }
}, },
data() { data() {
return { return {
order: { order: {
warehouse_id: null warehouse_id: null,
}, },
complete_date: null,
warehouses: [], warehouses: [],
showWarehouse: false, showWarehouse: true,
showCompleteDate: false,
isLoading: false isLoading: false
} }
}, },
@@ -85,7 +85,7 @@
fetch(route('api.warehouse.list', {'all': true})).then(response => response.json()) fetch(route('api.warehouse.list', {'all': true})).then(response => response.json())
.then(response => { .then(response => {
this.warehouses = $.map(response.data, function(value, key){ this.warehouses = $.map(response.data, function(value){
return {'id': value.id, 'text': value.name}; return {'id': value.id, 'text': value.name};
}); });
@@ -99,36 +99,24 @@
//turn on loading animation //turn on loading animation
this.isLoading = true; this.isLoading = true;
fetch(route('api.order.step.update', {orderId: this.data}), { fetch(route('api.order.warehouse.update', {orderId: this.data}), {
method: 'post', method: 'post',
body: JSON.stringify(this.order), body: JSON.stringify(this.order),
headers: { headers: {
'content-type': 'application/json' 'content-type': 'application/json'
} }
}).then(() => { }).then(() => {
this.$emit('updateStep', {'complete_date': this.complete_date, 'type': 'WAREHOUSE_CONFIRMED'});
this.clearForm(); this.clearForm();
//turn off loading animation //turn off loading animation
this.isLoading = false; this.isLoading = false;
});
let notification = this.$refs.notification;
notification.title = notificationConstant.ORDER.ORDER_WAREHOUSE_CONFIRMED.TITLE;
notification.message = notificationConstant.ORDER.ORDER_WAREHOUSE_CONFIRMED.MESSAGE;
notification.execute();
Event.$emit('updateOrdersList');
})
},
toggleIncludeWarehouse(){
this.order.warehouse_id = null;
this.showWarehouse = !this.showWarehouse;
}, },
clearForm(){ clearForm(){
this.order.warehouse_id = null; this.order.warehouse_id = null;
this.showWarehouse = false; this.complete_date = null;
this.showCompleteDate = false;
} }
} }
} }
@@ -1,54 +1,62 @@
<template> <template>
<div class="inline"> <div class="inline">
<notification-component ref="notification"></notification-component> <div class="btn btn-sm btn-success b-rad-none requestModal" v-if="!arrangementExist" data-type="deliveryArrangement">Delivery Arrangement</div>
<div class="btn btn-sm btn-success b-rad-none requestModal" data-type="delivery">Out for Delivery</div> <div class="btn btn-sm btn-success b-rad-none requestModal" v-if="arrangementExist" data-type="deliveryComplete">Successful Delivery</div>
<confirm-modal-component <div class="btn btn-sm btn-warning text-black b-rad-none requestModal" v-if="arrangementExist" data-type="deliveryArrangement">Reschedule Delivery</div>
title="Order Packed" <modal-component type="deliveryArrangement">
:message="'Are you sure this order is out for delivery?'" <div class="card card-default no-border">
type="delivery" <div class="card-block no-padding">
v-on:confirm="completeDelivery()"></confirm-modal-component> <delivery-arrangement-form-component :attachments="this.attachments" :data="this.data"></delivery-arrangement-form-component>
</div>
</div>
</modal-component>
<confirm-modal-component v-if="arrangementExist"
title="Order Packed"
:message="'Are you sure this order delivery is successful?'"
type="deliveryComplete"
v-on:confirm="completeDelivery()">
<div class="card card-default no-border m-b-0 m-t-15">
<div class="card-block no-padding">
<action-date-component v-model="complete_date"></action-date-component>
</div>
</div>
</confirm-modal-component>
</div> </div>
</template> </template>
<script> <script>
import notificationConstant from '../../../../../js/notification';
export default { export default {
props: { props: {
'data': { 'data': {
required: true required: true
},
'attachments': {
type: Object
} }
}, },
data() { data() {
return { return {
arrangementExist: false,
complete_date: null,
isLoading: false isLoading: false
} }
}, },
watch: {
'attachments': function() {
if(this.attachments !== null){
this.arrangementExist = true;
}
}
},
created(){
if(this.attachments !== null){
this.arrangementExist = true;
}
},
methods: { methods: {
completeDelivery() { completeDelivery() {
this.$emit('updateStep', {'complete_date': this.complete_date, 'type': 'COMPLETE'});
//turn on loading animation
this.isLoading = true;
fetch(route('api.order.step.update', {orderId: this.data}), {
method: 'post',
headers: {
'content-type': 'application/json'
}
}).then(() => {
//turn off loading animation
this.isLoading = false;
let notification = this.$refs.notification;
notification.title = notificationConstant.ORDER.OUT_FOR_DELIVERY.TITLE;
notification.message = notificationConstant.ORDER.OUT_FOR_DELIVERY.MESSAGE;
notification.execute();
Event.$emit('updateOrdersList', true);
})
} }
} }
} }

Some files were not shown because too many files have changed in this diff Show More