Create Currency Logic Class

Update Currency Selling Logic Class
Delete Currency Selling Logic Class
Create Currency Log Service Class
This commit is contained in:
CheeSiong
2020-11-29 12:39:36 +08:00
parent 140067f28b
commit dec78bf8d7
27 changed files with 816 additions and 10 deletions
@@ -66,13 +66,13 @@ class DeleteCompanyBankLogic extends AbstractControllerLogic
try {
DB::beginTransaction();
$segment_query = $this->fetchesCompanyBank->execute(['id' => $request->route('id')]);
$company_bank_query = $this->fetchesCompanyBank->execute(['id' => $request->route('id')]);
$this->canDeleteCompanyBank->passes();
$this->deletesCompanyBank->execute($segment_query);
$this->deletesCompanyBank->execute($company_bank_query);
DB::commit();
return $this->resourceResponse(new CompanyBankResource($segment_query));
return $this->resourceResponse(new CompanyBankResource($company_bank_query));
} catch (\Exception $exception){
throw new ErrorException($exception->getMessage(), $exception->getCode());
@@ -37,23 +37,23 @@ class UpdateCompanyBankLogic extends AbstractControllerLogic
private $updatesCompanyBank;
/** @var FetchesCompanyBank */
private $fetchesSegment;
private $fetchesCompanyBank;
/**
* UpdateStandardSegmentConstantLogic constructor.
* @param CanUpdateCompanyBank $canUpdateCompanyBank
* @param UpdatesCompanyBank $updatesCompanyBank
* @param FetchesCompanyBank $fetchesSegment
* @param FetchesCompanyBank $fetchesCompanyBank
*/
public function __construct(
CanUpdateCompanyBank $canUpdateCompanyBank,
UpdatesCompanyBank $updatesCompanyBank,
FetchesCompanyBank $fetchesSegment
FetchesCompanyBank $fetchesCompanyBank
)
{
$this->canUpdateCompanyBank = $canUpdateCompanyBank;
$this->updatesCompanyBank = $updatesCompanyBank;
$this->fetchesSegment = $fetchesSegment;
$this->fetchesCompanyBank = $fetchesCompanyBank;
}
/**
@@ -66,7 +66,7 @@ class UpdateCompanyBankLogic extends AbstractControllerLogic
try {
DB::beginTransaction();
$company_bank_query = $this->fetchesSegment->execute(['id' => $request->route('id')]);
$company_bank_query = $this->fetchesCompanyBank->execute(['id' => $request->route('id')]);
$company_bank_object = new CompanyBankObject(
$company_bank_query->country_id,
@@ -0,0 +1,87 @@
<?php
namespace App\Classes\Modules\Currencies\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Currencies\Standards\Rules\CanCreateCurrency;
use App\Classes\Modules\Currencies\Services\CreatesCurrency;
use App\Classes\Modules\Currencies\Services\CreatesCurrencyLog;
use App\Classes\Modules\Currencies\DataTransferObjects\CurrencyObject;
use App\Http\Resources\CurrencyResource;
use ErrorException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class CreateCurrencyLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Created Currency',
'message' => 'You have successfully created a new Currency'
];
}
/** @var CanCreateCurrency */
private $canCreateCurrency;
/** @var CreatesCurrency */
private $createsCurrency;
/** @var CreatesCurrencyLog */
private $createsCurrencyLog;
/**
* CreateSegmentLogic constructor.
* @param CanCreateCurrency $canCreateCurrency
* @param CreatesCurrency $createsCurrency
* @param CreatesCurrencyLog $createsCurrencyLog
*/
public function __construct(
CanCreateCurrency $canCreateCurrency,
CreatesCurrency $createsCurrency,
CreatesCurrencyLog $createsCurrencyLog
)
{
$this->canCreateCurrency = $canCreateCurrency;
$this->createsCurrency = $createsCurrency;
$this->createsCurrencyLog = $createsCurrencyLog;
}
/**
* @param Request $request
* @return JsonResponse
* @throws ErrorException
*/
public function logic(Request $request) : JsonResponse
{
try {
DB::beginTransaction();
$currency_object = new CurrencyObject(
$request->input('country_id'),
$request->input('name'),
$request->input('short_code'),
$request->input('symbol'),
number_format( (float) $request->input('selling'), 5, '.', '')
);
$this->canCreateCurrency->passes($currency_object);
$currency_query = $this->createsCurrency->execute($currency_object);
$currency_log_query = $this->createsCurrencyLog->execute($currency_query);
DB::commit();
return $this->resourceResponse(new CurrencyResource($currency_query));
} catch (\Exception $exception) {
throw new ErrorException($exception->getMessage(), $exception->getCode());
}
}
}
@@ -0,0 +1,82 @@
<?php
namespace App\Classes\Modules\Currencies\ControllersLogic;
use App\Http\Resources\CurrencyResource;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Currencies\Services\FetchesCurrency;
use App\Classes\Modules\Currencies\Standards\Rules\CanDeleteCurrency;
use App\Classes\Modules\Currencies\Services\DeletesCurrency;
use App\Classes\Modules\Currencies\DataTransferObjects\SegmentObject;
use ErrorException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class DeleteCurrencyLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Delete Currency',
'message' => 'You have successfully deleted the Currency'
];
}
/** @var CanDeleteCurrency */
private $canDeleteCurrency;
/** @var DeletesCurrency */
private $deletesCurrency;
/** @var FetchesCurrency */
private $fetchesCurrency;
/**
* UpdateStandardSegmentConstantLogic constructor.
* @param CanUpdateSegment $canDeleteCurrency
* @param UpdatesSegment $deletesSegment
* @param FetchesCurrency $fetchesCurrency
*/
public function __construct(
CanDeleteCurrency $canDeleteCurrency,
DeletesCurrency $deletesCurrency,
FetchesCurrency $fetchesCurrency
)
{
$this->canDeleteCurrency = $canDeleteCurrency;
$this->deletesCurrency = $deletesCurrency;
$this->fetchesCurrency = $fetchesCurrency;
}
/**
* @param Request $request
* @return JsonResponse
* @throws ErrorException
*/
public function logic(Request $request) : JsonResponse
{
try {
DB::beginTransaction();
$currency_query = $this->fetchesCurrency->execute(['id' => $request->route('id')]);
$this->canDeleteCurrency->passes();
$this->deletesCurrency->execute($currency_query);
DB::commit();
return $this->resourceResponse(new CurrencyResource($currency_query));
} catch (\Exception $exception){
throw new ErrorException($exception->getMessage(), $exception->getCode());
}
}
}
@@ -0,0 +1,98 @@
<?php
namespace App\Classes\Modules\Currencies\ControllersLogic;
use App\Http\Resources\CurrencyResource;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Currencies\Services\FetchesCurrency;
use App\Classes\Modules\Currencies\Standards\Rules\CanUpdateCurrency;
use App\Classes\Modules\Currencies\Services\UpdatesCurrencyRate;
use App\Classes\Modules\Currencies\Services\CreatesCurrencyLog;
use App\Classes\Modules\Currencies\DataTransferObjects\CurrencyObject;
use ErrorException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class UpdateCurrencyRateLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Updated Currency Rate',
'message' => 'You have successfully updated the Currency Rate'
];
}
/** @var CanUpdateCurrency */
private $canUpdateCurrency;
/** @var UpdatesCurrencyRate */
private $updatesCurrencyRate;
/** @var FetchesCurrency */
private $fetchesCurrency;
/** @var CreatesCurrencyLog */
private $createsCurrencyLog;
/**
* UpdateStandardSegmentConstantLogic constructor.
* @param CanUpdateCurrency $canUpdateCurrency
* @param UpdatesCurrencyRate $updatesCurrencyRate
* @param FetchesCurrency $fetchesCurrency
*/
public function __construct(
CanUpdateCurrency $canUpdateCurrency,
UpdatesCurrencyRate $updatesCurrencyRate,
CreatesCurrencyLog $createsCurrencyLog,
FetchesCurrency $fetchesCurrency
)
{
$this->canUpdateCurrency = $canUpdateCurrency;
$this->updatesCurrencyRate = $updatesCurrencyRate;
$this->createsCurrencyLog = $createsCurrencyLog;
$this->fetchesCurrency = $fetchesCurrency;
}
/**
* @param Request $request
* @return JsonResponse
* @throws ErrorException
*/
public function logic(Request $request) : JsonResponse
{
try {
DB::beginTransaction();
$currency_query = $this->fetchesCurrency->execute(['id' => $request->route('id')]);
$currency_object = new CurrencyObject(
$currency_query->country_id,
$currency_query->name,
$currency_query->short_code,
$currency_query->symbol,
$request->input('selling', $currency_query->selling)
);
$this->canUpdateCurrency->passes($currency_object);
$currency_query = $this->updatesCurrencyRate->execute($currency_query, $currency_object);
$currency_log_query = $this->createsCurrencyLog->execute($currency_query);
DB::commit();
return $this->resourceResponse(new CurrencyResource($currency_query));
} catch (\Exception $exception){
throw new ErrorException($exception->getMessage(), $exception->getCode());
}
}
}
@@ -0,0 +1,78 @@
<?php
namespace App\Classes\Modules\Currencies\DataTransferObjects;
use App\Classes\Interfaces\DataTransferObject;
class CurrencyObject implements DataTransferObject
{
/** @var string|null */
private $country_id;
private $name;
private $short_code;
private $symbol;
private $selling;
/**
* CompanyBankObject constructor.
* @param int|null $country_id
* @param string|null $name
* @param string|null $short_code
* @param string|null $symbol
* @param float|null $selling
*/
public function __construct(
?int $country_id,
?string $name,
?string $short_code,
?string $symbol,
?float $selling
)
{
$this->country_id = $country_id;
$this->name = $name;
$this->short_code = $short_code;
$this->symbol = $symbol;
$this->selling = $selling;
}
/**
* @return int
*/
public function getCountryId(): ?int
{
return $this->country_id;
}
/**
* @return string
*/
public function getName(): ?string
{
return $this->name;
}
/**
* @return string
*/
public function getShortCode(): ?string
{
return $this->short_code;
}
/**
* @return string
*/
public function getSymbol(): ?string
{
return $this->symbol;
}
/**
* @return float
*/
public function getSelling(): ?float
{
return $this->selling;
}
}
@@ -0,0 +1,26 @@
<?php
namespace App\Classes\Modules\Currencies\Services;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Classes\Modules\Currencies\DataTransferObjects\CurrencyObject;
use App\Models\Currency;
class CreatesCurrency extends AbstractUpdateRecord
{
/**
* @param CurrencyObject $object
* @return \Illuminate\Database\Eloquent\Model
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(CurrencyObject $object) {
$model = new Currency();
$model->country_id = $object->getCountryId();
$model->name = $object->getName();
$model->short_code = $object->getShortCode();
$model->symbol = $object->getSymbol();
$model->selling = $object->getSelling();
return $this->handler($model);
}
}
@@ -0,0 +1,24 @@
<?php
namespace App\Classes\Modules\Currencies\Services;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Models\Currency;
use App\Models\CurrencyLog;
class CreatesCurrencyLog extends AbstractUpdateRecord
{
/**
* @param Currency $object
* @return \Illuminate\Database\Eloquent\Model
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(Currency $object) {
$model = new CurrencyLog();
$model->currency_id = $object->id;
$model->selling = $object->selling;
$model->created_by = \Auth::user()->id;
return $this->handler($model);
}
}
@@ -0,0 +1,14 @@
<?php
namespace App\Classes\Modules\Currencies\Services;
use App\Classes\General\Eloquent\AbstractDeleteRecord;
use App\Models\Currency;
class DeletesCurrency extends AbstractDeleteRecord
{
public function execute(Currency $model) {
return $this->handler($model);
}
}
@@ -0,0 +1,33 @@
<?php
namespace App\Classes\Modules\Currencies\Services;
use App\Classes\General\Eloquent\AbstractFetchRecord;
use Illuminate\Database\Eloquent\Builder;
use App\Models\Currency;
class FetchesCurrency extends AbstractFetchRecord
{
/** @var Currency */
private $repository;
/**
* FetchesUser constructor.
* @param Currency $repository
*/
public function __construct(Currency $repository)
{
$this->repository = $repository;
}
/**
* @return Builder
*/
public function getRepository(): Builder
{
return $this->repository->newQuery();
}
}
@@ -0,0 +1,23 @@
<?php
namespace App\Classes\Modules\Currencies\Services;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Classes\Modules\Currencies\DataTransferObjects\CurrencyObject;
use App\Models\Currency;
class UpdatesCurrencyRate extends AbstractUpdateRecord
{
/**
* @param CurrencyObject $object
* @return \Illuminate\Database\Eloquent\Model
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(Currency $model, CurrencyObject $object)
{
$model->selling = $object->getSelling();
return $this->handler($model);
}
}
@@ -0,0 +1,55 @@
<?php
namespace App\Classes\Modules\Currencies\Standards\Rules;
use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Modules\Currencies\DataTransferObjects\SegmentObject;
use App\Classes\Modules\Currencies\Standards\Validators\CurrencyValidation;
class CanCreateCurrency extends AbstractRule
{
/** @var currencyValidation */
private $currencyValidation;
/**
* CanCreateCurrency constructor.
* @param CurrencyValidation $currencyValidation
*/
public function __construct(CurrencyValidation $currencyValidation)
{
$this->currencyValidation = $currencyValidation;
}
/**
* @return bool
*/
protected function authorized(): bool
{
// TODO Set Authorization rules
if (!\Auth::user()->can('add currency')) {
return false;
}
return true;
}
/**
* @param SegmentObject $object
* @return bool
* @throws \App\Classes\Exceptions\RequestValidationException
*/
protected function validators($object): bool
{
return $this->currencyValidation->validate($object);
}
/**
* @param SegmentObject $object
* @return bool
*/
protected function criteria($object): bool
{
return true;
}
}
@@ -0,0 +1,45 @@
<?php
namespace App\Classes\Modules\Currencies\Standards\Rules;
use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Modules\Currencies\DataTransferObjects\CurrencyObject;
class CanDeleteCurrency extends AbstractRule
{
/**
* @return bool
*/
protected function authorized(): bool
{
// TODO Set Authorization rules
if (!\Auth::user()->can('delete currency')) {
return false;
}
return true;
}
/**
* @param CurrencyObject $object
* @return bool
*/
protected function validators($object): bool
{
return true;
}
/**
* @param CurrencyObject $object
* @return bool
*/
protected function criteria($object): bool
{
return true;
}
}
@@ -0,0 +1,58 @@
<?php
namespace App\Classes\Modules\Currencies\Standards\Rules;
use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Modules\Currencies\DataTransferObjects\CurrencyObject;
use App\Classes\Modules\Currencies\Standards\Validators\CurrencyValidation;
class CanUpdateCurrency extends AbstractRule
{
/** @var currencyValidation */
private $currencyValidation;
/**
* CanCreateAddress constructor.
* @param CurrencyValidation $CurrencyValidation
*/
public function __construct(CurrencyValidation $currencyValidation)
{
$this->currencyValidation = $currencyValidation;
}
/**
* @return bool
*/
protected function authorized(): bool
{
// TODO Set Authorization rules
if (!\Auth::user()->can('edit currency')) {
return false;
}
return true;
}
/**
* @param CurrencyValidation $object
* @return bool
* @throws \App\Classes\Exceptions\RequestValidationException
*/
protected function validators($object): bool
{
return $this->currencyValidation->validate($object);
}
/**
* @param CurrencyValidation $object
* @return bool
*/
protected function criteria($object): bool
{
return true;
}
}
@@ -0,0 +1,46 @@
<?php
namespace App\Classes\Modules\Currencies\Standards\Validators;
use App\Classes\General\Abstracts\AbstractValidation;
use App\Classes\Modules\Currencies\DataTransferObjects\CurrencyObject;
class CurrencyValidation extends AbstractValidation
{
/**
* @param CurrencyObject $object
* @return array
*/
protected function data($object): array
{
return [
'country_id' => $object->getCountryId(),
'name' => $object->getName(),
'short_code' => $object->getShortCode(),
'symbol' => $object->getSymbol(),
'selling' => $object->getSelling()
];
}
/**
* @return array
*/
protected function rules(): array
{
return [
'country_id' => 'required',
'name' => 'required',
'short_code' => 'required',
'short_code' => 'required',
'selling' => 'required',
];
}
/**
* @return array
*/
protected function messages(): array
{
return [];
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\Http\Controllers\Currencies;
use App\Classes\Modules\Currencies\ControllersLogic\CreateCurrencyLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class CreateCurrencyController
{
/**
* @param Request $request
* @param CreateCurrencyLogic $logic
* @return JsonResponse
*/
public function create(Request $request, CreateCurrencyLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\Http\Controllers\Currencies;
use App\Classes\Modules\Currencies\ControllersLogic\DeleteCurrencyLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class DeleteCurrencyController
{
/**
* @param Request $request
* @param DeleteCurrencyLogic $logic
* @return JsonResponse
*/
public function delete(Request $request, DeleteCurrencyLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\Currencies;
use App\Classes\Modules\Currencies\ControllersLogic\UpdateCurrencyRateLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class UpdateCurrencyRateController
{
/**
* @param Request $request
* @param UpdateCurrencyRateLogic $logic
* @return JsonResponse
*/
public function update(Request $request, UpdateCurrencyRateLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
+26
View File
@@ -0,0 +1,26 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class CurrencyResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'country_id' => $this->country_id,
'name' => $this->name,
'short_code' => $this->short_code,
'symbol' => $this->symbol,
'selling' => $this->selling
];
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
<?php
namespace App;
namespace App\Models;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Database\Eloquent\SoftDeletes;
+11
View File
@@ -0,0 +1,11 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class CurrencyLog extends AbstractModel
{
protected $table = 'currency_logs';
}
@@ -20,6 +20,7 @@ class CreateCurrenciesTable extends Migration
$table->string('name')->nullable();
$table->string('short_code')->nullable();
$table->string('symbol')->nullable();
$table->float('selling', 20, 5)->nullable();
$table->timestamps();
$table->softDeletes();
});
@@ -0,0 +1,36 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateCurrencyLogsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('currency_logs', function (Blueprint $table) {
$table->id();
$table->bigInteger('currency_id')->unsigned()->nullable();
$table->foreign('currency_id')->references('id')->on('currencies')->onDelete('cascade');
$table->float('selling', 20, 5)->nullable();
$table->bigInteger('created_by')->unsigned()->nullable();
$table->foreign('created_by')->references('id')->on('users')->onDelete('cascade');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('currency_logs');
}
}
@@ -24,7 +24,6 @@ class AdminUserPermissionsTableSeeder extends Seeder
Permission::create(['name' => 'edit document', 'guard_name' => 'web']);
Permission::create(['name' => 'delete document', 'guard_name' => 'web']);
Permission::create(['name' => 'view standard_segment', 'guard_name' => 'web']);
Permission::create(['name' => 'add standard_segment', 'guard_name' => 'web']);
Permission::create(['name' => 'edit standard_segment', 'guard_name' => 'web']);
@@ -50,6 +49,11 @@ class AdminUserPermissionsTableSeeder extends Seeder
Permission::create(['name' => 'edit company_bank', 'guard_name' => 'web']);
Permission::create(['name' => 'delete company_bank', 'guard_name' => 'web']);
Permission::create(['name' => 'view currency', 'guard_name' => 'web']);
Permission::create(['name' => 'add currency', 'guard_name' => 'web']);
Permission::create(['name' => 'edit currency', 'guard_name' => 'web']);
Permission::create(['name' => 'delete currency', 'guard_name' => 'web']);
///////////////////////////////////////////////////////////////////////
$shadow_admin_role = Role::create([
+1
View File
@@ -19,6 +19,7 @@ class CurrenciesTableSeeder extends Seeder
'name' => 'Ringgit',
'short_code' => 'MYR',
'symbol' => 'RM',
'selling' => 1,
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s')
]