diff --git a/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingLogic.php index 61f78dcb..47aa11cb 100644 --- a/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingLogic.php +++ b/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingLogic.php @@ -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]); diff --git a/app/Classes/Modules/Bookings/ControllersLogic/UpdateBookingOrderReferenceLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/UpdateBookingOrderReferenceLogic.php new file mode 100644 index 00000000..ab096c69 --- /dev/null +++ b/app/Classes/Modules/Bookings/ControllersLogic/UpdateBookingOrderReferenceLogic.php @@ -0,0 +1,73 @@ + '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)); + } + +} \ No newline at end of file diff --git a/app/Classes/ValueObjects/Constants/BookingAttributeNames.php b/app/Classes/ValueObjects/Constants/BookingAttributeNames.php new file mode 100644 index 00000000..491ad0a2 --- /dev/null +++ b/app/Classes/ValueObjects/Constants/BookingAttributeNames.php @@ -0,0 +1,8 @@ +execute($request); + } + +} \ No newline at end of file diff --git a/app/Http/Resources/BookingResource.php b/app/Http/Resources/BookingResource.php index 2612c5b4..83e53249 100644 --- a/app/Http/Resources/BookingResource.php +++ b/app/Http/Resources/BookingResource.php @@ -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'), diff --git a/app/Models/Booking.php b/app/Models/Booking.php index ca80d0c3..ff0b45b9 100644 --- a/app/Models/Booking.php +++ b/app/Models/Booking.php @@ -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()) { diff --git a/app/Models/ModelAttribute.php b/app/Models/ModelAttribute.php new file mode 100644 index 00000000..bbd3511c --- /dev/null +++ b/app/Models/ModelAttribute.php @@ -0,0 +1,27 @@ + "array" + ]; + + public function owner(): morphTo + { + return $this->morphTo(); + } + +} diff --git a/database/migrations/2024_07_14_175408_create_model_attributes_table.php b/database/migrations/2024_07_14_175408_create_model_attributes_table.php new file mode 100644 index 00000000..f05f6f8f --- /dev/null +++ b/database/migrations/2024_07_14_175408_create_model_attributes_table.php @@ -0,0 +1,24 @@ +id(); + $table->morphs('owner'); + $table->string('name'); + $table->json('value'); + $table->timestamps(); + }); + } + + public function down() + { + Schema::dropIfExists('model_attributes'); + } +} diff --git a/resources/assets/vue/components/banks/forms/AlipayAccountFormComponent.vue b/resources/assets/vue/components/banks/forms/AlipayAccountFormComponent.vue index e1d71d62..e8a02a23 100644 --- a/resources/assets/vue/components/banks/forms/AlipayAccountFormComponent.vue +++ b/resources/assets/vue/components/banks/forms/AlipayAccountFormComponent.vue @@ -26,7 +26,7 @@
-
+
{{disabled ? 'Change Recipient Account' : 'Cancel'}}
diff --git a/resources/assets/vue/components/banks/forms/BankAccountFormComponent.vue b/resources/assets/vue/components/banks/forms/BankAccountFormComponent.vue index 9c89c89d..17be80c6 100644 --- a/resources/assets/vue/components/banks/forms/BankAccountFormComponent.vue +++ b/resources/assets/vue/components/banks/forms/BankAccountFormComponent.vue @@ -133,7 +133,7 @@
-
+
{{disabled ? 'Change Recipient Account' : 'Cancel'}}
diff --git a/resources/assets/vue/components/banks/forms/PhoneAccountFormComponent.vue b/resources/assets/vue/components/banks/forms/PhoneAccountFormComponent.vue index 76401d2b..e1627020 100644 --- a/resources/assets/vue/components/banks/forms/PhoneAccountFormComponent.vue +++ b/resources/assets/vue/components/banks/forms/PhoneAccountFormComponent.vue @@ -39,7 +39,7 @@
-
+
{{disabled ? 'Change Recipient Account' : 'Cancel'}}
diff --git a/resources/assets/vue/components/bookings/elements/BookingConfirmationComponent.vue b/resources/assets/vue/components/bookings/elements/BookingConfirmationComponent.vue index 3e19e8e3..01974869 100644 --- a/resources/assets/vue/components/bookings/elements/BookingConfirmationComponent.vue +++ b/resources/assets/vue/components/bookings/elements/BookingConfirmationComponent.vue @@ -157,6 +157,31 @@
+
+
+
+
+ + +
+
+
+
+
+ +
+
+
+
+
+
+
Add Order Reference
+
+
+
+
@@ -294,7 +319,7 @@
- +
@@ -312,7 +337,7 @@ \ No newline at end of file diff --git a/resources/assets/vue/components/bookings/forms/confirmBookingComponent.vue b/resources/assets/vue/components/bookings/forms/confirmBookingComponent.vue index 2cb67ca0..d0a92e59 100644 --- a/resources/assets/vue/components/bookings/forms/confirmBookingComponent.vue +++ b/resources/assets/vue/components/bookings/forms/confirmBookingComponent.vue @@ -12,6 +12,13 @@