diff --git a/app/Classes/Modules/Addresses/DataTransferObjects/AddressObject.php b/app/Classes/Modules/Addresses/DataTransferObjects/AddressObject.php index 76c66b52..b4453c3a 100644 --- a/app/Classes/Modules/Addresses/DataTransferObjects/AddressObject.php +++ b/app/Classes/Modules/Addresses/DataTransferObjects/AddressObject.php @@ -3,6 +3,7 @@ namespace App\Classes\Modules\Addresses\DataTransferObjects; use App\Classes\General\Interfaces\DataTransferObject; +use App\Classes\ValueObjects\Constants\ApprovalStatus; class AddressObject implements DataTransferObject { @@ -38,7 +39,7 @@ class AddressObject implements DataTransferObject * @param int $postCode * @param null|string $reference */ - public function __construct(string $streetOne, ?string $streetTwo, int $countryId, int $stateId, int $districtId, int $postCode, ?string $reference = null) + public function __construct(string $streetOne, ?string $streetTwo, int $countryId, int $stateId, int $districtId, int $postCode, ?string $reference = null, ?int $status = ApprovalStatus::APPROVED) { $this->streetOne = $streetOne; $this->streetTwo = $streetTwo; @@ -47,6 +48,7 @@ class AddressObject implements DataTransferObject $this->districtId = $districtId; $this->postCode = $postCode; $this->reference = $reference; + $this->status = $status; } /** @@ -105,5 +107,13 @@ class AddressObject implements DataTransferObject return $this->reference; } + /** + * @return int + */ + public function getStatus(): int + { + return $this->status; + } + } \ No newline at end of file diff --git a/app/Classes/Modules/Addresses/Services/CreatesAddress.php b/app/Classes/Modules/Addresses/Services/CreatesAddress.php index b6662a98..b9f2716c 100644 --- a/app/Classes/Modules/Addresses/Services/CreatesAddress.php +++ b/app/Classes/Modules/Addresses/Services/CreatesAddress.php @@ -28,6 +28,7 @@ class CreatesAddress extends AbstractUpdateRelationshipRecord $model->state_id = $object->getStateId(); $model->district_id = $object->getDistrictId(); $model->postcode = $object->getPostCode(); + $model->status = $object->getStatus(); return $this->handler($addressable->addresses(), $model); diff --git a/app/Classes/Modules/Orders/ControllersLogic/ApproveChangeOrderAddressLogic.php b/app/Classes/Modules/Orders/ControllersLogic/ApproveChangeOrderAddressLogic.php new file mode 100644 index 00000000..ff78145e --- /dev/null +++ b/app/Classes/Modules/Orders/ControllersLogic/ApproveChangeOrderAddressLogic.php @@ -0,0 +1,43 @@ + 'Change Order Address Approval', + 'message' => 'You have successfully change the order address' + ]; + } + + /** @var ApproveChangeOrderAddressProcessor */ + private $approveChangeOrderAddressProcessor; + + /** + * ApproveChangeOrderAddressLogic constructor. + * @param ApproveChangeOrderAddressProcessor $approveChangeOrderAddressProcessor + */ + + public function __construct(ApproveChangeOrderAddressProcessor $approveChangeOrderAddressProcessor) + { + $this->approveChangeOrderAddressProcessor = $approveChangeOrderAddressProcessor; + } + + public function logic(Request $request): JsonResponse + { + $order = $this->approveChangeOrderAddressProcessor->execute($request); + + return $this->resourceResponse(new OrderResource($order)); + } +} diff --git a/app/Classes/Modules/Orders/ControllersLogic/RequestChangeOrderAddressLogic.php b/app/Classes/Modules/Orders/ControllersLogic/RequestChangeOrderAddressLogic.php new file mode 100644 index 00000000..b0c24f0b --- /dev/null +++ b/app/Classes/Modules/Orders/ControllersLogic/RequestChangeOrderAddressLogic.php @@ -0,0 +1,49 @@ + 'Request To Change Order Address', + 'message' => 'You have successfully request to change order address' + ]; + } + + /** @var RequestChangeOrderAddressProcessor */ + private $requestChangeOrderAddressProcessor; + + /** + * RequestChangeOrderAddressLogic constructor. + * @param RequestChangeOrderAddressProcessor $requestChangeOrderAddressProcessor + */ + + public function __construct(RequestChangeOrderAddressProcessor $requestChangeOrderAddressProcessor) + { + $this->requestChangeOrderAddressProcessor = $requestChangeOrderAddressProcessor; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\MalformedRequestException + */ + + public function logic(Request $request): JsonResponse + { + $order = $this->requestChangeOrderAddressProcessor->execute($request); + + return $this->resourceResponse(new OrderResource($order)); + } +} diff --git a/app/Classes/Modules/Orders/Processors/ApproveChangeOrderAddressProcessor.php b/app/Classes/Modules/Orders/Processors/ApproveChangeOrderAddressProcessor.php new file mode 100644 index 00000000..423d8ce5 --- /dev/null +++ b/app/Classes/Modules/Orders/Processors/ApproveChangeOrderAddressProcessor.php @@ -0,0 +1,53 @@ +canApproveChangeOrderAddress = $canApproveChangeOrderAddress; + $this->fetchesOrder = $fetchesOrder; + $this->deletesAddress = $deletesAddress; + $this->updatesOrdersAddress = $updatesOrdersAddress; + } + + + public function execute(Request $request) + { + $this->canApproveChangeOrderAddress->passes(); + + $order = $this->fetchesOrder->execute(['id' => $request->get('order_id')]); + $this->deletesAddress->execute($order->addressesApproved->first()); + $this->updatesOrdersAddress->execute($order->addressesPendingVerification->first(), ApprovalStatus::APPROVED); + + return $order; + } +} diff --git a/app/Classes/Modules/Orders/Processors/RequestChangeOrderAddressProcessor.php b/app/Classes/Modules/Orders/Processors/RequestChangeOrderAddressProcessor.php new file mode 100644 index 00000000..7f01726b --- /dev/null +++ b/app/Classes/Modules/Orders/Processors/RequestChangeOrderAddressProcessor.php @@ -0,0 +1,66 @@ +canChangeOrderAddress = $canChangeOrderAddress; + $this->fetchesOrder = $fetchesOrder; + $this->createsAddress = $createsAddress; + $this->fetchesAddress = $fetchesAddress; + $this->deletesAddress = $deletesAddress; + } + + + public function execute(Request $request) + { + + $this->canChangeOrderAddress->passes(); + + $order = $this->fetchesOrder->execute(['id' => $request->get('order_id')]); + foreach ($order->addressesPendingVerification as $address) { + $this->deletesAddress->execute($address); + } + + $address = $this->fetchesAddress->execute(['id' => $request->get('address_id')]); + $addressObject = new AddressObject($address->street_one, $address->street_two, $address->country_id, $address->state_id, $address->district_id, $address->postcode, $address->reference, ApprovalStatus::PENDING_VERIFICATION); + $this->createsAddress->execute($order, $addressObject); + + return $order; + } +} diff --git a/app/Classes/Modules/Orders/Services/UpdatesOrdersAddress.php b/app/Classes/Modules/Orders/Services/UpdatesOrdersAddress.php new file mode 100644 index 00000000..3ad6295a --- /dev/null +++ b/app/Classes/Modules/Orders/Services/UpdatesOrdersAddress.php @@ -0,0 +1,20 @@ +status = $type; + return $this->handler($address); + } +} diff --git a/app/Classes/Modules/Orders/Standards/Rules/CanApproveChangeOrderAddress.php b/app/Classes/Modules/Orders/Standards/Rules/CanApproveChangeOrderAddress.php new file mode 100644 index 00000000..24ce6418 --- /dev/null +++ b/app/Classes/Modules/Orders/Standards/Rules/CanApproveChangeOrderAddress.php @@ -0,0 +1,39 @@ +execute($request); + } +} diff --git a/app/Http/Controllers/Orders/RequestChangeOrderAddressController.php b/app/Http/Controllers/Orders/RequestChangeOrderAddressController.php new file mode 100644 index 00000000..3fb8881f --- /dev/null +++ b/app/Http/Controllers/Orders/RequestChangeOrderAddressController.php @@ -0,0 +1,20 @@ +execute($request); + } +} diff --git a/app/Models/Order.php b/app/Models/Order.php index 4d537646..9d3099a5 100644 --- a/app/Models/Order.php +++ b/app/Models/Order.php @@ -6,6 +6,7 @@ use App\Classes\General\Interfaces\Addressable; use App\Classes\General\Interfaces\Contactable; use App\Classes\General\Interfaces\Packable; use App\Classes\ValueObjects\Constants\RoleTypes; +use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Scopes\CustomerOrdersScope; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasManyThrough; @@ -77,4 +78,14 @@ class Order extends AbstractModel implements Addressable, Packable // static::addGlobalScope(new CustomerOrdersScope); // } } + + public function addressesPendingVerification() + { + return $this->addresses()->where('status','=',ApprovalStatus::PENDING_VERIFICATION); + } + + public function addressesApproved() + { + return $this->addresses()->where('status','=',ApprovalStatus::APPROVED); + } } diff --git a/resources/views/swagger/json.blade.php b/resources/views/swagger/json.blade.php index 1e09fa9c..00cfe1a3 100644 --- a/resources/views/swagger/json.blade.php +++ b/resources/views/swagger/json.blade.php @@ -2430,6 +2430,148 @@ } } }, + "/order/show/{id}": { + "get": { + "tags": [ + "Order" + ], + "produces": [ + "application/json" + ], + "operationId": "showOrder", + "summary": "Show order", + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "Order Reference Id", + "required": true, + "type": "integer" + } + ], + "responses": { + "200": { + "description": "successful operation", + "headers": { + "X-Expires-After": { + "type": "string", + "format": "date-time", + "description": "date in UTC when token expires" + }, + "X-Rate-Limit": { + "type": "integer", + "format": "int32", + "description": "calls per hour allowed by the user" + } + }, + "schema": { + "type": "string" + } + }, + "422": { + "description": "Invalid input supplied" + } + } + } + }, + "/order/address/change/request": { + "post": { + "tags": [ + "Order" + ], + "produces": [ + "application/json" + ], + "operationId": "requestChangeOrderAddress", + "summary": "Request Change Order Address", + "description": "", + "parameters": [ + { + "name": "order_id", + "in": "query", + "description": "Order ID", + "required": true, + "type": "integer" + }, + { + "name": "address_id", + "in": "query", + "description": "New Order Address ID", + "required": true, + "type": "integer" + }, + ], + "responses": { + "200": { + "description": "successful operation", + "headers": { + "X-Expires-After": { + "type": "string", + "format": "date-time", + "description": "date in UTC when token expires" + }, + "X-Rate-Limit": { + "type": "integer", + "format": "int32", + "description": "calls per hour allowed by the user" + } + }, + "schema": { + "type": "string" + } + }, + "422": { + "description": "Invalid input supplied" + } + } + } + }, + "/order/address/change/approve": { + "post": { + "tags": [ + "Order" + ], + "produces": [ + "application/json" + ], + "operationId": "approveChangeOrderAddress", + "summary": "Approve Change Order Address", + "description": "", + "parameters": [ + { + "name": "order_id", + "in": "query", + "description": "Order ID", + "required": true, + "type": "integer" + } + ], + "responses": { + "200": { + "description": "successful operation", + "headers": { + "X-Expires-After": { + "type": "string", + "format": "date-time", + "description": "date in UTC when token expires" + }, + "X-Rate-Limit": { + "type": "integer", + "format": "int32", + "description": "calls per hour allowed by the user" + } + }, + "schema": { + "type": "string" + } + }, + "422": { + "description": "Invalid input supplied" + } + } + } + }, "/address/create": { "post": { "tags": [ diff --git a/routes/order.php b/routes/order.php index 4f31ecff..27cb66ef 100644 --- a/routes/order.php +++ b/routes/order.php @@ -9,4 +9,6 @@ Route::group(['prefix' => 'order', 'as' => 'order.', 'namespace' => 'Orders'], f Route::put('/confirm/{id}', 'ConfirmOrderController@confirm')->name('confirm'); Route::put('/cancel/{id}', 'CancelOrderController@cancel')->name('cancel'); Route::put('/restore/{id}', 'RestoreOrderController@restore')->name('restore'); + Route::post('/address/change/request', 'RequestChangeOrderAddressController@request')->name('address.change.request'); + Route::post('/address/change/approve', 'ApproveChangeOrderAddressController@approve')->name('address.change.approve'); });