Merge remote-tracking branch 'origin/master'

This commit is contained in:
omair saleh
2021-07-21 16:10:27 +08:00
61 changed files with 3326 additions and 3 deletions
@@ -0,0 +1,45 @@
<?php
namespace App\Classes\Modules\Orders\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\Services\CreatesOrder;
use App\Classes\Modules\Orders\Standards\Rules\CanCreateOrder;
use App\Classes\ValueObjects\Constants\OrderStatus;
use App\Classes\ValueObjects\Constants\OrderSteps;
use App\Classes\ValueObjects\Constants\OrderType;
use App\Http\Resources\OrderResource;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
class CompletesOrderStepLogic extends AbstractControllerLogic
{
private $canCreateOrder;
private $createsOrder;
public function __construct(CanCreateOrder $canCreateOrder, CreatesOrder $createsOrder)
{
$this->canCreateOrder = $canCreateOrder;
$this->createsOrder = $createsOrder;
}
protected function notification():array {
return [
'title' => 'Created Order',
'message' => 'You have successfully created a new Order'
];
}
public function logic(Request $request) : JsonResponse {
$order_object = new OrderObject($request->get('company_module_id'), '', '', OrderType::SHARED_CONTAINER, OrderStatus::PROCESSING, OrderSteps::PROCESSING);
$this->canCreateOrder->passes($order_object);
$order = $this->createsOrder->execute($order_object);
return $this->resourceResponse(new OrderResource($order));
}
}
@@ -0,0 +1,86 @@
<?php
namespace App\Classes\Modules\OrderSteps\DataTransferObjects;
use App\Classes\General\Interfaces\DataTransferObject;
use Carbon\Carbon;
class OrderStepsObject implements DataTransferObject
{
private $id;
private $order_id;
private $appointee_id;
private $reference;
private $primary;
private $sequence;
private $status;
private $contract_status;
private $completed_date;
public function __construct(int $order_id, int $appointee_id, string $reference, bool $primary, float $sequence, int $status, int $contract_status, ?string $completed_date, int $id=0)
{
$this->order_id = $order_id;
$this->appointee_id = $appointee_id;
$this->reference = $reference;
$this->primary = $primary;
$this->sequence = $sequence;
$this->status = $status;
$this->contract_status = $contract_status;
$this->completed_date = $completed_date;
$this->id = $id;
}
public function getOrderId(): int
{
return $this->order_id;
}
public function getAppointeeId(): int
{
return $this->appointee_id;
}
public function getReference(): string
{
return $this->reference;
}
public function getPrimary(): bool
{
return $this->primary;
}
public function getSequence(): float
{
return $this->sequence;
}
public function getStatus(): int
{
return $this->status;
}
public function getContractStatus(): int
{
return $this->contract_status;
}
public function getCompletedDate(): Carbon
{
return $this->completed_date ? Carbon::parse($this->completed_date) : Carbon::now();
}
public function getId(): int
{
return $this->id;
}
}
@@ -0,0 +1,47 @@
<?php
namespace App\Classes\Modules\OrderSteps\Processors;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\Processors\UpdatesOrderCurrentStepProcessor;
use App\Classes\Modules\Orders\Services\FetchesOrder;
use App\Classes\Modules\OrderSteps\Services\CreatesOrderSteps;
use App\Classes\Modules\OrderSteps\Services\FetchesOrderSteps;
use App\Classes\Modules\Orders\Services\UpdatesCurrentStep;
use App\Classes\Modules\Orders\Standards\Rules\CanUpdateCurrentStep;
use App\Classes\Modules\OrderSteps\DataTransferObjects\OrderStepsObject;
use App\Classes\Modules\OrderSteps\Standards\Rules\CanCreateOrderStep;
use App\Classes\ValueObjects\Constants\OrderStatus;
use App\Classes\ValueObjects\Constants\OrderSteps;
use App\Models\Order;
use App\Models\OrderStep;
use Illuminate\Database\Eloquent\Model;
class CreateOrderStepsProcessor
{
private $canCreateOrderStep;
private $createsOrderSteps;
private $fetchesOrder;
private $fetchesOrderSteps;
public function __construct(CanCreateOrderStep $canCreateOrderStep, FetchesOrder $fetchesOrder, FetchesOrderSteps $fetchesOrderSteps, CreatesOrderSteps $createsOrderSteps )
{
$this->canCreateOrderStep = $canCreateOrderStep;
$this->createsOrderSteps = $createsOrderSteps;
$this->fetchesOrder = $fetchesOrder;
$this->fetchesOrderSteps = $fetchesOrderSteps;
}
public function execute(Model $order, string $currentStep){
$order_steps_object = new OrderStepsObject($order->id, $order->company_module_id, $currentStep, true, 0, OrderStatus::PROCESSING, 0, null);
$this->canCreateOrderStep->passes($order_steps_object);
return $this->createsOrderSteps->execute($order_steps_object);
}
}
@@ -0,0 +1,69 @@
<?php
namespace App\Classes\Modules\OrderSteps\Processors;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\Processors\UpdatesOrderCurrentStepProcessor;
use App\Classes\Modules\OrderSteps\Processors\UpdateOrderStepsProcessor;
use App\Classes\Modules\Orders\Services\FetchesOrder;
use App\Classes\Modules\OrderSteps\Services\FetchesOrderSteps;
use App\Classes\Modules\Orders\Services\UpdatesCurrentStep;
use App\Classes\Modules\Orders\Standards\Rules\CanUpdateCurrentStep;
use App\Classes\Modules\OrderSteps\DataTransferObjects\OrderStepsObject;
use App\Classes\Modules\OrderSteps\Services\CreatesManyOrderSteps;
use App\Classes\ValueObjects\Constants\OrderStatus;
use App\Classes\ValueObjects\Constants\OrderSteps;
use App\Classes\Modules\Unity\Processors\GetContractObligationsProcessor;
use App\Models\Order;
use App\Models\OrderStep;
use App\Classes\Jobs\UnityLogin;
use Config;
use Illuminate\Support\Facades\Http;
class GenerateOrderStepsProcessor
{
private $updatesOrderCurrentStep;
private $createsManyOrderStep;
private $unityConfig;
private $updateOrderStepProcessors;
private $getContractObligationsProcessor;
public function __construct(UpdatesOrderCurrentStepProcessor $updatesOrderCurrentStep, CreatesManyOrderSteps $createsManyOrderStep, UpdateOrderStepsProcessor $updateOrderStepProcessors, GetContractObligationsProcessor $getContractObligationsProcessor)
{
$this->updatesOrderCurrentStep = $updatesOrderCurrentStep;
$this->unityConfig = Config::get('unity');
$this->createsManyOrderStep = $createsManyOrderStep;
$this->updateOrderStepProcessors = $updateOrderStepProcessors;
$this->getContractObligationsProcessor = $getContractObligationsProcessor;
}
public function execute(Order $order){
$obligations = $this->getContractObligationsProcessor->execute();
foreach($obligations as $step){
$orderSteps[] = new OrderStepsObject(
$order->id,
1,
$step->name,
true,
$step->sequence,
0,
0,
null
);
}
$this->createsManyOrderStep->execute($order, $orderSteps);
$this->updatesOrderCurrentStep->execute($order->id, OrderSteps::PACKING);
$this->updateOrderStepProcessors->execute(OrderSteps::PROCESSING);
}
}
@@ -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 int $orderId
* @param StepObject $step
* @return JsonResponse
* @throws InternalServerErrorException
*/
public function handler(int $orderId, 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($orderId, $step);
/** notification */
return new JsonResponse(null, HttpStatus::REQUEST_ACCEPTED);
} catch (\Exception $exception){
throw new InternalServerErrorException("Failed to update order step because {$exception->getMessage()}");
}
}
}
@@ -0,0 +1,56 @@
<?php
namespace App\Classes\Modules\OrderSteps\Processors\Steps;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
use App\Classes\Modules\Orders\DataTransferObjects\StepObject;
use App\Classes\Modules\Orders\Services\Steps\GenerateOrderSteps;
use App\Classes\ValueObjects\Constants\OrderSteps;
use Illuminate\Http\JsonResponse;
class ConfirmsOrder extends AbstractStepProcessor
{
/** @var string */
const STEP_REFERENCE = OrderSteps::ORDER_PROCESSING_STEP;
/** @var int */
private $orderId;
/** @var StepObject */
private $step;
/**
* WarehousePackOrder constructor.
* @param int $orderId
* @param string $completeDate
*/
public function __construct(int $orderId, string $completeDate = null)
{
$this->orderId = $orderId;
$this->step = new StepObject(self::STEP_REFERENCE, $completeDate);
}
/**
* @return bool
*/
public function validator(): bool {
return true;
}
/**
* @return JsonResponse
* @throws InternalServerErrorException
* @throws \App\Classes\Modules\Accounts\Exceptions\CannotCreateOrderStepsException
*/
public function execute(): JsonResponse {
(new generateOrderSteps())->execute($this->orderId);
return $this->handler($this->orderId, $this->step);
}
}
@@ -0,0 +1,56 @@
<?php
namespace App\Classes\Modules\Orders\Processors;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
use App\Classes\Modules\Orders\DataTransferObjects\StepObject;
use App\Classes\ValueObjects\Constants\OrderSteps;
use App\Models\DeliveryArrangement;
use Illuminate\Http\JsonResponse;
class DeliverOrder extends AbstractStepProcessor
{
/** @var string */
const STEP_REFERENCE = OrderSteps::ORDER_DELIVERY_STEP;
/** @var int */
private $orderId;
/** @var StepObject */
private $step;
/**
* WarehousePackOrder constructor.
* @param int $orderId
* @param string $completeDate
*/
public function __construct(int $orderId, string $completeDate = null)
{
$this->orderId = $orderId;
$this->step = new StepObject(self::STEP_REFERENCE, $completeDate);
}
/**
* @return bool
*/
public function validator(): bool {
if(!DeliveryArrangement::where('order_id', $this->orderId)->exists()) {
return false;
}
return true;
}
/**
* @return JsonResponse
* @throws InternalServerErrorException
*/
public function execute(): JsonResponse {
return $this->handler($this->orderId, $this->step);
}
}
@@ -0,0 +1,59 @@
<?php
namespace App\Classes\Modules\Orders\Processors;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
use App\Classes\Modules\Orders\DataTransferObjects\StepObject;
use App\Classes\ValueObjects\Constants\OrderSteps;
use App\Models\ShippingArrangement;
use Illuminate\Http\JsonResponse;
class ShipOrder extends AbstractStepProcessor
{
/** @var string */
const STEP_REFERENCE = OrderSteps::ORDER_SHIPPING_STEP;
/** @var int */
private $orderId;
/** @var StepObject */
private $step;
/**
* WarehousePackOrder constructor.
* @param int $orderId
* @param string $completeDate
*/
public function __construct(int $orderId, string $completeDate = null)
{
$this->orderId = $orderId;
$this->step = new StepObject(self::STEP_REFERENCE, $completeDate);
}
/**
* @return bool
*/
public function validator(): bool {
if(!ShippingArrangement::where('order_id', $this->orderId)->exists()) {
return false;
}
return true;
}
/**
* @return JsonResponse
* @throws InternalServerErrorException
*/
public function execute(): JsonResponse {
return $this->handler($this->orderId, $this->step);
}
}
@@ -0,0 +1,52 @@
<?php
namespace App\Classes\Modules\Orders\Processors;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
use App\Classes\Modules\Orders\DataTransferObjects\StepObject;
use App\Classes\ValueObjects\Constants\OrderSteps;
use Illuminate\Http\JsonResponse;
class WarehouseArrivalOrder extends AbstractStepProcessor
{
/** @var string */
const STEP_REFERENCE = OrderSteps::ORDER_WAREHOUSE_ARRIVAL_STEP;
/** @var int */
private $orderId;
/** @var StepObject */
private $step;
/**
* WarehousePackOrder constructor.
* @param int $orderId
* @param string $completeDate
*/
public function __construct(int $orderId, string $completeDate = null)
{
$this->orderId = $orderId;
$this->step = new StepObject(self::STEP_REFERENCE, $completeDate);
}
/**
* @return bool
*/
public function validator(): bool {
return true;
}
/**
* @return JsonResponse
* @throws InternalServerErrorException
*/
public function execute(): JsonResponse {
return $this->handler($this->orderId, $this->step);
}
}
@@ -0,0 +1,60 @@
<?php
namespace App\Classes\Modules\Orders\Processors;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
use App\Classes\Modules\Orders\DataTransferObjects\StepObject;
use App\Classes\ValueObjects\Constants\OrderSteps;
use App\Models\PackingList;
use Illuminate\Http\JsonResponse;
class WarehousePackOrder extends AbstractStepProcessor
{
/** @var string */
const STEP_REFERENCE = OrderSteps::ORDER_WAREHOUSE_PACKING_STEP;
/** @var int */
private $orderId;
/** @var StepObject */
private $step;
/**
* WarehousePackOrder constructor.
* @param int $orderId
* @param string $completeDate
*/
public function __construct(int $orderId, string $completeDate = null)
{
$this->orderId = $orderId;
$this->step = new StepObject(self::STEP_REFERENCE, $completeDate);
}
/**
* @return bool
*/
public function validator(): bool {
$packingList = PackingList::where('order_id', $this->orderId)->first();
if(!$packingList->confirmed) {
return false;
}
return true;
}
/**
* @return JsonResponse
* @throws InternalServerErrorException
*/
public function execute(): JsonResponse {
return $this->handler($this->orderId, $this->step);
}
}
@@ -0,0 +1,65 @@
<?php
namespace App\Classes\Modules\Orders\Processors;
use App\Classes\Excel\Import\OrdersExport;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
use App\Classes\Modules\Orders\DataTransferObjects\StepObject;
use App\Classes\ValueObjects\Constants\OrderSteps;
use App\Models\Order;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Mail;
use Maatwebsite\Excel\Facades\Excel;
class WarehouseReceivesOrder extends AbstractStepProcessor
{
/** @var string */
const STEP_REFERENCE = OrderSteps::ORDER_WAREHOUSE_RECEIVING_STEP;
/** @var int */
private $orderId;
/** @var StepObject */
private $step;
/**
* WarehousePackOrder constructor.
* @param int $orderId
* @param string $completeDate
*/
public function __construct(int $orderId, string $completeDate = null)
{
$this->orderId = $orderId;
$this->step = new StepObject(self::STEP_REFERENCE, $completeDate);
}
/**
* @return bool
*/
public function validator(): bool {
return true;
}
/**
* @return JsonResponse
* @throws InternalServerErrorException
*/
public function execute(): JsonResponse {
Mail::send('emails.received_orders_email', [], function ($message) {
$message->from('noreply@izyin.com', 'IZYIM');
$message->to('uldvstar@gmail.com', 'Omair Saleh')->subject('Received orders report '.now()->format('dd/mm/YY'));
$message->attach(
Excel::download(Order::find($this->orderId),
'report_'.now()->format('dd_mm_YY').'.xlsx')
->getFile(), ['as' => 'report_'.now()->format('dd/mm/YY').'.xlsx']);
});
return $this->handler($this->orderId, $this->step);
}
}
@@ -0,0 +1,51 @@
<?php
namespace App\Classes\Modules\Orders\Processors;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
use App\Classes\Modules\Orders\DataTransferObjects\StepObject;
use App\Classes\ValueObjects\Constants\OrderSteps;
use Illuminate\Http\JsonResponse;
class WarehouseUnpackingOrder extends AbstractStepProcessor
{
/** @var string */
const STEP_REFERENCE = OrderSteps::ORDER_WAREHOUSE_UNPACKING_STEP;
/** @var int */
private $orderId;
/** @var StepObject */
private $step;
/**
* WarehousePackOrder constructor.
* @param int $orderId
* @param string $completeDate
*/
public function __construct(int $orderId, string $completeDate = null)
{
$this->orderId = $orderId;
$this->step = new StepObject(self::STEP_REFERENCE, $completeDate);
}
/**
* @return bool
*/
public function validator(): bool {
return true;
}
/**
* @return JsonResponse
* @throws InternalServerErrorException
*/
public function execute(): JsonResponse {
return $this->handler($this->orderId, $this->step);
}
}
@@ -0,0 +1,43 @@
<?php
namespace App\Classes\Modules\OrderSteps\Processors;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\Processors\UpdatesOrderCurrentStepProcessor;
use App\Classes\Modules\OrderSteps\Services\FetchesOrderSteps;
use App\Classes\Modules\OrderSteps\Services\UpdatesOrderSteps;
use App\Classes\Modules\Orders\Services\UpdatesCurrentStep;
use App\Classes\Modules\OrderSteps\Standards\Rules\CanUpdateOrderStep;
use App\Classes\Modules\OrderSteps\DataTransferObjects\OrderStepsObject;
use App\Classes\ValueObjects\Constants\OrderStatus;
use App\Classes\ValueObjects\Constants\OrderSteps;
use App\Models\Order;
use App\Models\OrderStep;
class UpdateOrderStepsProcessor
{
private $canUpdateOrderStep;
private $updatesOrderSteps;
private $fetchesOrderSteps;
public function __construct(CanUpdateOrderStep $canUpdateOrderStep, UpdatesOrderSteps $updatesOrderSteps, FetchesOrderSteps $fetchesOrderSteps )
{
$this->canUpdateOrderStep = $canUpdateOrderStep;
$this->updatesOrderSteps = $updatesOrderSteps;
$this->fetchesOrderSteps = $fetchesOrderSteps;
}
public function execute(string $currentStep){
$orderStepsObject = new OrderStepsObject(0,0,$currentStep, 0, 0, 1, 1, null);
$this->canUpdateOrderStep->passes($orderStepsObject);
$orderSteps = $this->fetchesOrderSteps->execute(['reference'=>$currentStep]);
$this->updatesOrderSteps->execute($orderSteps, $orderStepsObject);
}
}
@@ -0,0 +1,30 @@
<?php
namespace App\Classes\Modules\OrderSteps\Services;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Classes\Modules\OrderSteps\DataTransferObjects\OrderStepsObject;
use App\Models\OrderStep;
use App\Models\Order;
class CreatesManyOrderSteps extends AbstractUpdateRecord
{
public function execute(Order $order, array $orderSteps) {
$orderStepsModel=[];
foreach($orderSteps as $step){
$orderStepsModel[]=[
'order_id' => $step->getOrderId(),
'appointee_id' => $step->getAppointeeId(),
'reference' => $step->getReference(),
'primary' => $step->getPrimary(),
'sequence' => $step->getSequence(),
'status' => 0,
'contract_status' => 0
];
}
$order->orderSteps()->createMany($orderStepsModel);
}
}
@@ -0,0 +1,29 @@
<?php
namespace App\Classes\Modules\OrderSteps\Services;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Classes\Modules\OrderSteps\DataTransferObjects\OrderStepsObject;
use App\Models\OrderStep;
use App\Models\Order;
class CreatesOrderSteps extends AbstractUpdateRecord
{
public function execute(OrderStepsObject $orderSteps) {
$orderStepsModel = new OrderStep();
$orderStepsModel->order_id = $orderSteps->getOrderId();
$orderStepsModel->appointee_id = $orderSteps->getAppointeeId();
$orderStepsModel->reference = $orderSteps->getReference();
$orderStepsModel->primary = $orderSteps->getPrimary();
$orderStepsModel->sequence = $orderSteps->getSequence();
$orderStepsModel->status = 0;
$orderStepsModel->contract_status = 0;
$orderStepsModel->complete_date = null;
return $this->handler($orderStepsModel);
}
}
@@ -0,0 +1,32 @@
<?php
namespace App\Classes\Modules\OrderSteps\Services;
use App\Classes\General\Eloquent\AbstractFetchRecord;
use App\Models\OrderStep;
use Illuminate\Database\Eloquent\Builder;
class FetchesOrderSteps extends AbstractFetchRecord
{
/** @var OrderStep */
private $repository;
/**
* FetchOrderSteps constructor.
* @param OrderStep $repository
*/
public function __construct(OrderStep $repository)
{
$this->repository = $repository;
}
/**
* @return Builder
*/
public function getRepository(): Builder
{
return $this->repository->newQuery();
}
}
@@ -0,0 +1,33 @@
<?php
namespace App\Classes\Modules\OrderSteps\Services;
use App\Classes\General\Eloquent\AbstractFetchRecord;
use App\Models\OrderStep;
use Illuminate\Database\Eloquent\Builder;
use phpDocumentor\Reflection\Types\AbstractList;
class ListsOrderSteps extends AbstractList
{
/** @var OrderStep */
private $repository;
/**
* FetchOrderSteps constructor.
* @param OrderStep $repository
*/
public function __construct(OrderStep $repository)
{
$this->repository = $repository;
}
/**
* @return Builder
*/
public function getRepository(): Builder
{
return $this->repository->newQuery();
}
}
@@ -0,0 +1,21 @@
<?php
namespace App\Classes\Modules\OrderSteps\Services;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Classes\Modules\OrderSteps\DataTransferObjects\OrderStepsObject;
use App\Models\OrderStep;
class UpdatesOrderSteps extends AbstractUpdateRecord
{
public function execute(OrderStep $model, OrderStepsObject $object) {
$model->status = $object->getStatus();
$model->contract_status = $object->getContractStatus();
$model->complete_date = $object->getCompletedDate();
return $this->handler($model);
}
}
@@ -0,0 +1,41 @@
<?php
namespace App\Classes\Modules\OrderSteps\Standards\Rules;
use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Modules\OrderSteps\Standards\Validators\CreateOrderStepValidation;
class CanCreateOrderStep extends AbstractRule
{
private $orderValidation;
public function __construct(CreateOrderStepValidation $orderValidation)
{
$this->orderValidation = $orderValidation;
}
/**
* @return bool
*/
protected function authorized(): bool
{
// TODO Set Authorization rules
return true;
}
protected function validators($object): bool
{
return $this->orderValidation->validate($object);
}
/**
* @param CompanyObject $object
* @return bool
*/
protected function criteria($object): bool
{
//Verify account?
//Contract created on Unity
return true;
}
}
@@ -0,0 +1,39 @@
<?php
namespace App\Classes\Modules\OrderSteps\Standards\Rules;
use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Modules\OrderSteps\Standards\Validators\UpdateOrderStepValidation;
class CanUpdateOrderStep extends AbstractRule
{
private $orderValidation;
public function __construct(UpdateOrderStepValidation $orderValidation)
{
$this->orderValidation = $orderValidation;
}
/**
* @return bool
*/
protected function authorized(): bool
{
// TODO Set Authorization rules
return true;
}
protected function validators($object): bool
{
return $this->orderValidation->validate($object);
}
/**
* @param CompanyObject $object
* @return bool
*/
protected function criteria($object): bool
{
return true;
}
}
@@ -0,0 +1,41 @@
<?php
namespace App\Classes\Modules\OrderSteps\Standards\Validators;
use App\Classes\General\Abstracts\AbstractValidation;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
class CreateOrderStepValidation extends AbstractValidation
{
/**
* @param OrderObject $object
* @return array
*/
protected function data($object): array
{
return [];
}
/**
* @param string $type
* @return array
*/
protected function rules(?string $type = 'POST'): array
{
if ($type == 'POST') {
return [];
} elseif ($type == 'PUT') {
return [
'id' => 'required'
];
}
}
/**
* @return array
*/
protected function messages(): array
{
return [];
}
}
@@ -0,0 +1,37 @@
<?php
namespace App\Classes\Modules\OrderSteps\Standards\Validators;
use App\Classes\General\Abstracts\AbstractValidation;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
class UpdateOrderStepValidation extends AbstractValidation
{
/**
* @param OrderObject $object
* @return array
*/
protected function data($object): array
{
return [
'id' => $object->getId(),
];
}
/**
* @param string $type
* @return array
*/
protected function rules(?string $type = 'POST'): array
{
return [];
}
/**
* @return array
*/
protected function messages(): array
{
return [];
}
}
@@ -0,0 +1,51 @@
<?php
namespace App\Classes\Modules\Orders\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\Services\CreatesOrder;
use App\Classes\Modules\Orders\Services\FetchesOrder;
use App\Classes\Modules\Orders\Standards\Rules\CanConfirmOrder;
use App\Classes\Modules\OrderSteps\Processors\GenerateOrderStepsProcessor;
use App\Classes\ValueObjects\Constants\OrderStatus;
use App\Classes\ValueObjects\Constants\OrderSteps;
use App\Classes\ValueObjects\Constants\OrderType;
use App\Http\Resources\OrderResource;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use Config;
class ConfirmOrderLogic extends AbstractControllerLogic
{
private $canConfirmOrder;
private $generateOrderStepsProcessor;
public function __construct(CanConfirmOrder $canConfirmOrder, GenerateOrderStepsProcessor $generateOrderStepsProcessor, FetchesOrder $fetchesOrder)
{
$this->canConfirmOrder = $canConfirmOrder;
$this->generateOrderStepsProcessor = $generateOrderStepsProcessor;
$this->fetchesOrder = $fetchesOrder;
}
protected function notification():array {
return [
'title' => 'Confirm Order',
'message' => 'Order confirmed'
];
}
public function logic(Request $request) : JsonResponse {
$order_object = new OrderObject(0,'','',0,0, '',$request->get('id'));
$this->canConfirmOrder->passes($order_object);
$order = $this->fetchesOrder->execute(['id'=>$order_object->getId()]);
$this->generateOrderStepsProcessor->execute($order);
return $this->resourceResponse(new OrderResource($order));
}
}
@@ -0,0 +1,46 @@
<?php
namespace App\Classes\Modules\Orders\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\Services\CreatesOrder;
use App\Classes\Modules\Orders\Processors\CreateOrderProcessor;
use App\Classes\Modules\Orders\Standards\Rules\CanCreateOrder;
use App\Classes\ValueObjects\Constants\OrderStatus;
use App\Classes\ValueObjects\Constants\OrderSteps;
use App\Classes\ValueObjects\Constants\OrderType;
use App\Http\Resources\OrderResource;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
class CreateOrderLogic extends AbstractControllerLogic
{
private $createOrderProcessor;
public function __construct( CreateOrderProcessor $createsOrderProcessor)
{
$this->createOrderProcessor = $createsOrderProcessor;
}
protected function notification():array {
return [
'title' => 'Created Order',
'message' => 'You have successfully created a new Order'
];
}
public function logic(Request $request) : JsonResponse {
$order = $this->createOrderProcessor->execute($request);
//$order_object = new OrderObject($request->get('company_module_id'), '', '', OrderType::SHARED_CONTAINER, OrderStatus::PROCESSING, OrderSteps::PROCESSING);
//$this->canCreateOrder->passes($order_object);
//$order = $this->createsOrder->execute($order_object);
return $this->resourceResponse(new OrderResource($order));
}
}
@@ -0,0 +1,74 @@
<?php
namespace App\Classes\Modules\Orders\DataTransferObjects;
use App\Classes\General\Interfaces\DataTransferObject;
class OrderObject implements DataTransferObject
{
private $id;
private $company_module_id;
private $reference;
private $reference_contract;
private $type;
private $status;
private $current_step;
public function __construct(int $company_module_id, ?string $reference, string $reference_contract, int $type, int $status, string $current_step, int $id=0)
{
$this->company_module_id = $company_module_id;
$this->reference = $reference;
$this->reference_contract = $reference_contract;
$this->type = $type;
$this->status = $status;
$this->current_step = $current_step;
$this->id = $id;
}
public function getId(): int
{
return $this->id;
}
public function getCompanyModuleId(): int
{
return $this->company_module_id;
}
public function getReference(): string
{
return $this->reference;
}
public function getReferenceContract(): string
{
return $this->reference_contract;
}
public function getType(): int
{
return $this->type;
}
public function getStatus(): int
{
return $this->status;
}
public function getCurrentStep(): string
{
return $this->current_step;
}
public function setCurrentStep(string $step)
{
$this->current_step = $step;
}
}
@@ -0,0 +1,53 @@
<?php
namespace App\Classes\Modules\Orders\Services\Steps;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\Services\FetchesOrder;
use App\Classes\Modules\OrderSteps\Services\FetchesOrderSteps;
use App\Classes\Modules\Orders\Standards\Rules\CanUpdateCurrentStep;
use App\Classes\Modules\OrderSteps\Processors\UpdateOrderStepsProcessor;
use App\Classes\ValueObjects\Constants\OrderStatus;
use App\Classes\ValueObjects\Constants\OrderSteps;
use App\Models\Order;
use App\Models\OrderStep;
class ConfirmOrderProcessor
{
private $canUpdateCurrentStep;
private $updatesCurrentStep;
private $fetchesOrder;
private $fetchesOrderSteps;
private $updateOrderStepProcessors;
public function __construct(CanUpdateCurrentStep $canUpdateCurrentStep, FetchesOrder $fetchesOrder, FetchesOrderSteps $fetchesOrderSteps, UpdatesOrderCurrentStep $updatesCurrentStep, UpdateOrderStepsProcessor $updateOrderStepProcessors)
{
$this->canUpdateCurrentStep = $canUpdateCurrentStep;
$this->updatesCurrentStep = $updatesCurrentStep;
$this->fetchesOrder = $fetchesOrder;
$this->fetchesOrderSteps = $fetchesOrderSteps;
$this->updateOrderStepProcessors = $updateOrderStepProcessors;
}
public function execute(int $orderId, string $currentStep){
$order_object = new OrderObject(0, '', '', 0, 0, $currentStep, $orderId);
$this->canUpdateCurrentStep->passes($order_object);
$order = $this->fetchesOrder->execute(['id'=>$order_object->getId()]);
$order_steps = $this->fetchesOrderSteps->execute(['order_id'=>$order_object->getId(), 'status'=> OrderStatus::PROCESSING, 'order_by' => 'sequence', 'per_page' => 1]);
$order_object->setCurrentStep($currentStep);
$order = $this->updatesCurrentStep->execute($order, $order_object);
$this->updateOrderStepProcessors->execute($currentStep);
}
}
@@ -0,0 +1,42 @@
<?php
namespace App\Classes\Modules\Orders\Processors;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\Services\CreatesOrder;
use App\Classes\Modules\Orders\Standards\Rules\CanCreateOrder;
use App\Classes\Modules\OrderSteps\Processors\CreateOrderStepsProcessor;
use App\Classes\ValueObjects\Constants\OrderStatus;
use App\Classes\ValueObjects\Constants\OrderSteps;
use App\Classes\ValueObjects\Constants\OrderType;
use Illuminate\Http\Request;
class CreateOrderProcessor
{
private $canCreateOrder;
private $createsOrder;
private $createOrderStepsProcessor;
public function __construct(CanCreateOrder $canCreateOrder, CreatesOrder $createsOrder, CreateOrderStepsProcessor $createOrderStepsProcessor)
{
$this->canCreateOrder = $canCreateOrder;
$this->createsOrder = $createsOrder;
$this->createOrderStepsProcessor = $createOrderStepsProcessor;
}
public function execute(Request $request){
$order_object = new OrderObject($request->get('company_module_id'), $request->get('reference'), '', OrderType::SHARED_CONTAINER, OrderStatus::PROCESSING, OrderSteps::PROCESSING);
$this->canCreateOrder->passes($order_object);
$order = $this->createsOrder->execute($order_object);
//Add processing to order step
$this->createOrderStepsProcessor->execute($order, OrderSteps::PROCESSING);
return $order;
}
}
@@ -0,0 +1,48 @@
<?php
namespace App\Classes\Modules\Orders\Processors;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\Services\FetchesOrder;
use App\Classes\Modules\Orders\Services\UpdatesCurrentStep;
use App\Classes\Modules\OrderSteps\Services\FetchesOrderSteps;
use App\Classes\Modules\Orders\Standards\Rules\CanUpdateCurrentStep;
use App\Classes\ValueObjects\Constants\OrderStatus;
use App\Classes\ValueObjects\Constants\OrderSteps;
use App\Models\Order;
use App\Models\OrderStep;
class UpdatesOrderCurrentStepProcessor
{
private $canUpdateCurrentStep;
private $updatesCurrentStep;
private $fetchesOrder;
private $fetchesOrderSteps;
public function __construct(CanUpdateCurrentStep $canUpdateCurrentStep, FetchesOrder $fetchesOrder, FetchesOrderSteps $fetchesOrderSteps, UpdatesCurrentStep $updatesCurrentStep)
{
$this->canUpdateCurrentStep = $canUpdateCurrentStep;
$this->updatesCurrentStep = $updatesCurrentStep;
$this->fetchesOrder = $fetchesOrder;
$this->fetchesOrderSteps = $fetchesOrderSteps;
}
public function execute(int $orderId, string $currentStep){
$order_object = new OrderObject(0, '', '', 0, 0, $currentStep, $orderId);
$this->canUpdateCurrentStep->passes($order_object);
$order = $this->fetchesOrder->execute(['id'=>$order_object->getId()]);
$order_steps = $this->fetchesOrderSteps->execute(['order_id'=>$order_object->getId(), 'status'=> OrderStatus::PROCESSING, 'order_by' => 'sequence', 'per_page' => 1]);
$order_object->setCurrentStep($currentStep);
$order = $this->updatesCurrentStep->execute($order, $order_object);
}
}
@@ -0,0 +1,29 @@
<?php
namespace App\Classes\Modules\Orders\Services;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Models\Order;
class CreatesOrder extends AbstractUpdateRecord
{
/**
* @param OrderObject $object
* @return \Illuminate\Database\Eloquent\Model
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(OrderObject $object)
{
$model = new Order();
$model->company_module_id = $object->getCompanyModuleId();
$model->reference = $object->getReference();
$model->reference_contract = $object->getReferenceContract();
$model->type = $object->getType();
$model->status = $object->getStatus();
$model->current_step = $object->getCurrentStep();
return $this->handler($model);
}
}
@@ -0,0 +1,32 @@
<?php
namespace App\Classes\Modules\Orders\Services;
use App\Classes\General\Eloquent\AbstractFetchRecord;
use App\Models\Order;
use Illuminate\Database\Eloquent\Builder;
class FetchesOrder extends AbstractFetchRecord
{
/** @var Order */
private $repository;
/**
* FetchOrder constructor.
* @param Order $repository
*/
public function __construct(Order $repository)
{
$this->repository = $repository;
}
/**
* @return Builder
*/
public function getRepository(): Builder
{
return $this->repository->newQuery();
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\Classes\Modules\Orders\Services;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Models\Order;
class UpdatesCurrentStep extends AbstractUpdateRecord
{
public function execute(Order $model, OrderObject $object) {
$model->current_step = $object->getCurrentStep();
return $this->handler($model);
}
}
@@ -0,0 +1,39 @@
<?php
namespace App\Classes\Modules\Orders\Standards\Rules;
use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Modules\Orders\Standards\Validators\ConfirmOrderValidation;
class CanConfirmOrder extends AbstractRule
{
private $confirmOrderValidation;
public function __construct(ConfirmOrderValidation $confirmOrderValidation)
{
$this->confirmOrderValidation = $confirmOrderValidation;
}
/**
* @return bool
*/
protected function authorized(): bool
{
// TODO Set Authorization rules
return true;
}
protected function validators($object): bool
{
return $this->confirmOrderValidation->validate($object);
}
/**
* @param CompanyObject $object
* @return bool
*/
protected function criteria($object): bool
{
return true;
}
}
@@ -0,0 +1,41 @@
<?php
namespace App\Classes\Modules\Orders\Standards\Rules;
use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Modules\Orders\Standards\Validators\OrderValidation;
class CanCreateOrder extends AbstractRule
{
private $orderValidation;
public function __construct(OrderValidation $orderValidation)
{
$this->orderValidation = $orderValidation;
}
/**
* @return bool
*/
protected function authorized(): bool
{
// TODO Set Authorization rules
return true;
}
protected function validators($object): bool
{
return $this->orderValidation->validate($object);
}
/**
* @param CompanyObject $object
* @return bool
*/
protected function criteria($object): bool
{
//Verify account?
//Contract created on Unity
return true;
}
}
@@ -0,0 +1,39 @@
<?php
namespace App\Classes\Modules\Orders\Standards\Rules;
use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Modules\Orders\Standards\Validators\UpdateCurrentStepValidation;
class CanUpdateCurrentStep extends AbstractRule
{
private $orderValidation;
public function __construct(UpdateCurrentStepValidation $orderValidation)
{
$this->orderValidation = $orderValidation;
}
/**
* @return bool
*/
protected function authorized(): bool
{
// TODO Set Authorization rules
return true;
}
protected function validators($object): bool
{
return $this->orderValidation->validate($object);
}
/**
* @param CompanyObject $object
* @return bool
*/
protected function criteria($object): bool
{
return true;
}
}
@@ -0,0 +1,40 @@
<?php
namespace App\Classes\Modules\Orders\Standards\Validators;
use App\Classes\General\Abstracts\AbstractValidation;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
class ConfirmOrderValidation extends AbstractValidation
{
/**
* @param OrderObject $object
* @return array
*/
protected function data($object): array
{
return [
'id' => $object->getId(),
];
}
/**
* @param string $type
* @return array
*/
protected function rules(?string $type = 'POST'): array
{
return [
'id' => 'required|exists:orders,id'
];
}
/**
* @return array
*/
protected function messages(): array
{
return [];
}
}
@@ -0,0 +1,49 @@
<?php
namespace App\Classes\Modules\Orders\Standards\Validators;
use App\Classes\General\Abstracts\AbstractValidation;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
class OrderValidation extends AbstractValidation
{
/**
* @param OrderObject $object
* @return array
*/
protected function data($object): array
{
return [
'company_module_id' => $object->getCompanyModuleId(),
'reference' => $object->getReference(),
'reference_contract' => $object->getReferenceContract(),
];
}
/**
* @param string $type
* @return array
*/
protected function rules(?string $type = 'POST'): array
{
if ($type == 'POST') {
return [
'company_module_id' => 'required',
'reference' => '',
'reference_contract' => ''
];
} elseif ($type == 'PUT') {
return [
'id' => 'required'
];
}
}
/**
* @return array
*/
protected function messages(): array
{
return [];
}
}
@@ -0,0 +1,41 @@
<?php
namespace App\Classes\Modules\Orders\Standards\Validators;
use App\Classes\General\Abstracts\AbstractValidation;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
class UpdateCurrentStepValidation extends AbstractValidation
{
/**
* @param OrderObject $object
* @return array
*/
protected function data($object): array
{
return [
'id' => $object->getId(),
'current_step' => $object->getCurrentStep(),
];
}
/**
* @param string $type
* @return array
*/
protected function rules(?string $type = 'POST'): array
{
return [
'id'=> 'required|numeric',
'current_step'=> 'required',
];
}
/**
* @return array
*/
protected function messages(): array
{
return [];
}
}
@@ -0,0 +1,24 @@
<?php
namespace App\Classes\Modules\Unity\Processors;
use Config;
use Illuminate\Support\Facades\Http;
use App\Classes\Modules\Unity\Services\GetContractObligations;
class GetContractObligationsProcessor
{
private $unityConfig;
private $GetContractObligations;
public function __construct(GetContractObligations $getContractObligations)
{
$this->unityConfig = Config::get('unity');
$this->getContractObligations = $getContractObligations;
}
public function execute(){
return $this->getContractObligations->execute();
}
}
@@ -0,0 +1,37 @@
<?php
namespace App\Classes\Modules\Unity\Services;
use Config;
use Illuminate\Support\Facades\Http;
class GetAccessToken
{
private $unityConfig;
public function __construct()
{
$this->unityConfig = Config::get('unity');
}
public function execute(){
//TODO: Cache access token base on expiry for login version
$accesToken='';
if($this->unityConfig['default_auth']=='login'){
$loginDetails = $this->unityConfig['auth']['login'];
$response = Http::post($this->unityConfig['url'].$loginDetails['endpoint'], [
'email' => $loginDetails['username'],
'password' => $loginDetails['password'],
])->object();
$accesToken = $response->access_token;
}else{
$accesToken = $this->unityConfig['auth']['api_key']['key'];
}
//TODO: Throw error if access token not available
return $accesToken;
}
}
@@ -0,0 +1,31 @@
<?php
namespace App\Classes\Modules\Unity\Services;
use Config;
use Illuminate\Support\Facades\Http;
use App\Classes\Modules\Unity\Services\GetAccessToken;
class GetContractObligations
{
private $unityConfig;
private $getAccessToken;
public function __construct(GetAccessToken $getAccessToken)
{
$this->unityConfig = Config::get('unity');
$this->getAccessToken = $getAccessToken;
}
public function execute(){
$accesToken=$this->getAccessToken->execute();
$response = Http::withToken($accesToken)->get($this->unityConfig['url'].$this->unityConfig['steps_endpoint'])->object();
$orderSteps = [];
return (isset($response->data)) ? $response->data : [];
}
}
@@ -0,0 +1,15 @@
<?php
namespace App\Classes\ValueObjects\Constants;
final class OrderEntity {
public const WAREHOUSE_MALAYSIA = "Warehouse Malaysia";
public const WAREHOUSE_YIWU = "Warehouse Yiwu";
public const WAREHOUSE_GUANG_ZHOU = "Warehouse Guang Zhou";
public const SUPPLIER = "Supplier";
}
@@ -0,0 +1,17 @@
<?php
namespace App\Classes\ValueObjects\Constants;
final class OrderStatus {
public const PROCESSING = 0;
public const SHIPPING = 1;
public const RECEIVING = 2;
public const COMPLETE = 3;
public const CANCEL = 4;
}
@@ -0,0 +1,161 @@
<?php
namespace App\Classes\ValueObjects\Constants;
final class OrderSteps
{
public const PROCESSING = 'PROCESSING';
public const PACKING = 'PACKING';
public const SHIPPING = 'SHIPPING';
public const DELIVERY = 'DELIVERY';
public const WAREHOUSE_RECEIVING = 'WAREHOUSE_RECEIVING';
public const WAREHOUSE_LOAD_CONTAINER = 'WAREHOUSE_LOAD_CONTAINER';
public const WAREHOUSE_ARRIVAL = 'WAREHOUSE_ARRIVAL';
public const WAREHOUSE_UNLOAD_CONTAINER = 'WAREHOUSE_UNLOAD_CONTAINER';
/*
public const COMPANY_PROCESSING_CATEGORY = 'processing';
public const COMPANY_SHIPPING_CATEGORY = 'shipping';
public const COMPANY_RECEIVING_CATEGORY = 'receiving';
public const COMPANY_COMPLETE_CATEGORY = 'complete';
public const COMPANY_CANCEL_CATEGORY = 'cancel';
public const ORDER_PROCESSING_STEP = 'PS_PROCESSING';
public const ORDER_SHIPPING_STEP = 'PS_SHIPPING';
public const ORDER_DELIVERY_STEP = 'PS_DELIVERY';
public const ORDER_MODULE_WAREHOUSE = 'WAREHOUSE';
public const ORDER_WAREHOUSE_RECEIVING_STEP = 'MS_WAREHOUSE_RECEIVING';
public const ORDER_WAREHOUSE_PACKING_STEP = 'MS_WAREHOUSE_PACKING';
public const ORDER_WAREHOUSE_ARRIVAL_STEP = 'MS_WAREHOUSE_ARRIVAL';
public const ORDER_WAREHOUSE_UNPACKING_STEP = 'MS_WAREHOUSE_UNPACKING';
public const ORDER_MODULE_NO_WAREHOUSE = 'NO_WAREHOUSE';
public const ORDER_NO_WAREHOUSE_PENDING_SUPPLIER = 'MS_NO_WAREHOUSE_PENDING_SUPPLIER';
public const ORDER_PRIMARY_STEPS = [
OrderSteps::ORDER_PROCESSING_STEP => [
'initial_name' => 'processing order',
'final_name' => 'order confirmed',
'description' => 'Order created and pending confirmation',
'sequence' => 0
]
];
public const ORDER_PRIMARY_MODULAR_STEPS = [
OrderSteps::ORDER_SHIPPING_STEP => [
'initial_name' => 'shipping',
'final_name' => 'shipped out',
'description' => 'Order is Loaded to Container, waiting for Shipment',
'sequence' => 1
],
OrderSteps::ORDER_DELIVERY_STEP => [
'initial_name' => 'delivery',
'final_name' => 'Received',
'description' => 'Order out for delivery soon',
'sequence' => 2
],
];
public const ORDER_MODULAR_STEPS = [
OrderSteps::ORDER_MODULE_WAREHOUSE => [
'china_warehouse' => [
'previous' => OrderSteps::ORDER_PROCESSING_STEP,
'next' => OrderSteps::ORDER_SHIPPING_STEP,
'steps' => [
OrderSteps::ORDER_WAREHOUSE_RECEIVING_STEP => [
'initial_name' => 'pending supplier',
'final_name' => 'arrived at warehouse',
'description' => 'Waiting for supplier to deliver order to warehouse'
],
OrderSteps::ORDER_WAREHOUSE_PACKING_STEP => [
'initial_name' => 'packing',
'final_name' => 'packed',
'description' => 'Packing order into shipping container'
]
]
],
'malaysia_warehouse' => [
'previous' => OrderSteps::ORDER_SHIPPING_STEP,
'next' => OrderSteps::ORDER_DELIVERY_STEP,
'steps' => [
OrderSteps::ORDER_WAREHOUSE_ARRIVAL_STEP => [
'initial_name' => 'pending arrival',
'final_name' => 'arrived at warehouse',
'description' => 'Waiting for order\'s arrival & custom clearance'
],
OrderSteps::ORDER_WAREHOUSE_UNPACKING_STEP => [
'initial_name' => 'unpacking',
'final_name' => 'unpacked',
'description' => 'Unpacking order from shipping container'
]
]
]
],
OrderSteps::ORDER_MODULE_NO_WAREHOUSE => [
'pending_arrival' => [
'previous' => OrderSteps::ORDER_PROCESSING_STEP,
'next' => OrderSteps::ORDER_SHIPPING_STEP,
'steps' => [
OrderSteps::ORDER_NO_WAREHOUSE_PENDING_SUPPLIER => [
'initial_name' => 'pending supplier',
'final_name' => 'supplier packed order',
'description' => 'Waiting for supplier to pack order for shipping'
]
]
]
],
];
public const COMPANY_ORDER_PROCESSING = [
OrderSteps::ORDER_PROCESSING_STEP,
OrderSteps::ORDER_NO_WAREHOUSE_PENDING_SUPPLIER,
OrderSteps::ORDER_WAREHOUSE_RECEIVING_STEP
];
public const COMPANY_ORDER_SHIPPING = [
OrderSteps::ORDER_WAREHOUSE_PACKING_STEP,
OrderSteps::ORDER_SHIPPING_STEP
];
public const COMPANY_ORDER_RECEIVING = [
OrderSteps::ORDER_WAREHOUSE_ARRIVAL_STEP,
OrderSteps::ORDER_WAREHOUSE_UNPACKING_STEP,
OrderSteps::ORDER_DELIVERY_STEP
];
public const WAREHOUSE_RECEIVING_CATEGORY = 'receiving';
public const WAREHOUSE_SHIPPING_CATEGORY = 'shipping';
public const WAREHOUSE_COMPLETE_CATEGORY = 'complete';
public const WAREHOUSE_CANCEL_CATEGORY = 'cancel';
public const WAREHOUSE_ORDER_RECEIVING = [
OrderSteps::ORDER_WAREHOUSE_RECEIVING_STEP
];
public const WAREHOUSE_ORDER_SHIPPING = [
OrderSteps::ORDER_WAREHOUSE_PACKING_STEP,
OrderSteps::ORDER_SHIPPING_STEP,
];
public const WAREHOUSE_ORDER_COMPLETE = [
OrderSteps::ORDER_WAREHOUSE_ARRIVAL_STEP,
OrderSteps::ORDER_WAREHOUSE_UNPACKING_STEP,
OrderSteps::ORDER_DELIVERY_STEP
];
public const STEP_PROCESSOR = [
OrderSteps::ORDER_PROCESSING_STEP => ConfirmsOrder::class,
OrderSteps::ORDER_WAREHOUSE_RECEIVING_STEP => WarehouseReceivesOrder::class,
OrderSteps::ORDER_WAREHOUSE_PACKING_STEP => WarehousePackOrder::class,
OrderSteps::ORDER_SHIPPING_STEP => ShipOrder::class,
OrderSteps::ORDER_WAREHOUSE_ARRIVAL_STEP => WarehouseArrivalOrder::class,
OrderSteps::ORDER_WAREHOUSE_UNPACKING_STEP => WarehouseUnpackingOrder::class,
OrderSteps::ORDER_DELIVERY_STEP => DeliverOrder::class,
];
*/
}
@@ -0,0 +1,11 @@
<?php
namespace App\Classes\ValueObjects\Constants;
final class OrderType {
public const SHARED_CONTAINER = 0;
public const DEDICATED_CONTAINER = 1;
}
@@ -0,0 +1,19 @@
<?php
namespace App\Classes\ValueObjects\Constants;
final class OrderWorkflow
{
public const STANDARD = [
OrderSteps::PROCESSING=>[],
OrderSteps::PACKING=>[],
OrderSteps::SHIPPING=>[
OrderSteps::WAREHOUSE_ARRIVAL=>[],
OrderSteps::WAREHOUSE_LOAD_CONTAINER=>[]
],
OrderSteps::DELIVERY=>[
OrderSteps::WAREHOUSE_RECEIVING=>[],
OrderSteps::WAREHOUSE_UNLOAD_CONTAINER=>[]
],
];
}
@@ -0,0 +1,13 @@
<?php
namespace App\Classes\ValueObjects\Constants;
final class UnityStatus {
public const PENDING = 9;
public const ACTIVE = 1;
public const DELETED = 2;
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\Orders;
use App\Classes\Modules\Orders\ControllersLogic\CompletesOrderStepLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class CompletesOrderStepsController
{
/**
* @param Request $request
* @param CreateOrderLogic $logic
* @return JsonResponse
*/
public function complete(Request $request, CompletesOrderStepLogic $logic): JsonResponse
{
return $logic->execute($request);
}
}
@@ -0,0 +1,21 @@
<?php
namespace App\Http\Controllers\Orders;
use App\Classes\Modules\Orders\ControllersLogic\ConfirmOrderLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class ConfirmOrderController
{
/**
* @param Request $request
* @param ConfirmOrderLogic $logic
* @return JsonResponse
*/
public function confirm(int $id, Request $request, ConfirmOrderLogic $logic): JsonResponse
{
$request->merge(['id' => $id]);
return $logic->execute($request);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\Orders;
use App\Classes\Modules\Orders\ControllersLogic\CreateOrderLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class CreateOrderController
{
/**
* @param Request $request
* @param CreateOrderLogic $logic
* @return JsonResponse
*/
public function create(Request $request, CreateOrderLogic $logic): JsonResponse
{
return $logic->execute($request);
}
}
+33
View File
@@ -0,0 +1,33 @@
<?php
namespace App\Http\Resources;
use App\Models\Company;
use App\Models\Currency;
use App\Models\OrderStep;
use App\Models\SegmentConstant;
use Illuminate\Http\Resources\Json\JsonResource;
class OrderResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'reference' => $this->reference,
'reference_contract' => (int) $this->type,
'type' => (int) $this->type,
'status' => (int) $this->status,
'current_step' => $this->current_step,
'company' => new CompanyResource(Company::where('id',$this->companyModule()->first()->company_id)->first()),
'order_steps' => OrderStepsResource::collection($this->orderSteps()->get()),
];
}
}
+36
View File
@@ -0,0 +1,36 @@
<?php
namespace App\Http\Resources;
use App\Classes\Modules\Companies\Services\FetchesCompanyServices;
use App\Classes\ValueObjects\Constants\BankAccountType;
use App\Classes\ValueObjects\Constants\BusinessType;
use App\Classes\ValueObjects\Constants\DocumentType;
use App\Classes\ValueObjects\Constants\SegmentConstants;
use App\Models\Currency;
use App\Models\SegmentConstant;
use Illuminate\Http\Resources\Json\JsonResource;
class OrderStepsResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'order_id' => $this->order_id,
'appointee_id' => $this->appointee_id,
'reference' => $this->reference,
'primary' => (int) $this->primary,
'sequence' => (double) $this->sequence,
'status' =>(int) $this->status,
'contract_status' =>(int) $this->contract_status,
'complete_date' => $this->complete_date,
];
}
}
+30
View File
@@ -0,0 +1,30 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\MorphMany;
class Order extends AbstractModel
{
use SoftDeletes;
protected $table = 'orders';
protected $dates = ['deleted_at'];
public function companyModule(): belongsTo
{
return $this->belongsTo(CompanyModule::class, 'company_module_id', 'id');
}
public function orderSteps()
{
return $this->hasMany(OrderStep::class, 'order_id');
}
}
+11
View File
@@ -0,0 +1,11 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class OrderRole extends Model
{
use HasFactory;
}
+16
View File
@@ -0,0 +1,16 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\SoftDeletes;
class OrderStep extends AbstractModel
{
use SoftDeletes;
protected $table = 'order_steps';
protected $dates = ['deleted_at'];
protected $fillable = ['order_id','appointee_id','reference','primary','sequence','status','contract_status','complete_date'];
}
+42
View File
@@ -0,0 +1,42 @@
<?php
return [
'url' => env('UNITY_API_URL', 'https://dev.unity.izyim.com/user-backsys/api/'),
'auth' => [
'api_key' => [
'key' => env('UNITY_API_KEY', ''),
],
'login' => [
'username' => env('UNITY_LOGIN_USERNAME','one@izyim.com'),
'password' => env('UNITY_LOGIN_PASSWORD','pass123'),
'endpoint' => env('UNITY_LOGIN_ENDPOINT','login')
],
],
'steps_endpoint' => env('UNITY_LOGIN_ENDPOINT','contract-template-obligation/list'),
'default_auth' => env('UNITY_AUTH','login'),
'on_error_email' => env('UNITY_ON_ERROR_EMAIL','dev@shipping.com,dev@unity.com'),
'contract_template_id' => env('UNITY_CONTRACT_TEMPLATE_ID', 102),
'contract_template_cache' => env('UNITY_CONTRACT_TEMPLATE_CACHE','60'),
'entity' => [
'xxx' => App\Classes\ValueObjects\Constants\OrderEntity::SUPPLIER,
'zzz' => App\Classes\ValueObjects\Constants\OrderEntity::WAREHOUSE_YIWU,
'vvv' => App\Classes\ValueObjects\Constants\OrderEntity::WAREHOUSE_GUANG_ZHOU,
'wwww' => App\Classes\ValueObjects\Constants\OrderEntity::SUPPLIER,
],
'step_processor' => [
App\Classes\ValueObjects\Constants\OrderSteps::PACKING => App\Classes\Modules\OrderSteps\Processors\Steps\Packing::class,
],
];
@@ -0,0 +1,40 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateOrdersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('orders', function (Blueprint $table) {
$table->id();
$table->bigInteger('company_module_id')->unsigned()->index()->comment('Entity responsible to create this order');
$table->string('reference')->comment('Reference no for user ');
$table->string('reference_contract')->comment('Reference no from Unity platform');
$table->integer('type')->default(0)->comment('Order packages can be shipped in shared or dedicated container');
$table->integer('status')->default(0)->comment('Status of this order, e.g. processing, shipping etc.');
$table->string('current_step')->nullable(false)->comment('Current steps is quick reference for order steps');
$table->softDeletes();
$table->timestamps();
$table->foreign('company_module_id')->references('id')->on('company_modules');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('orders');
}
}
@@ -0,0 +1,43 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateOrderStepsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('order_steps', function (Blueprint $table) {
$table->id();
$table->bigInteger('order_id')->unsigned()->index();
$table->bigInteger('appointee_id')->unsigned()->index()->comment('');
$table->string('reference')->comment('Reference no for user ');
$table->integer('primary')->default(0);
$table->decimal('sequence', 4, 2);
$table->integer('status')->default(0)->comment('Status of this order, e.g. processing, shipping etc.');
$table->integer('contract_status')->default(0)->comment('Status of this order, e.g. processing, shipping etc.');
$table->date('complete_date')->nullable();
$table->softDeletes();
$table->timestamps();
$table->foreign('appointee_id')->references('id')->on('company_modules');
$table->foreign('order_id')->references('id')->on('orders');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('order_steps');
}
}
@@ -0,0 +1,38 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateOrderRolesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('order_roles', function (Blueprint $table) {
$table->id();
$table->bigInteger('order_id')->unsigned()->index()->comment('Order id');
$table->bigInteger('company_module_id')->unsigned()->index()->comment('Entity plays a role in this order, e.g. Freight Forwarder');
$table->integer('role')->default(0)->comment('Describe role participate in processing order');
$table->softDeletes();
$table->timestamps();
$table->foreign('company_module_id')->references('id')->on('company_modules');
$table->foreign('order_id')->references('id')->on('orders');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('order_roles');
}
}
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -40,8 +40,8 @@ Route::group(['middleware' => 'api', 'prefix' => 'v1', 'as' => 'api.'], function
//
// require __DIR__ . '/bank.php';
//
// require __DIR__ . '/booking.php';
//
require __DIR__ . '/order.php';
require __DIR__ . '/currency.php';
require __DIR__ . '/address.php';
+21
View File
@@ -0,0 +1,21 @@
<?php
use Illuminate\Support\Facades\Route;
Route::group(['prefix' => 'order', 'as' => 'order.', 'namespace' => 'Orders'], function () {
#Route::get('/{id}/show', 'FetchOrderController@fetch')->name('show');
#Route::get('/list', 'ListOrdersController@list')->name('list');
Route::post('/create', 'CreateOrderController@create')->name('create');
Route::put('/confirm/{id}', 'ConfirmOrderController@confirm')->name('confirm');
#Route::put('/update/{id}', 'UpdateOrderController@update')->name('update');
#Route::delete('/delete/{id}', 'DeleteOrderController@destroy')->name('delete');
Route::group(['prefix' => '{id}/step', 'as' => 'step.'], function () {
Route::post('/complete', 'CompletesOrderStepsController@complete')->name('create');
});
Route::group(['prefix' => '{id}/role', 'as' => 'role.'], function () {});
});