Admin Workflow - API code refactor to fetch information to display on workflow + action when answer is saved

This commit is contained in:
Dillon Ngo
2025-01-05 01:14:00 +08:00
parent 38d4da72f7
commit b096b3f93a
6 changed files with 107 additions and 52 deletions
@@ -4,15 +4,7 @@ namespace App\Classes\Modules\Bookings\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Bookings\Services\FetchesBooking;
use App\Classes\Modules\Documents\Services\ApprovesDocument;
use App\Classes\Modules\Documents\Services\FetchesDocument;
use App\Classes\Modules\Documents\Services\RejectsDocument;
use App\Classes\Modules\Transactions\Processors\CreateInvoiceTransactionProcessor;
use App\Classes\Modules\Transactions\Services\FetchesTransaction;
use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\TransactionType;
use App\Classes\Modules\Bookings\Processors\ApprovePurchaseOrderProcessor;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
@@ -29,26 +21,16 @@ class ApprovePurchaseOrderLogic extends AbstractControllerLogic
];
}
/** @var FetchesBooking */
private $fetchesBooking;
/** @var UpdatesTransactionStatus */
private $updatesTransactionStatus;
/** @var CreateInvoiceTransactionProcessor */
private $createInvoiceTransactionProcessor;
/** @var ApprovePurchaseOrderProcessor */
private $approvePurchaseOrderProcessor;
/**
* ApprovePurchaseOrderLogic constructor.
* @param FetchesBooking $fetchesBooking
* @param UpdatesTransactionStatus $updatesTransactionStatus
* @param CreateInvoiceTransactionProcessor $createInvoiceTransactionProcessor
* @param ApprovePurchaseOrderProcessor $approvePurchaseOrderProcessor
*/
public function __construct(FetchesBooking $fetchesBooking, UpdatesTransactionStatus $updatesTransactionStatus, CreateInvoiceTransactionProcessor $createInvoiceTransactionProcessor)
public function __construct(ApprovePurchaseOrderProcessor $approvePurchaseOrderProcessor)
{
$this->fetchesBooking = $fetchesBooking;
$this->updatesTransactionStatus = $updatesTransactionStatus;
$this->createInvoiceTransactionProcessor = $createInvoiceTransactionProcessor;
$this->approvePurchaseOrderProcessor = $approvePurchaseOrderProcessor;
}
/**
@@ -58,18 +40,7 @@ class ApprovePurchaseOrderLogic extends AbstractControllerLogic
*/
public function logic(Request $request) : JsonResponse
{
$booking = $this->fetchesBooking->execute(['id' => $request->route('id')]);
$purchaseOrder = $booking->transactions()->where('type', TransactionType::PURCHASE_ORDER)->first();
$booking->transactions()->where('type', TransactionType::PURCHASE_ORDER)->where('id', '!=', $purchaseOrder->id)->delete();
$this->updatesTransactionStatus->execute($purchaseOrder, ApprovalStatus::APPROVED);
$this->createInvoiceTransactionProcessor->execute($booking);
$this->approvePurchaseOrderProcessor->execute($request->route('id'));
return $this->response([]);
}
}
}
@@ -0,0 +1,55 @@
<?php
namespace App\Classes\Modules\Bookings\Processors;
use App\Classes\Modules\Bookings\Services\FetchesBooking;
use App\Classes\Modules\Transactions\Processors\CreateInvoiceTransactionProcessor;
use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\TransactionType;
class ApprovePurchaseOrderProcessor
{
/** @var FetchesBooking */
private $fetchesBooking;
/** @var UpdatesTransactionStatus */
private $updatesTransactionStatus;
/** @var CreateInvoiceTransactionProcessor */
private $createInvoiceTransactionProcessor;
/**
* ApprovePurchaseOrderProcessor constructor.
* @param FetchesBooking $fetchesBooking
* @param UpdatesTransactionStatus $updatesTransactionStatus
* @param CreateInvoiceTransactionProcessor $createInvoiceTransactionProcessor
*/
public function __construct(FetchesBooking $fetchesBooking, UpdatesTransactionStatus $updatesTransactionStatus, CreateInvoiceTransactionProcessor $createInvoiceTransactionProcessor)
{
$this->fetchesBooking = $fetchesBooking;
$this->updatesTransactionStatus = $updatesTransactionStatus;
$this->createInvoiceTransactionProcessor = $createInvoiceTransactionProcessor;
}
/**
* @param int $bookingId
* @return void
* @throws \App\Classes\Exceptions\MalformedRequestException
* @throws \App\Classes\Exceptions\JobResourceNotFoundException
*/
public function execute(int $bookingId) {
$booking = $this->fetchesBooking->execute(['id' => $bookingId]);
$purchaseOrder = $booking->transactions()->where('type', TransactionType::PURCHASE_ORDER)->first();
$booking->transactions()->where('type', TransactionType::PURCHASE_ORDER)->where('id', '!=', $purchaseOrder->id)->delete();
$this->updatesTransactionStatus->execute($purchaseOrder, ApprovalStatus::APPROVED);
$this->createInvoiceTransactionProcessor->execute($booking);
}
}
@@ -79,10 +79,7 @@ class FetchAdminWFPendingApprovalPOLogic extends AbstractControllerLogic
// ->whereHas('transactions', fn ($query) => $query->where('type', TransactionType::PURCHASE_ORDER)->where('status', '<', ApprovalStatus::APPROVED))
// ->first();
// $booking1 = $this->fetchesBooking->execute(['purchase_order_approval' => true, 'status_in' => [2], 'order_by_id_desc' => true, 'with_transactions' => true]);
// Log::info('booking1 '.json_encode($booking1));
$booking = $this->fetchesBooking->execute(['purchase_order_approval' => true, 'status_in' => [2], 'id_not_in' => $excludedBookingIds, 'order_by_id_desc' => true]);
$booking = $this->fetchesBooking->execute(['purchase_order_approval' => true, 'status_in' => [2], 'id_not_in' => $excludedBookingIds, 'with_transactions' => true, 'order_by_id_desc' => true]);
if(!$booking){
return responseJson(null, 'No booking found', 404);
@@ -8,7 +8,7 @@ use App\Classes\Modules\Questionnaires\Standards\Rules\CanFetchQuestion;
use App\Classes\Modules\Bookings\Services\FetchesBooking;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\TransactionType;
use App\Http\Resources\BookingBaseResource;
use App\Http\Resources\BookingResource;
use App\Models\KeyValuePair;
use Carbon\Carbon;
use App\Models\Booking;
@@ -76,7 +76,7 @@ class FetchAdminWFPendingFillPOLogic extends AbstractControllerLogic
// ->whereDoesntHave('transactions', fn ($query) => $query->where('type', TransactionType::PURCHASE_ORDER))
// ->first();
$booking = $this->fetchesBooking->execute(['pending_purchase_order' => true, 'has_payment_status_in' => [2, 3], 'id_not_in' => $excludedBookingIds, 'order_by_id_desc' => true]);
$booking = $this->fetchesBooking->execute(['pending_purchase_order' => true, 'has_payment_status_in' => [2, 3], 'id_not_in' => $excludedBookingIds, 'with_transactions' => true, 'order_by_id_desc' => true]);
if(!$booking){
return responseJson(null, 'No booking found', 404);
@@ -90,7 +90,7 @@ class FetchAdminWFPendingFillPOLogic extends AbstractControllerLogic
// ]);
// return $booking ? responseJson(new BookingResource($booking)) : responseJson(null, 'No booking found', 404);
return $this->resourceResponse(new BookingBaseResource($booking));
return $this->resourceResponse(new BookingResource($booking));
}
}
@@ -0,0 +1,31 @@
<?php
namespace App\Classes\Modules\Questionnaires\Processors;
use App\Classes\Modules\Bookings\Processors\ApprovePurchaseOrderProcessor;
use Illuminate\Support\Facades\Log;
class SaveAnswerActionV1AdminWFProcessor
{
/** @var ApprovePurchaseOrderProcessor */
private $approvePurchaseOrderProcessor;
/**
* SaveAnswerActionV1AdminWFProcessor constructor.
* @param ApprovePurchaseOrderProcessor $approvePurchaseOrderProcessor
*/
public function __construct(ApprovePurchaseOrderProcessor $approvePurchaseOrderProcessor)
{
$this->approvePurchaseOrderProcessor = $approvePurchaseOrderProcessor;
}
/**
* @return
*/
public function execute($questionMetadata, $answerInText){
if($answerInText === "approve_po_approved"){
$this->approvePurchaseOrderProcessor->execute($questionMetadata['id']);
}
}
}
@@ -4,28 +4,27 @@ namespace App\Classes\Modules\Questionnaires\Processors;
use App\Models\QAUserAnswerSelected;
use App\Classes\Modules\Questionnaires\Services\FetchesUserAnswerSelected;
use App\Classes\Modules\Questionnaires\Processors\SaveAnswerActionV1AdminWFProcessor;
use App\Classes\Modules\Documents\Processors\UploadDocumentProcessor;
use App\Classes\ValueObjects\Constants\QAType;
class SaveAnswerV1AdminWFProcessor
{
/** @var FetchesUserAnswerSelected */
private $fetchesUserAnswerSelected;
/** @var UploadDocumentProcessor */
private $uploadDocumentForProcessor;
/** @var SaveAnswerActionV1AdminWFProcessor */
private $saveAnswerActionProcessor;
/**
* SaveAnswerV1AdminWFProcessor constructor.
* @param FetchesUserAnswerSelected $fetchesUserAnswerSelected
* @param UploadDocumentProcessor $uploadDocumentForProcessor
* @param SaveAnswerActionV1AdminWFProcessor $saveAnswerActionProcessor
*/
public function __construct(FetchesUserAnswerSelected $fetchesUserAnswerSelected, UploadDocumentProcessor $uploadDocumentForProcessor)
public function __construct(UploadDocumentProcessor $uploadDocumentForProcessor, SaveAnswerActionV1AdminWFProcessor $saveAnswerActionProcessor)
{
$this->fetchesUserAnswerSelected = $fetchesUserAnswerSelected;
$this->uploadDocumentForProcessor = $uploadDocumentForProcessor;
$this->saveAnswerActionProcessor = $saveAnswerActionProcessor;
}
/**
@@ -80,6 +79,8 @@ class SaveAnswerV1AdminWFProcessor
}
$answer->save();
$this->saveAnswerActionProcessor->execute($questionMetadata, $answerInText);
return $answer;
}
}