Skip to content

Commit

Permalink
assign vendor process testing
Browse files Browse the repository at this point in the history
  • Loading branch information
hafijul233 committed Jun 30, 2024
1 parent 497689c commit 0eaaca9
Show file tree
Hide file tree
Showing 14 changed files with 323 additions and 91 deletions.
19 changes: 17 additions & 2 deletions routes/api.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,23 @@
Route::prefix('remit')->name('remit.')
->middleware(config('fintech.auth.middleware'))->group(function () {
if (Core::packageExists('Transaction')) {
Route::get('assignable-vendors/{order_id}', [AssignVendorController::class, 'available'])
->name('assignable-vendors.available');
Route::get('assign-vendors/available/{order_id}', [AssignVendorController::class, 'available'])
->name('assign-vendors.available');

Route::post('assign-vendors/quote', [AssignVendorController::class, 'vendor'])
->name('assign-vendors.quota');

Route::post('assign-vendors/process', [AssignVendorController::class, 'process'])
->name('assign-vendors.process');

Route::post('assign-vendors/status', [AssignVendorController::class, 'status'])
->name('assign-vendors.status');

Route::post('assign-vendors/release', [AssignVendorController::class, 'release'])
->name('assign-vendors.release');

Route::post('assign-vendors/cancel', [AssignVendorController::class, 'cancel'])
->name('assign-vendors.cancel');
}
Route::apiResource('bank-transfers', BankTransferController::class)->except('update', 'destroy');
Route::group(['prefix' => 'bank-transfers'], function () {
Expand Down
5 changes: 2 additions & 3 deletions src/Contracts/OrderQuotation.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,11 @@

namespace Fintech\Remit\Contracts;

use MongoDB\Laravel\Eloquent\Model;

interface OrderQuotation
{
/**
* @param \Illuminate\Database\Eloquent\Model|Model $order
* @param \Illuminate\Database\Eloquent\Model|\Fintech\Core\Abstracts\BaseModel $order
*/
public function requestQuotation($order): mixed;
public function requestQuote($order): mixed;
}
12 changes: 12 additions & 0 deletions src/Contracts/ProceedOrder.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php

namespace Fintech\Remit\Contracts;


interface ProceedOrder
{
/**
* @param \Illuminate\Database\Eloquent\Model|\Fintech\Core\Abstracts\BaseModel $order
*/
public function processOrder($order): mixed;
}
2 changes: 2 additions & 0 deletions src/Facades/Remit.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace Fintech\Remit\Facades;

use Fintech\Remit\Services\AssignVendorService;
use Fintech\Remit\Services\BankTransferService;
use Fintech\Remit\Services\CashPickupService;
use Fintech\Remit\Services\WalletTransferService;
Expand All @@ -11,6 +12,7 @@
* @method static BankTransferService bankTransfer()
* @method static CashPickupService cashPickup()
* @method static WalletTransferService walletTransfer()
* @method static AssignVendorService assignVendor()
*
* // Crud Service Method Point Do not Remove //
*
Expand Down
146 changes: 95 additions & 51 deletions src/Http/Controllers/AssignVendorController.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,34 +6,38 @@
use ErrorException;
use Exception;
use Fintech\Business\Facades\Business;
use Fintech\Core\Abstracts\BaseModel;
use Fintech\Remit\Contracts\OrderQuotation;
use Fintech\Remit\Facades\Remit;
use Fintech\Remit\Http\Requests\AssignableVendorInfoRequest;
use Fintech\Remit\Http\Resources\AssignableVendorCollection;
use Fintech\Transaction\Facades\Transaction;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;

class AssignVendorController extends Controller
{
private function getOrder($id): BaseModel
{
$order = Transaction::order()->find($id);

if (!$order) {
throw (new ModelNotFoundException)->setModel(config('fintech.transaction.order_model'), $id);
}

return $order;
}

/**
* Store a newly created resource in storage.
*/
public function available(string $id): JsonResponse|AssignableVendorCollection
{
try {
$order = Transaction::order()->find($id);

if (! $order) {
throw (new ModelNotFoundException)->setModel(config('fintech.transaction.order_model'), $id);
}
$order = $this->getOrder($id);

$serviceVendors = Business::serviceVendor()->list([
'service_id_array' => [$order->service_id],
'enabled' => true,
'paginate' => false,
]);
$serviceVendors = Remit::assignVendor()->availableVendors($order);

return new AssignableVendorCollection($serviceVendors);

Expand All @@ -57,29 +61,34 @@ public function vendor(AssignableVendorInfoRequest $request): JsonResponse
$service_vendor_slug = $request->input('vendor_slug');

try {
$order = Transaction::order()->find($order_id);

if (! $order) {
throw (new ModelNotFoundException)->setModel(config('fintech.transaction.order_model'), $order_id);
}
$order = $this->getOrder($order_id);

$availableVendors = config('fintech.remit.providers');
$jsonResponse = Remit::assignVendor()->requestQuote($order, $service_vendor_slug);

if (! isset($availableVendors[$service_vendor_slug])) {
throw new ErrorException('Service Vendor is not available on the configuration.');
}
return response()->success($jsonResponse);

$vendor = $availableVendors[$service_vendor_slug];
} catch (ModelNotFoundException $exception) {

$driverClass = $vendor['driver'];
return response()->notfound($exception->getMessage());

} catch (Exception $exception) {

$instance = App::make($driverClass);
return response()->failed($exception->getMessage());
}
}

public function process(AssignableVendorInfoRequest $request): JsonResponse
{
$order_id = $request->input('order_id');

$service_vendor_slug = $request->input('vendor_slug');

try {

if (! $instance instanceof OrderQuotation) {
throw new ErrorException('Service Vendor Class is not instance of `Fintech\Remit\Contracts\OrderQuotation` interface.');
}
$order = $this->getOrder($order_id);

$jsonResponse = $instance->requestQuotation($order);
$jsonResponse = Remit::assignVendor()->requestQuote($order, $service_vendor_slug);

return response()->success($jsonResponse);

Expand All @@ -93,40 +102,75 @@ public function vendor(AssignableVendorInfoRequest $request): JsonResponse
}
}

/**
* Show the form for editing the specified resource.
*/
public function edit(string $id)
public function status(AssignableVendorInfoRequest $request): JsonResponse
{
//
}
$order_id = $request->input('order_id');

/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
$service_vendor_slug = $request->input('vendor_slug');

/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
try {

$order = $this->getOrder($order_id);

$jsonResponse = Remit::assignVendor()->requestQuote($order, $service_vendor_slug);

return response()->success($jsonResponse);

} catch (ModelNotFoundException $exception) {

return response()->notfound($exception->getMessage());

} catch (Exception $exception) {

return response()->failed($exception->getMessage());
}
}

private function defaultVendorData(): array
public function release(AssignableVendorInfoRequest $request): JsonResponse
{
return [
'balance' => 'test',
'approved' => true,
];
$order_id = $request->input('order_id');

$service_vendor_slug = $request->input('vendor_slug');

try {

$order = $this->getOrder($order_id);

$jsonResponse = Remit::assignVendor()->requestQuote($order, $service_vendor_slug);

return response()->success($jsonResponse);

} catch (ModelNotFoundException $exception) {

return response()->notfound($exception->getMessage());

} catch (Exception $exception) {

return response()->failed($exception->getMessage());
}
}

private function cityBankVendorData(): array
public function cancel(AssignableVendorInfoRequest $request): JsonResponse
{
$order_id = $request->input('order_id');

$service_vendor_slug = $request->input('vendor_slug');

try {

$order = $this->getOrder($order_id);

$jsonResponse = Remit::assignVendor()->requestQuote($order, $service_vendor_slug);

return response()->success($jsonResponse);

} catch (ModelNotFoundException $exception) {

return response()->notfound($exception->getMessage());

} catch (Exception $exception) {

return response()->failed($exception->getMessage());
}
}
}
17 changes: 0 additions & 17 deletions src/Http/Resources/AssignableVendorCollection.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,21 +28,4 @@ public function toArray($request)
];
})->toArray();
}

/**
* Get additional data that should be returned with the resource array.
*
* @return array<string, mixed>
*/
public function with(Request $request): array
{
return [
'options' => [
'dir' => Constant::SORT_DIRECTIONS,
'per_page' => Constant::PAGINATE_LENGTHS,
'sort' => ['id', 'name', 'created_at', 'updated_at'],
],
'query' => $request->all(),
];
}
}
9 changes: 9 additions & 0 deletions src/Remit.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace Fintech\Remit;

use Fintech\Remit\Services\AssignVendorService;
use Fintech\Remit\Services\BankTransferService;
use Fintech\Remit\Services\CashPickupService;
use Fintech\Remit\Services\WalletTransferService;
Expand Down Expand Up @@ -32,6 +33,14 @@ public function walletTransfer()
return app(WalletTransferService::class);
}

/**
* @return AssignVendorService
*/
public function assignVendor()
{
return app(AssignVendorService::class);
}

//** Crud Service Method Point Do not Remove **//

}
Loading

0 comments on commit 0eaaca9

Please sign in to comment.