diff --git a/app/Classes/Modules/Bookings/ControllerLogic/CreateBookingLogic.php b/app/Classes/Modules/Bookings/ControllerLogic/CreateBookingLogic.php new file mode 100644 index 00000000..e1d4fa74 --- /dev/null +++ b/app/Classes/Modules/Bookings/ControllerLogic/CreateBookingLogic.php @@ -0,0 +1,116 @@ + 'Created Booking', + 'message' => 'You have successfully created a new Booking' + ]; + } + + /** @var CanCreateBooking */ + private $canCreateBooking; + + /** @var CreatesBooking */ + private $createsBooking; + + /** @var GeneratesBookingMarking */ + private $generatesBookingMarking; + + /** @var FetchesCompany */ + private $fetchesCompany; + + /** @var FetchesCompanyBank */ + private $fetchesCompanyBank; + + /** @var FetchesCurrency */ + private $fetchesCurrency; + + /** + * CreateSegmentLogic constructor. + * @param CanCreateBooking $canCreateBooking + * @param CreatesBooking $createsBooking + * @param FetchesCompany $fetchesCompany + * @param FetchesCompanyBank $fetchesCompanyBank + * @param FetchesCurrency $fetchesCurrency + */ + public function __construct( + CanCreateBooking $canCreateBooking, + CreatesBooking $createsBooking, + GeneratesBookingMarking $generatesBookingMarking, + FetchesCompany $fetchesCompany, + FetchesCompanyBank $fetchesCompanyBank, + FetchesCurrency $fetchesCurrency + ) + { + $this->canCreateBooking = $canCreateBooking; + $this->createsBooking = $createsBooking; + $this->generatesBookingMarking = $generatesBookingMarking; + $this->fetchesCompany = $fetchesCompany; + $this->fetchesCompanyBank = $fetchesCompanyBank; + $this->fetchesCurrency = $fetchesCurrency; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws ErrorException + */ + public function logic(Request $request) : JsonResponse + { + try { + DB::beginTransaction(); + $booking_object = new BookingObject( + $request->input('company_id'), + $request->input('transferable_bank_id'), + $this->generatesBookingMarking->execute(), + $request->input('reference'), + number_format( (float) $request->input('fix_amount'), 5, '.', ''), + $request->input('fix_currency_id'), + $request->input('convertible_currency_id'), + $request->input('conversion_currency_id') + ); + $this->canCreateBooking->passes($booking_object); + + $company = $this->fetchesCompany->execute(['id' => $request->input('company_id')]); + $transferable_bank = $this->fetchesCompanyBank->execute(['id' => $request->input('transferable_bank_id')]); + $fix_currency = $this->fetchesCurrency->execute(['id' => $request->input('fix_currency_id')]); + $convertible_currency = $this->fetchesCurrency->execute(['id' => $request->input('convertible_currency_id')]); + $conversion_currency = $this->fetchesCurrency->execute(['id' => $request->input('conversion_currency_id')]); + + $booking = $this->createsBooking->execute($booking_object); + + DB::commit(); + + return $this->resourceResponse(new BookingResource($booking)); + + } catch (\Exception $exception) { + throw new ErrorException($exception->getMessage(), $exception->getCode()); + } + + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Bookings/ControllerLogic/DeleteBookingLogic.php b/app/Classes/Modules/Bookings/ControllerLogic/DeleteBookingLogic.php new file mode 100644 index 00000000..78f3a0b5 --- /dev/null +++ b/app/Classes/Modules/Bookings/ControllerLogic/DeleteBookingLogic.php @@ -0,0 +1,82 @@ + 'Delete Booking', + 'message' => 'You have successfully deleted the Booking' + ]; + } + + /** @var CanDeleteBooking */ + private $canDeleteBooking; + + /** @var DeletesBooking */ + private $deletesBooking; + + /** @var FetchesBooking */ + private $fetchesBooking; + + /** + * UpdateStandardSegmentConstantLogic constructor. + * @param CanUpdateSegment $canDeleteBooking + * @param UpdatesSegment $deletesSegment + * @param FetchesBooking $fetchesBooking + */ + public function __construct( + CanDeleteBooking $canDeleteBooking, + DeletesBooking $deletesBooking, + FetchesBooking $fetchesBooking + ) + { + $this->canDeleteBooking = $canDeleteBooking; + $this->deletesBooking = $deletesBooking; + $this->fetchesBooking = $fetchesBooking; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws ErrorException + */ + public function logic(Request $request) : JsonResponse + { + try { + DB::beginTransaction(); + + $booking = $this->fetchesBooking->execute(['id' => $request->route('id')]); + $this->canDeleteBooking->passes(); + $this->deletesBooking->execute($booking); + + DB::commit(); + + return $this->resourceResponse(new BookingResource($booking)); + + } catch (\Exception $exception){ + throw new ErrorException($exception->getMessage(), $exception->getCode()); + } + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Bookings/ControllerLogic/UpdateBookingLogic.php b/app/Classes/Modules/Bookings/ControllerLogic/UpdateBookingLogic.php new file mode 100644 index 00000000..549c86f7 --- /dev/null +++ b/app/Classes/Modules/Bookings/ControllerLogic/UpdateBookingLogic.php @@ -0,0 +1,93 @@ + 'Updated Booking', + 'message' => 'You have successfully updated the Booking' + ]; + } + + /** @var CanUpdateBooking */ + private $canUpdateBooking; + + /** @var UpdatesBookingRate */ + private $updatesBookingRate; + + /** @var FetchesBooking */ + private $fetchesBooking; + + /** + * UpdateStandardSegmentConstantLogic constructor. + * @param CanUpdateBooking $canUpdateBooking + * @param UpdatesBooking $updatesBooking + * @param FetchesBooking $fetchesBooking + */ + public function __construct( + CanUpdateBooking $canUpdateBooking, + UpdatesBooking $updatesBooking, + FetchesBooking $fetchesBooking + ) + { + $this->canUpdateBooking = $canUpdateBooking; + $this->updatesBooking = $updatesBooking; + $this->fetchesBooking = $fetchesBooking; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws ErrorException + */ + public function logic(Request $request) : JsonResponse + { + try { + DB::beginTransaction(); + + $booking = $this->fetchesBooking->execute(['id' => $request->route('id')]); + + $booking_object = new BookingObject( + $booking->company_id, + $request->input('transferable_bank_id', $booking->transferable_bank_id), + $booking->marking, + $request->input('reference', $booking->reference), + $request->input('fix_amount', $booking->fix_amount), + $request->input('fix_currency_id', $booking->fix_currency_id), + $request->input('convertible_currency_id', $booking->convertible_currency_id), + $request->input('conversion_currency_id', $booking->conversion_currency_id) + ); + $this->canUpdateBooking->passes($booking_object); + $booking = $this->updatesBooking->execute($booking, $booking_object); + + DB::commit(); + + return $this->resourceResponse(new BookingResource($booking)); + + } catch (\Exception $exception){ + throw new ErrorException($exception->getMessage(), $exception->getCode()); + } + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Bookings/DataTransferObjects/BookingObject.php b/app/Classes/Modules/Bookings/DataTransferObjects/BookingObject.php new file mode 100644 index 00000000..4e3a15bb --- /dev/null +++ b/app/Classes/Modules/Bookings/DataTransferObjects/BookingObject.php @@ -0,0 +1,112 @@ +company_id = $company_id; + $this->transferable_bank_id = $transferable_bank_id; + $this->marking = $marking; + $this->reference = $reference; + $this->fix_amount = $fix_amount; + $this->fix_currency_id = $fix_currency_id; + $this->convertible_currency_id = $convertible_currency_id; + $this->conversion_currency_id = $conversion_currency_id; + } + + /** + * @return int + */ + public function getCompanyId(): ?int + { + return $this->company_id; + } + + /** + * @return int + */ + public function getTransferableBankId(): ?int + { + return $this->transferable_bank_id; + } + + /** + * @return string + */ + public function getMarking(): ?string + { + return $this->marking; + } + + /** + * @return string + */ + public function getReference(): ?string + { + return $this->reference; + } + + /** + * @return float + */ + public function getFixAmount(): ?float + { + return $this->fix_amount; + } + + /** + * @return int + */ + public function getFixCurrencyId(): ?int + { + return $this->fix_currency_id; + } + + /** + * @return int + */ + public function getConvertibleCurrencyId(): ?int + { + return $this->convertible_currency_id; + } + + /** + * @return int + */ + public function getConversionCurrencyId(): ?int + { + return $this->conversion_currency_id; + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Bookings/Services/ChecksIfBookingMarkingExists.php b/app/Classes/Modules/Bookings/Services/ChecksIfBookingMarkingExists.php new file mode 100644 index 00000000..45530853 --- /dev/null +++ b/app/Classes/Modules/Bookings/Services/ChecksIfBookingMarkingExists.php @@ -0,0 +1,27 @@ +repository = $repository; + } + + public function execute(int $marking): bool { + return $this->repository->where('marking', $marking)->exists(); + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Bookings/Services/CreatesBooking.php b/app/Classes/Modules/Bookings/Services/CreatesBooking.php new file mode 100644 index 00000000..676451fd --- /dev/null +++ b/app/Classes/Modules/Bookings/Services/CreatesBooking.php @@ -0,0 +1,28 @@ +company_id = $object->getCompanyId(); + $model->transferable_bank_id = $object->getTransferableBankId(); + $model->marking = $object->getMarking(); + $model->reference = $object->getReference(); + $model->fix_amount = $object->getFixAmount(); + $model->fix_currency_id = $object->getFixCurrencyId(); + $model->convertible_currency_id = $object->getConvertibleCurrencyId(); + $model->conversion_currency_id = $object->getConversionCurrencyId(); + return $this->handler($model); + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Bookings/Services/DeletesBooking.php b/app/Classes/Modules/Bookings/Services/DeletesBooking.php new file mode 100644 index 00000000..b189c382 --- /dev/null +++ b/app/Classes/Modules/Bookings/Services/DeletesBooking.php @@ -0,0 +1,14 @@ +handler($model); + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Bookings/Services/FetchesBooking.php b/app/Classes/Modules/Bookings/Services/FetchesBooking.php new file mode 100644 index 00000000..b38f5a15 --- /dev/null +++ b/app/Classes/Modules/Bookings/Services/FetchesBooking.php @@ -0,0 +1,33 @@ +repository = $repository; + } + + + /** + * @return Builder + */ + public function getRepository(): Builder + { + return $this->repository->newQuery(); + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Bookings/Services/GeneratesBookingMarking.php b/app/Classes/Modules/Bookings/Services/GeneratesBookingMarking.php new file mode 100644 index 00000000..0e920ab8 --- /dev/null +++ b/app/Classes/Modules/Bookings/Services/GeneratesBookingMarking.php @@ -0,0 +1,31 @@ +bookingMarkingExists = $bookingMarkingExists; + } + + + /** + * @return int + */ + public function execute(): int { + + $marking = mt_rand(100000001, 999999999); + return !$this->bookingMarkingExists->execute($marking) ? $marking : self::execute(); + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Bookings/Services/UpdatesBooking.php b/app/Classes/Modules/Bookings/Services/UpdatesBooking.php new file mode 100644 index 00000000..b5350aa3 --- /dev/null +++ b/app/Classes/Modules/Bookings/Services/UpdatesBooking.php @@ -0,0 +1,27 @@ +transferable_bank_id = $object->getTransferableBankId(); + $model->reference = $object->getReference(); + $model->fix_amount = $object->getFixAmount(); + $model->fix_currency_id = $object->getFixCurrencyId(); + $model->convertible_currency_id = $object->getConvertibleCurrencyId(); + $model->conversion_currency_id = $object->getConversionCurrencyId(); + return $this->handler($model); + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Bookings/Standards/Rules/CanCreateBooking.php b/app/Classes/Modules/Bookings/Standards/Rules/CanCreateBooking.php new file mode 100644 index 00000000..29cfac94 --- /dev/null +++ b/app/Classes/Modules/Bookings/Standards/Rules/CanCreateBooking.php @@ -0,0 +1,55 @@ +bookingValidation = $bookingValidation; + } + + /** + * @return bool + */ + protected function authorized(): bool + { + // TODO Set Authorization rules + if (!\Auth::user()->can('add booking')) { + return false; + } + + return true; + } + + /** + * @param SegmentObject $object + * @return bool + * @throws \App\Classes\Exceptions\RequestValidationException + */ + protected function validators($object): bool + { + return $this->bookingValidation->validate($object); + } + + /** + * @param SegmentObject $object + * @return bool + */ + protected function criteria($object): bool + { + return true; + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Bookings/Standards/Rules/CanDeleteBooking.php b/app/Classes/Modules/Bookings/Standards/Rules/CanDeleteBooking.php new file mode 100644 index 00000000..1b5acee4 --- /dev/null +++ b/app/Classes/Modules/Bookings/Standards/Rules/CanDeleteBooking.php @@ -0,0 +1,45 @@ +can('delete booking')) { + return false; + } + + return true; + + } + + /** + * @param BookingObject $object + * @return bool + */ + protected function validators($object): bool + { + return true; + + } + + + /** + * @param BookingObject $object + * @return bool + */ + protected function criteria($object): bool + { + return true; + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Bookings/Standards/Rules/CanUpdateBooking.php b/app/Classes/Modules/Bookings/Standards/Rules/CanUpdateBooking.php new file mode 100644 index 00000000..9b7fc253 --- /dev/null +++ b/app/Classes/Modules/Bookings/Standards/Rules/CanUpdateBooking.php @@ -0,0 +1,58 @@ +bookingValidation = $bookingValidation; + } + + /** + * @return bool + */ + protected function authorized(): bool + { + // TODO Set Authorization rules + + if (!\Auth::user()->can('edit booking')) { + return false; + } + + return true; + } + + /** + * @param BookingValidation $object + * @return bool + * @throws \App\Classes\Exceptions\RequestValidationException + */ + protected function validators($object): bool + { + return $this->bookingValidation->validate($object); + } + + /** + * @param BookingValidation $object + * @return bool + */ + protected function criteria($object): bool + { + return true; + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Bookings/Standards/Validators/BookingValidation.php b/app/Classes/Modules/Bookings/Standards/Validators/BookingValidation.php new file mode 100644 index 00000000..1bc628d0 --- /dev/null +++ b/app/Classes/Modules/Bookings/Standards/Validators/BookingValidation.php @@ -0,0 +1,52 @@ + $object->getCompanyId(), + 'transferable_bank_id' => $object->getTransferableBankId(), + 'marking' => $object->getMarking(), + 'reference' => $object->getReference(), + 'fix_amount' => $object->getFixAmount(), + 'fix_currency_id' => $object->getFixCurrencyId(), + 'convertible_currency_id' => $object->getConvertibleCurrencyId(), + 'conversion_currency_id' => $object->getConversionCurrencyId(), + ]; + } + + /** + * @return array + */ + protected function rules(): array + { + return [ + 'company_id' => 'required', + 'transferable_bank_id' => 'required', + 'marking' => 'required', + 'reference' => 'required', + 'fix_amount' => 'required', + 'fix_currency_id' => 'required', + 'convertible_currency_id' => 'required', + 'conversion_currency_id' => 'required' + ]; + } + + /** + * @return array + */ + protected function messages(): array + { + return []; + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Companies/Services/FetchesCompany.php b/app/Classes/Modules/Companies/Services/FetchesCompany.php new file mode 100644 index 00000000..288ba922 --- /dev/null +++ b/app/Classes/Modules/Companies/Services/FetchesCompany.php @@ -0,0 +1,33 @@ +repository = $repository; + } + + + /** + * @return Builder + */ + public function getRepository(): Builder + { + return $this->repository->newQuery(); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Bookings/CreateBookingController.php b/app/Http/Controllers/Bookings/CreateBookingController.php new file mode 100644 index 00000000..c3c37efd --- /dev/null +++ b/app/Http/Controllers/Bookings/CreateBookingController.php @@ -0,0 +1,19 @@ +execute($request); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Bookings/DeleteBookingController.php b/app/Http/Controllers/Bookings/DeleteBookingController.php new file mode 100644 index 00000000..dfbd8a01 --- /dev/null +++ b/app/Http/Controllers/Bookings/DeleteBookingController.php @@ -0,0 +1,19 @@ +execute($request); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Bookings/UpdateBookingController.php b/app/Http/Controllers/Bookings/UpdateBookingController.php new file mode 100644 index 00000000..3d15641d --- /dev/null +++ b/app/Http/Controllers/Bookings/UpdateBookingController.php @@ -0,0 +1,20 @@ +execute($request); + } + +} \ No newline at end of file diff --git a/app/Http/Resources/BookingResource.php b/app/Http/Resources/BookingResource.php new file mode 100644 index 00000000..ee5c62a9 --- /dev/null +++ b/app/Http/Resources/BookingResource.php @@ -0,0 +1,30 @@ + $this->id, + 'company_id' => $this->company_id, + 'transferable_bank_id' => $this->transferable_bank_id, + 'marking' => $this->marking, + 'reference' => $this->reference, + 'fix_amount' => $this->fix_amount, + 'fix_currency_id' => $this->fix_currency_id, + 'convertible_currency_id' => $this->convertible_currency_id, + 'conversion_currency_id' => $this->conversion_currency_id, + 'status' => $this->status + ]; + } +} diff --git a/app/Models/Booking.php b/app/Models/Booking.php new file mode 100644 index 00000000..0e56c5fc --- /dev/null +++ b/app/Models/Booking.php @@ -0,0 +1,27 @@ +id(); + $table->bigInteger('company_id')->unsigned()->nullable(); + $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade'); + $table->bigInteger('transferable_bank_id')->unsigned()->nullable(); + $table->foreign('transferable_bank_id')->references('id')->on('company_banks')->onDelete('cascade'); + $table->string('marking'); + $table->string('reference'); + $table->float('fix_amount', 20, 5)->nullable(); + $table->bigInteger('fix_currency_id')->unsigned()->nullable(); + $table->foreign('fix_currency_id')->references('id')->on('currencies')->onDelete('cascade'); + $table->bigInteger('convertible_currency_id')->unsigned()->nullable(); + $table->foreign('convertible_currency_id')->references('id')->on('currencies')->onDelete('cascade'); + $table->bigInteger('conversion_currency_id')->unsigned()->nullable(); + $table->foreign('conversion_currency_id')->references('id')->on('currencies')->onDelete('cascade'); + $table->integer('status')->default(1); + $table->timestamps(); + $table->softDeletes(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('bookings'); + } +} diff --git a/database/seeds/AdminUserPermissionsTableSeeder.php b/database/seeds/AdminUserPermissionsTableSeeder.php index 90ef26e1..4d747771 100644 --- a/database/seeds/AdminUserPermissionsTableSeeder.php +++ b/database/seeds/AdminUserPermissionsTableSeeder.php @@ -54,6 +54,11 @@ class AdminUserPermissionsTableSeeder extends Seeder Permission::create(['name' => 'edit currency', 'guard_name' => 'web']); Permission::create(['name' => 'delete currency', 'guard_name' => 'web']); + Permission::create(['name' => 'view booking', 'guard_name' => 'web']); + Permission::create(['name' => 'add booking', 'guard_name' => 'web']); + Permission::create(['name' => 'edit booking', 'guard_name' => 'web']); + Permission::create(['name' => 'delete booking', 'guard_name' => 'web']); + /////////////////////////////////////////////////////////////////////// $shadow_admin_role = Role::create([ diff --git a/database/seeds/CompanyBanksTableSeeder.php b/database/seeds/CompanyBanksTableSeeder.php new file mode 100644 index 00000000..c583e8ab --- /dev/null +++ b/database/seeds/CompanyBanksTableSeeder.php @@ -0,0 +1,30 @@ +insert([ + [ + 'id' => 1, + 'country_id' => 1, + 'bank_name' => '12345678', + 'holder_name' => '12345678', + 'account_no' => '12345678', + 'type' => 1, + 'default' => 1, + 'status' => 1, + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at' => date('Y-m-d H:i:s') + ] + ]); + } +} diff --git a/database/seeds/DatabaseSeeder.php b/database/seeds/DatabaseSeeder.php index 72afc412..441291eb 100644 --- a/database/seeds/DatabaseSeeder.php +++ b/database/seeds/DatabaseSeeder.php @@ -23,6 +23,7 @@ class DatabaseSeeder extends Seeder $this->call(SegmentConstantsTableSeeder::class); $this->call(CompaniesTableSeeder::class); + $this->call(CompanyBanksTableSeeder::class); // Admin $this->call(AdminUserTableSeeder::class); diff --git a/routes/api.php b/routes/api.php index 1771abb5..c4cab3c4 100644 --- a/routes/api.php +++ b/routes/api.php @@ -24,7 +24,9 @@ Route::group(['middleware' => 'api', 'prefix' => 'v1', 'as' => 'api.'], function require __DIR__ . '/segment.php'; - require __DIR__ . '/company_bank.php'; + // require __DIR__ . '/company_bank.php'; + + require __DIR__ . '/booking.php'; Route::group(['middleware' => 'valid.token'], function () { require __DIR__ . '/crud.php'; diff --git a/routes/booking.php b/routes/booking.php new file mode 100644 index 00000000..2697327d --- /dev/null +++ b/routes/booking.php @@ -0,0 +1,13 @@ + 'Bookings'], function () { + Route::group(['middleware' => 'valid.token'], function () { + Route::group(['prefix' => 'booking'], function () { + Route::post('/create', 'CreateBookingController@create')->name('create'); + Route::put('/update/{id}', 'UpdateBookingController@update')->name('update'); + Route::delete('/delete/{id}', 'DeleteBookingController@delete')->name('delete'); + }); + }); +}); \ No newline at end of file