Order APIs & Unity services

This commit is contained in:
Fairuz
2021-07-17 18:44:22 +08:00
parent 9c0772bf65
commit 95660069c9
23 changed files with 403 additions and 78 deletions
@@ -44,4 +44,4 @@ class CreateOrderStepsProcessor
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);
}
}
@@ -1,6 +1,6 @@
<?php
namespace App\Classes\Modules\Orders\Processors;
namespace App\Classes\Modules\OrderSteps\Processors\Steps;
use App\Classes\Modules\ControllerLogic\Exceptions\InternalServerErrorException;
@@ -53,4 +53,4 @@ class ConfirmsOrder extends AbstractStepProcessor
return $this->handler($this->orderId, $this->step);
}
}
}
@@ -4,10 +4,10 @@ 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\FetchesOrderSteps;
use App\Classes\Modules\OrderSteps\Services\UpdatesOrderSteps;
use App\Classes\Modules\Orders\Services\UpdatesCurrentStep;
use App\Classes\Modules\Orders\Standards\Rules\CanUpdateCurrentStep;
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;
@@ -16,35 +16,28 @@ use App\Models\OrderStep;
class UpdateOrderStepsProcessor
{
private $canUpdateCurrentStep;
private $canUpdateOrderStep;
private $updatesOrderCurrentStep;
private $fetchesOrder;
private $updatesOrderSteps;
private $fetchesOrderSteps;
public function __construct(CanUpdateCurrentStep $canUpdateCurrentStep, FetchesOrder $fetchesOrder, FetchesOrderSteps $fetchesOrderSteps, UpdatesOrderCurrentStepProcessor $updatesOrderCurrentStep )
public function __construct(CanUpdateOrderStep $canUpdateOrderStep, UpdatesOrderSteps $updatesOrderSteps, FetchesOrderSteps $fetchesOrderSteps )
{
$this->canUpdateCurrentStep = $canUpdateCurrentStep;
$this->updatesOrderCurrentStep = $updatesOrderCurrentStep;
$this->fetchesOrder = $fetchesOrder;
$this->canUpdateOrderStep = $canUpdateOrderStep;
$this->updatesOrderSteps = $updatesOrderSteps;
$this->fetchesOrderSteps = $fetchesOrderSteps;
}
public function execute(int $orderId, string $currentStep){
public function execute(string $currentStep){
$order_object = new OrderStepsObject($currentStep, 0, $currentStep, 0, 0, OrderStatus::PROCESSING, 0, null);
$orderStepsObject = new OrderStepsObject(0,0,$currentStep, 0, 0, 1, 1, null);
$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]);
$this->updatesOrderCurrentStep->execute($orderId, $currentStep);
$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);
}
}
@@ -5,22 +5,25 @@ 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 $object) {
public function execute(OrderStepsObject $orderSteps) {
$model = new OrderStep();
$model->order_id = $object->getOrderId();
$model->appointee_id = $object->getAppointeeId();
$model->reference = $object->getReference();
$model->primary = $object->getPrimary();
$model->sequence = $object->getSequence();
$model->status = $object->getStatus();
$model->contract_status = $object->getContractStatus();
$orderStepsModel = new OrderStep();
return $this->handler($model);
$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);
}
}
@@ -4,17 +4,13 @@ namespace App\Classes\Modules\OrderSteps\Services;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Classes\Modules\OrderSteps\DataTransferObjects\OrderStepsObject;
use App\Models\Order;
use App\Models\OrderStep;
class UpdatesOrderSteps extends AbstractUpdateRecord
{
public function execute(Order $model, OrderStepsObject $object) {
public function execute(OrderStep $model, OrderStepsObject $object) {
$model->appointee_id = $object->getAppointeeId();
$model->reference = $object->getReference();
$model->primary = $object->getPrimary();
$model->sequence = $object->getSequence();
$model->status = $object->getStatus();
$model->contract_status = $object->getContractStatus();
$model->complete_date = $object->getCompletedDate();
@@ -15,7 +15,6 @@ class UpdateOrderStepValidation extends AbstractValidation
{
return [
'id' => $object->getId(),
'current_step' => $object->getCurrentStep(),
];
}
@@ -25,10 +24,7 @@ class UpdateOrderStepValidation extends AbstractValidation
*/
protected function rules(?string $type = 'POST'): array
{
return [
'id'=> 'required|numeric',
'current_step'=> 'required',
];
return [];
}
/**
@@ -5,41 +5,47 @@ 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\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 $canCreateOrder;
private $generateOrderStepsProcessor;
private $createsOrder;
public function __construct(CanCreateOrder $canCreateOrder, CreatesOrder $createsOrder)
public function __construct(CanConfirmOrder $canConfirmOrder, GenerateOrderStepsProcessor $generateOrderStepsProcessor, FetchesOrder $fetchesOrder)
{
$this->canCreateOrder = $canCreateOrder;
$this->createsOrder = $createsOrder;
$this->canConfirmOrder = $canConfirmOrder;
$this->generateOrderStepsProcessor = $generateOrderStepsProcessor;
$this->fetchesOrder = $fetchesOrder;
}
protected function notification():array {
return [
'title' => 'Created Order',
'message' => 'You have successfully created a new Order'
'title' => 'Confirm Order',
'message' => 'Order confirmed'
];
}
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_object = new OrderObject(0,'','',0,0, '',$request->get('id'));
$order = $this->createsOrder->execute($order_object);
$this->canConfirmOrder->passes($order_object);
$order = $this->fetchesOrder->execute(['id'=>$order_object->getId()]);
$this->generateOrderStepsProcessor->execute($order);
return $this->resourceResponse(new OrderResource($order));
}
}
}
@@ -21,7 +21,7 @@ class OrderObject implements DataTransferObject
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)
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;
@@ -71,4 +71,4 @@ class OrderObject implements DataTransferObject
{
$this->current_step = $step;
}
}
}
@@ -6,6 +6,7 @@ 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;
@@ -21,12 +22,15 @@ class ConfirmOrderProcessor
private $fetchesOrderSteps;
public function __construct(CanUpdateCurrentStep $canUpdateCurrentStep, FetchesOrder $fetchesOrder, FetchesOrderSteps $fetchesOrderSteps, UpdatesOrderCurrentStep $updatesCurrentStep)
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){
@@ -43,7 +47,7 @@ class ConfirmOrderProcessor
$order = $this->updatesCurrentStep->execute($order, $order_object);
$this->updateOrderStepProcessors->execute($currentStep);
}
}
}
@@ -44,7 +44,5 @@ class UpdatesOrderCurrentStepProcessor
$order = $this->updatesCurrentStep->execute($order, $order_object);
}
}
}
@@ -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,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,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";
}
@@ -4,15 +4,15 @@ namespace App\Classes\ValueObjects\Constants;
final class OrderSteps
{
public const PROCESSING = 'PS_PROCESSING';
public const PACKING = 'PS_PACKING';
public const SHIPPING = 'PS_SHIPPING';
public const DELIVERY = 'PS_DELIVERY';
public const PROCESSING = 'PROCESSING';
public const PACKING = 'PACKING';
public const SHIPPING = 'SHIPPING';
public const DELIVERY = 'DELIVERY';
public const WAREHOUSE_RECEIVING = 'MS_WAREHOUSE_RECEIVING';
public const WAREHOUSE_LOAD_CONTAINER = 'MS_WAREHOUSE_LOAD_CONTAINER';
public const WAREHOUSE_ARRIVAL = 'MS_WAREHOUSE_ARRIVAL';
public const WAREHOUSE_UNLOAD_CONTAINER = 'MS_WAREHOUSE_UNLOAD_CONTAINER';
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';
@@ -158,4 +158,4 @@ final class OrderSteps
OrderSteps::ORDER_DELIVERY_STEP => DeliverOrder::class,
];
*/
}
}
@@ -13,8 +13,9 @@ class ConfirmOrderController
* @param ConfirmOrderLogic $logic
* @return JsonResponse
*/
public function confirm(Request $request, ConfirmOrderLogic $logic): JsonResponse
public function confirm(int $id, Request $request, ConfirmOrderLogic $logic): JsonResponse
{
$request->merge(['id' => $id]);
return $logic->execute($request);
}
}
}
+1
View File
@@ -12,4 +12,5 @@ class OrderStep extends AbstractModel
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,
],
];
+2 -2
View File
@@ -93,7 +93,7 @@
}
}
},
"/order/{id}/confirm": {
"/order/confirm/{id}": {
"put": {
"tags": [
"Order"
@@ -101,7 +101,7 @@
"produces": [
"application/json"
],
"operationId": "createOrder",
"operationId": "confirmOrder",
"summary": "Admin confirms order",
"description": "",
"parameters": [