From 94904ee3738b7f2a61dfe3e72cde3787e36ebb37 Mon Sep 17 00:00:00 2001 From: Fairuz Date: Mon, 10 May 2021 17:02:33 +0800 Subject: [PATCH] EXCHANGE-149 - Confirmation modal for merge bookings (abit on backend for process merge) --- .../ControllersLogic/MergeBookingLogic.php | 71 +++++++++----- .../BookingMergeObject.php | 54 ++++++++++- .../Bookings/Services/FetchesBooking.php | 1 + .../Modules/Bookings/Services/GetBookings.php | 51 ++++++++++ .../Services/UpdatesBookingTransaction.php | 34 +++++++ .../Criterias/BookingsAreMergeable.php | 53 +++++++++++ .../Standards/Rules/CanMergeBooking.php | 14 ++- .../elements/BookingMergeModalComponent.vue | 66 +++++++++++++ .../elements/BookingMergeableComponent.vue | 80 +++++++++------- .../sections/BookingMergeSectionComponent.vue | 95 +++++++++++++++---- .../general/elements/ListComponent.vue | 2 +- routes/booking.php | 2 +- 12 files changed, 445 insertions(+), 78 deletions(-) create mode 100644 app/Classes/Modules/Bookings/Services/GetBookings.php create mode 100644 app/Classes/Modules/Bookings/Services/UpdatesBookingTransaction.php create mode 100644 app/Classes/Modules/Bookings/Standards/Criterias/BookingsAreMergeable.php create mode 100644 resources/assets/vue/components/bookings/elements/BookingMergeModalComponent.vue diff --git a/app/Classes/Modules/Bookings/ControllersLogic/MergeBookingLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/MergeBookingLogic.php index 23cce87f..fbbbf28d 100644 --- a/app/Classes/Modules/Bookings/ControllersLogic/MergeBookingLogic.php +++ b/app/Classes/Modules/Bookings/ControllersLogic/MergeBookingLogic.php @@ -2,25 +2,21 @@ namespace App\Classes\Modules\Bookings\ControllersLogic; -use App\Classes\Exceptions\ResourceNotFoundException; use App\Classes\General\Abstracts\AbstractControllerLogic; use App\Classes\Modules\Bookings\DataTransferObjects\BookingMergeObject; +use App\Classes\Modules\Bookings\Services\DeletesBooking; use App\Classes\Modules\Bookings\Services\FetchesBooking; +use App\Classes\Modules\Bookings\Services\GetBookings; use App\Classes\Modules\Bookings\Standards\Rules\CanMergeBooking; use App\Classes\Modules\Companies\Services\FetchesCompany; -use App\Classes\Modules\Banks\Services\FetchesBank; -use App\Classes\Modules\Currencies\Services\FetchesCurrency; use App\Classes\Modules\Bookings\Standards\Rules\CanCreateBooking; use App\Classes\Modules\Bookings\Services\CreatesBooking; use App\Classes\Modules\Bookings\Services\GeneratesBookingMarking; -use App\Classes\Modules\Bookings\DataTransferObjects\BookingObject; -use App\Classes\ValueObjects\Constants\ApprovalStatus; -use App\Http\Resources\BookingResource; +use App\Classes\Modules\Bookings\Services\UpdatesBookingTransaction; -use ErrorException; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -49,8 +45,14 @@ class MergeBookingLogic extends AbstractControllerLogic /** @var FetchesCompany */ private $fetchesCompany; - /** @var FetchesCompany */ - private $fetchesBooking; + /** @var GetBookings */ + private $getBookings; + + /** @var UpdatesBookingTransaction */ + private $updatesBookingTransaction; + + /** @var DeletesBooking */ + private $deletesBooking; /** * CreateBookingLogic constructor. @@ -59,13 +61,15 @@ class MergeBookingLogic extends AbstractControllerLogic * @param GeneratesBookingMarking $generatesBookingMarking * @param FetchesCompany $fetchesCompany */ - public function __construct(CanMergeBooking $canMergeBooking, CreatesBooking $createsBooking, GeneratesBookingMarking $generatesBookingMarking, FetchesCompany $fetchesCompany, FetchesBooking $fetchesBooking) + public function __construct(CanMergeBooking $canMergeBooking, CreatesBooking $createsBooking, GeneratesBookingMarking $generatesBookingMarking, FetchesCompany $fetchesCompany, GetBookings $getBookings, UpdatesBookingTransaction $updatesBookingTransaction, DeletesBooking $deletesBooking) { $this->canMergeBooking = $canMergeBooking; $this->createsBooking = $createsBooking; $this->generatesBookingMarking = $generatesBookingMarking; $this->fetchesCompany = $fetchesCompany; - $this->fetchesBooking = $fetchesBooking; + $this->getBookings = $getBookings; + $this->updatesBookingTransaction = $updatesBookingTransaction; + $this->deletesBooking = $deletesBooking; } @@ -74,23 +78,46 @@ class MergeBookingLogic extends AbstractControllerLogic * @return JsonResponse * @throws \App\Classes\Exceptions\AccessForbiddenException * @throws \App\Classes\Exceptions\RequestValidationException - * @throws \App\Classes\Exceptions\ResourceNotFoundException + * @throws \App\Classes\Exceptions\MalformedRequestException */ public function logic(Request $request) : JsonResponse { - $object = new BookingMergeObject($request->get('booking_ids')); + $booking_object = new BookingMergeObject($request->get('id'),$request->get('booking_ids')); - $this->canMergeBooking->passes($object); + $this->canMergeBooking->passes($booking_object); - /* - $bookings = $this->fetchesBooking->execute([ - 'id_in'=> $object->getBookingIds(), - 'status' => ApprovalStatus::APPROVED, - ]); - */ - #TODO: Fetch transaction (+details) record, reassign transaction id & recalculate amount - //dd($bookings); + $booking_main = $this->getBookings->handler(['id'=> $booking_object->getId()])[0]; + $bookings_to_merge = $this->getBookings->handler(['id_in'=> $booking_object->getBookingIds()]); + + $booking_amount = $booking_main->fix_amount; + $transaction_amount = 0; + + $booking_main_transactions = $booking_main->transactions()->get(); + + foreach($booking_main_transactions as $transaction) + { + $transaction_amount += $transaction->amount; + } + + foreach($bookings_to_merge as $booking) + { + $booking_amount += $booking->fix_amount; + $bookings_to_merge_transactions = $booking->transactions()->get(); + + foreach($bookings_to_merge_transactions as $transaction) + { + $transaction_amount += $transaction->amount; + } + //Soft-delete selected bookings + //$this->deletesBooking->execute($booking); + } + + $booking_object->setBookingAmount($booking_amount); + $booking_object->setTransactionAmount($transaction_amount); + + $this->updatesBookingTransaction->execute($booking_main,$bookings_to_merge, $booking_object); + dd('??'); return $this->response(); diff --git a/app/Classes/Modules/Bookings/DataTransferObjects/BookingMergeObject.php b/app/Classes/Modules/Bookings/DataTransferObjects/BookingMergeObject.php index 5b590145..03c90e2e 100644 --- a/app/Classes/Modules/Bookings/DataTransferObjects/BookingMergeObject.php +++ b/app/Classes/Modules/Bookings/DataTransferObjects/BookingMergeObject.php @@ -7,18 +7,37 @@ use App\Classes\General\Interfaces\DataTransferObject; class BookingMergeObject implements DataTransferObject { + /** @var int */ + private $id; + /** @var array */ private $bookingIds; + /** @var float */ + private $bookingAmount; + + /** @var float */ + private $transactionAmount; + /** * BookingMergeObject constructor. + * @param int $id * @param array $bookingIds */ - public function __construct(array $bookingIds) + public function __construct(int $id, array $bookingIds) { + $this->id = $id; $this->bookingIds = $bookingIds; } + /** + * @return int + */ + public function getId(): int + { + return $this->id; + } + /** * @return array */ @@ -27,4 +46,37 @@ class BookingMergeObject implements DataTransferObject return $this->bookingIds; } + /** + * @return float + */ + public function getBookingAmount(): float + { + return $this->bookingAmount; + } + + /** + * @param float $amount + * @return float + */ + public function setBookingAmount(float $amount) + { + $this->bookingAmount = $amount; + } + + /** + * @return float + */ + public function getTransactionAmount(): float + { + return $this->transactionAmount; + } + + /** + * @param float $amount + * @return float + */ + public function setTransactionAmount(float $amount) + { + $this->transactionAmount = $amount; + } } \ No newline at end of file diff --git a/app/Classes/Modules/Bookings/Services/FetchesBooking.php b/app/Classes/Modules/Bookings/Services/FetchesBooking.php index b38f5a15..fbb001ff 100644 --- a/app/Classes/Modules/Bookings/Services/FetchesBooking.php +++ b/app/Classes/Modules/Bookings/Services/FetchesBooking.php @@ -30,4 +30,5 @@ class FetchesBooking extends AbstractFetchRecord { return $this->repository->newQuery(); } + } \ No newline at end of file diff --git a/app/Classes/Modules/Bookings/Services/GetBookings.php b/app/Classes/Modules/Bookings/Services/GetBookings.php new file mode 100644 index 00000000..b90697ae --- /dev/null +++ b/app/Classes/Modules/Bookings/Services/GetBookings.php @@ -0,0 +1,51 @@ +repository = $repository; + } + + + /** + * @return Builder + */ + public function getRepository(): Builder + { + return $this->repository->newQuery(); + } + + /** + * @param Builder $query + * @return Collection + * @throws ResourceNotFoundException + */ + public function getResults(Builder $query):Collection + { + if (!$query->exists()) { + throw new ResourceNotFoundException('Unable to find any record based on the criteria provided'); + } + + return $query->get(); + } + + +} \ No newline at end of file diff --git a/app/Classes/Modules/Bookings/Services/UpdatesBookingTransaction.php b/app/Classes/Modules/Bookings/Services/UpdatesBookingTransaction.php new file mode 100644 index 00000000..b4afbeb9 --- /dev/null +++ b/app/Classes/Modules/Bookings/Services/UpdatesBookingTransaction.php @@ -0,0 +1,34 @@ +transactions()->get(); + + foreach ($bookings_to_merge_transactions as $transaction) { + var_dump( $transaction->booking_id); + $transaction->booking_id = $object->getId(); + $this->handler($transaction); + } + } + + $booking_main->fix_amount=$object->getBookingAmount(); + + return $this->handler($booking_main); + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Bookings/Standards/Criterias/BookingsAreMergeable.php b/app/Classes/Modules/Bookings/Standards/Criterias/BookingsAreMergeable.php new file mode 100644 index 00000000..f25aa2a8 --- /dev/null +++ b/app/Classes/Modules/Bookings/Standards/Criterias/BookingsAreMergeable.php @@ -0,0 +1,53 @@ +repository = $repository; + } + + + /** + * @param BookingMergeObject $object + * @return bool + * @throws ResourceNotFoundException + */ + public function execute(BookingMergeObject $object){ + + $bookingOriginal=$this->repository->where(['id'=> $object->getId(),'status' => ApprovalStatus::APPROVED,])->first(); + $bookingToMerge=$this->repository->whereIn('id', $object->getBookingIds()) + ->where([ + 'status' => ApprovalStatus::APPROVED, + 'service_id' => $bookingOriginal->service_id, + 'fix_currency_id' => $bookingOriginal->fix_currency_id, + 'convertible_currency_id' => $bookingOriginal->convertible_currency_id, + ])->get(); + + if($bookingOriginal===null || $bookingToMerge->count() !== count($object->getBookingIds())){ + throw new ResourceNotFoundException('The booking doesn\'t exist'); + } + return true; + + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Bookings/Standards/Rules/CanMergeBooking.php b/app/Classes/Modules/Bookings/Standards/Rules/CanMergeBooking.php index 64e89127..f348346e 100644 --- a/app/Classes/Modules/Bookings/Standards/Rules/CanMergeBooking.php +++ b/app/Classes/Modules/Bookings/Standards/Rules/CanMergeBooking.php @@ -2,7 +2,10 @@ namespace App\Classes\Modules\Bookings\Standards\Rules; +use App\Classes\Exceptions\ResourceNotFoundException; use App\Classes\General\Abstracts\AbstractRule; +use App\Classes\Modules\Bookings\Standards\Criterias\BookingsAreMergeable; +use App\Classes\Modules\Bookings\DataTransferObjects\BookingMergeObject; use App\Classes\Modules\Bookings\DataTransferObjects\BookingObject; use App\Classes\Modules\Bookings\Standards\Validators\BookingMergeValidation; @@ -12,14 +15,19 @@ class CanMergeBooking extends AbstractRule /** @var BookingMergeValidation */ private $bookingMergeValidation; + /** @var BookingsAreMergeable */ + private $bookingsAreMergeable; + /** * CanCreateBooking constructor. * @param BookingMergeValidation $bookingMergeValidation + * @param BookingsAreMergeable $bookingsAreMergeable */ - public function __construct(BookingMergeValidation $bookingMergeValidation) + public function __construct(BookingMergeValidation $bookingMergeValidation, BookingsAreMergeable $bookingsAreMergeable) { $this->bookingMergeValidation = $bookingMergeValidation; + $this->bookingsAreMergeable = $bookingsAreMergeable; } /** @@ -41,11 +49,13 @@ class CanMergeBooking extends AbstractRule } /** - * @param BookingObject $object + * @param BookingMergeObject $object * @return bool + * @throws ResourceNotFoundException */ protected function criteria($object): bool { + $this->bookingsAreMergeable->execute($object); return true; } } \ No newline at end of file diff --git a/resources/assets/vue/components/bookings/elements/BookingMergeModalComponent.vue b/resources/assets/vue/components/bookings/elements/BookingMergeModalComponent.vue new file mode 100644 index 00000000..ff686674 --- /dev/null +++ b/resources/assets/vue/components/bookings/elements/BookingMergeModalComponent.vue @@ -0,0 +1,66 @@ + + + diff --git a/resources/assets/vue/components/bookings/elements/BookingMergeableComponent.vue b/resources/assets/vue/components/bookings/elements/BookingMergeableComponent.vue index a8aea8a2..7510ab31 100644 --- a/resources/assets/vue/components/bookings/elements/BookingMergeableComponent.vue +++ b/resources/assets/vue/components/bookings/elements/BookingMergeableComponent.vue @@ -1,56 +1,68 @@