Orders APIs WIP

This commit is contained in:
Fairuz
2021-07-15 17:30:12 +08:00
parent ac288981f5
commit 9c0772bf65
24 changed files with 1443 additions and 56 deletions
@@ -25,7 +25,7 @@ class OrderStepsObject implements DataTransferObject
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)
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;
@@ -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);
}
}
@@ -1,10 +1,11 @@
<?php
namespace App\Classes\Modules\Orders\Services\Steps;
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\Orders\Services\FetchesOrderSteps;
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;
@@ -13,7 +14,7 @@ use App\Classes\ValueObjects\Constants\OrderSteps;
use App\Models\Order;
use App\Models\OrderStep;
class UpdateOrderStep
class UpdateOrderStepsProcessor
{
private $canUpdateCurrentStep;
@@ -23,7 +24,7 @@ class UpdateOrderStep
private $fetchesOrderSteps;
public function __construct(CanUpdateCurrentStep $canUpdateCurrentStep, FetchesOrder $fetchesOrder, FetchesOrderSteps $fetchesOrderSteps, UpdatesOrderCurrentStep $updatesOrderCurrentStep)
public function __construct(CanUpdateCurrentStep $canUpdateCurrentStep, FetchesOrder $fetchesOrder, FetchesOrderSteps $fetchesOrderSteps, UpdatesOrderCurrentStepProcessor $updatesOrderCurrentStep )
{
$this->canUpdateCurrentStep = $canUpdateCurrentStep;
$this->updatesOrderCurrentStep = $updatesOrderCurrentStep;
@@ -41,8 +42,6 @@ class UpdateOrderStep
$order_steps = $this->fetchesOrderSteps->execute(['order_id'=>$order_object->getId(), 'status'=> OrderStatus::PROCESSING, 'order_by' => 'sequence', 'per_page' => 1]);
$order_object->setCurrentStep($currentStep);
$this->updatesOrderCurrentStep->execute($orderId, $currentStep);
@@ -0,0 +1,26 @@
<?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 CreatesOrderSteps extends AbstractUpdateRecord
{
public function execute(OrderStepsObject $object) {
$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();
return $this->handler($model);
}
}
@@ -1,6 +1,6 @@
<?php
namespace App\Classes\Modules\Orders\Services;
namespace App\Classes\Modules\OrderSteps\Services;
use App\Classes\General\Eloquent\AbstractFetchRecord;
use App\Models\OrderStep;
@@ -1,6 +1,6 @@
<?php
namespace App\Classes\Modules\Orders\Services;
namespace App\Classes\Modules\OrderSteps\Services;
use App\Classes\General\Eloquent\AbstractFetchRecord;
use App\Models\OrderStep;
@@ -0,0 +1,25 @@
<?php
namespace App\Classes\Modules\OrderSteps\Services;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Classes\Modules\OrderSteps\DataTransferObjects\OrderStepsObject;
use App\Models\Order;
class UpdatesOrderSteps extends AbstractUpdateRecord
{
public function execute(Order $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();
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,41 @@
<?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(),
'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,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 ConfirmOrderLogic 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));
}
}
@@ -5,6 +5,7 @@ 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;
@@ -16,14 +17,11 @@ use Illuminate\Http\JsonResponse;
class CreateOrderLogic extends AbstractControllerLogic
{
private $canCreateOrder;
private $createOrderProcessor;
private $createsOrder;
public function __construct(CanCreateOrder $canCreateOrder, CreatesOrder $createsOrder)
public function __construct( CreateOrderProcessor $createsOrderProcessor)
{
$this->canCreateOrder = $canCreateOrder;
$this->createsOrder = $createsOrder;
$this->createOrderProcessor = $createsOrderProcessor;
}
protected function notification():array {
@@ -34,11 +32,14 @@ class CreateOrderLogic extends AbstractControllerLogic
}
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->createOrderProcessor->execute($request);
$order = $this->createsOrder->execute($order_object);
//$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,49 @@
<?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\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;
public function __construct(CanUpdateCurrentStep $canUpdateCurrentStep, FetchesOrder $fetchesOrder, FetchesOrderSteps $fetchesOrderSteps, UpdatesOrderCurrentStep $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,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;
}
}
@@ -1,10 +1,11 @@
<?php
namespace App\Classes\Modules\Orders\Services\Steps;
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\FetchesOrderSteps;
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;
@@ -21,7 +22,7 @@ class UpdatesOrderCurrentStepProcessor
private $fetchesOrderSteps;
public function __construct(CanUpdateCurrentStep $canUpdateCurrentStep, FetchesOrder $fetchesOrder, FetchesOrderSteps $fetchesOrderSteps, UpdatesOrderCurrentStep $updatesCurrentStep)
public function __construct(CanUpdateCurrentStep $canUpdateCurrentStep, FetchesOrder $fetchesOrder, FetchesOrderSteps $fetchesOrderSteps, UpdatesCurrentStep $updatesCurrentStep)
{
$this->canUpdateCurrentStep = $canUpdateCurrentStep;
$this->updatesCurrentStep = $updatesCurrentStep;
@@ -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,20 @@
<?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(Request $request, ConfirmOrderLogic $logic): JsonResponse
{
return $logic->execute($request);
}
}
+3 -2
View File
@@ -5,6 +5,7 @@ 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;
@@ -24,9 +25,9 @@ class OrderResource extends JsonResource
'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()),
];
}
}
+7 -23
View File
@@ -23,30 +23,14 @@ class OrderStepsResource extends JsonResource
{
return [
'id' => $this->id,
'name' => $this->name,
'order_id' => $this->order_id,
'appointee_id' => $this->appointee_id,
'reference' => $this->reference,
'type' => (int) $this->type,
'business_type' => (int) $this->business_type,
'status' => (int) $this->status,
'contact' => new ContactResource ($this->when($this->has('contacts'), $this->contacts->first())),
'address' => new AddressResource($this->when($this->has('addresses'), $this->addresses->where('billing', true)->first())),
// 'employee' => new UserResource($this->employees->first()),
// 'identification' => new DocumentResource($this->documents->whereIn('document_type', DocumentType::IDENTIFICATION_DOCUMENTS)->first()),
// 'bookings' => BookingResource::collection($this->whenLoaded('bookings', $this->bookings()->orderBy('id', 'DESC')->get(), [])),
// 'personal_banks' => BankResource::collection($this->banks->where('type', BankAccountType::PERSONAL)),
// 'recipient_banks' => [
// 'accounts' => BankResource::collection($this->banks->where('type', BankAccountType::EXTERNAL)),
// 'default' => new BankResource($this->banks->where('type', BankAccountType::EXTERNAL)->where('default', true)->first())
// ],
// 'segments' => SegmentResource::collection($this->segments),
// 'services' => (new FetchesCompanyServices())->getServices($this->servicesConfigurations()),
// 'currencies' => $this->when($this->business_type === BusinessType::CURRENCY_VENDOR, function(){
// $segment = SegmentConstant::where('reference', SegmentConstants::SUPPLIER_CURRENCIES)->where('detail->id', $this->id)->first();
// return $segment ? CurrencyResource::collection(Currency::whereIn('id', $segment->detail->currencies)->get()) : [];
// })
'primary' => (int) $this->primary,
'sequence' => (double) $this->sequence,
'status' =>(int) $this->status,
'contract_status' =>(int) $this->contract_status,
'complete_date' => $this->complete_date,
];
}
}
+8 -4
View File
@@ -2,10 +2,14 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class OrderStep extends Model
class OrderStep extends AbstractModel
{
use HasFactory;
use SoftDeletes;
protected $table = 'order_steps';
protected $dates = ['deleted_at'];
}
File diff suppressed because one or more lines are too long
+10 -5
View File
@@ -3,14 +3,19 @@
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::get('/{id}/show', 'FetchOrderController@fetch')->name('show');
#Route::get('/list', 'ListOrdersController@list')->name('list');
Route::post('/create', 'CreateOrderController@create')->name('create');
Route::put('/update/{id}', 'UpdateOrderController@update')->name('update');
Route::delete('/delete/{id}', 'DeleteOrderController@destroy')->name('delete');
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::group(['prefix' => '{id}/step', 'as' => 'step.'], function () {
Route::post('/complete', 'CompletesOrderStepsController@complete')->name('create');
});
Route::group(['prefix' => '{id}/role', 'as' => 'role.'], function () {});
});