Merge branch '1688-order-reference' of gitlab.com:CIEFWorldwideSdnBhd/exchange-2.0

This commit is contained in:
edmondlang
2024-07-14 19:58:52 +08:00
16 changed files with 350 additions and 5 deletions
@@ -2,6 +2,7 @@
namespace App\Classes\Modules\Bookings\ControllersLogic;
use App\Classes\Exceptions\MalformedRequestException;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Companies\Services\FetchesCompany;
@@ -15,6 +16,7 @@ use App\Classes\Modules\Bookings\Services\GeneratesBookingMarking;
use App\Classes\Modules\Bookings\DataTransferObjects\BookingObject;
use App\Classes\Modules\PerfexCRM\Processors\BookingToPerfexCRMProcessor;
use App\Classes\Modules\Milestones\Processors\CheckMilestonesForRewardProcessor;
use App\Classes\ValueObjects\Constants\BookingAttributeNames;
use App\Classes\ValueObjects\Constants\Milestones;
use App\Http\Resources\BookingResource;
@@ -84,6 +86,21 @@ class CreateBookingLogic extends AbstractControllerLogic
*/
public function logic(Request $request) : JsonResponse
{
if (in_array($request->input('service_id'), [4, 10])) {
if (!$request['order_reference_no']) {
throw new MalformedRequestException('At least 1 order reference required.');
}
if ($request['order_reference_no']) {
foreach ($request['order_reference_no'] as $index => $reference) {
if (!$reference) {
$index += 1;
throw new MalformedRequestException("Order reference {$index} cannot be empty");
}
}
}
}
$company = $this->fetchesCompany->execute(['id' => $request->input('company_id')]);
$object = new BookingObject($request->input('service_id'), $request->input('transferable_bank_id'), $this->generatesBookingMarking->execute(), number_format( floatval(str_replace(',', '', $request->input('fix_amount'))), 5, '.', ''), $request->input('type') === 1 ? $request->input('convertible_currency_id') : 1, $request->input('convertible_currency_id'), 1);
@@ -97,6 +114,15 @@ class CreateBookingLogic extends AbstractControllerLogic
$this->bookingToPerfexCRMProcessor->execute($booking);
}
if (in_array($request->input('service_id'), [4, 10])) {
foreach ($request['order_reference_no'] as $order_reference) {
$booking->modelAttributes()->create([
'name' => BookingAttributeNames::ORDER_REFERENCE_NO,
'value' => $order_reference
]);
}
}
//cief todo: case study 5
// $user = $company->employees()->first();
// $this->checkMilestonesForRewardProcessor->execute($user, [Milestones::MILESTONE_5]);
@@ -0,0 +1,73 @@
<?php
namespace App\Classes\Modules\Bookings\ControllersLogic;
use App\Http\Resources\BookingResource;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Bookings\Services\FetchesBooking;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use App\Classes\Exceptions\MalformedRequestException;
use App\Classes\ValueObjects\Constants\BookingAttributeNames;
class UpdateBookingOrderReferenceLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Updated Booking Order References',
'message' => 'You have successfully updated the Booking Order References'
];
}
/** @var FetchesBooking */
private $fetchesBooking;
/**
* UpdateBookingOrderReferenceLogic constructor.
* @param FetchesBooking $fetchesBooking
*/
public function __construct(FetchesBooking $fetchesBooking)
{
$this->fetchesBooking = $fetchesBooking;
}
/**
* @param Request $request
* @return JsonResponse
* @throws MalformedRequestException
*/
public function logic(Request $request) : JsonResponse
{
if (!$request['order_reference_no']) {
throw new MalformedRequestException('At least 1 order reference required.');
}
if ($request['order_reference_no']) {
foreach ($request['order_reference_no'] as $index => $reference) {
if (!$reference) {
$index += 1;
throw new MalformedRequestException("Order reference {$index} cannot be empty");
}
}
}
$booking = $this->fetchesBooking->execute(['id' => $request->route('id')]);
$booking->modelAttributes()->delete();
foreach ($request['order_reference_no'] as $order_reference) {
$booking->modelAttributes()->create([
'name' => BookingAttributeNames::ORDER_REFERENCE_NO,
'value' => $order_reference
]);
}
return $this->resourceResponse(new BookingResource($booking));
}
}
@@ -0,0 +1,8 @@
<?php
namespace App\Classes\ValueObjects\Constants;
class BookingAttributeNames
{
public const ORDER_REFERENCE_NO = 'ORDER_REFERENCE_NO';
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\Bookings;
use App\Classes\Modules\Bookings\ControllersLogic\UpdateBookingOrderReferenceLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class UpdateBookingOrderReferenceController
{
/**
* @param Request $request
* @param UpdateBookingOrderReferenceLogic $logic
* @return JsonResponse
*/
public function update(Request $request, UpdateBookingOrderReferenceLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
+7
View File
@@ -7,6 +7,7 @@ use App\Classes\Modules\Bookings\Services\CalculatesBookingOutstanding;
use App\Classes\Modules\Bookings\Services\CalculatesBookingPayableAmount;
use App\Classes\Modules\Bookings\Services\CalculatesBookingRefundAmount;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\BookingAttributeNames;
use App\Classes\ValueObjects\Constants\TransactionType;
use App\Classes\ValueObjects\Constants\DocumentType;
use Carbon\Carbon;
@@ -45,6 +46,12 @@ class BookingResource extends JsonResource
'proforma_invoice' => new DocumentResource($this->documents()->where('document_type', DocumentType::PROFORMA_INVOICE)->whereNotIn('status', [ApprovalStatus::REJECTED, ApprovalStatus::EXPIRED])->orderByDesc('id')->first()),
'ecommerce_purchase_order' => new DocumentResource($this->documents()->where('document_type', DocumentType::ECOMMERCE_PURCHASE_ORDER)->first()),
],
'order_reference_no' => $this->modelAttributes()->where('name', BookingAttributeNames::ORDER_REFERENCE_NO)->get()->map(function ($attr) {
return [
'id' => $attr->id,
'value' => $attr->value
];
}),
'status' => $this->status,
'created_at' => Carbon::parse($this->created_at)->format('d-m-Y'),
'created_at_with_time' => Carbon::parse($this->created_at)->format('d-m-Y h:i:s A'),
+5
View File
@@ -107,6 +107,11 @@ class Booking extends AbstractModel implements Documentable, Transactionable
return $this->hasManyDeep(Transaction::class, [Transaction::class.' as alias'], [['owner_type', 'owner_id'], ['owner_type', 'owner_id']], [null, null]);
}
public function modelAttributes(): MorphMany
{
return $this->morphMany(ModelAttribute::class, 'owner');
}
protected static function booted()
{
if (auth()->user()) {
+27
View File
@@ -0,0 +1,27 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\MorphTo;
class ModelAttribute extends Model
{
protected $table = 'model_attributes';
protected $fillable = [
"name",
"value"
];
protected $casts = [
"value" => "array"
];
public function owner(): morphTo
{
return $this->morphTo();
}
}