Copied transaction, receipt & currecny module from Exchange

This commit is contained in:
Fairuz
2021-07-04 11:52:31 +08:00
parent 9bcb45e5cc
commit bc8ec2854a
113 changed files with 5403 additions and 5 deletions
@@ -0,0 +1,108 @@
<?php
namespace App\Classes\Modules\Currencies\ControllersLogic;
use App\Classes\Exceptions\MalformedRequestException;
use App\Classes\Exceptions\ResourceConflictException;
use App\Classes\Exceptions\ResourceNotFoundException;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Countries\DataTransferObjects\CountryObject;
use App\Classes\Modules\Countries\Services\CreatesCountry;
use App\Classes\Modules\Countries\Services\FetchesCountry;
use App\Classes\Modules\Currencies\Services\FetchesCurrency;
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 App\Models\Country;
use App\Models\Currency;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class CreateCurrencyLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Create Currency',
'message' => 'You have successfully created a new Currency'
];
}
/** @var FetchesCountry */
private $fetchesCountry;
/** @var FetchesCurrency */
private $fetchesCurrency;
/** @var CreatesCountry */
private $createsCountry;
/** @var CanCreateCurrency */
private $canCreateCurrency;
/** @var CreatesCurrency */
private $createsCurrency;
/** @var CreatesCurrencyLog */
private $createsCurrencyLog;
/**
* CreateCurrencyLogic constructor.
* @param FetchesCountry $fetchesCountry
* @param FetchesCurrency $fetchesCurrency
* @param CreatesCountry $createsCountry
* @param CanCreateCurrency $canCreateCurrency
* @param CreatesCurrency $createsCurrency
* @param CreatesCurrencyLog $createsCurrencyLog
*/
public function __construct(FetchesCountry $fetchesCountry, FetchesCurrency $fetchesCurrency, CreatesCountry $createsCountry, CanCreateCurrency $canCreateCurrency, CreatesCurrency $createsCurrency, CreatesCurrencyLog $createsCurrencyLog)
{
$this->fetchesCountry = $fetchesCountry;
$this->fetchesCurrency = $fetchesCurrency;
$this->createsCountry = $createsCountry;
$this->canCreateCurrency = $canCreateCurrency;
$this->createsCurrency = $createsCurrency;
$this->createsCurrencyLog = $createsCurrencyLog;
}
/**
* @param Request $request
* @return JsonResponse
* @throws MalformedRequestException
* @throws ResourceConflictException
* @throws \App\Classes\Exceptions\AccessForbiddenException
* @throws \App\Classes\Exceptions\RequestValidationException
*/
public function logic(Request $request) : JsonResponse
{
$countryObject = Country($request->input('country_short_code'));
/** @var Country $country */
$country = $this->createsCountry->execute(new CountryObject($countryObject));
$currencyInfo = $countryObject->getCurrency();
$currencyObject = new CurrencyObject($currencyInfo['iso_4217_name'], $currencyInfo['iso_4217_code']);
$this->canCreateCurrency->passes($currencyObject);
try {
$this->fetchesCurrency->execute(['country_id' => $country->id, 'short_code' => $currencyObject->getShortCode()]);
throw new ResourceConflictException('Duplicated Currency. This currency already exists in the system');
} catch (ResourceNotFoundException $exception){
/** @var Currency $currency */
$currency = $this->createsCurrency->execute($country, $currencyObject);
$this->createsCurrencyLog->execute($currency);
}
return $this->resourceResponse(new CurrencyResource($currency));
}
}
@@ -0,0 +1,77 @@
<?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 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;
/**
* DeleteCurrencyLogic constructor.
* @param CanDeleteCurrency $canDeleteCurrency
* @param DeletesCurrency $deletesCurrency
* @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 \App\Classes\Exceptions\AccessForbiddenException
* @throws \App\Classes\Exceptions\MalformedRequestException
* @throws \App\Classes\Exceptions\RequestValidationException
*/
public function logic(Request $request) : JsonResponse
{
$this->canDeleteCurrency->passes();
$currency_query = $this->fetchesCurrency->execute(['id' => $request->route('id')]);
$this->deletesCurrency->execute($currency_query);
return $this->response([]);
}
}
@@ -0,0 +1,71 @@
<?php
namespace App\Classes\Modules\Currencies\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Currencies\Services\FetchesCurrency;
use App\Classes\Modules\Currencies\Standards\Rules\CanFetchCurrency;
use App\Classes\Modules\Segments\Services\FetchesConstant;
use App\Classes\ValueObjects\Constants\SegmentConstants;
use App\Http\Resources\CurrencyResource;
use App\Models\Currency;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class FetchSystemPrimaryCurrencyLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Fetch System\'s primary currency',
'message' => 'You have successfully retrieved a Currency'
];
}
/** @var CanFetchCurrency */
private $canFetchCurrency;
/** @var FetchesConstant*/
private $fetchesConstant;
/** @var FetchesCurrency */
private $fetchesCurrency;
/**
* FetchSystemPrimaryCurrencyLogic constructor.
* @param CanFetchCurrency $canFetchCurrency
* @param FetchesConstant $fetchesConstant
* @param FetchesCurrency $fetchesCurrency
*/
public function __construct(CanFetchCurrency $canFetchCurrency, FetchesConstant $fetchesConstant, FetchesCurrency $fetchesCurrency)
{
$this->canFetchCurrency = $canFetchCurrency;
$this->fetchesConstant = $fetchesConstant;
$this->fetchesCurrency = $fetchesCurrency;
}
/**
* @param Request $request
* @return JsonResponse
* @throws \App\Classes\Exceptions\AccessForbiddenException
* @throws \App\Classes\Exceptions\RequestValidationException
*/
public function logic(Request $request) : JsonResponse
{
$this->canFetchCurrency->passes();
$constant = $this->fetchesConstant->execute(['reference' => SegmentConstants::SYSTEM_PRIMARY_CURRENCY]);
/** @var Currency $currency */
$currency = $this->fetchesCurrency->execute(['id' => $constant->detail->id]);
return $this->resourceResponse(new CurrencyResource($currency));
}
}
@@ -0,0 +1,62 @@
<?php
namespace App\Classes\Modules\Currencies\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Currencies\Services\ListsCurrency;
use App\Classes\Modules\Currencies\Standards\Rules\CanListCurrency;
use App\Http\Resources\CurrencyResource;
use ErrorException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class ListCurrencyLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Retrieved Currency',
'message' => 'You have successfully retrieved a list of Currency'
];
}
/** @var CanListCurrency */
private $canListCurrency;
/** @var ListsCurrency */
private $listsCurrency;
/**
* ListCurrencyLogic constructor.
* @param CanListCurrency $canListCurrency
* @param ListsCurrency $listsCurrency
*/
public function __construct(CanListCurrency $canListCurrency, ListsCurrency $listsCurrency)
{
$this->canListCurrency = $canListCurrency;
$this->listsCurrency = $listsCurrency;
}
/**
* @param Request $request
* @return JsonResponse
* @throws \App\Classes\Exceptions\AccessForbiddenException
* @throws \App\Classes\Exceptions\MalformedRequestException
* @throws \App\Classes\Exceptions\RequestValidationException
*/
public function logic(Request $request) : JsonResponse
{
$this->canListCurrency->passes();
$query = $this->listsCurrency->execute($this->listsCurrency->deserializeFilters($request->input('filters')));
return $this->collectionResponse(CurrencyResource::collection($query));
}
}
@@ -0,0 +1,60 @@
<?php
namespace App\Classes\Modules\Currencies\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Currencies\Services\FetchesCurrency;
use App\Classes\Modules\Currencies\Services\RateCalculatesCurrency;
use App\Http\Resources\RateCalculateCurrencyResource;
use ErrorException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class RateCalculateCurrencyLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Rate Calculated Currency',
'message' => 'You have successfully rate calculated a Currency'
];
}
/** @var FetchesCurrency */
private $fetchesCurrency;
/** @var RateCalculatesCurrency */
private $rateCalculatesCurrency;
/**
* @param FetchesCurrency $fetchesCurrency
* @param RateCalculatesCurrency $rateCalculatesCurrency
*/
public function __construct(FetchesCurrency $fetchesCurrency, RateCalculatesCurrency $rateCalculatesCurrency)
{
$this->fetchesCurrency = $fetchesCurrency;
$this->rateCalculatesCurrency = $rateCalculatesCurrency;
}
/**
* @param Request $request
* @return JsonResponse
*/
public function logic(Request $request) : JsonResponse
{
$amount = $request->input('amount');
$conversion_currency = $this->fetchesCurrency->execute(['id' => $request->input('conversion_currency_id')]);
$convertable_currency = $this->fetchesCurrency->execute(['id' => $request->input('convertable_currency_id')]);
$this->rateCalculatesCurrency->execute($conversion_currency, $convertable_currency, $amount);
return $this->resourceResponse(new RateCalculateCurrencyResource($conversion_currency, $convertable_currency, $amount));
}
}
@@ -0,0 +1,74 @@
<?php
namespace App\Classes\Modules\Currencies\ControllersLogic\Rates;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Currencies\Services\Rates\FetchesRate;
use App\Classes\Modules\Currencies\Services\Rates\CalculatesRate;
use App\Http\Resources\CalculateCurrencyRateResource;
use ErrorException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class CalculateRateLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Calculated Currency Rate',
'message' => 'You have successfully rate calculated a Currency'
];
}
/** @var FetchesRate */
private $fetchesRate;
/** @var CalculatesRate */
private $calculatesRate;
/**
* @param FetchesRate $fetchesRate
* @param CalculatesRate $calculatesRate
*/
public function __construct(FetchesRate $fetchesRate, CalculatesRate $calculatesRate)
{
$this->fetchesRate = $fetchesRate;
$this->calculatesRate = $calculatesRate;
}
/**
* @param Request $request
* @return JsonResponse
* @throws ErrorException
*/
public function logic(Request $request) : JsonResponse
{
try {
$amount = $request->input('amount');
$conversion_currency_rate = $this->fetchesRate->execute(
[
'id' => $request->input('conversion_currency_rate_id'),
]
);
$convertable_currency_rate = $this->fetchesRate->execute(
[
'id' => $request->input('convertable_currency_rate_id')
]
);
$convert_amount = $this->calculatesRate->execute($conversion_currency_rate, $convertable_currency_rate, $amount);
return $this->resourceResponse(new CalculateCurrencyRateResource($conversion_currency_rate, $convertable_currency_rate, $convert_amount));
} catch (\Exception $exception){
throw new ErrorException($exception->getMessage(), $exception->getCode());
}
}
}
@@ -0,0 +1,96 @@
<?php
namespace App\Classes\Modules\Currencies\ControllersLogic\Rates;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Currencies\Services\FetchesCurrency;
use App\Classes\Modules\Currencies\Services\Rates\CreatesRateLog;
use App\Classes\Modules\Currencies\Standards\Rules\Rates\CanCreateRate;
use App\Classes\Modules\Currencies\Services\Rates\CreatesRate;
use App\Classes\Modules\Currencies\DataTransferObjects\RateObject;
use App\Http\Resources\CurrencyRateResource;
use ErrorException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class CreateRateLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Created Currency Rate',
'message' => 'You have successfully created a new Currency Rate'
];
}
/** @var CanCreateRate */
private $canCreateRate;
/** @var CreatesRate */
private $createsRate;
/** @var CreatesRateLog */
private $createsRateLog;
/** @var FetchesCurrency */
private $fetchesCurrency;
/**
* CreateRateLogic constructor.
* @param CanCreateRate $canCreateRate
* @param CreatesRate $createsRate
* @param CreatesRateLog $createsRateLog
* @param FetchesCurrency $fetchesCurrency
*/
public function __construct(
CanCreateRate $canCreateRate,
CreatesRate $createsRate,
CreatesRateLog $createsRateLog,
FetchesCurrency $fetchesCurrency
)
{
$this->canCreateRate = $canCreateRate;
$this->createsRate = $createsRate;
$this->createsRateLog = $createsRateLog;
$this->fetchesCurrency = $fetchesCurrency;
}
/**
* @param Request $request
* @return JsonResponse
* @throws ErrorException
*/
public function logic(Request $request) : JsonResponse
{
try {
DB::beginTransaction();
$currency_rate_object = new RateObject(
$request->input('currency_id'),
number_format( (float) $request->input('selling'), 5, '.', ''),
$request->input('payment_method_type')
);
$this->canCreateRate->passes($currency_rate_object);
$currency_rate_query = $this->createsRate->execute($currency_rate_object);
$this->createsRateLog->execute($currency_rate_query);
DB::commit();
return $this->resourceResponse(new CurrencyRateResource($currency_rate_query));
} catch (\Exception $exception) {
throw new ErrorException($exception->getMessage(), $exception->getCode());
}
}
}
@@ -0,0 +1,82 @@
<?php
namespace App\Classes\Modules\Currencies\ControllersLogic\Rates;
use App\Classes\Modules\Currencies\Services\Rates\DeletesRate;
use App\Http\Resources\CurrencyRateResource;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Currencies\Services\Rates\FetchesRate;
use App\Classes\Modules\Currencies\Standards\Rules\Rates\CanDeleteRate;
use ErrorException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class DeleteRateLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Delete Currency Rate',
'message' => 'You have successfully deleted the Currency Rate'
];
}
/** @var CanDeleteRate */
private $canDeleteRate;
/** @var DeletesRate */
private $deletesRate;
/** @var FetchesRate */
private $fetchesRate;
/**
* DeleteRateRateLogic constructor.
* @param CanDeleteRate $canDeleteRate
* @param DeletesRate $deletesRate
* @param FetchesRate $fetchesRate
*/
public function __construct(
CanDeleteRate $canDeleteRate,
DeletesRate $deletesRate,
FetchesRate $fetchesRate
)
{
$this->canDeleteRate = $canDeleteRate;
$this->deletesRate = $deletesRate;
$this->fetchesRate = $fetchesRate;
}
/**
* @param Request $request
* @return JsonResponse
* @throws ErrorException
*/
public function logic(Request $request) : JsonResponse
{
try {
DB::beginTransaction();
$currency_rate = $this->fetchesRate->execute(['id' => $request->route('id')]);
$this->canDeleteRate->passes();
$this->deletesRate->execute($currency_rate);
DB::commit();
return $this->resourceResponse(new CurrencyRateResource($currency_rate));
} catch (\Exception $exception){
throw new ErrorException($exception->getMessage(), $exception->getCode());
}
}
}
@@ -0,0 +1,66 @@
<?php
namespace App\Classes\Modules\Currencies\ControllersLogic\Rates;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Currencies\Services\Rates\FetchesRate;
use App\Classes\Modules\Currencies\Standards\Rules\Rates\CanFetchRate;
use App\Http\Resources\CurrencyRateResource;
use ErrorException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class FetchRateLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Retrieved Currency Rate',
'message' => 'You have successfully retrieved a Currency Rate'
];
}
/** @var CanFetchRate */
private $canFetchRate;
/** @var FetchesRate */
private $fetchesRate;
/**
* FetchRateControllersLogic constructor.
* @param CanFetchRate $canFetchRate
* @param FetchesRate $fetchesRate
*/
public function __construct(CanFetchRate $canFetchRate, FetchesRate $fetchesRate)
{
$this->canFetchRate = $canFetchRate;
$this->fetchesRate = $fetchesRate;
}
/**
* @param Request $request
* @return JsonResponse
* @throws ErrorException
*/
public function logic(Request $request) : JsonResponse
{
try {
$this->canFetchRate->passes();
$query = $this->fetchesRate->execute(['id' => $request->route('id')]);
return $this->resourceResponse(new CurrencyRateResource($query));
} catch (\Exception $exception){
throw new ErrorException($exception->getMessage(), $exception->getCode());
}
}
}
@@ -0,0 +1,70 @@
<?php
namespace App\Classes\Modules\Currencies\ControllersLogic\Rates;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Currencies\Services\Rates\ListsRates;
use App\Classes\Modules\Currencies\Standards\Rules\Rates\CanListRates;
use App\Http\Resources\CurrencyRateResource;
use ErrorException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class ListRatesLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Retrieved Currency Rate',
'message' => 'You have successfully retrieved a list of Currency Rate'
];
}
/** @var CanListRates */
private $canListRates;
/** @var ListsRates */
private $listsRates;
/**
* ListRatesLogic constructor.
* @param CanListRates $canListRates
* @param ListsRates $listsRates
*/
public function __construct(CanListRates $canListRates, ListsRates $listsRates)
{
$this->canListRates = $canListRates;
$this->listsRates = $listsRates;
}
/**
* @param Request $request
* @return JsonResponse
* @throws ErrorException
*/
public function logic(Request $request) : JsonResponse
{
try {
$this->canListRates->passes();
$query = $this->listsRates->execute(
[
'currency_id' => $request->input('currency_id'),
'payment_method_type' => $request->input('payment_method_type')
]
);
return $this->collectionResponse(CurrencyRateResource::collection($query));
} catch (\Exception $exception){
throw new ErrorException($exception->getMessage(), $exception->getCode());
}
}
}
@@ -0,0 +1,97 @@
<?php
namespace App\Classes\Modules\Currencies\ControllersLogic\Rates;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Currencies\Services\Rates\CreatesRateLog;
use App\Classes\Modules\Currencies\Services\Rates\FetchesRate;
use App\Classes\Modules\Currencies\Standards\Rules\Rates\CanUpdateRate;
use App\Classes\Modules\Currencies\Services\Rates\UpdatesRate;
use App\Classes\Modules\Currencies\DataTransferObjects\RateObject;
use App\Http\Resources\CurrencyRateResource;
use ErrorException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class UpdateRateLogic extends AbstractControllerLogic
{
/** @var CanUpdateRate */
private $canUpdateRate;
/** @var UpdatesRate */
private $updatesRate;
/** @var CreatesRateLog */
private $createsRateLog;
/** @var FetchesRate */
private $fetchesRate;
/**
* UpdateStandardRateLogic constructor.
* @param CanUpdateRate $canUpdateRate
* @param UpdatesRate $updatesRate
* @param CreatesRateLog $createsRateLog
* @param FetchesRate $fetchesRate
*/
public function __construct(
CanUpdateRate $canUpdateRate,
UpdatesRate $updatesRate,
CreatesRateLog $createsRateLog,
FetchesRate $fetchesRate
)
{
$this->canUpdateRate = $canUpdateRate;
$this->updatesRate = $updatesRate;
$this->createsRateLog = $createsRateLog;
$this->fetchesRate = $fetchesRate;
}
/**
* @param Request $request
* @return JsonResponse
* @throws ErrorException
*/
public function logic(Request $request) : JsonResponse
{
try {
DB::beginTransaction();
$currency_rate_query = $this->fetchesRate->execute(['id' => $request->route('id')]);
$currency_object_object = new RateObject(
$currency_rate_query->currency_id,
$request->input('selling', $currency_rate_query->selling),
$currency_rate_query->payment_method_type
);
$this->canUpdateRate->passes($currency_object_object);
$currency_rate_query = $this->updatesRate->execute($currency_rate_query, $currency_object_object);
$this->createsRateLog->execute($currency_rate_query);
DB::commit();
return $this->resourceResponse(new CurrencyRateResource($currency_rate_query));
} catch (\Exception $exception){
throw new ErrorException($exception->getMessage(), $exception->getCode());
}
}
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Updated Currency Rate',
'message' => 'You have successfully updated the Currency Rate'
];
}
}
@@ -0,0 +1,86 @@
<?php
namespace App\Classes\Modules\Currencies\DataTransferObjects;
use App\Classes\General\Interfaces\DataTransferObject;
use App\Classes\ValueObjects\Constants\PaymentMethodType;
class CurrencyConversionObject implements DataTransferObject
{
/** @var float */
private $amount;
/** @var int */
private $currencyId;
/** @var int */
private $serviceId;
/** @var int */
private $type;
/** @var int|null */
private $paymentMethod;
/**
* CurrencyConversionObject constructor.
* @param float $amount
* @param int $currencyId
* @param int $serviceId
* @param int $type
* @param int|null $paymentMethod
*/
public function __construct(float $amount, int $currencyId, int $serviceId, int $type, ?int $paymentMethod = PaymentMethodType::CASH)
{
$this->amount = $amount;
$this->currencyId = $currencyId;
$this->serviceId = $serviceId;
$this->type = $type;
$this->paymentMethod = $paymentMethod;
}
/**
* @return float
*/
public function getAmount(): float
{
return $this->amount;
}
/**
* @return int
*/
public function getCurrencyId(): int
{
return $this->currencyId;
}
/**
* @return int
*/
public function getServiceId(): int
{
return $this->serviceId;
}
/**
* @return int
*/
public function getType(): int
{
return $this->type;
}
/**
* @return int|null
*/
public function getPaymentMethod(): ?int
{
return $this->paymentMethod;
}
}
@@ -0,0 +1,45 @@
<?php
namespace App\Classes\Modules\Currencies\DataTransferObjects;
use App\Classes\General\Interfaces\DataTransferObject;
use App\Classes\ValueObjects\Constants\PaymentMethodType;
class RateObject implements DataTransferObject
{
/** @var array */
private $selling;
/** @var array */
private $payment_method_type;
/**
* RateObject constructor.
* @param array $selling
* @param string $payment_method_type
*/
public function __construct(array $selling, string $payment_method_type)
{
$this->selling = $selling;
$this->payment_method_type = $payment_method_type;
}
/**
* @return array
*/
public function getSelling(): array
{
return $this->selling;
}
/**
* @return int
*/
public function getPaymentMethodType(): int
{
return PaymentMethodType::PAYMENT_METHODS[$this->payment_method_type];
}
}
@@ -0,0 +1,23 @@
<?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->created_by = Auth()->user()->id;
return $this->handler($model);
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\Classes\Modules\Currencies\Services;
use App\Classes\General\Eloquent\AbstractDeleteRecord;
use App\Models\Currency;
class DeletesCurrency extends AbstractDeleteRecord
{
/**
* @param Currency $model
* @return mixed
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
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\AbstractListRecord;
use Illuminate\Database\Eloquent\Builder;
use App\Models\Currency;
class ListsCurrency extends AbstractListRecord
{
/** @var Currency */
private $repository;
/**
* ListsCurrency constructor.
* @param Currency $repository
*/
public function __construct(Currency $repository)
{
$this->repository = $repository;
}
/**
* @return Builder
*/
function getRepository(): Builder
{
return $this->repository->newQuery();
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Classes\Modules\Currencies\Services;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Models\Currency;
class RateCalculatesCurrency extends AbstractUpdateRecord
{
public function execute(Currency $conversion_currency, Currency $convertable_currency, $amount)
{
return $convert_amount = ($conversion_currency->selling / $convertable_currency->selling) * $amount;
}
public function execute_rate(Currency $conversion_currency, Currency $convertable_currency)
{
return $convert_rate = ($conversion_currency->selling / $convertable_currency->selling);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Classes\Modules\Currencies\Services\Rates;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Models\CurrencyRate;
class CalculatesRate extends AbstractUpdateRecord
{
public function execute(CurrencyRate $conversion_currency_rate, CurrencyRate $convertable_currency_rate, $amount)
{
return $convert_amount = ($conversion_currency_rate->selling / $convertable_currency_rate->selling) * $amount;
}
public function execute_rate(CurrencyRate $conversion_currency_rate, CurrencyRate $convertable_currency_rate)
{
return $convert_rate = ($conversion_currency_rate->selling / $convertable_currency_rate->selling);
}
}
@@ -0,0 +1,29 @@
<?php
namespace App\Classes\Modules\Currencies\Services\Rates;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Classes\General\Eloquent\AbstractUpdateRelationshipRecord;
use App\Classes\Modules\Currencies\DataTransferObjects\RateObject;
use App\Models\Currency;
use App\Models\CurrencyRate;
class CreatesRate extends AbstractUpdateRelationshipRecord
{
/**
* @param Currency $currency
* @param RateObject $object
* @return \Illuminate\Database\Eloquent\Model
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(Currency $currency, RateObject $object)
{
$model = new CurrencyRate();
$model->selling = $object->getSelling();
$model->payment_method_type = $object->getPaymentMethodType();
$model->service_id = $object->getServiceId();
return $this->handler($currency->rates(), $model);
}
}
@@ -0,0 +1,24 @@
<?php
namespace App\Classes\Modules\Currencies\Services\Rates;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Models\CurrencyRate;
use App\Models\CurrencyRateLog;
class CreatesRateLog extends AbstractUpdateRecord
{
/**
* @param CurrencyRate $object
* @return \Illuminate\Database\Eloquent\Model
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(CurrencyRate $object) {
$model = new CurrencyRateLog();
$model->currency_rate_id = $object->id;
$model->selling = $object->selling;
$model->created_by = \Auth::user()->id;
return $this->handler($model);
}
}
@@ -0,0 +1,24 @@
<?php
namespace App\Classes\Modules\Currencies\Services\Rates;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Classes\General\Eloquent\AbstractUpdateRelationshipRecord;
use App\Classes\Modules\Currencies\DataTransferObjects\RateObject;
use App\Models\Currency;
use App\Models\CurrencyRate;
class CreatesRates extends AbstractUpdateRelationshipRecord
{
/**
* @param Currency $currency
* @param array $rates
* @return mixed
*/
public function execute(Currency $currency, array $rates)
{
return $currency->update($rates)->save();
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\Classes\Modules\Currencies\Services\Rates;
use App\Classes\General\Eloquent\AbstractDeleteRecord;
use App\Models\CurrencyRate;
class DeletesRate extends AbstractDeleteRecord
{
/**
* @param CurrencyRate $model
* @return mixed
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(CurrencyRate $model) {
return $this->handler($model);
}
}
@@ -0,0 +1,33 @@
<?php
namespace App\Classes\Modules\Currencies\Services\Rates;
use App\Classes\General\Eloquent\AbstractFetchRecord;
use Illuminate\Database\Eloquent\Builder;
use App\Models\CurrencyRate;
class FetchesRate extends AbstractFetchRecord
{
/** @var CurrencyRate */
private $repository;
/**
* FetchesRate constructor.
* @param CurrencyRate $repository
*/
public function __construct(CurrencyRate $repository)
{
$this->repository = $repository;
}
/**
* @return Builder
*/
public function getRepository(): Builder
{
return $this->repository->newQuery();
}
}
@@ -0,0 +1,33 @@
<?php
namespace App\Classes\Modules\Currencies\Services\Rates;
use App\Classes\General\Eloquent\AbstractListRecord;
use Illuminate\Database\Eloquent\Builder;
use App\Models\CurrencyRate;
class ListsRates extends AbstractListRecord
{
/** @var CurrencyRate */
private $repository;
/**
* ListsRates constructor.
* @param CurrencyRate $repository
*/
public function __construct(CurrencyRate $repository)
{
$this->repository = $repository;
}
/**
* @return Builder
*/
function getRepository(): Builder
{
return $this->repository->newQuery();
}
}
@@ -0,0 +1,24 @@
<?php
namespace App\Classes\Modules\Currencies\Services\Rates;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Classes\Modules\Currencies\DataTransferObjects\RateObject;
use App\Models\CurrencyRate;
class UpdatesRate extends AbstractUpdateRecord
{
/**
* @param CurrencyRate $model
* @param RateObject $object
* @return \Illuminate\Database\Eloquent\Model
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(CurrencyRate $model, RateObject $object)
{
$model->selling = $object->getSelling();
return $this->handler($model);
}
}
@@ -0,0 +1,51 @@
<?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 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
return true;
}
/**
* @param CurrencyObject $object
* @return bool
* @throws \App\Classes\Exceptions\RequestValidationException
*/
protected function validators($object): bool
{
return $this->currencyValidation->validate($object);
}
/**
* @param CurrencyObject $object
* @return bool
*/
protected function criteria($object): bool
{
return true;
}
}
@@ -0,0 +1,39 @@
<?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
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,40 @@
<?php
namespace App\Classes\Modules\Currencies\Standards\Rules;
use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Modules\Currencies\DataTransferObjects\CurrencyObject;
class CanFetchCurrency extends AbstractRule
{
/**
* @return bool
*/
protected function authorized(): bool
{
// TODO Set Authorization rules
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,41 @@
<?php
namespace App\Classes\Modules\Currencies\Standards\Rules;
use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Modules\Currencies\DataTransferObjects\CurrencyObject;
class CanListCurrency extends AbstractRule
{
/**
* @return bool
*/
protected function authorized(): bool
{
// TODO Set Authorization rules
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,54 @@
<?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;
/**
* CanUpdateCurrency constructor.
* @param CurrencyValidation $currencyValidation
*/
public function __construct(CurrencyValidation $currencyValidation)
{
$this->currencyValidation = $currencyValidation;
}
/**
* @return bool
*/
protected function authorized(): bool
{
// TODO Set Authorization rules
return true;
}
/**
* @param CurrencyObject $object
* @return bool
* @throws \App\Classes\Exceptions\RequestValidationException
*/
protected function validators($object): bool
{
return $this->currencyValidation->validate($object);
}
/**
* @param CurrencyObject $object
* @return bool
*/
protected function criteria($object): bool
{
return true;
}
}
@@ -0,0 +1,55 @@
<?php
namespace App\Classes\Modules\Currencies\Standards\Rules\Rates;
use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Modules\Currencies\Standards\Validators\Rates\RateValidation;
use App\Classes\Modules\Currencies\DataTransferObjects\RateObject;
class CanCreateRate extends AbstractRule
{
/** @var RateValidation */
private $rateValidation;
/**
* CanCreateRate constructor.
* @param RateValidation $rateValidation
*/
public function __construct(RateValidation $rateValidation)
{
$this->rateValidation = $rateValidation;
}
/**
* @return bool
*/
protected function authorized(): bool
{
// TODO Set Authorization rules
if (!\Auth::user()->can('add currency_rate')) {
return false;
}
return true;
}
/**
* @param RateObject $object
* @return bool
* @throws \App\Classes\Exceptions\RequestValidationException
*/
protected function validators($object): bool
{
return $this->rateValidation->validate($object, 'POST');
}
/**
* @param RateObject $object
* @return bool
*/
protected function criteria($object): bool
{
return true;
}
}
@@ -0,0 +1,45 @@
<?php
namespace App\Classes\Modules\Currencies\Standards\Rules\Rates;
use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Modules\Currencies\DataTransferObjects\RateObject;
class CanDeleteRate extends AbstractRule
{
/**
* @return bool
*/
protected function authorized(): bool
{
// TODO Set Authorization rules
if (!\Auth::user()->can('delete currency_rate')) {
return false;
}
return true;
}
/**
* @param RateObject $object
* @return bool
*/
protected function validators($object): bool
{
return true;
}
/**
* @param RateObject $object
* @return bool
*/
protected function criteria($object): bool
{
return true;
}
}
@@ -0,0 +1,43 @@
<?php
namespace App\Classes\Modules\Currencies\Standards\Rules\Rates;
use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Modules\Currencies\DataTransferObjects\RateObject;
class CanFetchRate extends AbstractRule
{
/**
* @return bool
*/
protected function authorized(): bool
{
// TODO Set Authorization rules
return true;
}
/**
* @param RateObject $object
* @return bool
*/
protected function validators($object): bool
{
return true;
}
/**
* @param RateObject $object
* @return bool
*/
protected function criteria($object): bool
{
return true;
}
}
@@ -0,0 +1,45 @@
<?php
namespace App\Classes\Modules\Currencies\Standards\Rules\Rates;
use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Modules\Currencies\DataTransferObjects\CurrencyObject;
class CanListRates extends AbstractRule
{
/**
* @return bool
*/
protected function authorized(): bool
{
// TODO Set Authorization rules
if (!\Auth::user()->can('view currency_rate')) {
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\Rates;
use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Modules\Currencies\Standards\Validators\Rates\RateValidation;
use App\Classes\Modules\Currencies\DataTransferObjects\RateObject;
class CanUpdateRate extends AbstractRule
{
/** @var RateValidation */
private $rateValidation;
/**
* CanUpdateRate constructor.
* @param RateValidation $rateValidation
*/
public function __construct(RateValidation $rateValidation)
{
$this->rateValidation = $rateValidation;
}
/**
* @return bool
*/
protected function authorized(): bool
{
// TODO Set Authorization rules
if (!\Auth::user()->can('view currency_rate')) {
return false;
}
return true;
}
/**
* @param RateObject $object
* @return bool
* @throws \App\Classes\Exceptions\RequestValidationException
*/
protected function validators($object): bool
{
return $this->rateValidation->validate($object, 'PUT');
}
/**
* @param RateObject $object
* @return bool
*/
protected function criteria($object): bool
{
return true;
}
}
@@ -0,0 +1,40 @@
<?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 [
'name' => $object->getName(),
'short_code' => $object->getShortCode()
];
}
/**
* @return array
*/
protected function rules(): array
{
return [
'name' => 'required',
'short_code' => 'required'
];
}
/**
* @return array
*/
protected function messages(): array
{
return [];
}
}
@@ -0,0 +1,45 @@
<?php
namespace App\Classes\Modules\Currencies\Standards\Validators;
use App\Classes\General\Abstracts\AbstractValidation;
use App\Classes\Modules\Currencies\DataTransferObjects\RateObject;
class RateValidation extends AbstractValidation
{
/**
* @param RateObject $object
* @return array
*/
protected function data($object): array {
$data = [
'currency_id'=> $object->getCurrencyId(),
'selling' => $object->getSelling(),
'payment_method_type' => $object->getPaymentMethodType(),
];
return $data;
}
/**
* @param null|string $type
* @return array
*/
protected function rules(?string $type = 'POST'): array {
return [
'currency_id' => $type == 'POST' ? 'required' : '',
'selling' => 'required',
'payment_method_type' => 'required',
];
}
/**
* @return array
*/
protected function messages(): array {
return [];
}
}
@@ -0,0 +1,158 @@
<?php
namespace App\Classes\Modules\Receipts\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Receipts\Standards\Rules\CanCreateReceipt;
use App\Classes\Modules\Receipts\Standards\Rules\CanCreateReceiptDetail;
use App\Classes\Modules\Receipts\DataTransferObjects\ReceiptObject;
use App\Classes\Modules\Receipts\DataTransferObjects\ReceiptDetailObject;
use App\Classes\Modules\Receipts\Services\CreatesReceipt;
use App\Classes\Modules\Receipts\Services\CreatesReceiptDetail;
use App\Classes\Modules\Receipts\Services\GeneratesReceiptBillNo;
use App\Http\Resources\ReceiptResource;
use App\Http\Resources\ReceiptDetailResource;
use App\Classes\Modules\Currencies\Services\FetchesCurrency;
use App\Classes\Modules\Currencies\Services\RateCalculatesCurrency;
use App\Classes\Modules\Companies\Services\FetchesCompany;
use App\Classes\Modules\Transactions\Services\FetchesTransaction;
use ErrorException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class CreateReceiptLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Created Receipt',
'message' => 'You have successfully created a receipt'
];
}
/** @var GeneratesReceiptBillNo */
private $generatesReceiptBillNo;
/** @var CanCreateReceipt */
private $canCreateReceipt;
private $fetchesCurrency;
private $rateCalculatesCurrency;
private $fetchesCompany;
private $createsReceipt;
private $canCreateReceiptDetail;
private $createsReceiptDetail;
private $fetchesTransaction;
/**
* CreateWalletLogic constructor.
* @param GeneratesReceiptBillNo $generatesReceiptBillNo
* @param CanCreateReceipt $canCreateReceipt
* @param FetchesCurrency $fetchesCurrency
* @param RateCalculatesCurrency $rateCalculatesCurrency
* @param FetchesCompany $fetchesCompany
* @param CreatesReceipt $createsReceipt
* @param CanCreateReceiptDetail $canCreateReceiptDetail
* @param CreatesReceiptDetail $createsReceiptDetail
* @param FetchesTransaction $fetchesTransaction
*/
public function __construct(
GeneratesReceiptBillNo $generatesReceiptBillNo, CanCreateReceipt $canCreateReceipt,
FetchesCurrency $fetchesCurrency,RateCalculatesCurrency $rateCalculatesCurrency, FetchesCompany $fetchesCompany,
CreatesReceipt $createsReceipt,
CanCreateReceiptDetail $canCreateReceiptDetail, CreatesReceiptDetail $createsReceiptDetail,
FetchesTransaction $fetchesTransaction
){
$this->generatesReceiptBillNo = $generatesReceiptBillNo;
$this->canCreateReceipt = $canCreateReceipt;
$this->fetchesCurrency = $fetchesCurrency;
$this->rateCalculatesCurrency = $rateCalculatesCurrency;
$this->fetchesCompany = $fetchesCompany;
$this->createsReceipt =$createsReceipt;
$this->canCreateReceiptDetail =$canCreateReceiptDetail;
$this->createsReceiptDetail = $createsReceiptDetail;
$this->fetchesTransaction = $fetchesTransaction;
}
/**
* @param Request $request
* @return JsonResponse
* @throws ErrorException
*/
public function logic(Request $request) : JsonResponse
{
try {
DB::beginTransaction();
$json_array = json_decode($request->getContent(), true);
$company = $this->fetchesCompany->execute(['id' => $json_array['company_id']]);
$conversion_currency = $this->fetchesCurrency->execute(['id' => $json_array['currency_id']]);
$convertable_currency = $this->fetchesCurrency->execute(['id' => 1]);//MYR
$convert_amount = $this->rateCalculatesCurrency->execute($conversion_currency, $convertable_currency, $json_array['amount']);
$convert_rate = $this->rateCalculatesCurrency->execute_rate($conversion_currency, $convertable_currency);
$object = new ReceiptObject(
$this->generatesReceiptBillNo->execute(),$json_array['trans_type1'],$json_array['trans_type2'],
number_format( (float) $convert_amount, 5, '.', ''), 1 , number_format( (float) $json_array['amount'], 5, '.', ''),
$json_array['currency_id'],number_format( (float) $convert_rate, 5, '.', ''),
$json_array['dt_transaction'],1,$request->route('id'),
$company->id
);
$this->canCreateReceipt->passes($object);
$receipt = $this->createsReceipt->execute($object);
$receipt_array = new ReceiptResource($receipt);
$receipt_detail_array = array();
foreach ($json_array['receipt_detail'] as $key => $value) {
$transaction_inv = $this->fetchesTransaction->execute(['id' => $value['transaction_id']]);
$object_detail = new ReceiptDetailObject(
$json_array['trans_type1'],$json_array['trans_type2'],
$transaction_inv->id,$receipt->id,
number_format( (float) $convert_amount, 5, '.', ''), number_format( (float) $json_array['amount'], 5, '.', '')
);
$this->canCreateReceiptDetail->passes($object_detail);
$transaction_detail = $this->createsReceiptDetail->execute($object_detail);
//array_push($stack, "apple", "raspberry");
$receipt_detail_resource= new ReceiptDetailResource($transaction_detail);
$receipt_detail_array[]= $receipt_detail_resource->toArray($request);
}
//$transaction_array['transaction_detail']= $transaction_detail_array;
//print_r($transaction_detail_array);
//dd($transaction_detail_array);
DB::commit();
return $this->resourceResponse($receipt_array);
//return $this->resourceResponse($json_array);
} catch (\Exception $exception) {
throw new ErrorException($exception->getMessage(), $exception->getCode());
}
}
}
@@ -0,0 +1,81 @@
<?php
namespace App\Classes\Modules\Receipts\DataTransferObjects;
use App\Classes\General\Interfaces\DataTransferObject;
class ReceiptDetailObject implements DataTransferObject
{
private $trans_type1;
private $trans_type2;
private $transaction_id;
private $receipt_id;
private $price;
private $amount;
public function __construct(
string $trans_type1,string $trans_type2,
int $transaction_id, int $receipt_id,
float $price,float $amount
){
$this->trans_type1= $trans_type1;
$this->trans_type2 = $trans_type2;
$this->transaction_id = $transaction_id;
$this->receipt_id = $receipt_id;
$this->price = $price;
$this->amount = $amount;
}
/**
* @return string
*/
public function getTransType1(): string
{
return $this->trans_type1;
}
/**
* @return string
*/
public function getTransType2(): string
{
return $this->trans_type2;
}
/**
* @return int
*/
public function getTransactionId(): int
{
return $this->transaction_id;
}
/**
* @return int
*/
public function getReceiptId(): int
{
return $this->receipt_id;
}
public function getPrice(): float
{
return $this->price;
}
public function getAmount(): float
{
return $this->amount;
}
}
@@ -0,0 +1,150 @@
<?php
namespace App\Classes\Modules\Receipts\DataTransferObjects;
use App\Classes\General\Interfaces\DataTransferObject;
class ReceiptObject implements DataTransferObject
{
/*
*
* return [
'id' => $this->id,
'trans_type1' => $this->trans_type1,
'trans_type2' => $this->trans_type2,
'bill_no' => (int) $this->bill_no,
'amount' => (double) $this->amount,
'currency_id' => (int) $this->currency_id,
'original_amount' => (double) $this->original_amount,
'original_currency_id' => (int) $this->original_currency_id,
'currency_rate' => (double) $this->currency_rate,
'dt_transaction' => $this->dt_transaction,
'status' => (int) $this->status,
'booking_id' => (int) $this->booking_id,
'company_id' => (int) $this->company_id
];
*/
private $trans_type1;
private $trans_type2;
private $bill_no;
private $amount;
private $currency_id;
private $original_amount;
private $original_currency_id;
private $currency_rate;
private $dt_transaction;
private $status;
private $booking_id;
private $company_id;
public function __construct(
int $bill_no,string $trans_type1,string $trans_type2,
float $amount, int $currency_id, int $original_amount,
int $original_currency_id, float $currency_rate,
string $dt_transaction,int $status,int $booking_id,
int $company_id
){
$this->bill_no = $bill_no;
$this->trans_type1= $trans_type1;
$this->trans_type2 = $trans_type2;
$this->amount= $amount;
$this->currency_id = $currency_id;
$this->original_amount = $original_amount;
$this->original_currency_id = $original_currency_id;
$this->currency_rate = $currency_rate;
$this->dt_transaction = $dt_transaction;
$this->status = $status;
$this->booking_id = $booking_id;
$this->company_id = $company_id;
}
/**
* @return int
*/
public function getBillNo(): int
{
return $this->bill_no;
}
/**
* @return string
*/
public function getTransType1(): string
{
return $this->trans_type1;
}
/**
* @return string
*/
public function getTransType2(): string
{
return $this->trans_type2;
}
public function getAmount(): float
{
return $this->amount;
}
/**
* @return int
*/
public function getCurrency(): int
{
return $this->currency_id;
}
public function getOriginalAmount(): float
{
return $this->original_amount;
}
public function getOriginalCurrency(): int
{
return $this->original_currency_id;
}
public function getCurrencyRate(): float
{
return $this->currency_rate;
}
/**
* @return string
*/
public function getDtTransaction(): string
{
return $this->dt_transaction;
}
public function getStatus(): int
{
return $this->original_currency_id;
}
public function getBookingId(): int
{
return $this->booking_id;
}
public function getCompanyId(): int
{
return $this->company_id;
}
}
@@ -0,0 +1,22 @@
<?php
namespace App\Classes\Modules\Receipts\Services;
use App\Models\Receipt;
class ChecksIfReceiptBillNoExists
{
private $repository;
public function __construct(Receipt $repository)
{
$this->repository = $repository;
}
public function execute(int $bill_no): bool {
return $this->repository->where('bill_no', $bill_no)->exists();
}
}
@@ -0,0 +1,35 @@
<?php
namespace App\Classes\Modules\Receipts\Services;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Classes\Modules\Receipts\DataTransferObjects\ReceiptObject;
use App\Models\Receipt;
class CreatesReceipt extends AbstractUpdateRecord
{
/**
* @param ReceiptObject $object
* @return \Illuminate\Database\Eloquent\Model
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(ReceiptObject $object) {
$model = new Receipt();
$model->bill_no = $object->getBillNo();
$model->trans_type1 = $object->getTransType1();
$model->trans_type2 = $object->getTransType2();
$model->amount = $object->getAmount();
$model->currency_id = $object->getCurrency();
$model->original_amount = $object->getOriginalAmount();
$model->original_currency_id = $object->getOriginalCurrency();
$model->currency_rate = $object->getCurrencyRate();
$model->dt_transaction = $object->getDtTransaction();
$model->status = $object->getStatus();
$model->booking_id = $object->getBookingId();
$model->company_id = $object->getCompanyId();
return $this->handler($model);
}
}
@@ -0,0 +1,29 @@
<?php
namespace App\Classes\Modules\Receipts\Services;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Classes\Modules\Receipts\DataTransferObjects\ReceiptDetailObject;
use App\Models\ReceiptDetail;
class CreatesReceiptDetail extends AbstractUpdateRecord
{
/**
* @param ReceiptDetailObject $object
* @return \Illuminate\Database\Eloquent\Model
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(ReceiptDetailObject $object) {
$model = new ReceiptDetail();
$model->trans_type1 = $object->getTransType1();
$model->trans_type2 = $object->getTransType2();
$model->transaction_id = $object->getTransactionId();
$model->receipt_id = $object->getReceiptId();
$model->price = $object->getPrice();
$model->amount = $object->getAmount();
return $this->handler($model);
}
}
@@ -0,0 +1,27 @@
<?php
namespace App\Classes\Modules\Receipts\Services;
class GeneratesReceiptBillNo
{
private $receiptBillNoExists;
public function __construct(ChecksIfReceiptBillNoExists $receiptBillNoExists)
{
$this->receiptBillNoExists = $receiptBillNoExists;
}
public function execute(): int {
$code = mt_rand(100000001, 999999999);
return !$this->receiptBillNoExists->execute($code) ? $code : self::execute();
}
}
@@ -0,0 +1,51 @@
<?php
namespace App\Classes\Modules\Receipts\Standards\Rules;
use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Modules\Receipts\DataTransferObjects\ReceiptObject;
use App\Classes\Modules\Receipts\Standards\Validators\ReceiptValidation;
class CanCreateReceipt extends AbstractRule
{
/** @var ReceiptValidation */
private $receiptValidation;
public function __construct(ReceiptValidation $receiptValidation)
{
$this->receiptValidation = $receiptValidation;
}
/**
* @return bool
*/
protected function authorized(): bool
{
// TODO Set Authorization rules
return true;
}
/**
* @param ReceiptObject $object
* @return bool
* @throws \App\Classes\Exceptions\RequestValidationException
*/
protected function validators($object): bool
{
return $this->receiptValidation->validate($object);
}
/**
* @param ReceiptObject $object
* @return bool
*/
protected function criteria($object): bool
{
return true;
}
}
@@ -0,0 +1,51 @@
<?php
namespace App\Classes\Modules\Receipts\Standards\Rules;
use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Modules\Receipts\DataTransferObjects\ReceiptDetailObject;
use App\Classes\Modules\Receipts\Standards\Validators\ReceiptDetailValidation;
class CanCreateReceiptDetail extends AbstractRule
{
/** @var ReceiptDetailValidation */
private $receiptDetailValidation;
public function __construct(ReceiptDetailValidation $receiptDetailValidation)
{
$this->receiptDetailValidation = $receiptDetailValidation;
}
/**
* @return bool
*/
protected function authorized(): bool
{
// TODO Set Authorization rules
return true;
}
/**
* @param ReceiptDetailObject $object
* @return bool
* @throws \App\Classes\Exceptions\RequestValidationException
*/
protected function validators($object): bool
{
return $this->receiptDetailValidation->validate($object);
}
/**
* @param ReceiptDetailObject $object
* @return bool
*/
protected function criteria($object): bool
{
return true;
}
}
@@ -0,0 +1,58 @@
<?php
namespace App\Classes\Modules\Receipts\Standards\Validators;
use App\Classes\General\Abstracts\AbstractValidation;
class ReceiptDetailValidation extends AbstractValidation
{
/*
*
* $this->bill_no = $bill_no;
$this->trans_type1= $trans_type1;
$this->trans_type2 = $trans_type2;
$this->amount= $amount;
$this->currency_id = $currency_id;
$this->original_amount = $original_amount;
$this->original_currency_id = $original_currency_id;
$this->currency_rate = $currency_rate;
$this->dt_transaction = $dt_transaction;
$this->status = $status;
$this->booking_id = $booking_id;
$this->company_id = $company_id;
*/
protected function data($object): array
{
return [
'trans_type1' => $object->getTransType1(),
'trans_type2' => $object->getTransType2(),
'transaction_id' => $object->getTransactionId(),
'receipt_id' => $object->getReceiptId(),
'price'=>$object->getPrice(),
'amount' => $object->getAmount()
];
}
/**
* @return array
*/
protected function rules(): array
{
return [
'trans_type1' => 'required',
'trans_type2' => 'required',
'transaction_id' => 'required',
'receipt_id' => 'required',
'price'=>'required',
'amount' => 'required'
];
}
/**
* @return array
*/
protected function messages(): array
{
return [];
}
}
@@ -0,0 +1,54 @@
<?php
namespace App\Classes\Modules\Receipts\Standards\Validators;
use App\Classes\General\Abstracts\AbstractValidation;
class ReceiptValidation extends AbstractValidation
{
protected function data($object): array
{
return [
'bill_no' => $object->getBillNo(),
'trans_type1' => $object->getBillNo(),
'trans_type2' => $object->getTransType2(),
'amount' => $object->getAmount(),
'currency_id' => $object->getCurrency(),
'original_amount' => $object->getOriginalAmount(),
'original_currency_id'=>$object->getOriginalCurrency(),
'dt_transaction'=>$object->getDtTransaction(),
'status'=>$object->getStatus(),
'booking_id'=>$object->getBookingId(),
'company_id'=>$object->getCompanyId()
];
}
/**
* @return array
*/
protected function rules(): array
{
return [
'bill_no' => 'required',
'trans_type1' => 'required',
'trans_type2' => 'required',
'amount' => 'required',
'currency_id' => 'required',
'original_amount' => 'required',
'original_currency_id'=>'required',
'dt_transaction'=>'required',
'status'=>'required',
'booking_id'=>'required',
'company_id'=>'required'
];
}
/**
* @return array
*/
protected function messages(): array
{
return [];
}
}
@@ -0,0 +1,208 @@
<?php
namespace App\Classes\Modules\Transactions\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Transactions\Standards\Rules\CanCreateTransaction;
use App\Classes\Modules\Transactions\Standards\Rules\CanCreateTransactionDetail;
use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject;
use App\Classes\Modules\Transactions\DataTransferObjects\TransactionDetailObject;
use App\Classes\Modules\Transactions\Services\CreatesTransaction;
use App\Classes\Modules\Transactions\Services\CreatesTransactionDetail;
use App\Classes\Modules\Transactions\Services\GeneratesTransactionBillNumber;
use App\Http\Resources\TransactionResource;
use App\Http\Resources\TransactionDetailResource;
use App\Classes\Modules\Receipts\Standards\Rules\CanCreateReceipt;
use App\Classes\Modules\Receipts\Standards\Rules\CanCreateReceiptDetail;
use App\Classes\Modules\Receipts\DataTransferObjects\ReceiptObject;
use App\Classes\Modules\Receipts\DataTransferObjects\ReceiptDetailObject;
use App\Classes\Modules\Receipts\Services\CreatesReceipt;
use App\Classes\Modules\Receipts\Services\CreatesReceiptDetail;
use App\Classes\Modules\Receipts\Services\GeneratesReceiptBillNo;
use App\Classes\Modules\Currencies\Services\FetchesCurrency;
use App\Classes\Modules\Currencies\Services\RateCalculatesCurrency;
use App\Classes\Modules\Transactions\Services\FetchesTransaction;
use App\Classes\Modules\Transactions\Services\FetchesTransactionDetail;
use App\Classes\Modules\Companies\Services\FetchesCompany;
use ErrorException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class CreateMakePaymentPOTransactionLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Created Transaction',
'message' => 'You have successfully created a transaction'
];
}
/** @var GeneratesTransactionBillNumber */
private $generatesTransactionBillNo;
/** @var CanCreateTransaction */
private $canCreateTransaction;
private $fetchesCurrency;
private $rateCalculatesCurrency;
private $fetchesCompany;
private $createsTransaction;
private $canCreateTransactionDetail;
private $createsTransactionDetail;
private $fetchesTransaction;
private $fetchesTransactionDetail;
private $generatesReceiptBillNo;
/** @var CanCreateReceipt */
private $canCreateReceipt;
private $createsReceipt;
private $canCreateReceiptDetail;
private $createsReceiptDetail;
/**
* CreateWalletLogic constructor.
* @param GeneratesTransactionBillNumber $generatesTransactionBillNo
* @param CanCreateTransaction $canCreateTransaction
* @param FetchesCurrency $fetchesCurrency
* @param RateCalculatesCurrency $rateCalculatesCurrency
* @param FetchesCompany $fetchesCompany
* @param CreatesTransaction $createsTransaction
* @param CanCreateTransactionDetail $canCreateTransactionDetail
* @param CreatesTransactionDetail $createsTransactionDetail
* @param FetchesTransaction $fetchesTransaction
* @param FetchesTransactionDetail $fetchesTransactionDetail
* @param GeneratesReceiptBillNo $generatesReceiptBillNo
* @param CanCreateReceipt $canCreateReceipt
* @param CreatesReceipt $createsReceipt
* @param CanCreateReceiptDetail $canCreateReceiptDetail
* @param CreatesReceiptDetail $createsReceiptDetail
*/
public function __construct(
GeneratesTransactionBillNumber $generatesTransactionBillNo, CanCreateTransaction $canCreateTransaction,
FetchesCurrency $fetchesCurrency, RateCalculatesCurrency $rateCalculatesCurrency, FetchesCompany $fetchesCompany,
CreatesTransaction $createsTransaction,
CanCreateTransactionDetail $canCreateTransactionDetail, CreatesTransactionDetail $createsTransactionDetail,
FetchesTransaction $fetchesTransaction , FetchesTransactionDetail $fetchesTransactionDetail,
GeneratesReceiptBillNo $generatesReceiptBillNo, CanCreateReceipt $canCreateReceipt,
CreatesReceipt $createsReceipt,
CanCreateReceiptDetail $canCreateReceiptDetail, CreatesReceiptDetail $createsReceiptDetail
){
$this->generatesTransactionBillNo = $generatesTransactionBillNo;
$this->canCreateTransaction = $canCreateTransaction;
$this->fetchesCurrency = $fetchesCurrency;
$this->rateCalculatesCurrency = $rateCalculatesCurrency;
$this->fetchesCompany = $fetchesCompany;
$this->createsTransaction =$createsTransaction;
$this->canCreateTransactionDetail =$canCreateTransactionDetail;
$this->createsTransactionDetail = $createsTransactionDetail;
$this->fetchesTransaction = $fetchesTransaction;
$this->fetchesTransactionDetail = $fetchesTransactionDetail;
$this->generatesReceiptBillNo = $generatesReceiptBillNo;
$this->canCreateReceipt = $canCreateReceipt;
$this->createsReceipt =$createsReceipt;
$this->canCreateReceiptDetail =$canCreateReceiptDetail;
$this->createsReceiptDetail = $createsReceiptDetail;
}
/**
* @param Request $request
* @return JsonResponse
* @throws ErrorException
*/
public function logic(Request $request) : JsonResponse
{
try {
DB::beginTransaction();
$json_array = json_decode($request->getContent(), true);
$po_transaction = $this->fetchesTransaction->execute(['id' => $json_array['ref_po']]);
$object = new TransactionObject(
$this->generatesTransactionBillNo->execute(),$po_transaction->trans_type1,'INV',
$po_transaction->amount, $po_transaction->currency_id , $po_transaction->original_amount,
$po_transaction->original_currency_id, $po_transaction->currency_rate ,
$po_transaction->dt_transaction,1,$po_transaction->booking_id,
$po_transaction->company_id
);
$this->canCreateTransaction->passes($object);
$transaction = $this->createsTransaction->execute($object);
$transaction_array = new TransactionResource($transaction);
$transaction_detail = $this->fetchesTransactionDetail->getRepository()->where('transaction_id', $json_array['ref_po'])->get();
foreach ($transaction_detail as $key => $value) {
$object_detail = new TransactionDetailObject(
$transaction->trans_type1,$transaction->trans_type2,
$transaction->id,$value->product_code,$value->product_name,
$value->qty,$value->price, $value->amount
);
$this->canCreateTransactionDetail->passes($object_detail);
$transaction_detail = $this->createsTransactionDetail->execute($object_detail);
//array_push($stack, "apple", "raspberry");
$transaction_detail_resource= new TransactionDetailResource($transaction_detail);
$transaction_detail_array[]= $transaction_detail_resource->toArray($request);
}
$object = new ReceiptObject(
$this->generatesReceiptBillNo->execute(),$transaction->trans_type1,"RECPT",
$po_transaction->amount, $po_transaction->currency_id , $po_transaction->original_amount,
$po_transaction->original_currency_id, $po_transaction->currency_rate ,
$po_transaction->dt_transaction,1,$po_transaction->booking_id,
$po_transaction->company_id
);
$this->canCreateReceipt->passes($object);
$receipt = $this->createsReceipt->execute($object);
$object_detail = new ReceiptDetailObject(
$transaction->trans_type1,"RECPT",
$transaction->id,$receipt->id,
$transaction->amount, $transaction->amount
);
$this->canCreateReceiptDetail->passes($object_detail);
$this->createsReceiptDetail->execute($object_detail);
DB::commit();
return $this->resourceResponse($transaction_array);
} catch (\Exception $exception) {
throw new ErrorException($exception->getMessage(), $exception->getCode());
}
}
}
@@ -0,0 +1,93 @@
<?php
namespace App\Classes\Modules\Transactions\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Companies\Services\FetchesCompany;
use App\Classes\Modules\Companies\Services\UpdatesCompanyStatus;
use App\Classes\Modules\Documents\DataTransferObjects\DocumentObject;
use App\Classes\Modules\Documents\Services\CreatesDocument;
use App\Classes\Modules\Documents\Services\CreatesFiles;
use App\Classes\Modules\Transactions\Services\FetchesTransaction;
use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\CompanyType;
use App\Classes\ValueObjects\Constants\DocumentType;
use App\Models\Company;
use App\Models\Document;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use App\Classes\Modules\Transactions\Processors\CreateInvoiceTransactionProcessor;
class CreatePaymentProofDocumentLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Payment Proof Document',
'message' => 'You have successfully submitted your payment proof document'
];
}
/** @var FetchesTransaction */
private $fetchesTransaction;
/** @var CreatesDocument */
private $createsDocument;
/** @var CreatesFiles */
private $createsFile;
/** @var UpdatesTransactionStatus */
private $updatesTransactionStatus;
/** @var CreateInvoiceTransactionProcessor */
private $createInvoiceTransactionProcessor;
/**
* CreatePaymentVerificationDocumentLogic constructor.
* @param FetchesTransaction $fetchesTransaction
* @param CreatesDocument $createsDocument
* @param CreatesFiles $createsFile
* @param UpdatesTransactionStatus $updatesTransactionStatus
*/
public function __construct(FetchesTransaction $fetchesTransaction, CreatesDocument $createsDocument, CreatesFiles $createsFile, UpdatesTransactionStatus $updatesTransactionStatus, CreateInvoiceTransactionProcessor $createInvoiceTransactionProcessor)
{
$this->fetchesTransaction = $fetchesTransaction;
$this->createsDocument = $createsDocument;
$this->createsFile = $createsFile;
$this->updatesTransactionStatus = $updatesTransactionStatus;
$this->createInvoiceTransactionProcessor = $createInvoiceTransactionProcessor;
}
/**
* @param Request $request
* @return JsonResponse
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function logic(Request $request) : JsonResponse
{
$transaction = $this->fetchesTransaction->execute(['id' => $request->route('id')]);
$object = new DocumentObject(DocumentType::CURRENCY_VENDOR_PAYMENT_PROOF, $request->input('files'), '', ApprovalStatus::APPROVED, 'china_bank_slip');
/** @var Document $document */
$document = $this->createsDocument->execute($transaction, $object);
$this->createsFile->execute($document, $object);
$this->updatesTransactionStatus->execute($transaction, ApprovalStatus::COMPLETED);
$this->createInvoiceTransactionProcessor->execute($transaction->booking);
return $this->response([]);
}
}
@@ -0,0 +1,121 @@
<?php
namespace App\Classes\Modules\Transactions\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Bookings\Services\FetchesBooking;
use App\Classes\Modules\Companies\Services\FetchesCompany;
use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject;
use App\Classes\Modules\Transactions\Services\CreatesTransaction;
use App\Classes\Modules\Transactions\Services\CreatesTransactionDetail;
use App\Classes\Modules\Transactions\Services\DeletesTransactionDetails;
use App\Classes\Modules\Transactions\Services\FetchesTransaction;
use App\Classes\Modules\Transactions\Services\GeneratesTransactionBillNumber;
use App\Classes\Modules\Transactions\Services\UpdatesTransaction;
use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\PaymentMethodType;
use App\Classes\ValueObjects\Constants\TransactionType;
use App\Http\Resources\TransactionResource;
use App\Models\Booking;
use App\Models\Transaction;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class CreatePurchaseOrderTransactionLogic extends AbstractControllerLogic
{
/**
* CreatePurchaseOrderTransactionLogic constructor.
* @param FetchesBooking $fetchesBooking
* @param UpdatesTransactionStatus $updatesTransactionStatus
* @param CreatesTransaction $createsTransaction
* @param CreatesTransactionDetail $createsTransactionDetail
* @param UpdatesTransaction $updatesTransaction
* @param DeletesTransactionDetails $deletesTransactionDetails
* @param GeneratesTransactionBillNumber $generatesTransactionBillNumber
*/
public function __construct(FetchesBooking $fetchesBooking, UpdatesTransactionStatus $updatesTransactionStatus, CreatesTransaction $createsTransaction, CreatesTransactionDetail $createsTransactionDetail, UpdatesTransaction $updatesTransaction, DeletesTransactionDetails $deletesTransactionDetails, GeneratesTransactionBillNumber $generatesTransactionBillNumber)
{
$this->fetchesBooking = $fetchesBooking;
$this->updatesTransactionStatus = $updatesTransactionStatus;
$this->createsTransaction = $createsTransaction;
$this->createsTransactionDetail = $createsTransactionDetail;
$this->updatesTransaction = $updatesTransaction;
$this->deletesTransactionDetails = $deletesTransactionDetails;
$this->generatesTransactionBillNumber = $generatesTransactionBillNumber;
}
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Update Purchase Order',
'message' => 'You have successfully updated you booking\'s purchase order'
];
}
/** @var FetchesBooking */
private $fetchesBooking;
/** @var UpdatesTransactionStatus */
private $updatesTransactionStatus;
/** @var CreatesTransaction */
private $createsTransaction;
/** @var CreatesTransactionDetail */
private $createsTransactionDetail;
/** @var UpdatesTransaction */
private $updatesTransaction;
/** @var DeletesTransactionDetails */
private $deletesTransactionDetails;
/** @var GeneratesTransactionBillNumber */
private $generatesTransactionBillNumber;
/**
* @param Request $request
* @return JsonResponse
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function logic(Request $request) : JsonResponse
{
/** @var Booking $booking */
$booking = $this->fetchesBooking->execute(['id' => $request->route('id')]);
/** @var Transaction $transaction */
$transaction = $booking->transactions()->where('type', TransactionType::PURCHASE_ORDER)->first();
$billNumber = $this->generatesTransactionBillNumber->execute('PO-');
$total = collect($request->input('products'))->sum(function($product){
return $product['quantity'] * floatval(str_replace(',', '', $product['unit_price']));
});
$object = new TransactionObject($billNumber, TransactionType::PURCHASE_ORDER, $booking->company->id, 1,
1, PaymentMethodType::CASH,
$total, $total, $booking->fix_currency_id, $booking->fix_currency_id,
1, 0, 0, null, ApprovalStatus::PENDING_SUBMISSION, $request->input('products'));
!$transaction ? $transaction = $this->createsTransaction->execute($booking, $object) : $transaction = $this->updatesTransaction->execute($transaction, $object);
$this->updatesTransactionStatus->execute($transaction, (float)number_format((float)$total , 2, '.', '') === (float)number_format((float)$booking->fix_amount, 2, '.', '') ? ApprovalStatus::PENDING_VERIFICATION : ApprovalStatus::PENDING_SUBMISSION);
$this->deletesTransactionDetails->execute($transaction);
foreach ($object->getDetails() as $product){
$this->createsTransactionDetail->execute($transaction, $product);
}
return $this->resourceResponse(new TransactionResource($transaction));
}
}
@@ -0,0 +1,132 @@
<?php
namespace App\Classes\Modules\Transactions\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Companies\Services\FetchesCompany;
use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject;
use App\Classes\Modules\Documents\DataTransferObjects\DocumentObject;
use App\Classes\Modules\Transactions\Services\CreatesTransaction;
use App\Classes\Modules\Transactions\Services\FetchesTransaction;
use App\Classes\Modules\Transactions\Services\GeneratesTransactionBillNumber;
use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus;
use App\Classes\Modules\Documents\Services\CreatesDocument;
use App\Classes\Modules\Documents\Services\CreatesFiles;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\PaymentMethodType;
use App\Classes\ValueObjects\Constants\TransactionType;
use App\Classes\ValueObjects\Constants\DocumentType;
use App\Models\Document;
use App\Models\Transaction;
use Barryvdh\DomPDF\PDF;
use Carbon\Carbon;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Meneses\LaravelLaravelMpdf\Facades\LaravelLaravelMpdf;
use Meneses\LaravelMpdf\Facades\LaravelMpdf;
class CreateSupplierTransactionLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Create Supplier Transactions',
'message' => 'You have successfully created currency supplier transactions'
];
}
/** @var FetchesCompany */
private $fetchesCompany;
/** @var FetchesTransaction */
private $fetchesTransaction;
/** @var UpdatesTransactionStatus */
private $updatesTransactionStatus;
/** @var CreatesTransaction */
private $createsTransaction;
/** @var CreatesDocument */
private $createsDocument;
/** @var CreatesFiles */
private $createsFile;
/** @var GeneratesTransactionBillNumber */
private $generatesTransactionBillNumber;
/** @var PDF */
private $pdf;
/**
* CreateSupplierTransactionLogic constructor.
* @param FetchesCompany $fetchesCompany
* @param FetchesTransaction $fetchesTransaction
* @param UpdatesTransactionStatus $updatesTransactionStatus
* @param CreatesTransaction $createsTransaction
* @param GeneratesTransactionBillNumber $generatesTransactionBillNumber
* @param PDF $pdf
*/
public function __construct(FetchesCompany $fetchesCompany, FetchesTransaction $fetchesTransaction, UpdatesTransactionStatus $updatesTransactionStatus, CreatesTransaction $createsTransaction, CreatesDocument $createsDocument, CreatesFiles $createsFile, GeneratesTransactionBillNumber $generatesTransactionBillNumber, PDF $pdf)
{
$this->fetchesCompany = $fetchesCompany;
$this->fetchesTransaction = $fetchesTransaction;
$this->updatesTransactionStatus = $updatesTransactionStatus;
$this->createsTransaction = $createsTransaction;
$this->createsDocument = $createsDocument;
$this->createsFile = $createsFile;
$this->generatesTransactionBillNumber = $generatesTransactionBillNumber;
$this->pdf = $pdf;
}
public function logic(Request $request) : JsonResponse
{
$supplier = $this->fetchesCompany->execute(['id' => $request->route('id')]);
$rate = $request->input('rate');
$transactions = collect();
foreach($request->input('payments') as $payment){
/** @var Transaction $payment */
$payment = $this->fetchesTransaction->execute(['id' => $payment['id']]);
$this->updatesTransactionStatus->execute($payment, ApprovalStatus::COMPLETED);
$billNumber = $this->generatesTransactionBillNumber->execute('SPLR-');
$object = new TransactionObject($billNumber, TransactionType::BILL, $supplier->id, 1,
$supplier->banks()->where('default', true)->first()->id, PaymentMethodType::CASH,
$payment->original_amount * (1 / $rate), $payment->original_amount, 1, $payment->original_currency_id,
$rate, 0, 0, null, ApprovalStatus::APPROVED);
$transactions[] = $this->createsTransaction->execute($payment->booking, $object);
}
$pdf = LaravelMpdf::loadView('pages.pdfs.currency_vendor_order', ['transactions' => $transactions, 'supplier' => $supplier]);
$path = Str::studly($supplier->name).'_'.Carbon::now()->format('Y_m_d_h_s_i').'.pdf';
$object = new DocumentObject(
DocumentType::CURRENCY_VENDOR_ORDER,
[chunk_split('data:application/pdf;base64,'.base64_encode($pdf->output()))],
'',
ApprovalStatus::COMPLETED,
'currency_vendor_order'
);
/** @var Document $document */
$document = $this->createsDocument->execute($supplier, $object);
$this->createsFile->execute($document, $object);
return $this->response([]);
}
}
@@ -0,0 +1,153 @@
<?php
namespace App\Classes\Modules\Transactions\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Transactions\Standards\Rules\CanCreateTransaction;
use App\Classes\Modules\Transactions\Standards\Rules\CanCreateTransactionDetail;
use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject;
use App\Classes\Modules\Transactions\DataTransferObjects\TransactionDetailObject;
use App\Classes\Modules\Transactions\Services\CreatesTransaction;
use App\Classes\Modules\Transactions\Services\CreatesTransactionDetail;
use App\Classes\Modules\Transactions\Services\GeneratesTransactionBillNumber;
use App\Http\Resources\TransactionResource;
use App\Http\Resources\TransactionDetailResource;
use App\Classes\Modules\Currencies\Services\FetchesCurrency;
use App\Classes\Modules\Currencies\Services\RateCalculatesCurrency;
use App\Classes\Modules\Companies\Services\FetchesCompany;
use ErrorException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class CreateTransactionLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Created Transaction',
'message' => 'You have successfully created a transaction'
];
}
/** @var GeneratesTransactionBillNumber */
private $generatesTransactionBillNo;
/** @var CanCreateTransaction */
private $canCreateTransaction;
private $fetchesCurrency;
private $rateCalculatesCurrency;
private $fetchesCompany;
private $createsTransaction;
private $canCreateTransactionDetail;
private $createsTransactionDetail;
/**
* CreateWalletLogic constructor.
* @param GeneratesTransactionBillNumber $generatesTransactionBillNo
* @param CanCreateTransaction $canCreateTransaction
* @param FetchesCurrency $fetchesCurrency
* @param RateCalculatesCurrency $rateCalculatesCurrency
* @param FetchesCompany $fetchesCompany
* @param CreatesTransaction $createsTransaction
* @param CanCreateTransactionDetail $canCreateTransactionDetail
* @param CreatesTransactionDetail $createsTransactionDetail
*/
public function __construct(
GeneratesTransactionBillNumber $generatesTransactionBillNo, CanCreateTransaction $canCreateTransaction,
FetchesCurrency $fetchesCurrency, RateCalculatesCurrency $rateCalculatesCurrency, FetchesCompany $fetchesCompany,
CreatesTransaction $createsTransaction,
CanCreateTransactionDetail $canCreateTransactionDetail, CreatesTransactionDetail $createsTransactionDetail
){
$this->generatesTransactionBillNo = $generatesTransactionBillNo;
$this->canCreateTransaction = $canCreateTransaction;
$this->fetchesCurrency = $fetchesCurrency;
$this->rateCalculatesCurrency = $rateCalculatesCurrency;
$this->fetchesCompany = $fetchesCompany;
$this->createsTransaction =$createsTransaction;
$this->canCreateTransactionDetail =$canCreateTransactionDetail;
$this->createsTransactionDetail = $createsTransactionDetail;
}
/**
* @param Request $request
* @return JsonResponse
* @throws ErrorException
*/
public function logic(Request $request) : JsonResponse
{
try {
DB::beginTransaction();
$json_array = json_decode($request->getContent(), true);
$company = $this->fetchesCompany->execute(['id' => $json_array['company_id']]);
$conversion_currency = $this->fetchesCurrency->execute(['id' => $json_array['currency_id']]);
$convertable_currency = $this->fetchesCurrency->execute(['id' => 1]);//MYR
$convert_amount = $this->rateCalculatesCurrency->execute($conversion_currency, $convertable_currency, $json_array['amount']);
$convert_rate = $this->rateCalculatesCurrency->execute_rate($conversion_currency, $convertable_currency);
/*
int $bill_no,string $trans_type1,string $trans_type2,
float $amount, int $currency_id, int $original_amount,
int $original_currency_id, float $currency_rate,
string $dt_transaction,int $status,int $booking_id,
int $company_id
*/
$object = new TransactionObject(
$this->generatesTransactionBillNo->execute(),$json_array['trans_type1'],$json_array['trans_type2'],
number_format( (float) $convert_amount, 5, '.', ''), 1 , number_format( (float) $json_array['amount'], 5, '.', ''),
$json_array['currency_id'],number_format( (float) $convert_rate, 5, '.', ''),
$json_array['dt_transaction'],1,$request->route('id'),
$company->id
);
$this->canCreateTransaction->passes($object);
$transaction = $this->createsTransaction->execute($object);
$transaction_array = new TransactionResource($transaction);
$transaction_detail_array = array();
foreach ($json_array['transaction_detail'] as $key => $value) {
$object_detail = new TransactionDetailObject(
$json_array['trans_type1'],$json_array['trans_type2'],
$transaction->id,$value['product_code'],$value['product_name'],
(int)$value['qty'],number_format( (float) $convert_amount, 5, '.', ''), number_format( (float) $json_array['amount'], 5, '.', '')
);
$this->canCreateTransactionDetail->passes($object_detail);
$transaction_detail = $this->createsTransactionDetail->execute($object_detail);
//array_push($stack, "apple", "raspberry");
$transaction_detail_resource= new TransactionDetailResource($transaction_detail);
$transaction_detail_array[]= $transaction_detail_resource->toArray($request);
}
//$transaction_array['transaction_detail']= $transaction_detail_array;
//print_r($transaction_detail_array);
//dd($transaction_detail_array);
DB::commit();
return $this->resourceResponse($transaction_array);
//return $this->resourceResponse($json_array);
} catch (\Exception $exception) {
throw new ErrorException($exception->getMessage(), $exception->getCode());
}
}
}
@@ -0,0 +1,50 @@
<?php
namespace App\Classes\Modules\Transactions\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Transactions\Services\ListsTransactions;
use App\Http\Resources\BookingResource;
use App\Http\Resources\TransactionResource;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class ListTransactionsLogic extends AbstractControllerLogic
{
/**
* ListTransactionsLogic constructor.
* @param ListsTransactions $listsTransactions
*/
public function __construct(ListsTransactions $listsTransactions)
{
$this->listsTransactions = $listsTransactions;
}
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Retrieved Transactions',
'message' => 'You have successfully retrieved a list of transactions'
];
}
/** @var ListsTransactions */
private $listsTransactions;
public function logic(Request $request) : JsonResponse
{
$query = $this->listsTransactions->execute($this->listsTransactions->deserializeFilters($request->input('filters')));
return $this->collectionResponse(TransactionResource::collection($query));
}
}
@@ -0,0 +1,61 @@
<?php
namespace App\Classes\Modules\Transactions\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Transactions\Services\FetchesTransaction;
use App\Classes\Modules\Transactions\Services\ListsTransactions;
use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Http\Resources\BookingResource;
use App\Http\Resources\TransactionResource;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class SuspendTransactionLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Suspend Transaction',
'message' => 'You have successfully suspended the payment booking'
];
}
/** @var FetchesTransaction */
private $fetchesTransaction;
/** @var UpdatesTransactionStatus */
private $updatesTransactionStatus;
/**
* SuspendTransactionLogic constructor.
* @param FetchesTransaction $fetchesTransaction
* @param UpdatesTransactionStatus $updatesTransactionStatus
*/
public function __construct(FetchesTransaction $fetchesTransaction, UpdatesTransactionStatus $updatesTransactionStatus)
{
$this->fetchesTransaction = $fetchesTransaction;
$this->updatesTransactionStatus = $updatesTransactionStatus;
}
public function logic(Request $request) : JsonResponse
{
$transaction = $this->fetchesTransaction->execute(['id' => $request->route('id')]);
$this->updatesTransactionStatus->execute($transaction, ApprovalStatus::SUSPENDED);
return $this->response([]);
}
}
@@ -0,0 +1,73 @@
<?php
namespace App\Classes\Modules\Transactions\DataTransferObjects;
use App\Classes\General\Interfaces\DataTransferObject;
class TransactionDetailObject implements DataTransferObject
{
/** @var string|null */
private $code;
/** @var string|null */
private $name;
/** @var int|null */
private $quantity;
/** @var float|null */
private $price;
/**
* TransactionDetailObject constructor.
* @param string $code
* @param string $name
* @param int $quantity
* @param float $price
*/
public function __construct(?string $code, ?string $name , ?int $quantity, ?float $price)
{
$this->code = $code;
$this->name = $name;
$this->quantity = $quantity;
$this->price = $price;
}
/**
* @return string
*/
public function getCode(): ?string
{
return $this->code;
}
/**
* @return string
*/
public function getName(): ?string
{
return $this->name;
}
/**
* @return int
*/
public function getQuantity(): ?int
{
return $this->quantity;
}
/**
* @return float
*/
public function getPrice(): ?float
{
return $this->price;
}
public function getAmount(): float
{
return $this->getQuantity() * $this->getPrice();
}
}
@@ -0,0 +1,232 @@
<?php
namespace App\Classes\Modules\Transactions\DataTransferObjects;
use App\Classes\General\Interfaces\DataTransferObject;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use Carbon\Carbon;
class TransactionObject implements DataTransferObject
{
/** @var string */
private $billNo;
/** @var string */
private $transactionType;
/** @var int */
private $issuer;
/** @var int */
private $receiver;
/** @var int */
private $recipientBankAccountId;
/** @var int */
private $paymentMethod;
/** @var float */
private $amount;
/** @var float */
private $originalAmount;
/** @var int */
private $currencyId;
/** @var int */
private $originalCurrencyId;
/** @var float */
private $currencyRate;
/** @var float */
private $tax;
/** @var float */
private $serviceCharge;
/** @var Carbon|null */
private $expiresOn;
/** @var int|null */
private $status;
/** @var array|null */
private $details;
/**
* TransactionObject constructor.
* @param string $billNo
* @param string $transactionType
* @param int $issuer
* @param int $receiver
* @param int $recipientBankAccountId
* @param int $paymentMethod
* @param float $amount
* @param float $originalAmount
* @param int $currencyId
* @param int $originalCurrencyId
* @param float $currencyRate
* @param float $tax
* @param float $serviceCharge
* @param Carbon|null $expiresOn
* @param int|null $status
* @param array|null $details
*/
public function __construct(string $billNo, string $transactionType, int $issuer, int $receiver, int $recipientBankAccountId, int $paymentMethod, float $amount, float $originalAmount, int $currencyId, int $originalCurrencyId, float $currencyRate, float $tax, float $serviceCharge, ?Carbon $expiresOn, ?int $status = ApprovalStatus::PENDING_SUBMISSION, ?array $details = [])
{
$this->billNo = $billNo;
$this->transactionType = $transactionType;
$this->issuer = $issuer;
$this->receiver = $receiver;
$this->recipientBankAccountId = $recipientBankAccountId;
$this->paymentMethod = $paymentMethod;
$this->amount = $amount;
$this->originalAmount = $originalAmount;
$this->currencyId = $currencyId;
$this->originalCurrencyId = $originalCurrencyId;
$this->currencyRate = $currencyRate;
$this->tax = $tax;
$this->serviceCharge = $serviceCharge;
$this->expiresOn = $expiresOn;
$this->status = $status;
$this->details = $details;
}
/**
* @return string
*/
public function getBillNo(): string
{
return $this->billNo;
}
/**
* @return string
*/
public function getTransactionType(): string
{
return $this->transactionType;
}
/**
* @return int
*/
public function getIssuer(): int
{
return $this->issuer;
}
/**
* @return int
*/
public function getReceiver(): int
{
return $this->receiver;
}
/**
* @return int
*/
public function getRecipientBankAccountId(): int
{
return $this->recipientBankAccountId;
}
/**
* @return int
*/
public function getPaymentMethod(): int
{
return $this->paymentMethod;
}
/**
* @return float
*/
public function getAmount(): float
{
return $this->amount;
}
/**
* @return float
*/
public function getOriginalAmount(): float
{
return $this->originalAmount;
}
/**
* @return int
*/
public function getCurrencyId(): int
{
return $this->currencyId;
}
/**
* @return int
*/
public function getOriginalCurrencyId(): int
{
return $this->originalCurrencyId;
}
/**
* @return float
*/
public function getCurrencyRate(): float
{
return $this->currencyRate;
}
/**
* @return float
*/
public function getTax(): float
{
return $this->tax;
}
/**
* @return float
*/
public function getServiceCharge(): float
{
return $this->serviceCharge;
}
/**
* @return Carbon|null
*/
public function getExpiresOn(): ?Carbon
{
return $this->expiresOn;
}
/**
* @return int
*/
public function getStatus(): int
{
return $this->status;
}
/**
* @return array
*/
public function getDetails(): array
{
return array_map(function($product){
return new TransactionDetailObject($product['stockCode'] ?? '', $product['description'] ?? '', $product['quantity'] ?? '', floatval(str_replace(',', '', $product['unit_price'])));
}, $this->details);
}
}
@@ -0,0 +1,229 @@
<?php
namespace App\Classes\Modules\Transactions\Processors;
use App\Classes\Modules\Bookings\Services\CalculatesBookingTransferredAmount;
use App\Classes\Modules\ServiceTypes\Services\FetchesServiceConfigurations;
use App\Classes\Modules\Transactions\Services\ListsTransactions;
use App\Classes\Modules\Transactions\Services\CreatesTransaction;
use App\Classes\Modules\Transactions\Services\GeneratesTransactionBillNumber;
use App\Classes\Modules\Bookings\Services\CalculatesBookingPaidAmount;
use App\Classes\Modules\Bookings\Services\CalculatesBookingCurrencyAverageRate;
use App\Classes\Modules\Companies\Services\FetchesCompany;
use App\Classes\Modules\Documents\Services\CreatesDocument;
use App\Classes\Modules\Documents\Services\CreatesFiles;
use App\Classes\Modules\Bookings\Services\UpdatesBookingStatus;
use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject;
use App\Classes\Modules\Documents\DataTransferObjects\DocumentObject;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\SegmentConstants;
use App\Classes\ValueObjects\Constants\TransactionType;
use App\Classes\ValueObjects\Constants\DocumentType;
use App\Models\Booking;
use App\Models\Document;
use App\Models\SegmentConstant;
use Meneses\LaravelMpdf\Facades\LaravelMpdf;
class CreateInvoiceTransactionProcessor
{
/** @var ListsTransactions */
private $listsTransactions;
/** @var CreatesTransaction */
private $createsTransaction;
/** @var GeneratesTransactionBillNumber */
private $generatesTransactionBillNumber;
/** @var CalculatesBookingPaidAmount */
private $calculatesBookingPaidAmount;
/** @var CalculatesBookingTransferredAmount */
private $calculatesBookingTransferredAmount;
/** @var FetchesServiceConfigurations */
private $fetchesServiceConfigurations;
/** @var CalculatesBookingCurrencyAverageRate */
private $calculatesBookingCurrencyAverageRate;
/** @var FetchesCompany */
private $fetchesCompany;
/** @var CreatesDocument */
private $createsDocument;
/** @var CreatesFiles */
private $createsFile;
/** @var UpdatesBookingStatus */
private $updatesBookingStatus;
/**
* CreateInvoiceTransactionProcessor constructor.
* @param ListsTransactions $listsTransactions
* @param CreatesTransaction $createsTransaction
* @param GeneratesTransactionBillNumber $generatesTransactionBillNumber
* @param CalculatesBookingPaidAmount $calculatesBookingPaidAmount
* @param CalculatesBookingTransferredAmount $calculatesBookingTransferredAmount
* @param FetchesServiceConfigurations $fetchesServiceConfigurations
* @param CalculatesBookingCurrencyAverageRate $calculatesBookingCurrencyAverageRate
* @param FetchesCompany $fetchesCompany
* @param CreatesDocument $createsDocument
* @param CreatesFiles $createsFile
* @param UpdatesBookingStatus $updatesBookingStatus
*/
public function __construct(ListsTransactions $listsTransactions, CreatesTransaction $createsTransaction, GeneratesTransactionBillNumber $generatesTransactionBillNumber, CalculatesBookingPaidAmount $calculatesBookingPaidAmount, CalculatesBookingTransferredAmount $calculatesBookingTransferredAmount, FetchesServiceConfigurations $fetchesServiceConfigurations, CalculatesBookingCurrencyAverageRate $calculatesBookingCurrencyAverageRate, FetchesCompany $fetchesCompany, CreatesDocument $createsDocument, CreatesFiles $createsFile, UpdatesBookingStatus $updatesBookingStatus)
{
$this->listsTransactions = $listsTransactions;
$this->createsTransaction = $createsTransaction;
$this->generatesTransactionBillNumber = $generatesTransactionBillNumber;
$this->calculatesBookingPaidAmount = $calculatesBookingPaidAmount;
$this->calculatesBookingTransferredAmount = $calculatesBookingTransferredAmount;
$this->fetchesServiceConfigurations = $fetchesServiceConfigurations;
$this->calculatesBookingCurrencyAverageRate = $calculatesBookingCurrencyAverageRate;
$this->fetchesCompany = $fetchesCompany;
$this->createsDocument = $createsDocument;
$this->createsFile = $createsFile;
$this->updatesBookingStatus = $updatesBookingStatus;
}
/**
* @param Booking $booking
* @return void
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(Booking $booking)
{
$payment_amount = $this->calculatesBookingTransferredAmount->execute($booking, $booking->fix_currency_id);
$booking_amount = $booking->fix_amount;
if ((float) $booking_amount !== (float) $payment_amount) {
return;
}
$po_order_transaction = $booking->transactions()
->where('type', TransactionType::PURCHASE_ORDER)
->complete()
->first();
$constants = SegmentConstant::where('reference', SegmentConstants::SERVICE_TYPE)->where('detail->id', $booking->service->id)->first();
if($constants->detail->is_billable && !$po_order_transaction) {
return;
}
$transaction = $booking->transactions()
->where('type', TransactionType::PAYMENT)
->first();
$billNumber = $this->generatesTransactionBillNumber->execute('INV-');
$booking_currency_average_rate = $this->calculatesBookingCurrencyAverageRate->execute($booking, TransactionType::PAYMENT);
$total_service_charge = $booking->transactions()
->where('type', TransactionType::PAYMENT)
->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])
->sum('service_charge');
$total_tax = $booking->transactions()
->where('type', TransactionType::PAYMENT)
->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])
->sum('tax');
$transaction_object = new TransactionObject(
$billNumber,
TransactionType::INVOICE,
$transaction->issuer,
$transaction->receiver,
$transaction->recipient_bank_account_id,
$transaction->payment_method,
$payment_amount,
$booking_amount,
$transaction->currency_id,
$transaction->original_currency_id,
$booking_currency_average_rate,
$total_tax,
$total_service_charge,
null,
ApprovalStatus::APPROVED
);
$invoice_transaction = $this->createsTransaction->execute($po_order_transaction->booking, $transaction_object);
$supplier = $this->fetchesCompany->execute(['id' => $transaction->receiver]);
$purchase_order_pdf = LaravelMpdf::loadView('pages.pdfs.purchase_order', ['invoice_transaction' => $invoice_transaction, 'po_order_transaction' => $po_order_transaction, 'supplier' => $supplier]);
$document_object = new DocumentObject(
DocumentType::PURCHASE_ORDER,
[chunk_split('data:application/pdf;base64,'.base64_encode($purchase_order_pdf->output()))],
'',
ApprovalStatus::COMPLETED,
'purchase_orders'
);
$document = $this->createsDocument->execute($po_order_transaction->booking, $document_object);
$this->createsFile->execute($document, $document_object);
$deliver_order_pdf = LaravelMpdf::loadView('pages.pdfs.deliver_order', ['invoice_transaction' => $invoice_transaction, 'po_order_transaction' => $po_order_transaction, 'supplier' => $supplier]);
$document_object = new DocumentObject(
DocumentType::DELIVER_ORDER,
[chunk_split('data:application/pdf;base64,'.base64_encode($deliver_order_pdf->output()))],
'',
ApprovalStatus::COMPLETED,
'delivery_orders'
);
/** @var Document $document */
$document = $this->createsDocument->execute($po_order_transaction->booking, $document_object);
$this->createsFile->execute($document, $document_object);
$invoice_pdf = LaravelMpdf::loadView('pages.pdfs.invoice', ['invoice_transaction' => $invoice_transaction, 'po_order_transaction' => $po_order_transaction, 'supplier' => $supplier]);
$document_object = new DocumentObject(
DocumentType::INVOICE,
[chunk_split('data:application/pdf;base64,'.base64_encode($invoice_pdf->output()))],
'',
ApprovalStatus::COMPLETED,
'invoices'
);
$document = $this->createsDocument->execute($po_order_transaction->booking, $document_object);
$this->createsFile->execute($document, $document_object);
$billNumber = $this->generatesTransactionBillNumber->execute('SPDO-');
$booking_currency_average_rate = $this->calculatesBookingCurrencyAverageRate->execute($booking, TransactionType::BILL);
$transaction_object = new TransactionObject(
$billNumber,
TransactionType::SUPPLIER_DELIVER,
$transaction->issuer,
$transaction->receiver,
$transaction->recipient_bank_account_id,
$transaction->payment_method,
$payment_amount,
$booking_amount,
$transaction->currency_id,
$transaction->original_currency_id,
$booking_currency_average_rate,
$total_tax,
$total_service_charge,
null,
ApprovalStatus::APPROVED
);
$supplier_deliver_order_transaction = $this->createsTransaction->execute($po_order_transaction->booking, $transaction_object);
$supplier_order_pdf = LaravelMpdf::loadView('pages.pdfs.supplier_deliver_order', ['supplier_deliver_order_transaction' => $supplier_deliver_order_transaction, 'po_order_transaction' => $po_order_transaction, 'supplier' => $supplier]);
$document_object = new DocumentObject(
DocumentType::SUPPLIER_DELIVER_ORDER,
[chunk_split('data:application/pdf;base64,'.base64_encode($supplier_order_pdf->output()))],
'',
ApprovalStatus::COMPLETED,
'supplier_delivery_orders'
);
$document = $this->createsDocument->execute($po_order_transaction->booking, $document_object);
$this->createsFile->execute($document, $document_object);
$this->updatesBookingStatus->execute($booking, ApprovalStatus::COMPLETED);
}
}
@@ -0,0 +1,22 @@
<?php
namespace App\Classes\Modules\Transactions\Services;
use App\Models\Transaction;
class ChecksIfTransactionBillNumberExists
{
private $repository;
public function __construct(Transaction $repository)
{
$this->repository = $repository;
}
public function execute(string $bill_no): bool {
return $this->repository->where('bill_no', $bill_no)->exists();
}
}
@@ -0,0 +1,40 @@
<?php
namespace App\Classes\Modules\Transactions\Services;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Classes\General\Eloquent\AbstractUpdateRelationshipRecord;
use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject;
use App\Models\Booking;
use App\Models\Transaction;
class CreatesTransaction extends AbstractUpdateRelationshipRecord
{
/**
* @param TransactionObject $object
* @return \Illuminate\Database\Eloquent\Model
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(Booking $booking, TransactionObject $object) {
$model = new Transaction();
$model->bill_no = $object->getBillNo();
$model->type = $object->getTransactionType();
$model->issuer = $object->getIssuer();
$model->receiver = $object->getReceiver();
$model->recipient_bank_account_id = $object->getRecipientBankAccountId();
$model->payment_method = $object->getPaymentMethod();
$model->amount = $object->getAmount();
$model->original_amount = $object->getOriginalAmount();
$model->currency_id = $object->getCurrencyId();
$model->original_currency_id = $object->getOriginalCurrencyId();
$model->currency_rate = $object->getCurrencyRate();
$model->tax = $object->getTax();
$model->service_charge = $object->getServiceCharge();
$model->expires_on = $object->getExpiresOn();
$model->status = $object->getStatus();
return $this->handler($booking->transactions(), $model);
}
}
@@ -0,0 +1,30 @@
<?php
namespace App\Classes\Modules\Transactions\Services;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Classes\General\Eloquent\AbstractUpdateRelationshipRecord;
use App\Classes\Modules\Transactions\DataTransferObjects\TransactionDetailObject;
use App\Models\Transaction;
use App\Models\TransactionDetail;
class CreatesTransactionDetail extends AbstractUpdateRelationshipRecord
{
/**
* @param Transaction $transaction
* @param TransactionDetailObject $object
* @return \Illuminate\Database\Eloquent\Model
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(Transaction $transaction, TransactionDetailObject $object) {
$model = new TransactionDetail();
$model->product_code = $object->getCode();
$model->product_name = $object->getName();
$model->quantity = $object->getQuantity();
$model->price = $object->getPrice();
$model->amount = $object->getAmount();
return $this->handler($transaction->transactionDetails(), $model);
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\Classes\Modules\Transactions\Services;
use App\Classes\General\Eloquent\AbstractDeleteRecord;
use App\Models\Transaction;
class DeletesTransactionDetails extends AbstractDeleteRecord
{
/**
* @param Transaction $model
* @return mixed
*/
public function execute(Transaction $model) {
return $model->transactionDetails()->delete();
}
}
@@ -0,0 +1,34 @@
<?php
namespace App\Classes\Modules\Transactions\Services;
use App\Classes\General\Eloquent\AbstractFetchRecord;
use Illuminate\Database\Eloquent\Builder;
use App\Models\Transaction;
class FetchesTransaction extends AbstractFetchRecord
{
/** @var Transaction */
private $repository;
/**
* FetchesTransaction constructor.
* @param Transaction $repository
*/
public function __construct(Transaction $repository)
{
$this->repository = $repository;
}
/**
* @return Builder
*/
public function getRepository(): Builder
{
return $this->repository->newQuery();
}
}
@@ -0,0 +1,35 @@
<?php
namespace App\Classes\Modules\Transactions\Services;
use App\Classes\General\Eloquent\AbstractFetchRecord;
use Illuminate\Database\Eloquent\Builder;
use App\Models\TransactionDetail;
class FetchesTransactionDetail extends AbstractFetchRecord
{
/** @var TransactionDetail */
private $repository;
/**
* FetchesTransaction constructor.
* @param TransactionDetail $repository
*/
public function __construct(TransactionDetail $repository)
{
$this->repository = $repository;
}
/**
* @return Builder
*/
public function getRepository(): Builder
{
return $this->repository->newQuery();
}
}
@@ -0,0 +1,37 @@
<?php
namespace App\Classes\Modules\Transactions\Services;
use Carbon\Carbon;
class GeneratesTransactionBillNumber
{
/** @var ChecksIfTransactionBillNumberExists */
private $checksIfTransactionBillNumberExists;
/**
* GeneratesTransactionBillNo constructor.
* @param ChecksIfTransactionBillNumberExists $checksIfTransactionBillNumberExists
*/
public function __construct(ChecksIfTransactionBillNumberExists $checksIfTransactionBillNumberExists)
{
$this->checksIfTransactionBillNumberExists = $checksIfTransactionBillNumberExists;
}
/**
* @param string $prefix
* @return string
*/
public function execute(string $prefix): string {
$date = carbon::now();
$billNumber = $prefix.$date->format('Y').$date->format('m').'-'.mt_rand(10000, 99999);
return !$this->checksIfTransactionBillNumberExists->execute($billNumber) ? $billNumber : self::execute($prefix);
}
}
@@ -0,0 +1,31 @@
<?php
namespace App\Classes\Modules\Transactions\Services;
use App\Models\Transaction;
use Illuminate\Database\Eloquent\Builder;
use App\Classes\General\Eloquent\AbstractListRecord;
class ListsTransactions extends AbstractListRecord
{
/** @var Transaction */
private $repository;
/**
* ListsBookings constructor.
* @param Transaction $repository
*/
public function __construct(Transaction $repository)
{
$this->repository = $repository;
}
/**
* @return Builder
*/
public function getRepository(): Builder
{
return $this->repository->newQuery();
}
}
@@ -0,0 +1,33 @@
<?php
namespace App\Classes\Modules\Transactions\Services;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Classes\General\Eloquent\AbstractUpdateRelationshipRecord;
use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject;
use App\Models\Booking;
use App\Models\Transaction;
class UpdatesTransaction extends AbstractUpdateRecord
{
/**
* @param Transaction $transaction
* @param TransactionObject $object
* @return \Illuminate\Database\Eloquent\Model
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(Transaction $transaction, TransactionObject $object) {
$transaction->recipient_bank_account_id = $object->getRecipientBankAccountId();
$transaction->payment_method = $object->getPaymentMethod();
$transaction->amount = $object->getAmount();
$transaction->original_amount = $object->getOriginalAmount();
$transaction->currency_id = $object->getCurrencyId();
$transaction->original_currency_id = $object->getOriginalCurrencyId();
$transaction->currency_rate = $object->getCurrencyRate();
$transaction->tax = $object->getTax();
$transaction->service_charge = $object->getServiceCharge();
return $this->handler($transaction);
}
}
@@ -0,0 +1,22 @@
<?php
namespace App\Classes\Modules\Transactions\Services;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Models\Transaction;
class UpdatesTransactionStatus extends AbstractUpdateRecord
{
/**
* @param Transaction $model
* @param int $status
* @return \Illuminate\Database\Eloquent\Model
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(Transaction $model, int $status)
{
$model->status = $status;
return $this->handler($model);
}
}
@@ -0,0 +1,51 @@
<?php
namespace App\Classes\Modules\Transactions\Standards\Rules;
use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject;
use App\Classes\Modules\Transactions\Standards\Validators\TransactionValidation;
class CanCreateTransaction extends AbstractRule
{
/** @var TransactionValidation */
private $transactionValidation;
public function __construct(TransactionValidation $transactionValidation)
{
$this->transactionValidation = $transactionValidation;
}
/**
* @return bool
*/
protected function authorized(): bool
{
// TODO Set Authorization rules
return true;
}
/**
* @param TransactionObject $object
* @return bool
* @throws \App\Classes\Exceptions\RequestValidationException
*/
protected function validators($object): bool
{
return $this->transactionValidation->validate($object);
}
/**
* @param TransactionObject $object
* @return bool
*/
protected function criteria($object): bool
{
return true;
}
}
@@ -0,0 +1,51 @@
<?php
namespace App\Classes\Modules\Transactions\Standards\Rules;
use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Modules\Transactions\DataTransferObjects\TransactionDetailObject;
use App\Classes\Modules\Transactions\Standards\Validators\TransactionDetailValidation;
class CanCreateTransactionDetail extends AbstractRule
{
/** @var TransactionDetailValidation */
private $transactionDetailValidation;
public function __construct(TransactionDetailValidation $transactionDetailValidation)
{
$this->transactionDetailValidation = $transactionDetailValidation;
}
/**
* @return bool
*/
protected function authorized(): bool
{
// TODO Set Authorization rules
return true;
}
/**
* @param TransactionDetailObject $object
* @return bool
* @throws \App\Classes\Exceptions\RequestValidationException
*/
protected function validators($object): bool
{
return $this->transactionDetailValidation->validate($object);
}
/**
* @param TransactionDetailObject $object
* @return bool
*/
protected function criteria($object): bool
{
return true;
}
}
@@ -0,0 +1,62 @@
<?php
namespace App\Classes\Modules\Transactions\Standards\Validators;
use App\Classes\General\Abstracts\AbstractValidation;
class TransactionDetailValidation extends AbstractValidation
{
/*
*
* $this->bill_no = $bill_no;
$this->trans_type1= $trans_type1;
$this->trans_type2 = $trans_type2;
$this->amount= $amount;
$this->currency_id = $currency_id;
$this->original_amount = $original_amount;
$this->original_currency_id = $original_currency_id;
$this->currency_rate = $currency_rate;
$this->dt_transaction = $dt_transaction;
$this->status = $status;
$this->booking_id = $booking_id;
$this->company_id = $company_id;
*/
protected function data($object): array
{
return [
'trans_type1' => $object->getTransType1(),
'trans_type2' => $object->getTransType2(),
'transaction_id' => $object->getTransactionId(),
'product_code' => $object->getProductCode(),
'product_name'=>$object->getProductName(),
'qty'=>$object->getQty(),
'price'=>$object->getPrice(),
'amount' => $object->getAmount()
];
}
/**
* @return array
*/
protected function rules(): array
{
return [
'trans_type1' => 'required',
'trans_type2' => 'required',
'transaction_id' => 'required',
'product_code' => 'required',
'product_name'=>'required',
'qty'=>'required',
'price'=>'required',
'amount' => 'required'
];
}
/**
* @return array
*/
protected function messages(): array
{
return [];
}
}
@@ -0,0 +1,68 @@
<?php
namespace App\Classes\Modules\Transactions\Standards\Validators;
use App\Classes\General\Abstracts\AbstractValidation;
class TransactionValidation extends AbstractValidation
{
/*
*
* $this->bill_no = $bill_no;
$this->trans_type1= $trans_type1;
$this->trans_type2 = $trans_type2;
$this->amount= $amount;
$this->currency_id = $currency_id;
$this->original_amount = $original_amount;
$this->original_currency_id = $original_currency_id;
$this->currency_rate = $currency_rate;
$this->dt_transaction = $dt_transaction;
$this->status = $status;
$this->booking_id = $booking_id;
$this->company_id = $company_id;
*/
protected function data($object): array
{
return [
'bill_no' => $object->getBillNo(),
'trans_type1' => $object->getBillNo(),
'trans_type2' => $object->getTransType2(),
'amount' => $object->getAmount(),
'currency_id' => $object->getCurrency(),
'original_amount' => $object->getOriginalAmount(),
'original_currency_id'=>$object->getOriginalCurrency(),
'dt_transaction'=>$object->getDtTransaction(),
'status'=>$object->getStatus(),
'booking_id'=>$object->getBookingId(),
'company_id'=>$object->getCompanyId()
];
}
/**
* @return array
*/
protected function rules(): array
{
return [
'bill_no' => 'required',
'trans_type1' => 'required',
'trans_type2' => 'required',
'amount' => 'required',
'currency_id' => 'required',
'original_amount' => 'required',
'original_currency_id'=>'required',
'dt_transaction'=>'required',
'status'=>'required',
'booking_id'=>'required',
'company_id'=>'required'
];
}
/**
* @return array
*/
protected function messages(): array
{
return [];
}
}
@@ -0,0 +1,33 @@
<?php
namespace App\Classes\ValueObjects\Constants;
final class PaymentMethodType {
public const CASH = 1;
public const CHEQUE = 2;
public const BA = 3;
public const WALLET = 4;
public const PAYMENT_GATEWAY = 5;
public const PAYMENT_METHODS = [
'cash' => self::CASH,
'cheque' => self::CHEQUE,
'ba' => self::BA,
'wallet' => self::WALLET,
'payment gateway' => self::PAYMENT_GATEWAY,
];
public const PAYMENT_METHODS_ID = [
self::CASH => 'cash',
self::CHEQUE => 'cheque',
self::BA => 'ba',
self::WALLET => 'wallet',
self::PAYMENT_GATEWAY => 'payment gateway'
];
}
@@ -0,0 +1,19 @@
<?php
namespace App\Classes\ValueObjects\Constants;
final class TransactionStatus {
public const PENDING_PAYMENT = 0;
public const PENDING_APPROVAL = 1;
public const APPROVED = 2;
public const COMPLETED = 3;
public const REJECTED = 4;
public const EXPIRED = 5;
}
@@ -0,0 +1,25 @@
<?php
namespace App\Classes\ValueObjects\Constants;
final class TransactionType {
public const PAYMENT_ATTEMPT = 0;
public const PAYMENT = 1;
public const INVOICE = 2;
public const BILL = 3;
public const PERFORMA = 4;
public const TOP_UP = 5;
public const REFUND = 6;
public const PURCHASE_ORDER = 7;
public const SUPPLIER_DELIVER = 8;
}
@@ -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,19 @@
<?php
namespace App\Http\Controllers\Currencies;
use App\Classes\Modules\Currencies\ControllersLogic\FetchSystemPrimaryCurrencyLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class FetchSystemPrimaryCurrencyController
{
/**
* @param Request $request
* @param FetchSystemPrimaryCurrencyLogic $logic
* @return JsonResponse
*/
public function fetch(Request $request, FetchSystemPrimaryCurrencyLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\Currencies;
use App\Classes\Modules\Currencies\ControllersLogic\ListCurrencyLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class ListCurrencyController
{
/**
* @param Request $request
* @param ListCurrencyLogic $logic
* @return JsonResponse
*/
public function list(Request $request, ListCurrencyLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\Http\Controllers\Currencies;
use App\Classes\Modules\Currencies\ControllersLogic\RateCalculateCurrencyLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class RateCalculateCurrencyController
{
/**
* @param Request $request
* @param RateCalculateCurrencyLogic $logic
* @return JsonResponse
*/
public function convert(Request $request, RateCalculateCurrencyLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\Http\Controllers\Currencies\Rates;
use App\Classes\Modules\Currencies\ControllersLogic\Rates\CalculateRateLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class CalculateRateController
{
/**
* @param Request $request
* @param CalculateRateLogic $logic
* @return JsonResponse
*/
public function calculate(Request $request, CalculateRateLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\Currencies\Rates;
use App\Classes\Modules\Currencies\ControllersLogic\Rates\CreateRateLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class CreateRateController
{
/**
* @param Request $request
* @param CreateRateLogic $logic
* @return JsonResponse
*/
public function create(Request $request, CreateRateLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\Currencies\Rates;
use App\Classes\Modules\Currencies\ControllersLogic\Rates\DeleteRateLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class DeleteRateController
{
/**
* @param Request $request
* @param DeleteRateLogic $logic
* @return JsonResponse
*/
public function delete(Request $request, DeleteRateLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\Currencies\Rates;
use App\Classes\Modules\Currencies\ControllersLogic\Rates\FetchRateLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class FetchRateController
{
/**
* @param Request $request
* @param FetchRateLogic $logic
* @return JsonResponse
*/
public function fetch(Request $request, FetchRateLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\Currencies\Rates;
use App\Classes\Modules\Currencies\ControllersLogic\Rates\ListRatesLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class ListRatesController
{
/**
* @param Request $request
* @param ListRatesLogic $logic
* @return JsonResponse
*/
public function list(Request $request, ListRatesLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\Currencies\Rates;
use App\Classes\Modules\Currencies\ControllersLogic\Rates\UpdateRateLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class UpdateRateController
{
/**
* @param Request $request
* @param UpdateRateLogic $logic
* @return JsonResponse
*/
public function update(Request $request, UpdateRateLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,15 @@
<?php
namespace App\Http\Controllers\Receipts;
use App\Classes\Modules\Receipts\ControllersLogic\CreateReceiptLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class CreateReceiptController
{
public function create(Request $request, CreateReceiptLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,15 @@
<?php
namespace App\Http\Controllers\Transactions;
use App\Classes\Modules\Transactions\ControllersLogic\CreateMakePaymentPOTransactionLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class CreateMakePaymentPOTransactionController
{
public function create(Request $request, CreateMakePaymentPOTransactionLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,21 @@
<?php
namespace App\Http\Controllers\Transactions;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use App\Classes\Modules\Transactions\ControllersLogic\CreatePaymentProofDocumentLogic;
class CreatePaymentProofDocumentController
{
/**
* @param Request $request
* @param CreatePaymentProofDocumentLogic $logic
* @return JsonResponse
*/
public function verify(Request $request, CreatePaymentProofDocumentLogic $logic) : JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,21 @@
<?php
namespace App\Http\Controllers\Transactions;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use App\Classes\Modules\Transactions\ControllersLogic\CreatePurchaseOrderTransactionLogic;
class CreatePurchaseOrderTransactionController
{
/**
* @param Request $request
* @param CreatePurchaseOrderTransactionLogic $logic
* @return JsonResponse
*/
public function create(Request $request, CreatePurchaseOrderTransactionLogic $logic) : JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,21 @@
<?php
namespace App\Http\Controllers\Transactions;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use App\Classes\Modules\Transactions\ControllersLogic\CreateSupplierTransactionLogic;
class CreateSupplierTransactionController
{
/**
* @param Request $request
* @param CreateSupplierTransactionLogic $logic
* @return JsonResponse
*/
public function create(Request $request, CreateSupplierTransactionLogic $logic) : JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,15 @@
<?php
namespace App\Http\Controllers\Transactions;
use App\Classes\Modules\Transactions\ControllersLogic\CreateTransactionLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class CreateTransactionController
{
public function create(Request $request, CreateTransactionLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,21 @@
<?php
namespace App\Http\Controllers\Transactions;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use App\Classes\Modules\Transactions\ControllersLogic\ListTransactionsLogic;
class ListTransactionsController
{
/**
* @param Request $request
* @param ListTransactionsLogic $logic
* @return JsonResponse
*/
public function list(Request $request, ListTransactionsLogic $logic) : JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,21 @@
<?php
namespace App\Http\Controllers\Transactions;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use App\Classes\Modules\Transactions\ControllersLogic\SuspendTransactionLogic;
class SuspendTransactionController
{
/**
* @param Request $request
* @param SuspendTransactionLogic $logic
* @return JsonResponse
*/
public function suspend(Request $request, SuspendTransactionLogic $logic) : JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,26 @@
<?php
namespace App\Http\Resources;
use App\Models\CurrencyRate;
use Illuminate\Http\Resources\Json\JsonResource;
class CurrencyConversionResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'country' => new CountryResource($this->country),
'name' => $this->name,
'short_code' => $this->short_code,
'symbol' => $this->symbol,
];
}
}
@@ -0,0 +1,26 @@
<?php
namespace App\Http\Resources;
use App\Classes\ValueObjects\Constants\PaymentMethodType;
use Illuminate\Http\Resources\Json\JsonResource;
class CurrencyRateResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'payment_method' => PaymentMethodType::PAYMENT_METHODS_ID[$this->payment_method_type],
'selling' => [
'type' => property_exists($this->selling, 'type') ? $this->selling->type : 'rate',
'value' => property_exists($this->selling, 'value') ? $this->selling->value : $this->selling
]
];
}
}
+26
View File
@@ -0,0 +1,26 @@
<?php
namespace App\Http\Resources;
use App\Models\CurrencyRate;
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' => new CountryResource($this->country),
'name' => $this->name,
'short_code' => $this->short_code,
'symbol' => $this->symbol,
];
}
}
@@ -0,0 +1,32 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
use App\Models\Currency;
class RateCalculateCurrencyResource extends JsonResource
{
public function __construct(Currency $conversion_currency, Currency $convertable_currency, $convert_amount)
{
$this->conversion_currency = $conversion_currency;
$this->convertable_currency = $convertable_currency;
$this->convert_amount = $convert_amount;
}
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'conversion_currency' => $this->conversion_currency->id,
'convertable_currency' => $this->conversion_currency->id,
'convert_amount' => $this->convert_amount,
];
}
}
@@ -0,0 +1,29 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class ReceiptDetailResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'trans_type1' => $this->trans_type1,
'trans_type2' => $this->trans_type2,
'transaction_id' => (int) $this->transaction_id,
'receipt_id' => (int)$this->receipt_id,
'price' => (double) $this->price,
'amount' => (double) $this->amount
];
}
}
+34
View File
@@ -0,0 +1,34 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class ReceiptResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'trans_type1' => $this->trans_type1,
'trans_type2' => $this->trans_type2,
'bill_no' => (int) $this->bill_no,
'amount' => (double) $this->amount,
'currency_id' => (int) $this->currency_id,
'original_amount' => (double) $this->original_amount,
'original_currency_id' => (int) $this->original_currency_id,
'currency_rate' => (double) $this->currency_rate,
'dt_transaction' => $this->dt_transaction,
'status' => (int) $this->status,
'booking_id' => (int) $this->booking_id,
'company_id' => (int) $this->company_id
];
}
}

Some files were not shown because too many files have changed in this diff Show More