diff --git a/app/Classes/General/Abstracts/AbstractRule.php b/app/Classes/General/Abstracts/AbstractRule.php index 8a9b6f86..5b424df0 100644 --- a/app/Classes/General/Abstracts/AbstractRule.php +++ b/app/Classes/General/Abstracts/AbstractRule.php @@ -10,7 +10,7 @@ use App\Classes\General\Interfaces\DataTransferObject; abstract class AbstractRule { - abstract protected function authorized(): bool; + abstract protected function authorized($object): bool; abstract protected function validators($object): bool; @@ -26,7 +26,7 @@ abstract class AbstractRule */ public function passes(?DataTransferObject $object = null): bool { try { - if(!$this->authorized()){ + if(!$this->authorized($object)){ throw new AccessForbiddenException('You don\'t have permission to perform this action'); } @@ -43,4 +43,4 @@ abstract class AbstractRule } -} \ No newline at end of file +} diff --git a/app/Classes/General/Interfaces/KeyValueInterface.php b/app/Classes/General/Interfaces/KeyValueInterface.php index fbee5265..8089e46a 100644 --- a/app/Classes/General/Interfaces/KeyValueInterface.php +++ b/app/Classes/General/Interfaces/KeyValueInterface.php @@ -8,5 +8,5 @@ use Illuminate\Database\Eloquent\Relations\MorphMany; interface KeyValueInterface { - public function attributes(): morphMany; + public function attributesKVP(): morphMany; } diff --git a/app/Classes/Jobs/ListDocumentsJob.php b/app/Classes/Jobs/ListDocumentsJob.php index a01e0b0e..66007795 100644 --- a/app/Classes/Jobs/ListDocumentsJob.php +++ b/app/Classes/Jobs/ListDocumentsJob.php @@ -9,8 +9,7 @@ use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; -use App\Models\JobResult; -use Illuminate\Support\Facades\Log; + class ListDocumentsJob implements ShouldQueue { @@ -43,7 +42,7 @@ class ListDocumentsJob implements ShouldQueue $this->jobSubmissionObject->setJobCommand($rawPayload['data']['command']); } - $result = (App()->make(ListDocumentsJobProcessor::class))->execute($this->jobSubmissionObject); + (App()->make(ListDocumentsJobProcessor::class))->execute($this->jobSubmissionObject); } public function getJobId(){ diff --git a/app/Classes/Jobs/UpdatePerfexCRMPrelude.php b/app/Classes/Jobs/UpdatePerfexCRMPrelude.php index 3b05ac63..1bf9dede 100644 --- a/app/Classes/Jobs/UpdatePerfexCRMPrelude.php +++ b/app/Classes/Jobs/UpdatePerfexCRMPrelude.php @@ -41,7 +41,11 @@ class UpdatePerfexCRMPrelude implements ShouldQueue { $serviceTypeName = $this->transaction->owner->company->services()->where('id', $this->transaction->owner->service_id)->first()->name; $booking = $this->transaction->booking; - $bankDetails = $this->generateBankDetails($booking->bank); + $bank = $booking->bank; //cief todo: 66 + if($this->transaction->bank){ + $bank = $this->transaction->bank; + } + $bankDetails = $this->generateBankDetails($bank); $data = [ 'amount' => number_format($this->transaction->amount, 2, '.', ''), diff --git a/app/Classes/Modules/Accounts/ControllersLogic/CreateCustomerLogic.php b/app/Classes/Modules/Accounts/ControllersLogic/CreateCustomerLogic.php index 9a155f74..1359c99e 100644 --- a/app/Classes/Modules/Accounts/ControllersLogic/CreateCustomerLogic.php +++ b/app/Classes/Modules/Accounts/ControllersLogic/CreateCustomerLogic.php @@ -16,6 +16,7 @@ use App\Classes\Modules\Vouchers\Processors\Voucherify\NewCustomerToVoucherifyPr use App\Classes\Modules\Vouchers\Processors\CreateVoucherProcessor; use App\Classes\Modules\Companies\DataTransferObjects\EmploymentObject; use App\Classes\Modules\PerfexCRM\DataTransferObjects\CreateLeadPerfexCRMObject; +use App\Classes\Modules\Rewards\Services\CreatesUserReward; use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Classes\ValueObjects\Constants\BusinessType; use App\Classes\ValueObjects\Constants\CompanyType; @@ -85,6 +86,9 @@ class CreateCustomerLogic extends AbstractControllerLogic /** @var ConnectCompanyToShippingCompanyModule */ private $connectCompanyToShippingCompanyModule; + /** @var CreatesUserReward */ + private $createsUserReward; + /** * CreateCustomerLogic constructor. * @param CreateUserProcessor $createUserProcessor @@ -100,9 +104,10 @@ class CreateCustomerLogic extends AbstractControllerLogic * @param CreateVoucherProcessor $createVoucherProcessor * @param RegisterOnShippingProcessor $registerOnShippingProcessor * @param ConnectCompanyToShippingCompanyModule $connectCompanyToShippingCompanyModule + * @param CreatesUserReward $createsUserReward */ public function __construct(CreateUserProcessor $createUserProcessor, CreateCompanyProcessor $createCompanyProcessor, CreateContactProcessor $createContactProcessor, AssignEmployeeProcessor $assignEmployeeProcessor, AssignSegmentProcessor $assignSegmentProcessor, AuthenticationProcessor $authenticationProcessor, GenerateEmailVerificationAttemptProcessor $generateEmailVerificationAttemptProcessor, - CreatesSeasonalSegment $createsSeasonalSegment, NewCustomerToVoucherifyProcessor $newCustomerToVoucherifyProcessor, CreateVoucherProcessor $createVoucherProcessor, RegisterOnShippingProcessor $registerOnShippingProcessor, ConnectCompanyToShippingCompanyModule $connectCompanyToShippingCompanyModule) + CreatesSeasonalSegment $createsSeasonalSegment, NewCustomerToVoucherifyProcessor $newCustomerToVoucherifyProcessor, CreateVoucherProcessor $createVoucherProcessor, RegisterOnShippingProcessor $registerOnShippingProcessor, ConnectCompanyToShippingCompanyModule $connectCompanyToShippingCompanyModule, CreatesUserReward $createsUserReward) { $this->createUserProcessor = $createUserProcessor; $this->createCompanyProcessor = $createCompanyProcessor; @@ -117,6 +122,7 @@ class CreateCustomerLogic extends AbstractControllerLogic $this->createVoucherProcessor = $createVoucherProcessor; $this->registerOnShippingProcessor = $registerOnShippingProcessor; $this->connectCompanyToShippingCompanyModule = $connectCompanyToShippingCompanyModule; + $this->createsUserReward = $createsUserReward; } /** @@ -179,7 +185,13 @@ class CreateCustomerLogic extends AbstractControllerLogic $this->newCustomerToVoucherifyProcessor->execute($company->id, $user, true); - $this->createVoucherProcessor->execute($user, Vouchers::WELCOME_50_PERCENT_OFF); + $voucher = $this->createVoucherProcessor->execute($user, Vouchers::WELCOME_50_PERCENT_OFF); + if($voucher){ + $voucherCount = $user->rewards->where('voucher_id', $voucher->id)->count(); + if($voucherCount === 0){ + $this->createsUserReward->execute(null, $user, $voucher->id); + } + } $shippingCompanyModuleId = null; if ($request->input('shipping_company_module_id')) { diff --git a/app/Classes/Modules/Accounts/Services/CreatesKeyValuePair.php b/app/Classes/Modules/Accounts/Services/CreatesKeyValuePair.php index c963ec4e..6634bed2 100644 --- a/app/Classes/Modules/Accounts/Services/CreatesKeyValuePair.php +++ b/app/Classes/Modules/Accounts/Services/CreatesKeyValuePair.php @@ -22,7 +22,7 @@ class CreatesKeyValuePair extends AbstractUpdateRelationshipRecord $model->key = $object->getKey(); $model->value = $object->getValue(); - return $this->handler($kv->attributes(), $model); + return $this->handler($kv->attributesKVP(), $model); } } diff --git a/app/Classes/Modules/Accounts/Services/DeletesKeyValuePair.php b/app/Classes/Modules/Accounts/Services/DeletesKeyValuePair.php new file mode 100644 index 00000000..a52288af --- /dev/null +++ b/app/Classes/Modules/Accounts/Services/DeletesKeyValuePair.php @@ -0,0 +1,19 @@ +handler($model); + } +} diff --git a/app/Classes/Modules/Accounts/Services/UpdatesKeyValuePair.php b/app/Classes/Modules/Accounts/Services/UpdatesKeyValuePair.php new file mode 100644 index 00000000..0a800d79 --- /dev/null +++ b/app/Classes/Modules/Accounts/Services/UpdatesKeyValuePair.php @@ -0,0 +1,22 @@ +key = $object->getKey(); + $model->value = $object->getValue(); + return $this->handler($model); + } +} diff --git a/app/Classes/Modules/Accounts/Standards/Rules/CanAuthenticateUser.php b/app/Classes/Modules/Accounts/Standards/Rules/CanAuthenticateUser.php index ad2be911..e1a4b50d 100644 --- a/app/Classes/Modules/Accounts/Standards/Rules/CanAuthenticateUser.php +++ b/app/Classes/Modules/Accounts/Standards/Rules/CanAuthenticateUser.php @@ -26,7 +26,7 @@ class CanAuthenticateUser extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { return true; diff --git a/app/Classes/Modules/Accounts/Standards/Rules/CanCreateUser.php b/app/Classes/Modules/Accounts/Standards/Rules/CanCreateUser.php index 2da56844..7a32df58 100644 --- a/app/Classes/Modules/Accounts/Standards/Rules/CanCreateUser.php +++ b/app/Classes/Modules/Accounts/Standards/Rules/CanCreateUser.php @@ -26,7 +26,7 @@ class CanCreateUser extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Accounts/Standards/Rules/CanDeleteUser.php b/app/Classes/Modules/Accounts/Standards/Rules/CanDeleteUser.php index f106bcc7..9c1e3ad6 100644 --- a/app/Classes/Modules/Accounts/Standards/Rules/CanDeleteUser.php +++ b/app/Classes/Modules/Accounts/Standards/Rules/CanDeleteUser.php @@ -10,7 +10,7 @@ class CanDeleteUser extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Accounts/Standards/Rules/CanFetchUser.php b/app/Classes/Modules/Accounts/Standards/Rules/CanFetchUser.php index 740e231c..5f39c290 100644 --- a/app/Classes/Modules/Accounts/Standards/Rules/CanFetchUser.php +++ b/app/Classes/Modules/Accounts/Standards/Rules/CanFetchUser.php @@ -12,7 +12,7 @@ class CanFetchUser extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { return true; diff --git a/app/Classes/Modules/Accounts/Standards/Rules/CanGeneratePasswordReset.php b/app/Classes/Modules/Accounts/Standards/Rules/CanGeneratePasswordReset.php index 8a9b8226..dd314f81 100644 --- a/app/Classes/Modules/Accounts/Standards/Rules/CanGeneratePasswordReset.php +++ b/app/Classes/Modules/Accounts/Standards/Rules/CanGeneratePasswordReset.php @@ -33,7 +33,7 @@ class CanGeneratePasswordReset extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { return true; diff --git a/app/Classes/Modules/Accounts/Standards/Rules/CanListUsers.php b/app/Classes/Modules/Accounts/Standards/Rules/CanListUsers.php index d1ba2ea0..a4186733 100644 --- a/app/Classes/Modules/Accounts/Standards/Rules/CanListUsers.php +++ b/app/Classes/Modules/Accounts/Standards/Rules/CanListUsers.php @@ -13,7 +13,7 @@ class CanListUsers extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { return true; diff --git a/app/Classes/Modules/Accounts/Standards/Rules/CanRegisterUser.php b/app/Classes/Modules/Accounts/Standards/Rules/CanRegisterUser.php index d0720d1c..64aefd00 100644 --- a/app/Classes/Modules/Accounts/Standards/Rules/CanRegisterUser.php +++ b/app/Classes/Modules/Accounts/Standards/Rules/CanRegisterUser.php @@ -24,7 +24,7 @@ class CanRegisterUser extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Accounts/Standards/Rules/CanResendEmailVerification.php b/app/Classes/Modules/Accounts/Standards/Rules/CanResendEmailVerification.php index 4a9f016c..2ac8e942 100644 --- a/app/Classes/Modules/Accounts/Standards/Rules/CanResendEmailVerification.php +++ b/app/Classes/Modules/Accounts/Standards/Rules/CanResendEmailVerification.php @@ -13,7 +13,7 @@ class CanResendEmailVerification extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { return true; diff --git a/app/Classes/Modules/Accounts/Standards/Rules/CanResetPassword.php b/app/Classes/Modules/Accounts/Standards/Rules/CanResetPassword.php index cf620414..adaed65d 100644 --- a/app/Classes/Modules/Accounts/Standards/Rules/CanResetPassword.php +++ b/app/Classes/Modules/Accounts/Standards/Rules/CanResetPassword.php @@ -34,7 +34,7 @@ class CanResetPassword extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { return true; diff --git a/app/Classes/Modules/Accounts/Standards/Rules/CanUpdateUser.php b/app/Classes/Modules/Accounts/Standards/Rules/CanUpdateUser.php index a523ac12..c5abcd0f 100644 --- a/app/Classes/Modules/Accounts/Standards/Rules/CanUpdateUser.php +++ b/app/Classes/Modules/Accounts/Standards/Rules/CanUpdateUser.php @@ -26,7 +26,7 @@ class CanUpdateUser extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Addresses/Standards/Rules/CanCreateAddress.php b/app/Classes/Modules/Addresses/Standards/Rules/CanCreateAddress.php index 42508b1d..685e2e6e 100644 --- a/app/Classes/Modules/Addresses/Standards/Rules/CanCreateAddress.php +++ b/app/Classes/Modules/Addresses/Standards/Rules/CanCreateAddress.php @@ -26,7 +26,7 @@ class CanCreateAddress extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Addresses/Standards/Rules/CanDeleteAddress.php b/app/Classes/Modules/Addresses/Standards/Rules/CanDeleteAddress.php index c13a890c..a03ea389 100644 --- a/app/Classes/Modules/Addresses/Standards/Rules/CanDeleteAddress.php +++ b/app/Classes/Modules/Addresses/Standards/Rules/CanDeleteAddress.php @@ -13,7 +13,7 @@ class CanDeleteAddress extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Addresses/Standards/Rules/CanFetchAddress.php b/app/Classes/Modules/Addresses/Standards/Rules/CanFetchAddress.php index ffe53bee..61e7df25 100644 --- a/app/Classes/Modules/Addresses/Standards/Rules/CanFetchAddress.php +++ b/app/Classes/Modules/Addresses/Standards/Rules/CanFetchAddress.php @@ -13,7 +13,7 @@ class CanFetchAddress extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Addresses/Standards/Rules/CanListAddresses.php b/app/Classes/Modules/Addresses/Standards/Rules/CanListAddresses.php index aa02c55c..363332ec 100644 --- a/app/Classes/Modules/Addresses/Standards/Rules/CanListAddresses.php +++ b/app/Classes/Modules/Addresses/Standards/Rules/CanListAddresses.php @@ -13,7 +13,7 @@ class CanListAddresses extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Addresses/Standards/Rules/CanUpdateAddress.php b/app/Classes/Modules/Addresses/Standards/Rules/CanUpdateAddress.php index 355b590a..a03db81b 100644 --- a/app/Classes/Modules/Addresses/Standards/Rules/CanUpdateAddress.php +++ b/app/Classes/Modules/Addresses/Standards/Rules/CanUpdateAddress.php @@ -26,7 +26,7 @@ class CanUpdateAddress extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Announcements/Standards/Rules/CanAssignSegment.php b/app/Classes/Modules/Announcements/Standards/Rules/CanAssignSegment.php index 625a07a1..75d9e361 100644 --- a/app/Classes/Modules/Announcements/Standards/Rules/CanAssignSegment.php +++ b/app/Classes/Modules/Announcements/Standards/Rules/CanAssignSegment.php @@ -13,7 +13,7 @@ class CanAssignSegment extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Announcements/Standards/Rules/CanCreateAnnouncement.php b/app/Classes/Modules/Announcements/Standards/Rules/CanCreateAnnouncement.php index a01e0de1..7fe2fddb 100644 --- a/app/Classes/Modules/Announcements/Standards/Rules/CanCreateAnnouncement.php +++ b/app/Classes/Modules/Announcements/Standards/Rules/CanCreateAnnouncement.php @@ -24,7 +24,7 @@ class CanCreateAnnouncement extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { return true; } diff --git a/app/Classes/Modules/Announcements/Standards/Rules/CanDeleteAnnouncement.php b/app/Classes/Modules/Announcements/Standards/Rules/CanDeleteAnnouncement.php index 8a41deab..36d3edc7 100644 --- a/app/Classes/Modules/Announcements/Standards/Rules/CanDeleteAnnouncement.php +++ b/app/Classes/Modules/Announcements/Standards/Rules/CanDeleteAnnouncement.php @@ -10,7 +10,7 @@ class CanDeleteAnnouncement extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Announcements/Standards/Rules/CanListAnnouncements.php b/app/Classes/Modules/Announcements/Standards/Rules/CanListAnnouncements.php index a4c02847..0c47546f 100644 --- a/app/Classes/Modules/Announcements/Standards/Rules/CanListAnnouncements.php +++ b/app/Classes/Modules/Announcements/Standards/Rules/CanListAnnouncements.php @@ -11,7 +11,7 @@ class CanListAnnouncements extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { return true; } diff --git a/app/Classes/Modules/Announcements/Standards/Rules/CanUpdateAnnouncement.php b/app/Classes/Modules/Announcements/Standards/Rules/CanUpdateAnnouncement.php index d861d255..4d20fe3a 100644 --- a/app/Classes/Modules/Announcements/Standards/Rules/CanUpdateAnnouncement.php +++ b/app/Classes/Modules/Announcements/Standards/Rules/CanUpdateAnnouncement.php @@ -26,7 +26,7 @@ class CanUpdateAnnouncement extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Banks/ControllersLogic/UpdateBankLogic.php b/app/Classes/Modules/Banks/ControllersLogic/UpdateBankLogic.php index 8509ed6b..88172f47 100644 --- a/app/Classes/Modules/Banks/ControllersLogic/UpdateBankLogic.php +++ b/app/Classes/Modules/Banks/ControllersLogic/UpdateBankLogic.php @@ -3,21 +3,17 @@ namespace App\Classes\Modules\Banks\ControllersLogic; use App\Http\Resources\BankResource; - use App\Classes\General\Abstracts\AbstractControllerLogic; - use App\Classes\Modules\Banks\Services\FetchesBank; - use App\Classes\Modules\Banks\Standards\Rules\CanUpdateBank; use App\Classes\Modules\Banks\Services\UpdatesBank; +use App\Classes\Modules\Banks\Services\CreatesOrUpdateBank; use App\Classes\Modules\Banks\Services\CreatesBankLog; - +use App\Classes\Modules\Banks\Processors\UpdateBankProcessor; use App\Classes\Modules\Banks\DataTransferObjects\BankObject; - -use ErrorException; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; -use Illuminate\Support\Facades\DB; + class UpdateBankLogic extends AbstractControllerLogic { @@ -44,24 +40,36 @@ class UpdateBankLogic extends AbstractControllerLogic /** @var CreatesBankLog */ private $createsBankLog; + /** @var CreatesOrUpdateBank */ + private $createsOrUpdateBank; + + /** @var UpdateBankProcessor */ + private $updateBankProcessor; + /** * UpdateBankLogic constructor. * @param CanUpdateBank $canUpdateBank * @param UpdatesBank $updatesBank * @param FetchesBank $fetchesBank * @param CreatesBankLog $createsBankLog + * @param CreatesOrUpdateBank $createsOrUpdateBank + * @param UpdateBankProcessor $updateBankProcessor */ public function __construct( CanUpdateBank $canUpdateBank, UpdatesBank $updatesBank, FetchesBank $fetchesBank, - CreatesBankLog $createsBankLog + CreatesBankLog $createsBankLog, + CreatesOrUpdateBank $createsOrUpdateBank, + UpdateBankProcessor $updateBankProcessor ) { $this->canUpdateBank = $canUpdateBank; $this->updatesBank = $updatesBank; $this->fetchesBank = $fetchesBank; $this->createsBankLog = $createsBankLog; + $this->createsOrUpdateBank = $createsOrUpdateBank; + $this->updateBankProcessor = $updateBankProcessor; } /** @@ -74,15 +82,15 @@ class UpdateBankLogic extends AbstractControllerLogic public function logic(Request $request) : JsonResponse { $bankObject = new BankObject( - $request->input('company_id'), + $request->input('company_id'), $request->input('account_type'), $request->input('bank_name'), - $request->input('holder_name'), + $request->input('holder_name'), $request->input('account_no'), - $request->input('bank_branch'), - $request->input('swift'), + $request->input('bank_branch'), + $request->input('swift'), $request->input('snap'), - $request->input('country_id'), + $request->input('country_id'), $request->input('reference') ); @@ -90,12 +98,10 @@ class UpdateBankLogic extends AbstractControllerLogic $this->canUpdateBank->passes($bankObject); - $bank_query = $this->updatesBank->execute($bank, $bankObject); - -// $bankLog = $this->createsBankLog->execute($bank_query); + $bank_query = $this->updateBankProcessor->execute($bankObject, $bank, $request->input('bill_no') ?? '', (int) $request->input('transaction_id') ?? 0 ); return $this->resourceResponse(new BankResource($bank_query)); } -} \ No newline at end of file +} diff --git a/app/Classes/Modules/Banks/ControllersLogic/UpdateBankMetadataLogic.php b/app/Classes/Modules/Banks/ControllersLogic/UpdateBankMetadataLogic.php new file mode 100644 index 00000000..e73d051a --- /dev/null +++ b/app/Classes/Modules/Banks/ControllersLogic/UpdateBankMetadataLogic.php @@ -0,0 +1,67 @@ + 'Update Bank Metadata', + 'message' => 'You have successfully updated the Bank metadata' + ]; + } + + /** @var CanUpdateBankMetadata */ + private $canUpdateBankMetadata; + + /** @var FetchesTransaction */ + private $fetchesTransaction; + + /** + * UpdateBankMetadataLogic constructor. + * @param CanUpdateBankMetadata $canUpdateBankMetadata + * @param FetchesTransaction $fetchesTransaction + */ + public function __construct( + CanUpdateBankMetadata $canUpdateBankMetadata, + FetchesTransaction $fetchesTransaction + ) + { + $this->canUpdateBankMetadata = $canUpdateBankMetadata; + $this->fetchesTransaction = $fetchesTransaction; + } + + /** + * @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 + { + $bankMetadataObject = new BankMetadataObject( + $request->input('transactionId'), + ); + + $this->canUpdateBankMetadata->passes($bankMetadataObject); + + $transaction = $this->fetchesTransaction->execute(['id' => $request->input('transactionId')]); + $transaction->attributesKVP()->delete(); + + return $this->response([]); + } + +} diff --git a/app/Classes/Modules/Banks/DataTransferObjects/BankMetadataObject.php b/app/Classes/Modules/Banks/DataTransferObjects/BankMetadataObject.php new file mode 100644 index 00000000..dae7a61e --- /dev/null +++ b/app/Classes/Modules/Banks/DataTransferObjects/BankMetadataObject.php @@ -0,0 +1,29 @@ +transaction_id = $transaction_id; + } + + /** + * @return int + */ + public function getTransactionId(): int + { + return $this->transaction_id; + } +} diff --git a/app/Classes/Modules/Banks/Processors/UpdateBankProcessor.php b/app/Classes/Modules/Banks/Processors/UpdateBankProcessor.php new file mode 100644 index 00000000..6030c11d --- /dev/null +++ b/app/Classes/Modules/Banks/Processors/UpdateBankProcessor.php @@ -0,0 +1,97 @@ +updatesBank = $updatesBank; + $this->createsOrUpdateBank = $createsOrUpdateBank; + $this->createsKeyValuePair = $createsKeyValuePair; + $this->fetchesTransaction = $fetchesTransaction; + } + + /** + * @param BankObject $bankObject + * @param Bank $bank + * @param string $billNo + * @param int $transactionId + * @return Model + * @throws \App\Classes\Exceptions\MalformedRequestException + * @throws \App\Classes\Exceptions\JobResourceNotFoundException + */ + public function execute(BankObject $bankObject, Bank $bank, string $billNo, int $transactionId) { + $result = null; + if($billNo && $transactionId){ + $transaction = $this->fetchesTransaction->execute(['id' => $transactionId]); + //If payment transaction do not have a bank yet, create one + if(!$transaction->bank){ + $result = $this->createsOrUpdateBank->execute($bankObject); + + // if ($result->wasRecentlyCreated) { + //Key #1 for Bank + $kvp = $bank->attributesKVP()->where('key', 'App\Models\Bank')->where('value', $result->id)->latest()->first(); + if(!$kvp){ + $keyValuePairObject = new KeyValuePairObject( + "App\Models\Bank", + $result->id + ); + $this->createsKeyValuePair->execute($bank, $keyValuePairObject); + } + + //Key #2 for Payment Transaction (owner type: booking) + $keyValuePairObject = new KeyValuePairObject( + "App\Models\Bank", + $result->id + ); + $this->createsKeyValuePair->execute($transaction, $keyValuePairObject); + // } + + } + else{ + $result = $this->updatesBank->execute($transaction->bank, $bankObject); + } + } + else{ + $result = $this->updatesBank->execute($bank, $bankObject); + } + + return $result; + } +} diff --git a/app/Classes/Modules/Banks/Services/CreatesOrUpdateBank.php b/app/Classes/Modules/Banks/Services/CreatesOrUpdateBank.php new file mode 100644 index 00000000..1c582229 --- /dev/null +++ b/app/Classes/Modules/Banks/Services/CreatesOrUpdateBank.php @@ -0,0 +1,44 @@ + $object->getCompanyId(), + 'account_no' => $object->getAccountNo(), + 'reference' => $object->getReference(), + 'bank_name' => $object->getBankName(), + 'holder_name' => $object->getHolderName(), + 'bank_branch' => $object->getBankBranch(), + 'type' => $object->getType(), + 'country_id' => $object->getCountryId(), + 'created_by' => Auth::id(), + 'creator_type' => in_array($user->type, RoleTypes::ADMIN_ROLES) ? RoleTypes::ADMIN : RoleTypes::USER, + ]; + + $values = [ + 'swift' => $object->getSwift(), + 'snap' => $object->getSnap(), + ]; + + $model = Bank::updateOrCreate($attributes, $values); //Bank::firstOrCreate($attributes, $values); + + return $model; + } +} diff --git a/app/Classes/Modules/Banks/Standards/Rules/CanCreateBank.php b/app/Classes/Modules/Banks/Standards/Rules/CanCreateBank.php index 8cef85d8..cc155da8 100644 --- a/app/Classes/Modules/Banks/Standards/Rules/CanCreateBank.php +++ b/app/Classes/Modules/Banks/Standards/Rules/CanCreateBank.php @@ -24,7 +24,7 @@ class CanCreateBank extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { return true; } diff --git a/app/Classes/Modules/Banks/Standards/Rules/CanDeleteBank.php b/app/Classes/Modules/Banks/Standards/Rules/CanDeleteBank.php index 074550e5..82d7b571 100644 --- a/app/Classes/Modules/Banks/Standards/Rules/CanDeleteBank.php +++ b/app/Classes/Modules/Banks/Standards/Rules/CanDeleteBank.php @@ -10,7 +10,7 @@ class CanDeleteBank extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Banks/Standards/Rules/CanListBanks.php b/app/Classes/Modules/Banks/Standards/Rules/CanListBanks.php index d01232e7..f3a8616e 100644 --- a/app/Classes/Modules/Banks/Standards/Rules/CanListBanks.php +++ b/app/Classes/Modules/Banks/Standards/Rules/CanListBanks.php @@ -12,7 +12,7 @@ class CanListBanks extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { return true; } diff --git a/app/Classes/Modules/Banks/Standards/Rules/CanUpdateBank.php b/app/Classes/Modules/Banks/Standards/Rules/CanUpdateBank.php index e7a6d0fc..10f0b653 100644 --- a/app/Classes/Modules/Banks/Standards/Rules/CanUpdateBank.php +++ b/app/Classes/Modules/Banks/Standards/Rules/CanUpdateBank.php @@ -26,7 +26,7 @@ class CanUpdateBank extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Banks/Standards/Rules/CanUpdateBankMetadata.php b/app/Classes/Modules/Banks/Standards/Rules/CanUpdateBankMetadata.php new file mode 100644 index 00000000..d102a763 --- /dev/null +++ b/app/Classes/Modules/Banks/Standards/Rules/CanUpdateBankMetadata.php @@ -0,0 +1,66 @@ +validation = $validation; + } + + /** + * @return bool + */ + protected function authorized($object): bool + { + //cief todo: 66 - temporary workaround + // if (!Auth::user()->can('update bank_metadata')) { + // return false; + // } + + // return true; + + if (in_array(Auth::user()->type, RoleTypes::ADMIN_ROLES)) { + return true; + } + + return false; + } + + /** + * @param BankMetadataObject $object + * @return bool + * @throws \App\Classes\Exceptions\RequestValidationException + */ + protected function validators($object): bool + { + return $this->validation->validate($object); + } + + /** + * @param BankMetadataObject $object + * @return bool + */ + protected function criteria($object): bool + { + return true; + } + +} diff --git a/app/Classes/Modules/Banks/Standards/Validators/BankMetadataValidation.php b/app/Classes/Modules/Banks/Standards/Validators/BankMetadataValidation.php new file mode 100644 index 00000000..37e134c4 --- /dev/null +++ b/app/Classes/Modules/Banks/Standards/Validators/BankMetadataValidation.php @@ -0,0 +1,38 @@ + $object->getTransactionId(), + ]; + } + + /** + * @return array + */ + protected function rules(): array + { + return [ + 'transaction_id' => 'required', + ]; + } + + /** + * @return array + */ + protected function messages(): array + { + return []; + } +} diff --git a/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingLogic.php index 9c13a015..1d3be5c9 100644 --- a/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingLogic.php +++ b/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingLogic.php @@ -2,6 +2,7 @@ namespace App\Classes\Modules\Bookings\ControllersLogic; +use App\Classes\Exceptions\MalformedRequestException; use App\Classes\General\Abstracts\AbstractControllerLogic; use App\Classes\Modules\Companies\Services\FetchesCompany; @@ -15,6 +16,7 @@ use App\Classes\Modules\Bookings\Services\GeneratesBookingMarking; use App\Classes\Modules\Bookings\DataTransferObjects\BookingObject; use App\Classes\Modules\PerfexCRM\Processors\BookingToPerfexCRMProcessor; use App\Classes\Modules\Milestones\Processors\CheckMilestonesForRewardProcessor; +use App\Classes\ValueObjects\Constants\BookingAttributeNames; use App\Classes\ValueObjects\Constants\Milestones; use App\Http\Resources\BookingResource; @@ -84,6 +86,21 @@ class CreateBookingLogic extends AbstractControllerLogic */ public function logic(Request $request) : JsonResponse { + if (in_array($request->input('service_id'), [4, 10])) { + if (!$request['order_reference_no']) { + throw new MalformedRequestException('At least 1 order reference required.'); + } + + if ($request['order_reference_no']) { + foreach ($request['order_reference_no'] as $index => $reference) { + if (!$reference) { + $index += 1; + throw new MalformedRequestException("Order reference {$index} cannot be empty"); + } + } + } + } + $company = $this->fetchesCompany->execute(['id' => $request->input('company_id')]); $object = new BookingObject($request->input('service_id'), $request->input('transferable_bank_id'), $this->generatesBookingMarking->execute(), number_format( floatval(str_replace(',', '', $request->input('fix_amount'))), 5, '.', ''), $request->input('type') === 1 ? $request->input('convertible_currency_id') : 1, $request->input('convertible_currency_id'), 1); @@ -97,6 +114,15 @@ class CreateBookingLogic extends AbstractControllerLogic $this->bookingToPerfexCRMProcessor->execute($booking); } + if (in_array($request->input('service_id'), [4, 10])) { + foreach ($request['order_reference_no'] as $order_reference) { + $booking->modelAttributes()->create([ + 'name' => BookingAttributeNames::ORDER_REFERENCE_NO, + 'value' => $order_reference + ]); + } + } + //cief todo: case study 5 voucherify // $user = $company->employees()->first(); // $this->checkMilestonesForRewardProcessor->execute($user, [Milestones::MILESTONE_5]); diff --git a/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php index a8df7fce..e6bf4f1c 100644 --- a/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php +++ b/app/Classes/Modules/Bookings/ControllersLogic/CreateBookingRefundLogic.php @@ -14,6 +14,7 @@ use App\Classes\General\Abstracts\AbstractControllerLogic; use App\Classes\Modules\Transactions\Services\CreatesTransaction; use App\Classes\Modules\Transactions\Services\FetchesTransaction; use App\Classes\Modules\Bookings\Services\FetchesBookingQuotation; +use App\Classes\Modules\Currencies\DataTransferObjects\CurrencyConversionObject; use App\Classes\Modules\Remarks\DataTransferObjects\RemarkObject; use App\Classes\Modules\Transactions\ControllersLogic\UpdateRefundTransactionStatusLogic; use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus; @@ -100,21 +101,58 @@ class CreateBookingRefundLogic extends AbstractControllerLogic $refund = $transaction->transactions()->refunds()->whereIn('status', [ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::APPROVED])->sum('original_amount'); + $refundInPending = $transaction->transactions()->refunds()->where('status', ApprovalStatus::PENDING_VERIFICATION)->sum('original_amount'); + if($refund + $request->input('amount') > $transaction->original_amount) throw new MalformedRequestException('Your refund must not be greater than '. $transaction->original_amount .'.'); // $transactionRefundCalculationObject = new TransactionRefundCalculationObject($booking, $transaction, $request->input('amount')); // $transactionRefundCalculationObject->init(); - $refundAmount = bcdiv($request->input('amount'), $transaction->currency_rate, 7); - // refund service charges if is fully refund - $isFullyRefund = ($refund + $request->input('amount')) == $transaction->original_amount; - $refundTotal = $isFullyRefund ? $refundAmount + $transaction->service_charge + $transaction->tax : $refundAmount; + if ((float)$request->input('amount') === (float)$transaction->original_amount) { + $refundAmount = $transaction->original_amount / $transaction->currency_rate; + $service_charges_to_refund = $transaction->service_charge; + } else { + $refundAmount = bcdiv($request->input('amount'), $transaction->currency_rate, 7); + + $bookingAmountBeforeCurrentRefund = $booking->fix_amount - $refundInPending; + + $bookingAmountAfterRefunded = $booking->fix_amount - $refundInPending - $request->input('amount'); + + $isFullyRefund = ($refund + $request->input('amount')) == $transaction->original_amount; + + $voucherCode = null; + $redemptionId = null; + + if ($transaction->voucherRedemption) { + // $voucherCode = $transaction->voucherRedemption->voucher->code; + $redemptionId = $transaction->voucherRedemption->redemption_id; + } + + $conversionObjectBeforeCurrentRefund = new CurrencyConversionObject($bookingAmountBeforeCurrentRefund, $booking->convertible_currency_id, $booking->service_id, $booking->fix_currency_id === 1 ? 0:1, $transaction->payment_method); + + $conversionObjectAfterRefund = new CurrencyConversionObject($isFullyRefund ? $request->input('amount') : $bookingAmountAfterRefunded, $booking->convertible_currency_id, $booking->service_id, $booking->fix_currency_id === 1 ? 0:1, $transaction->payment_method); + + $quotationBeforeCurrentRefund = $this->fetchBookingQuotation->execute($booking->company, $conversionObjectBeforeCurrentRefund, $voucherCode, $redemptionId); + + $quotationAfterRefund = $this->fetchBookingQuotation->execute($booking->company, $conversionObjectAfterRefund, $voucherCode, $redemptionId); + + $service_charges_to_refund = $isFullyRefund ? $quotationBeforeCurrentRefund->getServiceCharge() : $quotationBeforeCurrentRefund->getServiceCharge() - $quotationAfterRefund->getServiceCharge(); + } + + // refund service charges if booking is not E2E + $refundTotal = $refundAmount; + + if ($booking->service_id !== 5) { + $refundTotal = $refundTotal + $service_charges_to_refund + $transaction->tax; + } else { + $service_charges_to_refund = 0; + } $object = new TransactionObject($billNumber, TransactionType::REFUND, 1, $booking->company->id, 1, PaymentMethodType::CASH, $refundTotal, $request->input('amount'), 1, $transaction->original_currency_id, $transaction->currency_rate, - 0, 0, null, ApprovalStatus::PENDING_VERIFICATION, [], $transaction->bill_no); + 0, $service_charges_to_refund, null, ApprovalStatus::PENDING_VERIFICATION, [], $transaction->bill_no); $refund_transaction = $this->createsTransaction->execute($transaction, $object); diff --git a/app/Classes/Modules/Bookings/ControllersLogic/UpdateBookingOrderReferenceLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/UpdateBookingOrderReferenceLogic.php new file mode 100644 index 00000000..ab096c69 --- /dev/null +++ b/app/Classes/Modules/Bookings/ControllersLogic/UpdateBookingOrderReferenceLogic.php @@ -0,0 +1,73 @@ + 'Updated Booking Order References', + 'message' => 'You have successfully updated the Booking Order References' + ]; + } + + /** @var FetchesBooking */ + private $fetchesBooking; + + /** + * UpdateBookingOrderReferenceLogic constructor. + * @param FetchesBooking $fetchesBooking + */ + public function __construct(FetchesBooking $fetchesBooking) + { + $this->fetchesBooking = $fetchesBooking; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws MalformedRequestException + */ + public function logic(Request $request) : JsonResponse + { + if (!$request['order_reference_no']) { + throw new MalformedRequestException('At least 1 order reference required.'); + } + + if ($request['order_reference_no']) { + foreach ($request['order_reference_no'] as $index => $reference) { + if (!$reference) { + $index += 1; + throw new MalformedRequestException("Order reference {$index} cannot be empty"); + } + } + } + + $booking = $this->fetchesBooking->execute(['id' => $request->route('id')]); + $booking->modelAttributes()->delete(); + + foreach ($request['order_reference_no'] as $order_reference) { + $booking->modelAttributes()->create([ + 'name' => BookingAttributeNames::ORDER_REFERENCE_NO, + 'value' => $order_reference + ]); + } + + return $this->resourceResponse(new BookingResource($booking)); + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Bookings/Services/FetchesBookingQuotation.php b/app/Classes/Modules/Bookings/Services/FetchesBookingQuotation.php index 5fe85c35..e5535e2a 100644 --- a/app/Classes/Modules/Bookings/Services/FetchesBookingQuotation.php +++ b/app/Classes/Modules/Bookings/Services/FetchesBookingQuotation.php @@ -11,8 +11,10 @@ use App\Classes\Modules\Vouchers\DataTransferObjects\ValidatedVoucherObject; use App\Classes\Modules\Vouchers\DataTransferObjects\ValidateVoucherifyVoucherObject; use App\Classes\Modules\Currencies\Services\FetchesCurrency; use App\Classes\Modules\Vouchers\Services\Voucherify\ValidatesVoucherifyVoucher; +use App\Classes\Modules\Vouchers\Services\Voucherify\FetchesVoucherifyRedemption; use App\Models\Company; use App\Models\Currency; +use Illuminate\Support\Facades\Log; class FetchesBookingQuotation { @@ -26,27 +28,34 @@ class FetchesBookingQuotation /** @var ValidatesVoucherifyVoucher */ private $validatesVoucherifyVoucher; + /** @var FetchesVoucherifyRedemption */ + private $fetchesVoucherifyRedemption; + /** * FetchesBookingQuotation constructor. * @param FetchesCompanyServiceSettings $fetchesCompanyServiceSettings * @param FetchesCurrency $fetchesCurrency + * @param ValidatesVoucherifyVoucher $validatesVoucherifyVoucher + * @param FetchesVoucherifyRedemption $fetchesVoucherifyRedemption */ - public function __construct(FetchesCompanyServiceSettings $fetchesCompanyServiceSettings, FetchesCurrency $fetchesCurrency, ValidatesVoucherifyVoucher $validatesVoucherifyVoucher) + public function __construct(FetchesCompanyServiceSettings $fetchesCompanyServiceSettings, FetchesCurrency $fetchesCurrency, ValidatesVoucherifyVoucher $validatesVoucherifyVoucher, FetchesVoucherifyRedemption $fetchesVoucherifyRedemption) { $this->fetchesCompanyServiceSettings = $fetchesCompanyServiceSettings; $this->fetchesCurrency = $fetchesCurrency; $this->validatesVoucherifyVoucher = $validatesVoucherifyVoucher; + $this->fetchesVoucherifyRedemption = $fetchesVoucherifyRedemption; } /** * @param Company $company * @param CurrencyConversionObject $conversionObject - * @param string $voucherCode + * @param null|string $voucherCode + * @param null|string $redemptionId * @return CalculationObject * @throws MalformedRequestException */ - public function execute(Company $company, CurrencyConversionObject $conversionObject, ?string $voucherCode = null){ + public function execute(Company $company, CurrencyConversionObject $conversionObject, ?string $voucherCode = null, ?string $redemptionId = null){ if($conversionObject->getAmount() <= 0) throw new MalformedRequestException('Your transfer must be greater than zero.'); $configurations = $this->fetchesCompanyServiceSettings->execute($company, $conversionObject); @@ -57,6 +66,8 @@ class FetchesBookingQuotation $calculationObject = new CalculationObject($conversionObject, $configurations, null); + $voucher = null; + //Voucherify if($voucherCode){ $employee = $company->employees()->first(); @@ -68,7 +79,24 @@ class FetchesBookingQuotation "metadata" => $result->metadata, "order" => $result->order, ]; - $validatedVoucherObject = new ValidatedVoucherObject(isset($voucher['metadata']->name) ? $voucher['metadata']->name: "", $voucher['code'], $voucher['discount']->type ?? 'AMOUNT', $voucher['order']->total_discount_amount, $voucher['order']->total_amount); + } + else if($redemptionId){ + $result = $this->fetchesVoucherifyRedemption->execute($redemptionId); + $voucher = [ + "code" => $result->voucher->code ?? null, + "discount" => null, + "metadata" => null, + "order" => $result->order ?? null, + ]; + } + + if($voucher){ + $validatedVoucherObject = new ValidatedVoucherObject( + isset($voucher['metadata']->name) ? $voucher['metadata']->name : "", + $voucher['code'], + $voucher['discount']->type ?? 'AMOUNT', + $voucher['order']->total_discount_amount, + $voucher['order']->total_amount); $calculationObject = new CalculationObject($conversionObject, $configurations, $validatedVoucherObject); } diff --git a/app/Classes/Modules/Bookings/Standards/Rules/CanCreateBooking.php b/app/Classes/Modules/Bookings/Standards/Rules/CanCreateBooking.php index 7871acfe..0f8b7d0d 100644 --- a/app/Classes/Modules/Bookings/Standards/Rules/CanCreateBooking.php +++ b/app/Classes/Modules/Bookings/Standards/Rules/CanCreateBooking.php @@ -25,7 +25,7 @@ class CanCreateBooking extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { return true; } diff --git a/app/Classes/Modules/Bookings/Standards/Rules/CanDeleteBooking.php b/app/Classes/Modules/Bookings/Standards/Rules/CanDeleteBooking.php index d1fcfe15..9ca591f6 100644 --- a/app/Classes/Modules/Bookings/Standards/Rules/CanDeleteBooking.php +++ b/app/Classes/Modules/Bookings/Standards/Rules/CanDeleteBooking.php @@ -11,7 +11,7 @@ class CanDeleteBooking extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules diff --git a/app/Classes/Modules/Bookings/Standards/Rules/CanFetchBooking.php b/app/Classes/Modules/Bookings/Standards/Rules/CanFetchBooking.php index c6f17684..0ac3f447 100644 --- a/app/Classes/Modules/Bookings/Standards/Rules/CanFetchBooking.php +++ b/app/Classes/Modules/Bookings/Standards/Rules/CanFetchBooking.php @@ -13,7 +13,7 @@ class CanFetchBooking extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Bookings/Standards/Rules/CanListBookings.php b/app/Classes/Modules/Bookings/Standards/Rules/CanListBookings.php index a66e9610..2147f321 100644 --- a/app/Classes/Modules/Bookings/Standards/Rules/CanListBookings.php +++ b/app/Classes/Modules/Bookings/Standards/Rules/CanListBookings.php @@ -12,7 +12,7 @@ class CanListBookings extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Bookings/Standards/Rules/CanMergeBooking.php b/app/Classes/Modules/Bookings/Standards/Rules/CanMergeBooking.php index f348346e..973b67d1 100644 --- a/app/Classes/Modules/Bookings/Standards/Rules/CanMergeBooking.php +++ b/app/Classes/Modules/Bookings/Standards/Rules/CanMergeBooking.php @@ -33,7 +33,7 @@ class CanMergeBooking extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { return true; } diff --git a/app/Classes/Modules/Bookings/Standards/Rules/CanUpdateBooking.php b/app/Classes/Modules/Bookings/Standards/Rules/CanUpdateBooking.php index 7158a825..2433cefb 100644 --- a/app/Classes/Modules/Bookings/Standards/Rules/CanUpdateBooking.php +++ b/app/Classes/Modules/Bookings/Standards/Rules/CanUpdateBooking.php @@ -26,7 +26,7 @@ class CanUpdateBooking extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules diff --git a/app/Classes/Modules/Companies/Standards/Rules/CanAssignEmployee.php b/app/Classes/Modules/Companies/Standards/Rules/CanAssignEmployee.php index f34f83ff..79a2a696 100644 --- a/app/Classes/Modules/Companies/Standards/Rules/CanAssignEmployee.php +++ b/app/Classes/Modules/Companies/Standards/Rules/CanAssignEmployee.php @@ -26,7 +26,7 @@ class CanAssignEmployee extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Companies/Standards/Rules/CanAssignSegment.php b/app/Classes/Modules/Companies/Standards/Rules/CanAssignSegment.php index c6dab1d9..892e5d8e 100644 --- a/app/Classes/Modules/Companies/Standards/Rules/CanAssignSegment.php +++ b/app/Classes/Modules/Companies/Standards/Rules/CanAssignSegment.php @@ -24,7 +24,7 @@ class CanAssignSegment extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Companies/Standards/Rules/CanCreateCompany.php b/app/Classes/Modules/Companies/Standards/Rules/CanCreateCompany.php index 75015ff0..1b8a2115 100644 --- a/app/Classes/Modules/Companies/Standards/Rules/CanCreateCompany.php +++ b/app/Classes/Modules/Companies/Standards/Rules/CanCreateCompany.php @@ -24,7 +24,7 @@ class CanCreateCompany extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Companies/Standards/Rules/CanCreateIdentificationDocument.php b/app/Classes/Modules/Companies/Standards/Rules/CanCreateIdentificationDocument.php index 3182408a..eff63893 100644 --- a/app/Classes/Modules/Companies/Standards/Rules/CanCreateIdentificationDocument.php +++ b/app/Classes/Modules/Companies/Standards/Rules/CanCreateIdentificationDocument.php @@ -25,7 +25,7 @@ class CanCreateIdentificationDocument extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Companies/Standards/Rules/CanDeleteCompany.php b/app/Classes/Modules/Companies/Standards/Rules/CanDeleteCompany.php index b2621b4f..cb8dbadf 100644 --- a/app/Classes/Modules/Companies/Standards/Rules/CanDeleteCompany.php +++ b/app/Classes/Modules/Companies/Standards/Rules/CanDeleteCompany.php @@ -13,7 +13,7 @@ class CanDeleteCompany extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Companies/Standards/Rules/CanFetchCompany.php b/app/Classes/Modules/Companies/Standards/Rules/CanFetchCompany.php index 1d2bad1d..ca2c3e69 100644 --- a/app/Classes/Modules/Companies/Standards/Rules/CanFetchCompany.php +++ b/app/Classes/Modules/Companies/Standards/Rules/CanFetchCompany.php @@ -13,7 +13,7 @@ class CanFetchCompany extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Companies/Standards/Rules/CanListCompanies.php b/app/Classes/Modules/Companies/Standards/Rules/CanListCompanies.php index 35cd974c..3c268aa3 100644 --- a/app/Classes/Modules/Companies/Standards/Rules/CanListCompanies.php +++ b/app/Classes/Modules/Companies/Standards/Rules/CanListCompanies.php @@ -13,7 +13,7 @@ class CanListCompanies extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Companies/Standards/Rules/CanUpdateCompany.php b/app/Classes/Modules/Companies/Standards/Rules/CanUpdateCompany.php index c7bd1f70..06b41599 100644 --- a/app/Classes/Modules/Companies/Standards/Rules/CanUpdateCompany.php +++ b/app/Classes/Modules/Companies/Standards/Rules/CanUpdateCompany.php @@ -24,7 +24,7 @@ class CanUpdateCompany extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Contacts/Standards/Rules/CanCreateContact.php b/app/Classes/Modules/Contacts/Standards/Rules/CanCreateContact.php index 9c739feb..dca4874d 100644 --- a/app/Classes/Modules/Contacts/Standards/Rules/CanCreateContact.php +++ b/app/Classes/Modules/Contacts/Standards/Rules/CanCreateContact.php @@ -26,7 +26,7 @@ class CanCreateContact extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Currencies/Standards/Rules/CanCreateCurrency.php b/app/Classes/Modules/Currencies/Standards/Rules/CanCreateCurrency.php index 873e03ce..1fb7b52e 100644 --- a/app/Classes/Modules/Currencies/Standards/Rules/CanCreateCurrency.php +++ b/app/Classes/Modules/Currencies/Standards/Rules/CanCreateCurrency.php @@ -24,7 +24,7 @@ class CanCreateCurrency extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Currencies/Standards/Rules/CanDeleteCurrency.php b/app/Classes/Modules/Currencies/Standards/Rules/CanDeleteCurrency.php index 60820e79..cbd666ab 100644 --- a/app/Classes/Modules/Currencies/Standards/Rules/CanDeleteCurrency.php +++ b/app/Classes/Modules/Currencies/Standards/Rules/CanDeleteCurrency.php @@ -10,7 +10,7 @@ class CanDeleteCurrency extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Currencies/Standards/Rules/CanFetchCurrency.php b/app/Classes/Modules/Currencies/Standards/Rules/CanFetchCurrency.php index 624809ed..1911c901 100644 --- a/app/Classes/Modules/Currencies/Standards/Rules/CanFetchCurrency.php +++ b/app/Classes/Modules/Currencies/Standards/Rules/CanFetchCurrency.php @@ -10,7 +10,7 @@ class CanFetchCurrency extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Currencies/Standards/Rules/CanListCurrency.php b/app/Classes/Modules/Currencies/Standards/Rules/CanListCurrency.php index 38a74f65..e7bde1c1 100644 --- a/app/Classes/Modules/Currencies/Standards/Rules/CanListCurrency.php +++ b/app/Classes/Modules/Currencies/Standards/Rules/CanListCurrency.php @@ -10,7 +10,7 @@ class CanListCurrency extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules diff --git a/app/Classes/Modules/Currencies/Standards/Rules/CanUpdateCurrency.php b/app/Classes/Modules/Currencies/Standards/Rules/CanUpdateCurrency.php index d7e2ca93..7d098f7b 100644 --- a/app/Classes/Modules/Currencies/Standards/Rules/CanUpdateCurrency.php +++ b/app/Classes/Modules/Currencies/Standards/Rules/CanUpdateCurrency.php @@ -26,7 +26,7 @@ class CanUpdateCurrency extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Currencies/Standards/Rules/Rates/CanCreateRate.php b/app/Classes/Modules/Currencies/Standards/Rules/Rates/CanCreateRate.php index cf63f89c..69c2110b 100644 --- a/app/Classes/Modules/Currencies/Standards/Rules/Rates/CanCreateRate.php +++ b/app/Classes/Modules/Currencies/Standards/Rules/Rates/CanCreateRate.php @@ -25,7 +25,7 @@ class CanCreateRate extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules if (!Auth::user()->can('add currency_rate')) { diff --git a/app/Classes/Modules/Currencies/Standards/Rules/Rates/CanDeleteRate.php b/app/Classes/Modules/Currencies/Standards/Rules/Rates/CanDeleteRate.php index 37fff506..cfc2b769 100644 --- a/app/Classes/Modules/Currencies/Standards/Rules/Rates/CanDeleteRate.php +++ b/app/Classes/Modules/Currencies/Standards/Rules/Rates/CanDeleteRate.php @@ -11,7 +11,7 @@ class CanDeleteRate extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules diff --git a/app/Classes/Modules/Currencies/Standards/Rules/Rates/CanFetchRate.php b/app/Classes/Modules/Currencies/Standards/Rules/Rates/CanFetchRate.php index 4006e36f..0d6457fe 100644 --- a/app/Classes/Modules/Currencies/Standards/Rules/Rates/CanFetchRate.php +++ b/app/Classes/Modules/Currencies/Standards/Rules/Rates/CanFetchRate.php @@ -13,7 +13,7 @@ class CanFetchRate extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Currencies/Standards/Rules/Rates/CanListRates.php b/app/Classes/Modules/Currencies/Standards/Rules/Rates/CanListRates.php index bd49c263..b06950cb 100644 --- a/app/Classes/Modules/Currencies/Standards/Rules/Rates/CanListRates.php +++ b/app/Classes/Modules/Currencies/Standards/Rules/Rates/CanListRates.php @@ -11,7 +11,7 @@ class CanListRates extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules diff --git a/app/Classes/Modules/Currencies/Standards/Rules/Rates/CanUpdateRate.php b/app/Classes/Modules/Currencies/Standards/Rules/Rates/CanUpdateRate.php index 8a153c54..c777b0af 100644 --- a/app/Classes/Modules/Currencies/Standards/Rules/Rates/CanUpdateRate.php +++ b/app/Classes/Modules/Currencies/Standards/Rules/Rates/CanUpdateRate.php @@ -26,7 +26,7 @@ class CanUpdateRate extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules diff --git a/app/Classes/Modules/Documents/Standards/Rules/CanApproveDocument.php b/app/Classes/Modules/Documents/Standards/Rules/CanApproveDocument.php index 544b605c..66d75000 100644 --- a/app/Classes/Modules/Documents/Standards/Rules/CanApproveDocument.php +++ b/app/Classes/Modules/Documents/Standards/Rules/CanApproveDocument.php @@ -12,7 +12,7 @@ class CanApproveDocument extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Documents/Standards/Rules/CanCreateDocument.php b/app/Classes/Modules/Documents/Standards/Rules/CanCreateDocument.php index abac99e3..862f79f4 100644 --- a/app/Classes/Modules/Documents/Standards/Rules/CanCreateDocument.php +++ b/app/Classes/Modules/Documents/Standards/Rules/CanCreateDocument.php @@ -25,7 +25,7 @@ class CanCreateDocument extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Documents/Standards/Rules/CanCreateFile.php b/app/Classes/Modules/Documents/Standards/Rules/CanCreateFile.php index d029cf2a..6016b65e 100644 --- a/app/Classes/Modules/Documents/Standards/Rules/CanCreateFile.php +++ b/app/Classes/Modules/Documents/Standards/Rules/CanCreateFile.php @@ -25,7 +25,7 @@ class CanCreateFile extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Documents/Standards/Rules/CanDeleteDocument.php b/app/Classes/Modules/Documents/Standards/Rules/CanDeleteDocument.php index e5bc4891..94d88ee8 100644 --- a/app/Classes/Modules/Documents/Standards/Rules/CanDeleteDocument.php +++ b/app/Classes/Modules/Documents/Standards/Rules/CanDeleteDocument.php @@ -12,7 +12,7 @@ class CanDeleteDocument extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Documents/Standards/Rules/CanListDocuments.php b/app/Classes/Modules/Documents/Standards/Rules/CanListDocuments.php index f5145df6..ab2806df 100644 --- a/app/Classes/Modules/Documents/Standards/Rules/CanListDocuments.php +++ b/app/Classes/Modules/Documents/Standards/Rules/CanListDocuments.php @@ -10,7 +10,7 @@ class CanListDocuments extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { /* diff --git a/app/Classes/Modules/Documents/Standards/Rules/CanRenderDocument.php b/app/Classes/Modules/Documents/Standards/Rules/CanRenderDocument.php index 0275d6f9..c01f2143 100644 --- a/app/Classes/Modules/Documents/Standards/Rules/CanRenderDocument.php +++ b/app/Classes/Modules/Documents/Standards/Rules/CanRenderDocument.php @@ -10,7 +10,7 @@ class CanRenderDocument extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Documents/Standards/Rules/CanUpdateDocument.php b/app/Classes/Modules/Documents/Standards/Rules/CanUpdateDocument.php index f07fb166..8171cb95 100644 --- a/app/Classes/Modules/Documents/Standards/Rules/CanUpdateDocument.php +++ b/app/Classes/Modules/Documents/Standards/Rules/CanUpdateDocument.php @@ -25,7 +25,7 @@ class CanUpdateDocument extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Documents/Standards/Rules/CanUpdateDocumentReference.php b/app/Classes/Modules/Documents/Standards/Rules/CanUpdateDocumentReference.php index e6a29785..5feb6e1c 100644 --- a/app/Classes/Modules/Documents/Standards/Rules/CanUpdateDocumentReference.php +++ b/app/Classes/Modules/Documents/Standards/Rules/CanUpdateDocumentReference.php @@ -11,7 +11,7 @@ class CanUpdateDocumentReference extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Exports/Services/ExportsAnalyticBillingTransactions.php b/app/Classes/Modules/Exports/Services/ExportsAnalyticBillingTransactions.php index af4c88c4..d368574f 100644 --- a/app/Classes/Modules/Exports/Services/ExportsAnalyticBillingTransactions.php +++ b/app/Classes/Modules/Exports/Services/ExportsAnalyticBillingTransactions.php @@ -65,8 +65,12 @@ class ExportsAnalyticBillingTransactions implements FromCollection, WithHeadings $bill = $transaction; $payment = $transaction->owner; $booking = $payment->owner; + $bank = $booking->bank; //cief todo: 66 + if($payment->bank){ + $bank = $payment->bank; + } $company = $booking->company; - $ecommerce = str::contains($booking->bank->bank_name, ['浙江网商银行']); + $ecommerce = str::contains($bank->bank_name, ['浙江网商银行']); return [ $booking->id, @@ -88,4 +92,4 @@ class ExportsAnalyticBillingTransactions implements FromCollection, WithHeadings $bill->created_at ]; } -} \ No newline at end of file +} diff --git a/app/Classes/Modules/Milestones/Processors/CheckMilestonesForRewardProcessor.php b/app/Classes/Modules/Milestones/Processors/CheckMilestonesForRewardProcessor.php index 1a138dfa..0ae5629c 100644 --- a/app/Classes/Modules/Milestones/Processors/CheckMilestonesForRewardProcessor.php +++ b/app/Classes/Modules/Milestones/Processors/CheckMilestonesForRewardProcessor.php @@ -156,7 +156,7 @@ class CheckMilestonesForRewardProcessor $voucherEndDate = $result->expiration_date; //create voucher - $voucherObject = new VoucherObject($result->code, isset($voucherName) ? $voucherName : "", $voucherType, $voucherValue, $voucherStartDate, $voucherEndDate); + $voucherObject = new VoucherObject($result->code, isset($voucherName) ? $voucherName : "", $voucherType, $voucherValue, null, $voucherStartDate, $voucherEndDate); $voucher = $this->createsVoucher->execute($voucherObject); if(!$voucher) $voucher = $this->fetchesVoucher->execute(['code' => $voucherObject->getCode()]); $voucherId = $voucher->id; diff --git a/app/Classes/Modules/Milestones/Standards/Rules/CanAssignReward.php b/app/Classes/Modules/Milestones/Standards/Rules/CanAssignReward.php index 35e8b31d..464f5f55 100644 --- a/app/Classes/Modules/Milestones/Standards/Rules/CanAssignReward.php +++ b/app/Classes/Modules/Milestones/Standards/Rules/CanAssignReward.php @@ -27,7 +27,7 @@ class CanAssignReward extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { if (!Auth::user()->can('edit milestone')) { return false; diff --git a/app/Classes/Modules/Milestones/Standards/Rules/CanCreateMilestone.php b/app/Classes/Modules/Milestones/Standards/Rules/CanCreateMilestone.php index be25b64f..7b63a3ef 100644 --- a/app/Classes/Modules/Milestones/Standards/Rules/CanCreateMilestone.php +++ b/app/Classes/Modules/Milestones/Standards/Rules/CanCreateMilestone.php @@ -25,7 +25,7 @@ class CanCreateMilestone extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { if (!Auth::user()->can('add milestone')) { return false; diff --git a/app/Classes/Modules/Milestones/Standards/Rules/CanDeleteMilestone.php b/app/Classes/Modules/Milestones/Standards/Rules/CanDeleteMilestone.php index c0c7fde7..2869d10f 100644 --- a/app/Classes/Modules/Milestones/Standards/Rules/CanDeleteMilestone.php +++ b/app/Classes/Modules/Milestones/Standards/Rules/CanDeleteMilestone.php @@ -11,7 +11,7 @@ class CanDeleteMilestone extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { if (!Auth::user()->can('delete milestone')) { return false; diff --git a/app/Classes/Modules/Milestones/Standards/Rules/CanUpdateMilestone.php b/app/Classes/Modules/Milestones/Standards/Rules/CanUpdateMilestone.php index 9f7db714..62b4df95 100644 --- a/app/Classes/Modules/Milestones/Standards/Rules/CanUpdateMilestone.php +++ b/app/Classes/Modules/Milestones/Standards/Rules/CanUpdateMilestone.php @@ -25,7 +25,7 @@ class CanUpdateMilestone extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { if (!Auth::user()->can('edit milestone')) { return false; diff --git a/app/Classes/Modules/Receipts/Standards/Rules/CanCreateReceipt.php b/app/Classes/Modules/Receipts/Standards/Rules/CanCreateReceipt.php index ea6b4f02..37d24609 100644 --- a/app/Classes/Modules/Receipts/Standards/Rules/CanCreateReceipt.php +++ b/app/Classes/Modules/Receipts/Standards/Rules/CanCreateReceipt.php @@ -23,7 +23,7 @@ class CanCreateReceipt extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Receipts/Standards/Rules/CanCreateReceiptDetail.php b/app/Classes/Modules/Receipts/Standards/Rules/CanCreateReceiptDetail.php index 71466752..4c38c481 100644 --- a/app/Classes/Modules/Receipts/Standards/Rules/CanCreateReceiptDetail.php +++ b/app/Classes/Modules/Receipts/Standards/Rules/CanCreateReceiptDetail.php @@ -23,7 +23,7 @@ class CanCreateReceiptDetail extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Remarks/Standards/Rules/CanCreateRemark.php b/app/Classes/Modules/Remarks/Standards/Rules/CanCreateRemark.php index fc51178f..a7d2e5b1 100644 --- a/app/Classes/Modules/Remarks/Standards/Rules/CanCreateRemark.php +++ b/app/Classes/Modules/Remarks/Standards/Rules/CanCreateRemark.php @@ -26,7 +26,7 @@ class CanCreateRemark extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Remarks/Standards/Rules/CanDeleteRemark.php b/app/Classes/Modules/Remarks/Standards/Rules/CanDeleteRemark.php index 7ddece31..1c61ac9d 100644 --- a/app/Classes/Modules/Remarks/Standards/Rules/CanDeleteRemark.php +++ b/app/Classes/Modules/Remarks/Standards/Rules/CanDeleteRemark.php @@ -13,7 +13,7 @@ class CanDeleteRemark extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Remarks/Standards/Rules/CanFetchRemark.php b/app/Classes/Modules/Remarks/Standards/Rules/CanFetchRemark.php index 6642611c..31ae8301 100644 --- a/app/Classes/Modules/Remarks/Standards/Rules/CanFetchRemark.php +++ b/app/Classes/Modules/Remarks/Standards/Rules/CanFetchRemark.php @@ -13,7 +13,7 @@ class CanFetchRemark extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Remarks/Standards/Rules/CanListRemarks.php b/app/Classes/Modules/Remarks/Standards/Rules/CanListRemarks.php index 4911a53b..b1372049 100644 --- a/app/Classes/Modules/Remarks/Standards/Rules/CanListRemarks.php +++ b/app/Classes/Modules/Remarks/Standards/Rules/CanListRemarks.php @@ -13,7 +13,7 @@ class CanListRemarks extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Remarks/Standards/Rules/CanUpdateRemark.php b/app/Classes/Modules/Remarks/Standards/Rules/CanUpdateRemark.php index 8a8c10e8..f6fd6587 100644 --- a/app/Classes/Modules/Remarks/Standards/Rules/CanUpdateRemark.php +++ b/app/Classes/Modules/Remarks/Standards/Rules/CanUpdateRemark.php @@ -26,7 +26,7 @@ class CanUpdateRemark extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Rewards/Standards/Rules/CanCreateReward.php b/app/Classes/Modules/Rewards/Standards/Rules/CanCreateReward.php index 5249b35c..2479f7df 100644 --- a/app/Classes/Modules/Rewards/Standards/Rules/CanCreateReward.php +++ b/app/Classes/Modules/Rewards/Standards/Rules/CanCreateReward.php @@ -25,7 +25,7 @@ class CanCreateReward extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { if (!Auth::user()->can('add reward')) { return false; diff --git a/app/Classes/Modules/Rewards/Standards/Rules/CanDeleteReward.php b/app/Classes/Modules/Rewards/Standards/Rules/CanDeleteReward.php index 888b0d1e..71a29b4c 100644 --- a/app/Classes/Modules/Rewards/Standards/Rules/CanDeleteReward.php +++ b/app/Classes/Modules/Rewards/Standards/Rules/CanDeleteReward.php @@ -11,7 +11,7 @@ class CanDeleteReward extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { if (!Auth::user()->can('delete reward')) { return false; diff --git a/app/Classes/Modules/Segments/Standards/Rules/CanCreateConstant.php b/app/Classes/Modules/Segments/Standards/Rules/CanCreateConstant.php index 55f9c61a..c1619917 100644 --- a/app/Classes/Modules/Segments/Standards/Rules/CanCreateConstant.php +++ b/app/Classes/Modules/Segments/Standards/Rules/CanCreateConstant.php @@ -25,7 +25,7 @@ class CanCreateConstant extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Segments/Standards/Rules/CanCreateSegment.php b/app/Classes/Modules/Segments/Standards/Rules/CanCreateSegment.php index f7b05a10..82a783bc 100644 --- a/app/Classes/Modules/Segments/Standards/Rules/CanCreateSegment.php +++ b/app/Classes/Modules/Segments/Standards/Rules/CanCreateSegment.php @@ -25,7 +25,7 @@ class CanCreateSegment extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules if (!Auth::user()->can('add segment')) { diff --git a/app/Classes/Modules/Segments/Standards/Rules/CanDeleteSegment.php b/app/Classes/Modules/Segments/Standards/Rules/CanDeleteSegment.php index 9faf4da6..5a8adf70 100644 --- a/app/Classes/Modules/Segments/Standards/Rules/CanDeleteSegment.php +++ b/app/Classes/Modules/Segments/Standards/Rules/CanDeleteSegment.php @@ -11,7 +11,7 @@ class CanDeleteSegment extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules diff --git a/app/Classes/Modules/Segments/Standards/Rules/CanFetchSegment.php b/app/Classes/Modules/Segments/Standards/Rules/CanFetchSegment.php index e6756305..c3449de1 100644 --- a/app/Classes/Modules/Segments/Standards/Rules/CanFetchSegment.php +++ b/app/Classes/Modules/Segments/Standards/Rules/CanFetchSegment.php @@ -13,7 +13,7 @@ class CanFetchSegment extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Segments/Standards/Rules/CanListSegments.php b/app/Classes/Modules/Segments/Standards/Rules/CanListSegments.php index 9d01231d..88cf4369 100644 --- a/app/Classes/Modules/Segments/Standards/Rules/CanListSegments.php +++ b/app/Classes/Modules/Segments/Standards/Rules/CanListSegments.php @@ -10,7 +10,7 @@ class CanListSegments extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { return true; } diff --git a/app/Classes/Modules/Segments/Standards/Rules/CanUpdateConstant.php b/app/Classes/Modules/Segments/Standards/Rules/CanUpdateConstant.php index 650b249c..85841dec 100644 --- a/app/Classes/Modules/Segments/Standards/Rules/CanUpdateConstant.php +++ b/app/Classes/Modules/Segments/Standards/Rules/CanUpdateConstant.php @@ -26,7 +26,7 @@ class CanUpdateConstant extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Segments/Standards/Rules/CanUpdateSegment.php b/app/Classes/Modules/Segments/Standards/Rules/CanUpdateSegment.php index 8287dfd6..81823722 100644 --- a/app/Classes/Modules/Segments/Standards/Rules/CanUpdateSegment.php +++ b/app/Classes/Modules/Segments/Standards/Rules/CanUpdateSegment.php @@ -27,7 +27,7 @@ class CanUpdateSegment extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules diff --git a/app/Classes/Modules/ServiceTypes/Standards/Rules/CanCreateServiceType.php b/app/Classes/Modules/ServiceTypes/Standards/Rules/CanCreateServiceType.php index 0fb57c32..5b7f68fc 100644 --- a/app/Classes/Modules/ServiceTypes/Standards/Rules/CanCreateServiceType.php +++ b/app/Classes/Modules/ServiceTypes/Standards/Rules/CanCreateServiceType.php @@ -26,7 +26,7 @@ class CanCreateServiceType extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/ServiceTypes/Standards/Rules/CanDeleteServiceType.php b/app/Classes/Modules/ServiceTypes/Standards/Rules/CanDeleteServiceType.php index 1a832257..a5325dbd 100644 --- a/app/Classes/Modules/ServiceTypes/Standards/Rules/CanDeleteServiceType.php +++ b/app/Classes/Modules/ServiceTypes/Standards/Rules/CanDeleteServiceType.php @@ -13,7 +13,7 @@ class CanDeleteServiceType extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/ServiceTypes/Standards/Rules/CanFetchServiceType.php b/app/Classes/Modules/ServiceTypes/Standards/Rules/CanFetchServiceType.php index e76497c8..61963bd1 100644 --- a/app/Classes/Modules/ServiceTypes/Standards/Rules/CanFetchServiceType.php +++ b/app/Classes/Modules/ServiceTypes/Standards/Rules/CanFetchServiceType.php @@ -13,7 +13,7 @@ class CanFetchServiceType extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/ServiceTypes/Standards/Rules/CanListServiceTypes.php b/app/Classes/Modules/ServiceTypes/Standards/Rules/CanListServiceTypes.php index 44dc0e8b..e55c42d9 100644 --- a/app/Classes/Modules/ServiceTypes/Standards/Rules/CanListServiceTypes.php +++ b/app/Classes/Modules/ServiceTypes/Standards/Rules/CanListServiceTypes.php @@ -13,7 +13,7 @@ class CanListServiceTypes extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/ServiceTypes/Standards/Rules/CanUpdateServiceType.php b/app/Classes/Modules/ServiceTypes/Standards/Rules/CanUpdateServiceType.php index 0e066109..f7e01f25 100644 --- a/app/Classes/Modules/ServiceTypes/Standards/Rules/CanUpdateServiceType.php +++ b/app/Classes/Modules/ServiceTypes/Standards/Rules/CanUpdateServiceType.php @@ -26,7 +26,7 @@ class CanUpdateServiceType extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Transactions/ControllersLogic/CancelBillGroupLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/CancelBillGroupLogic.php new file mode 100644 index 00000000..615ae342 --- /dev/null +++ b/app/Classes/Modules/Transactions/ControllersLogic/CancelBillGroupLogic.php @@ -0,0 +1,66 @@ + 'Cancel Bill Group Transaction', + 'message' => 'You have successfully cancelled this Bill Group Transaction' + ]; + } + + /** @var FetchesBillGroup */ + private $fetchesBillGroup; + + /** @var UpdatesTransactionStatus */ + private $updatesTransactionStatus; + + /** + * CancelBillGroupLogic constructor. + * @param FetchesBillGroup $fetchesBillGroup + * @param UpdatesTransactionStatus $updatesTransactionStatus + */ + public function __construct(FetchesBillGroup $fetchesBillGroup, UpdatesTransactionStatus $updatesTransactionStatus) + { + $this->fetchesBillGroup = $fetchesBillGroup; + $this->updatesTransactionStatus = $updatesTransactionStatus; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\MalformedRequestException + */ + public function logic(Request $request) : JsonResponse + { + $billGroup = $this->fetchesBillGroup->execute(['id' => $request->route('id')]); + + $transactions = $billGroup->transactions()->get(); + + foreach($transactions as $transaction) { + if ($transaction->status === ApprovalStatus::APPROVED || $transaction->status === ApprovalStatus::COMPLETED) { + $this->updatesTransactionStatus->execute($transaction, ApprovalStatus::PENDING_VERIFICATION); + } + } + + $billGroup->status = ApprovalStatus::PENDING_VERIFICATION; + $billGroup->save(); + + return $this->resourceResponse(new BillGroupResource($billGroup)); + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierBillGroupLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierBillGroupLogic.php index 6213f55f..db433e0a 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierBillGroupLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierBillGroupLogic.php @@ -34,7 +34,8 @@ class CreateSupplierBillGroupLogic extends AbstractControllerLogic /** * @return array */ - protected function notification():array { + protected function notification(): array + { return [ 'title' => 'Create Supplier White Form Order', 'message' => 'You have successfully created currency supplier white form order' @@ -84,7 +85,7 @@ class CreateSupplierBillGroupLogic extends AbstractControllerLogic $this->updatesTransactionStatus = $updatesTransactionStatus; } - public function logic(Request $request) : JsonResponse + public function logic(Request $request): JsonResponse { $supplier = $this->fetchesCompany->execute(['id' => $request->route('id')]); @@ -118,28 +119,28 @@ class CreateSupplierBillGroupLogic extends AbstractControllerLogic $service_charges = 0; - if ($supplier->id === 4548 || $supplier->id === 2729) { - $amount = round(floatval(str_replace(',', '', $request->input('payment_total'))), 2); - } else { - $service_charges = round(floatval(str_replace(',', '', $request->input('service_charges'))), 2); - } - + // if ($supplier->id === 4548 || $supplier->id === 2729) { + // $amount = round(floatval(str_replace(',', '', $request->input('payment_total'))), 2); + // } else { + $service_charges = round(floatval(str_replace(',', '', $request->input('service_charges'))), 2); + // } + $rate = $original_amount / $amount; - if ($supplier->id === 4548 || $supplier->id === 2729) { - $request['rate'] = $rate; - $request['supplier_id'] = $supplier->id; - foreach ($payments as $payment) { - $request->route()->setParameter('id', $payment['id']); - $this->updateGroupLogic->execute($request); - } - } - + // if ($supplier->id === 4548 || $supplier->id === 2729) { + // $request['rate'] = $rate; + // $request['supplier_id'] = $supplier->id; + // foreach ($payments as $payment) { + // $request->route()->setParameter('id', $payment['id']); + // $this->updateGroupLogic->execute($request); + // } + // } + $billGroup = new BillGroup(); $billGroup->issuer = $supplier->id; $billGroup->receiver = 1; $billGroup->reference = $this->generatesTransactionBillNumber->execute('BSPO-'); - $billGroup->amount = $amount; + $billGroup->amount = $amount + $service_charges; $billGroup->original_amount = $original_amount; $billGroup->currency_id = 1; $billGroup->original_currency_id = $payments[0]['original_currency']['id']; @@ -153,7 +154,7 @@ class CreateSupplierBillGroupLogic extends AbstractControllerLogic $billGroup->groups()->sync($payment['id'], false); } - //create bill refund + //create bill refund $amount += $service_charges; foreach ($supplierRefunds as $supplierRefund) { @@ -179,17 +180,33 @@ class CreateSupplierBillGroupLogic extends AbstractControllerLogic $billNumber = $this->generatesTransactionBillNumber->execute('BRFD-'); - $object = new TransactionObject($billNumber, TransactionType::BILL_REFUND, $supplier->id, 1, - 1, PaymentMethodType::CASH, - $deductedRefundAmount, $deductedRefundOriginalAmount, $refund->currency_id, - $refund->original_currency_id, $deductedRefundOriginalAmount / $deductedRefundAmount, - 0, 0, null, ApprovalStatus::APPROVED, []); + $object = new TransactionObject( + $billNumber, + TransactionType::BILL_REFUND, + $supplier->id, + 1, + 1, + PaymentMethodType::CASH, + $deductedRefundAmount, + $deductedRefundOriginalAmount, + $refund->currency_id, + $refund->original_currency_id, + $deductedRefundOriginalAmount / $deductedRefundAmount, + 0, + 0, + null, + ApprovalStatus::APPROVED, + [] + ); $transaction = $this->createsTransaction->execute($refund, $object); $billGroup->billRefunds()->sync($transaction->id, false); } + $billGroup->amount = $amount; + $billGroup->save(); + return $this->response([]); } } diff --git a/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierTransactionLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierTransactionLogic.php index ca0f77fd..a9297894 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierTransactionLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierTransactionLogic.php @@ -28,7 +28,8 @@ class CreateSupplierTransactionLogic extends AbstractControllerLogic /** * @return array */ - protected function notification():array { + protected function notification(): array + { return [ 'title' => 'Create Supplier Transactions', 'message' => 'You have successfully created currency supplier transactions' @@ -73,7 +74,7 @@ class CreateSupplierTransactionLogic extends AbstractControllerLogic $this->fetchesTransaction = $fetchesTransaction; } - public function logic(Request $request) : JsonResponse + public function logic(Request $request): JsonResponse { $supplier = $this->fetchesCompany->execute(['id' => $request->route('id')]); @@ -83,7 +84,7 @@ class CreateSupplierTransactionLogic extends AbstractControllerLogic $payments = $request->input('payments'); // todo-refund: activate this for partial refund - foreach($payments as $payment){ + foreach ($payments as $payment) { $payment = $this->fetchesTransaction->execute(['id' => $payment['id']]); $pendingRefundRequest = $payment->transactions()->refunds()->where('status', ApprovalStatus::PENDING_VERIFICATION)->first(); @@ -101,7 +102,7 @@ class CreateSupplierTransactionLogic extends AbstractControllerLogic $this->createSupplierTransactionProcessor->execute($supplier, $rate, $payments); - if(!count($this->createSupplierTransactionProcessor->getBills())) return $this->response([]); + if (!count($this->createSupplierTransactionProcessor->getBills())) return $this->response([]); $group = new Group(); $group->save(); @@ -131,7 +132,7 @@ class CreateSupplierTransactionLogic extends AbstractControllerLogic $transferFee = (float)$this->createSupplierTransactionProcessor->getTransferTransactions()->sum('service_charge'); $original_amount += $transferFee; - $amount += $transferFee / $currency_rate; + $amount = $amount + ($transferFee / $currency_rate) + $service_charge; $group->issuer = $issuer; $group->receiver = $receiver; @@ -150,7 +151,7 @@ class CreateSupplierTransactionLogic extends AbstractControllerLogic $object = new DocumentObject( DocumentType::CURRENCY_VENDOR_ORDER, - [chunk_split('data:application/pdf;base64,'.base64_encode($pdf->output()))], + [chunk_split('data:application/pdf;base64,' . base64_encode($pdf->output()))], '', ApprovalStatus::COMPLETED, 'currency_vendor_order' diff --git a/app/Classes/Modules/Transactions/ControllersLogic/UpdateGroupLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/UpdateGroupLogic.php index 8e16233b..431e1867 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/UpdateGroupLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/UpdateGroupLogic.php @@ -26,6 +26,7 @@ use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use ErrorException; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Log; use Mccarlosen\LaravelMpdf\Facades\LaravelMpdf; class UpdateGroupLogic extends AbstractControllerLogic @@ -223,7 +224,7 @@ class UpdateGroupLogic extends AbstractControllerLogic $group->issuer = $supplier->id; $group->original_amount = $group->transactions()->sum('original_amount') + ((float)$transferFeeTransactions->sum('service_charge') + (float)$group_transfer_fee_original_amount); - $group->amount = $group->transactions()->sum('amount') + (((float)$transferFeeTransactions->sum('service_charge') + (float)$group_transfer_fee_original_amount) / $rate); + $group->amount = $group->transactions()->sum('amount') + (((float)$transferFeeTransactions->sum('service_charge') + (float)$group_transfer_fee_original_amount) / $rate) + $group->transactions()->sum('service_charge'); $group->currency_rate = $rate; $group->tax = $group->transactions()->sum('tax'); $group->service_charge = $group->transactions()->sum('service_charge'); diff --git a/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php index 771113c5..d2b921d1 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/UpdateRefundTransactionStatusLogic.php @@ -100,7 +100,7 @@ class UpdateRefundTransactionStatusLogic extends AbstractControllerLogic $booking = $paymentTransaction->owner; - $reference = $refundTransaction->amount - $paymentTransaction->amount < 0.01 ? 'Fully Refund for Ref. ' . $booking->marking : 'Partially Refund for Ref. ' . $booking->marking; + $reference = $paymentTransaction->amount - $refundTransaction->amount < 0.01 ? 'Fully Refund for Ref. ' . $booking->marking : 'Partially Refund for Ref. ' . $booking->marking; $refundAmount = $this->calculatesBookingRefundAmount->calculateRefundAmount($paymentTransaction, $booking->fix_currency_id); diff --git a/app/Classes/Modules/Transactions/Services/CalculatesBillGroupPaymentAmount.php b/app/Classes/Modules/Transactions/Services/CalculatesBillGroupPaymentAmount.php index f41de813..d0e7dfcf 100644 --- a/app/Classes/Modules/Transactions/Services/CalculatesBillGroupPaymentAmount.php +++ b/app/Classes/Modules/Transactions/Services/CalculatesBillGroupPaymentAmount.php @@ -12,7 +12,7 @@ class CalculatesBillGroupPaymentAmount $bill_refund_amount = round(floatval($billGroup->billRefunds->sum('amount')), 7); $floating_amount = round(floatval($billGroup->transactions()->whereIn('status', [ApprovalStatus::PENDING_SUBMISSION, ApprovalStatus::PENDING_VERIFICATION])->sum('amount')), 7); $paid_amount = round(floatval($billGroup->transactions()->where('status', ApprovalStatus::APPROVED)->sum('amount')), 7); - $outstanding_amount = $billGroup->amount - $bill_refund_amount - $paid_amount - $floating_amount + $billGroup->service_charge; + $outstanding_amount = $billGroup->amount - $paid_amount - $floating_amount; $outstanding_amount = round($outstanding_amount, 7); return [ diff --git a/app/Classes/Modules/Transactions/Standards/Rules/CanCreateTransaction.php b/app/Classes/Modules/Transactions/Standards/Rules/CanCreateTransaction.php index 39fdd05a..c8f24a8e 100644 --- a/app/Classes/Modules/Transactions/Standards/Rules/CanCreateTransaction.php +++ b/app/Classes/Modules/Transactions/Standards/Rules/CanCreateTransaction.php @@ -23,7 +23,7 @@ class CanCreateTransaction extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Transactions/Standards/Rules/CanCreateTransactionDetail.php b/app/Classes/Modules/Transactions/Standards/Rules/CanCreateTransactionDetail.php index 2669ffbf..537d2813 100644 --- a/app/Classes/Modules/Transactions/Standards/Rules/CanCreateTransactionDetail.php +++ b/app/Classes/Modules/Transactions/Standards/Rules/CanCreateTransactionDetail.php @@ -23,7 +23,7 @@ class CanCreateTransactionDetail extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Vouchers/ControllersLogic/CreateVoucherLogic.php b/app/Classes/Modules/Vouchers/ControllersLogic/CreateVoucherLogic.php index a5d65544..5c85895a 100644 --- a/app/Classes/Modules/Vouchers/ControllersLogic/CreateVoucherLogic.php +++ b/app/Classes/Modules/Vouchers/ControllersLogic/CreateVoucherLogic.php @@ -6,9 +6,31 @@ namespace App\Classes\Modules\Vouchers\ControllersLogic; use App\Classes\Exceptions\MalformedRequestException; use App\Classes\General\Abstracts\AbstractControllerLogic; use App\Classes\Modules\Vouchers\Processors\CreateVoucherProcessor; +use App\Classes\Modules\Vouchers\Services\Voucherify\FetchesVoucherifyVoucher; +use App\Classes\Modules\Vouchers\Services\Voucherify\ValidatesVoucherifyVoucher; +use App\Classes\Modules\Vouchers\Services\Voucherify\CreatesVoucherifyVoucherInACampaign; +use App\Classes\Modules\Vouchers\Services\Voucherify\ListsVoucherifyVouchers; +use App\Classes\Modules\Vouchers\Services\Voucherify\FetchesVoucherifyCampaign; +use App\Classes\Modules\Vouchers\Services\CreatesVoucher; +use App\Classes\Modules\Vouchers\Services\FetchesVoucher; +use App\Classes\Modules\Vouchers\Services\UpdatesVoucherCampaign; +use App\Classes\Modules\Rewards\Services\CreatesUserReward; +use App\Classes\Modules\Accounts\Services\CreatesKeyValuePair; +use App\Classes\Modules\Accounts\Services\UpdatesKeyValuePair; +use App\Classes\Modules\Vouchers\Standards\Rules\CanCreateVoucher; +use App\Classes\Modules\Vouchers\DataTransferObjects\ValidateVoucherifyVoucherObject; +use App\Classes\Modules\Vouchers\DataTransferObjects\CreateVoucherObject; +use App\Classes\Modules\Accounts\DataTransferObjects\KeyValuePairObject; +use App\Classes\Modules\Vouchers\DataTransferObjects\VoucherCampaignObject; +use App\Classes\ValueObjects\Constants\RoleTypes; +use App\Classes\ValueObjects\Constants\Vouchers; use App\Models\User; +use App\Models\VoucherCampaign; +use Carbon\Carbon; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Log; class CreateVoucherLogic extends AbstractControllerLogic @@ -23,16 +45,61 @@ class CreateVoucherLogic extends AbstractControllerLogic ]; } + /** @var ValidatesVoucherifyVoucher */ + private $validatesVoucherifyVoucher; + + /** @var CreatesVoucherifyVoucherInACampaign */ + private $createsVoucherifyVoucherInACampaign; + + /** @var ListsVoucherifyVouchers */ + private $listsVoucherifyVouchers; + + /** @var FetchesVoucherifyCampaign */ + private $fetchesVoucherifyCampaign; + + /** @var CreatesUserReward */ + private $createsUserReward; + /** @var CreateVoucherProcessor */ private $createVoucherProcessor; + /** @var CanCreateVoucher */ + private $canCreateVoucher; + + /** @var CreatesKeyValuePair */ + private $createsKeyValuePair; + + /** @var UpdatesKeyValuePair */ + private $updatesKeyValuePair; + + /** @var UpdatesVoucherCampaign */ + private $updatesVoucherCampaign; + /** * CreateVoucherLogic constructor. + * @param ValidatesVoucherifyVoucher $validatesVoucherifyVoucher + * @param CreatesVoucherifyVoucherInACampaign $createsVoucherifyVoucherInACampaign + * @param ListsVoucherifyVouchers $listsVoucherifyVouchers + * @param FetchesVoucherifyCampaign $fetchesVoucherifyCampaign + * @param CreatesUserReward $createsUserReward * @param CreateVoucherProcessor $createVoucherProcessor + * @param CanCreateVoucher $canCreateVoucher + * @param CreatesKeyValuePair $createsKeyValuePair + * @param UpdatesKeyValuePair $updatesKeyValuePair + * @param UpdatesVoucherCampaign $updatesVoucherCampaign */ - public function __construct(CreateVoucherProcessor $createVoucherProcessor) + public function __construct(CreatesUserReward $createsUserReward, ValidatesVoucherifyVoucher $validatesVoucherifyVoucher, CreateVoucherProcessor $createVoucherProcessor, CreatesVoucherifyVoucherInACampaign $createsVoucherifyVoucherInACampaign, CanCreateVoucher $canCreateVoucher, ListsVoucherifyVouchers $listsVoucherifyVouchers, FetchesVoucherifyCampaign $fetchesVoucherifyCampaign, CreatesKeyValuePair $createsKeyValuePair, UpdatesKeyValuePair $updatesKeyValuePair, UpdatesVoucherCampaign $updatesVoucherCampaign) { + $this->createsUserReward = $createsUserReward; + $this->validatesVoucherifyVoucher = $validatesVoucherifyVoucher; $this->createVoucherProcessor = $createVoucherProcessor; + $this->createsVoucherifyVoucherInACampaign = $createsVoucherifyVoucherInACampaign; + $this->canCreateVoucher = $canCreateVoucher; + $this->listsVoucherifyVouchers = $listsVoucherifyVouchers; + $this->fetchesVoucherifyCampaign = $fetchesVoucherifyCampaign; + $this->createsKeyValuePair = $createsKeyValuePair; + $this->updatesKeyValuePair = $updatesKeyValuePair; + $this->updatesVoucherCampaign = $updatesVoucherCampaign; } /** @@ -42,8 +109,125 @@ class CreateVoucherLogic extends AbstractControllerLogic */ public function logic(Request $request) : JsonResponse { - $user = User::where('id', $request->input('userId'))->first(); - $result = $this->createVoucherProcessor->execute($user, $request->input('voucherCode'), null); + //Process request input + $userParam = User::where('id', $request->input('userId'))->first(); + $voucherCodeInput = $request->input('voucherCode'); + $userRewardObject = new CreateVoucherObject( + $voucherCodeInput, + $userParam, + ); + $this->canCreateVoucher->passes($userRewardObject); + + //Initialize variables + $result = null; + + $user = Auth::user(); /** @var User $user */ + if($user && isset($user->type) && in_array($user->type, RoleTypes::ADMIN_ROLES) && $userParam){ + $user = User::where('id', $userParam->id)->first(); + } + else{ + $user = $userParam ? $userParam : $user; + } + + //Voucherify - creates new voucher at voucherify + if ($voucherCodeInput === Vouchers::SORRY_50 || $voucherCodeInput === Vouchers::SORRY_100 || $voucherCodeInput === Vouchers::SORRY_200 ) { + $result = $this->newVoucherifyVoucherIssuanceHandler($voucherCodeInput); + } + else //Voucherify - validates existing voucher at voucherify + { + $result = $this->existingVoucherValidationHandler($voucherCodeInput, $user); + } + + //Save validated voucher info to local DB + if(!isset($result['reason'] ) && $result['validatedVoucherCode']){ + $voucher = $this->createVoucherProcessor->execute($user, $result['validatedVoucherCode'], $result['voucherCampaignId'] ?? null); + $voucherCount = $user->rewards->where('voucher_id', $voucher->id)->count(); + if($voucherCount == 0){ + $result = $this->createsUserReward->execute(null, $user, $voucher->id); + } + else{ + $result['reason'] = 'Voucher already added'; + } + } + + //Unset property that is set for internal processing + unset($result['validatedVoucherCode']); + unset($result['voucherCampaignId']); + return $this->response(['data' => $result]); } + + private function newVoucherifyVoucherIssuanceHandler($voucherCodeInput){ + $result = []; + $total = 0; + $limit = 0; + $voucherCampaign = VoucherCampaign::where('slug', strtolower($voucherCodeInput))->first(); + + if($voucherCampaign){ + $result['voucherCampaignId'] = $voucherCampaign->id; + $voucherList = $this->listsVoucherifyVouchers->execute($voucherCampaign->campaign_id); //Remote Voucherify + if (isset($voucherList->vouchers) && isset($voucherList->total)) { + $total = $voucherList->total; + } + $voucherifyCampaign = $this->fetchesVoucherifyCampaign->execute($voucherCampaign->campaign_id); //Remote Voucherify + + $campaignName = $voucherifyCampaign->name; + $campaignId = $voucherifyCampaign->id; + $campaignMetadata = $voucherifyCampaign->metadata; + + if(isset($campaignMetadata) && isset($campaignMetadata['voucher_limit_per_month'])){ + $limit = (int) $campaignMetadata['voucher_limit_per_month']; + } + + $voucherCampaignObject= new VoucherCampaignObject($campaignId, $campaignName, null, $limit); + $this->updatesVoucherCampaign->execute($voucherCampaign, $voucherCampaignObject); + + if($total >= $voucherCampaign['limit_per_month']){ + $result['reason'] = 'Quota for the month exceeded'; + } + else{ + //To track voucher issuance by admin + $total = $voucherList->total + 1; + $key = strtoupper($campaignId)."_".strtoupper(Carbon::now()->format('M'))."_TOTAL"; + $keyValuePairObject = new KeyValuePairObject( + $key, + $total + ); + $metadata = $voucherCampaign->attributesKVP()->where('key', $key)->first(); + if($metadata){ + $this->updatesKeyValuePair->execute($metadata, $keyValuePairObject); + } + else{ + $this->createsKeyValuePair->execute($voucherCampaign, $keyValuePairObject); + } + + $createdVoucher = $this->createsVoucherifyVoucherInACampaign->execute($campaignName, ""); //Remote Voucherify + if(isset($createdVoucher->message)){ + $result['reason'] = $createdVoucher->message; + } + else{ + $result['validatedVoucherCode'] = $createdVoucher->code; + } + } + } + else{ + $result['reason'] = 'Campaign not set'; + } + + return $result; + } + + private function existingVoucherValidationHandler(string $voucherCodeInput, User $user){ + $result = []; + $ValidateVoucherifyVoucherObject = new ValidateVoucherifyVoucherObject(0, $voucherCodeInput, 0.00, $user); + $voucherifyVoucherValidated = $this->validatesVoucherifyVoucher->execute($ValidateVoucherifyVoucherObject); //Remote Voucherify + + if(isset($voucherifyVoucherValidated->reason)){ + $result['reason'] = $voucherifyVoucherValidated->reason; + } + else if($voucherifyVoucherValidated){ + $result['validatedVoucherCode'] = $voucherCodeInput; + } + return $result; + } } diff --git a/app/Classes/Modules/Vouchers/ControllersLogic/ListVoucherCampaignsLogic.php b/app/Classes/Modules/Vouchers/ControllersLogic/ListVoucherCampaignsLogic.php new file mode 100644 index 00000000..3e3e13d6 --- /dev/null +++ b/app/Classes/Modules/Vouchers/ControllersLogic/ListVoucherCampaignsLogic.php @@ -0,0 +1,60 @@ +listsVoucherCampaigns = $listsVoucherCampaigns; + $this->canListVoucherCampaigns = $canListVoucherCampaigns; + } + + /** + * @return array + */ + protected function notification():array { + return [ + 'title' => 'Retrieved Voucher Campaigns', + 'message' => 'You have successfully retrieved a list of voucher campaigns' + ]; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\MalformedRequestException + */ + public function logic(Request $request) : JsonResponse + { + $this->canListVoucherCampaigns->passes(); + + $query = $this->listsVoucherCampaigns->execute($this->listsVoucherCampaigns->deserializeFilters($request->input('filters'))); + + $filters = json_decode($request->input('filters'), true); + if(isset($filters['include_metadata'])){ + $request->merge(['include_metadata' => true]); + } + + return $this->collectionResponse(VoucherCampaignResource::collection($query)); + } + +} diff --git a/app/Classes/Modules/Vouchers/DataTransferObjects/CreateVoucherObject.php b/app/Classes/Modules/Vouchers/DataTransferObjects/CreateVoucherObject.php new file mode 100644 index 00000000..74ef0e19 --- /dev/null +++ b/app/Classes/Modules/Vouchers/DataTransferObjects/CreateVoucherObject.php @@ -0,0 +1,44 @@ +user = $user; + $this->voucherCode = $voucherCode; + } + + + /** + * @return string + */ + public function getVoucherCode(): string + { + return $this->voucherCode; + } + + /** + * @return null|User + */ + public function getUser(): ?User + { + return $this->user; + } + +} diff --git a/app/Classes/Modules/Vouchers/DataTransferObjects/VoucherCampaignObject.php b/app/Classes/Modules/Vouchers/DataTransferObjects/VoucherCampaignObject.php new file mode 100644 index 00000000..f7fd04ee --- /dev/null +++ b/app/Classes/Modules/Vouchers/DataTransferObjects/VoucherCampaignObject.php @@ -0,0 +1,67 @@ +campaign_id = $campaign_id; + $this->name = $name; + $this->description = $description; + $this->limitPerMonth = $limitPerMonth; + } + + /** + * @return string + */ + public function getCampaignId(): string + { + return $this->campaign_id; + } + + /** + * @return string + */ + public function getName(): string + { + return $this->name; + } + + /** + * @return string|null + */ + public function getDescription(): ?string + { + return $this->description; + } + + /** + * @return int + */ + public function getLimitPerMonth(): int + { + return $this->limitPerMonth; + } +} diff --git a/app/Classes/Modules/Vouchers/DataTransferObjects/VoucherObject.php b/app/Classes/Modules/Vouchers/DataTransferObjects/VoucherObject.php index d4fd1e7b..78f67dfe 100644 --- a/app/Classes/Modules/Vouchers/DataTransferObjects/VoucherObject.php +++ b/app/Classes/Modules/Vouchers/DataTransferObjects/VoucherObject.php @@ -27,21 +27,26 @@ class VoucherObject implements DataTransferObject /** @var string|null */ private $endDate; + /** @var int */ + private $voucherCampaignId; + /** * VoucherObject constructor. * @param string $code * @param string $name * @param string $type * @param float $value + * @param int $voucherCampaignId * @param string $startDate * @param string $endDate */ - public function __construct(string $code, ?string $name, ?string $type, ?float $value, ?string $startDate = '', ?string $endDate = '') + public function __construct(string $code, ?string $name, ?string $type, ?float $value, ?int $voucherCampaignId, ?string $startDate = '', ?string $endDate = '') { $this->code = $code; $this->name = $name; $this->type = $type; $this->value = $value; + $this->voucherCampaignId = $voucherCampaignId; $this->startDate = $startDate; $this->endDate = $endDate; } @@ -62,7 +67,6 @@ class VoucherObject implements DataTransferObject return $this->name; } - /** * @return string */ @@ -71,7 +75,6 @@ class VoucherObject implements DataTransferObject return $this->type; } - /** * @return float */ @@ -80,6 +83,14 @@ class VoucherObject implements DataTransferObject return $this->value; } + /** + * @return int + */ + public function getVoucherCampaignId(): ?int + { + return $this->voucherCampaignId; + } + /** * @return DateTime */ diff --git a/app/Classes/Modules/Vouchers/Processors/CreateVoucherProcessor.php b/app/Classes/Modules/Vouchers/Processors/CreateVoucherProcessor.php index 690ad59f..1026a330 100644 --- a/app/Classes/Modules/Vouchers/Processors/CreateVoucherProcessor.php +++ b/app/Classes/Modules/Vouchers/Processors/CreateVoucherProcessor.php @@ -4,110 +4,76 @@ namespace App\Classes\Modules\Vouchers\Processors; use App\Classes\Modules\Vouchers\Services\Voucherify\FetchesVoucherifyVoucher; -use App\Classes\Modules\Vouchers\Services\Voucherify\ValidatesVoucherifyVoucher; use App\Classes\Modules\Vouchers\Services\CreatesVoucher; use App\Classes\Modules\Vouchers\Services\FetchesVoucher; -use App\Classes\Modules\Rewards\Services\CreatesUserReward; use App\Classes\Modules\Vouchers\DataTransferObjects\VoucherObject; -use App\Classes\Modules\Vouchers\DataTransferObjects\ValidateVoucherifyVoucherObject; -use App\Classes\ValueObjects\Constants\RoleTypes; use App\Models\User; -use Illuminate\Support\Facades\Auth; +use Carbon\Carbon; use Illuminate\Support\Facades\Log; - class CreateVoucherProcessor { /** @var FetchesVoucherifyVoucher */ private $fetchesVoucherifyVoucher; - /** @var ValidatesVoucherifyVoucher */ - private $validatesVoucherifyVoucher; - /** @var CreatesVoucher */ private $createsVoucher; - /** @var CreatesUserReward */ - private $createsUserReward; - /** @var FetchesVoucher */ private $fetchesVoucher; /** * CreateVoucherProcessor constructor. * @param FetchesVoucherifyVoucher $fetchesVoucherifyVoucher - * @param ValidatesVoucherifyVoucher $validatesVoucherifyVoucher * @param CreatesVoucher $createsVoucher - * @param CreatesUserReward $createsUserReward * @param FetchesVoucher $fetchesVoucher */ - public function __construct(FetchesVoucherifyVoucher $fetchesVoucherifyVoucher, CreatesVoucher $createsVoucher, CreatesUserReward $createsUserReward, FetchesVoucher $fetchesVoucher, ValidatesVoucherifyVoucher $validatesVoucherifyVoucher) + public function __construct(FetchesVoucherifyVoucher $fetchesVoucherifyVoucher, CreatesVoucher $createsVoucher, FetchesVoucher $fetchesVoucher) { $this->fetchesVoucherifyVoucher = $fetchesVoucherifyVoucher; $this->createsVoucher = $createsVoucher; - $this->createsUserReward = $createsUserReward; $this->fetchesVoucher = $fetchesVoucher; - $this->validatesVoucherifyVoucher = $validatesVoucherifyVoucher; } /** - * @param ?User $userParam + * @param null|User $user * @param string $voucherCodeInput - * @return array + * @param null|int $campaignId + * @return mixed * @throws \App\Classes\Exceptions\AccessForbiddenException * @throws \App\Classes\Exceptions\MalformedRequestException * @throws \App\Classes\Exceptions\RequestValidationException */ - public function execute(?User $userParam, string $voucherCodeInput) { - try{ - $result = null; - $user = Auth::user(); /** @var User $user */ - if($user && isset($user->type) && in_array($user->type, RoleTypes::ADMIN_ROLES) && $userParam){ - $user = User::where('id', $userParam->id)->first(); - } - else{ - $user = $userParam ? $userParam : $user; - } - - //Voucherify - Validates Voucher - $ValidateVoucherifyVoucherObject = new ValidateVoucherifyVoucherObject(0, $voucherCodeInput, 0.00, $user); - $voucherifyVoucherValidated = $this->validatesVoucherifyVoucher->execute($ValidateVoucherifyVoucherObject); - - if(isset($voucherifyVoucherValidated->reason)){ - $result = []; - $result['reason'] = $voucherifyVoucherValidated->reason; - } - else if($voucherifyVoucherValidated){ - $voucher = $this->recordVoucherInfo($user, $voucherCodeInput); - $voucherCount = $user->rewards->where('voucher_id', $voucher->id)->count(); - if($voucherCount == 0){ - $result = $this->createsUserReward->execute(null, $user, $voucher->id); - } - else{ - $result['reason'] = 'Voucher already added'; - } - } - - return $result; - } catch (\Exception $e) { - Log::error($e); - } - } - - private function recordVoucherInfo(User $user, string $voucherCodeInput){ - //Voucherify - Get Voucher + public function execute(?User $user, string $voucherCodeInput, ?int $campaignId = null) { + //Remotely - Get Voucher Voucherify $voucherifyVoucherFetched = $this->fetchesVoucherifyVoucher->execute($user, $voucherCodeInput); - $voucherName = $voucherifyVoucherFetched->campaign; + //Voucher stored locally need a name, by default use campaign name, else look into campaign metadata for displayname + if(isset($voucherifyVoucherFetched->metadata) && isset($voucherifyVoucherFetched->metadata->displayname)){ + $voucherName = $voucherifyVoucherFetched->metadata->displayname; + } + else{ + $voucherName = $voucherifyVoucherFetched->campaign; + } + $voucherType = $voucherifyVoucherFetched->discount->type; $voucherValue = isset($voucherifyVoucherFetched->discount->amount_off) ? $voucherifyVoucherFetched->discount->amount_off : $voucherifyVoucherFetched->discount->percent_off; $voucherCode = $voucherifyVoucherFetched->code; $voucherStartDate = $voucherifyVoucherFetched->start_date; $voucherEndDate = $voucherifyVoucherFetched->expiration_date; - $voucherObject= new VoucherObject($voucherCode, isset($voucherName) ? $voucherName : "Voucherify Voucher Added Manually", $voucherType, $voucherValue, $voucherStartDate, $voucherEndDate); + //Locally - Create and Fetch Voucher + $voucherObject = new VoucherObject( + $voucherCode, + isset($voucherName) ? $voucherName : "Voucher ".Carbon::now()->format('Ymd'), + $voucherType, + $voucherValue, + $campaignId, + $voucherStartDate, + $voucherEndDate); $voucher = $this->createsVoucher->execute($voucherObject); + if(!$voucher) $voucher = $this->fetchesVoucher->execute(['code' => $voucherCodeInput]); return $voucher; } diff --git a/app/Classes/Modules/Vouchers/Processors/Voucherify/BookingToVoucherifyProcessor.php b/app/Classes/Modules/Vouchers/Processors/Voucherify/BookingToVoucherifyProcessor.php index 323b2eaf..6f89916b 100644 --- a/app/Classes/Modules/Vouchers/Processors/Voucherify/BookingToVoucherifyProcessor.php +++ b/app/Classes/Modules/Vouchers/Processors/Voucherify/BookingToVoucherifyProcessor.php @@ -18,6 +18,7 @@ use App\Classes\ValueObjects\Constants\VoucherifyEntityType; use App\Models\User; use App\Models\Transaction; use App\Models\Voucher; +use App\Models\VoucherCampaign; use Illuminate\Support\Facades\Log; class BookingToVoucherifyProcessor @@ -84,6 +85,9 @@ class BookingToVoucherifyProcessor if($voucherCode){ $redeemVoucherifyVoucherObject = new RedeemVoucherifyVoucherObject($companyId, $transaction->id, $voucherCode, $amount, $user); $redeemVoucherResult = $this->redeemsVoucherifyVoucher->execute($redeemVoucherifyVoucherObject); + + // Log::info('redeemVoucherResult: '.json_encode($redeemVoucherResult)); + $redeemedVoucher = $redeemVoucherResult->voucher; $redemptionId = $redeemVoucherResult->id; @@ -95,7 +99,7 @@ class BookingToVoucherifyProcessor $voucherify_customer_id = $redeemVoucherResult->customer->id; } - $voucher = $this->recordVoucherInfo($redeemedVoucher, $transaction); + $voucher = $this->recordVoucherInfo($redeemedVoucher); $this->createsVoucherRedemption->execute($transaction, $voucher, $redemptionId, $voucherDiscountAmount); $this->recordVoucherForUserInfo($user, $voucher); } @@ -123,8 +127,14 @@ class BookingToVoucherifyProcessor //Create records at 3 tables $voucherValue = isset($redeemedVoucher->discount->amount_off) ? $redeemedVoucher->discount->amount_off : $redeemedVoucher->discount->percent_off; $voucherType = $redeemedVoucher->discount ? $redeemedVoucher->discount->type : null; + $voucherifyCampaignId = isset($redeemedVoucher->campaign_id) ? $redeemedVoucher->campaign_id : null; - $voucherObject= new VoucherObject($redeemedVoucher->code, isset($redeemedVoucher->metadata->name) ? $redeemedVoucher->metadata->name : "", $voucherType, $voucherValue); + $voucherCampaign = null; + if($voucherifyCampaignId){ + $voucherCampaign = VoucherCampaign::where('campaign_id', $voucherifyCampaignId)->first(); + } + + $voucherObject= new VoucherObject($redeemedVoucher->code, isset($redeemedVoucher->metadata->displayname) ? $redeemedVoucher->metadata->displayname : "", $voucherType, $voucherValue, $voucherCampaign ? $voucherCampaign->id : null); $voucher = $this->createsVoucher->execute($voucherObject); if(!$voucher) $voucher = $this->fetchesVoucher->execute(['code' => $voucherObject->getCode()]); diff --git a/app/Classes/Modules/Vouchers/Services/CheckIfVoucherCampaignExists.php b/app/Classes/Modules/Vouchers/Services/CheckIfVoucherCampaignExists.php new file mode 100644 index 00000000..9e299dab --- /dev/null +++ b/app/Classes/Modules/Vouchers/Services/CheckIfVoucherCampaignExists.php @@ -0,0 +1,27 @@ +repository = $repository; + } + + public function execute(string $campaignId): bool { + return $this->repository->where('campaign_id', $campaignId)->exists(); + } + +} diff --git a/app/Classes/Modules/Vouchers/Services/CreatesVoucher.php b/app/Classes/Modules/Vouchers/Services/CreatesVoucher.php index 9162dda8..3622036a 100644 --- a/app/Classes/Modules/Vouchers/Services/CreatesVoucher.php +++ b/app/Classes/Modules/Vouchers/Services/CreatesVoucher.php @@ -22,7 +22,7 @@ class CreatesVoucher extends AbstractUpdateRecord /** * @param VoucherObject $object - * @return \Illuminate\Database\Eloquent\Model + * @return \Illuminate\Database\Eloquent\Model|null * @throws \App\Classes\Exceptions\MalformedRequestException */ public function execute(VoucherObject $object) { @@ -33,6 +33,7 @@ class CreatesVoucher extends AbstractUpdateRecord $model->name = $object->getName(); $model->type = $object->getType(); $model->value = $object->getValue(); + $model->voucher_campaign_id = $object->getVoucherCampaignId(); $model->start_date = $object->getStartDate(); $model->end_date = $object->getEndDate(); return $this->handler($model); diff --git a/app/Classes/Modules/Vouchers/Services/CreatesVoucherCampaign.php b/app/Classes/Modules/Vouchers/Services/CreatesVoucherCampaign.php new file mode 100644 index 00000000..171c2d18 --- /dev/null +++ b/app/Classes/Modules/Vouchers/Services/CreatesVoucherCampaign.php @@ -0,0 +1,41 @@ +campaignExists = $campaignExists; + } + + /** + * @param VoucherCampaignObject $object + * @return \Illuminate\Database\Eloquent\Model|null + * @throws \App\Classes\Exceptions\MalformedRequestException + */ + public function execute(VoucherCampaignObject $object) { + if(!$this->campaignExists->execute($object->getCampaignId())) + { + $model = new VoucherCampaign(); + $model->campaign_id = $object->getCampaignId(); + $model->name = $object->getName(); + $model->description = $object->getDescription(); + $model->limit_per_month = $object->getLimitPerMonth(); + return $this->handler($model); + } + return null; + } +} diff --git a/app/Classes/Modules/Vouchers/Services/FetchesVoucherCampaign.php b/app/Classes/Modules/Vouchers/Services/FetchesVoucherCampaign.php new file mode 100644 index 00000000..b5f66178 --- /dev/null +++ b/app/Classes/Modules/Vouchers/Services/FetchesVoucherCampaign.php @@ -0,0 +1,34 @@ +repository = $repository; + } + + + /** + * @return Builder + */ + public function getRepository(): Builder + { + return $this->repository->newQuery(); + } +} diff --git a/app/Classes/Modules/Vouchers/Services/ListsVoucherCampaigns.php b/app/Classes/Modules/Vouchers/Services/ListsVoucherCampaigns.php new file mode 100644 index 00000000..d9b141ff --- /dev/null +++ b/app/Classes/Modules/Vouchers/Services/ListsVoucherCampaigns.php @@ -0,0 +1,33 @@ +repository = $repository; + } + + + /** + * @return Builder + */ + function getRepository(): Builder + { + return $this->repository->newQuery(); + } +} diff --git a/app/Classes/Modules/Vouchers/Services/UpdatesVoucherCampaign.php b/app/Classes/Modules/Vouchers/Services/UpdatesVoucherCampaign.php new file mode 100644 index 00000000..06501569 --- /dev/null +++ b/app/Classes/Modules/Vouchers/Services/UpdatesVoucherCampaign.php @@ -0,0 +1,26 @@ +name = $object->getName(); + $model->description = $object->getDescription(); + $model->limit_per_month = $object->getLimitPerMonth(); + + return $this->handler($model); + } +} diff --git a/app/Classes/Modules/Vouchers/Services/Voucherify/CreatesVoucherifyCustomer.php b/app/Classes/Modules/Vouchers/Services/Voucherify/CreatesVoucherifyCustomer.php index a15fe9c3..5964fce4 100644 --- a/app/Classes/Modules/Vouchers/Services/Voucherify/CreatesVoucherifyCustomer.php +++ b/app/Classes/Modules/Vouchers/Services/Voucherify/CreatesVoucherifyCustomer.php @@ -59,7 +59,7 @@ class CreatesVoucherifyCustomer return $result; } catch (\Voucherify\ClientException $e) { // throw $e; - Log::error($e); + Log::error('CreatesVoucherifyCustomer '.$e); return null; } } diff --git a/app/Classes/Modules/Vouchers/Services/Voucherify/CreatesVoucherifyOrder.php b/app/Classes/Modules/Vouchers/Services/Voucherify/CreatesVoucherifyOrder.php index 90e5d682..2abb6166 100644 --- a/app/Classes/Modules/Vouchers/Services/Voucherify/CreatesVoucherifyOrder.php +++ b/app/Classes/Modules/Vouchers/Services/Voucherify/CreatesVoucherifyOrder.php @@ -55,7 +55,7 @@ class CreatesVoucherifyOrder $result = $this->voucherifyClient->orders->create($orderObj); return $result; } catch (\Voucherify\ClientException $e) { - Log::error($e); + Log::error('CreatesVoucherifyOrder '.$e); return null; } } diff --git a/app/Classes/Modules/Vouchers/Services/Voucherify/CreatesVoucherifyVoucher.php b/app/Classes/Modules/Vouchers/Services/Voucherify/CreatesVoucherifyVoucher.php index ad95946b..db4f7198 100644 --- a/app/Classes/Modules/Vouchers/Services/Voucherify/CreatesVoucherifyVoucher.php +++ b/app/Classes/Modules/Vouchers/Services/Voucherify/CreatesVoucherifyVoucher.php @@ -52,7 +52,7 @@ class CreatesVoucherifyVoucher ]); return $result; } catch (\Voucherify\ClientException $e) { - Log::error($e); + Log::error('CreatesVoucherifyVoucher '.$e); return null; } } diff --git a/app/Classes/Modules/Vouchers/Services/Voucherify/CreatesVoucherifyVoucherInACampaign.php b/app/Classes/Modules/Vouchers/Services/Voucherify/CreatesVoucherifyVoucherInACampaign.php new file mode 100644 index 00000000..1916b1ef --- /dev/null +++ b/app/Classes/Modules/Vouchers/Services/Voucherify/CreatesVoucherifyVoucherInACampaign.php @@ -0,0 +1,40 @@ +voucherifyClient = createVoucherifyClient(); + } + + /** + * @param string $campaignName + * @param string $code + * @return null|object + * @throws \Voucherify\ClientException + */ + public function execute(string $campaignName, string $code) + { + try { + $result = $this->voucherifyClient->campaigns->addVoucherWithCode($campaignName, $code); + return $result; + } catch (\Voucherify\ClientException $e) { + Log::error('CreatesVoucherifyVoucherInACampaign '.$e); + return null; + } + } +} diff --git a/app/Classes/Modules/Vouchers/Services/Voucherify/FetchesVoucherifyCampaign.php b/app/Classes/Modules/Vouchers/Services/Voucherify/FetchesVoucherifyCampaign.php new file mode 100644 index 00000000..afd6b941 --- /dev/null +++ b/app/Classes/Modules/Vouchers/Services/Voucherify/FetchesVoucherifyCampaign.php @@ -0,0 +1,60 @@ +voucherifyClient = createVoucherifyClient(); + } + + /** + * @param string $campaignId + * @return null|object + * @throws \Voucherify\ClientException + */ + public function execute(string $campaignId) + { + //REST API - Direct Query + try{ + $response = Http::withHeaders([ + 'X-App-Id' => config('voucherify.application_id'), + 'X-App-Token' => config('voucherify.client_secret_key'), + ]) + ->get(config('voucherify.url').'/v1/campaigns/'.$campaignId); + + if($response->successful()){ + $data = $response->json(); + return (object) $data; + }else{ + Log::error($response); + return null; + } + }catch(\Exception $exception){ + throw new MalformedRequestException('Unable to get correct response from Voucherify: ' . $exception->getMessage()); + } + + //PHP SDK + // try { + // $result = $this->voucherifyClient->campaigns->get($name); //this is undefined in voucherify php sdk + // return $result; + // } catch (\Voucherify\ClientException $e) { + // Log::error('FetchesVoucherifyCampaign '.$e); + // return null; + // } + } +} diff --git a/app/Classes/Modules/Vouchers/Services/Voucherify/FetchesVoucherifyRedemption.php b/app/Classes/Modules/Vouchers/Services/Voucherify/FetchesVoucherifyRedemption.php new file mode 100644 index 00000000..03966926 --- /dev/null +++ b/app/Classes/Modules/Vouchers/Services/Voucherify/FetchesVoucherifyRedemption.php @@ -0,0 +1,38 @@ +voucherifyClient = createVoucherifyClient(); + } + + /** + * @param string $redemptionId + * @return null|object + * @throws \Voucherify\ClientException + */ + public function execute(string $redemptionId) + { + try { + $result = $this->voucherifyClient->redemptions->get($redemptionId); + return $result; + } catch (\Voucherify\ClientException $e) { + Log::error('FetchesVoucherifyRedemption '.$e); + return null; + } + } +} diff --git a/app/Classes/Modules/Vouchers/Services/Voucherify/FetchesVoucherifyVoucher.php b/app/Classes/Modules/Vouchers/Services/Voucherify/FetchesVoucherifyVoucher.php index 8c4d33b7..3ad962d6 100644 --- a/app/Classes/Modules/Vouchers/Services/Voucherify/FetchesVoucherifyVoucher.php +++ b/app/Classes/Modules/Vouchers/Services/Voucherify/FetchesVoucherifyVoucher.php @@ -40,7 +40,7 @@ class FetchesVoucherifyVoucher return $result; } catch (\Voucherify\ClientException $e) { - Log::error($e); + Log::error('FetchesVoucherifyVoucher '.$e); return null; } } diff --git a/app/Classes/Modules/Vouchers/Services/Voucherify/ListsVoucherifyVouchers.php b/app/Classes/Modules/Vouchers/Services/Voucherify/ListsVoucherifyVouchers.php new file mode 100644 index 00000000..217b9a3a --- /dev/null +++ b/app/Classes/Modules/Vouchers/Services/Voucherify/ListsVoucherifyVouchers.php @@ -0,0 +1,85 @@ +voucherifyClient = createVoucherifyClient(); + } + + /** + * @param string $campaignId + * @return null|object + * @throws \Voucherify\ClientException + */ + public function execute(string $campaignId) + { + + //PHP SDK +// try { +// $listVouchers = $this->voucherifyClient->vouchers->getList([ +// "campaign" => $campaignName, +// ]); +// if (isset($listVouchers->vouchers) && isset($listVouchers->total) && $listVouchers->total > 0) { +// $campaignId = $listVouchers->vouchers[0]->campaign_id; +// } +// } catch (\Voucherify\ClientException $e) { +// Log::error('ListsVoucherifyVouchers '.$e); +// return null; +// } + + //REST API - Direct Query + try{ + $dateRange = $this->getDateRangeForMonth(Carbon::now()->year, Carbon::now()->month); + $queryString = http_build_query([ + 'limit' => 50, + 'campaign_id' => $campaignId, + '[created_at][after]' => $dateRange['start'], + '[created_at][before]' => $dateRange['end'], + ]); + //$queryString = 'limit=50&campaign_id=' . $campaignId . '&[created_at][after]='. $dateRange['start'] . '&[created_at][before]='. $dateRange['end']; + $response = Http::withHeaders([ + 'X-App-Id' => config('voucherify.application_id'), + 'X-App-Token' => config('voucherify.client_secret_key'), + ]) + ->get(config('voucherify.url').'/v1/vouchers?'.$queryString); + + if($response->successful()){ + $data = $response->json(); + return (object) $data; + }else{ + Log::error($response); + return null; + } + }catch(\Exception $exception){ + throw new MalformedRequestException('Unable to get correct response from Voucherify: ' . $exception->getMessage()); + } + } + + private function getDateRangeForMonth($year, $month) { + $startDate = Carbon::createFromFormat('Y-m-d H:i:s', "{$year}-{$month}-01 00:00:00", 'Asia/Kuala_Lumpur')->startOfDay()->setTimezone('UTC'); + $endDate = Carbon::createFromFormat('Y-m-d H:i:s', "{$year}-{$month}-01 00:00:00", 'Asia/Kuala_Lumpur')->endOfMonth()->setTimezone('UTC'); + + return [ + 'start' => $startDate->toISOString(), + 'end' => $endDate->toISOString(), //'2024-07-11T15:59:59.999999Z' + ]; + } +} diff --git a/app/Classes/Modules/Vouchers/Services/Voucherify/RedeemsVoucherifyVoucher.php b/app/Classes/Modules/Vouchers/Services/Voucherify/RedeemsVoucherifyVoucher.php index 7c44889b..eca9d611 100644 --- a/app/Classes/Modules/Vouchers/Services/Voucherify/RedeemsVoucherifyVoucher.php +++ b/app/Classes/Modules/Vouchers/Services/Voucherify/RedeemsVoucherifyVoucher.php @@ -3,6 +3,7 @@ namespace App\Classes\Modules\Vouchers\Services\Voucherify; use App\Classes\Modules\Vouchers\DataTransferObjects\RedeemVoucherifyVoucherObject; +use Illuminate\Support\Facades\Log; class RedeemsVoucherifyVoucher { @@ -45,6 +46,7 @@ class RedeemsVoucherifyVoucher ]); return $result; } catch (\Voucherify\ClientException $e) { + Log::error('RedeemsVoucherifyVoucher '.$e); throw $e; } } diff --git a/app/Classes/Modules/Vouchers/Services/Voucherify/UpdatesVoucherifyOrder.php b/app/Classes/Modules/Vouchers/Services/Voucherify/UpdatesVoucherifyOrder.php index 80aae605..51c6c29e 100644 --- a/app/Classes/Modules/Vouchers/Services/Voucherify/UpdatesVoucherifyOrder.php +++ b/app/Classes/Modules/Vouchers/Services/Voucherify/UpdatesVoucherifyOrder.php @@ -36,7 +36,7 @@ class UpdatesVoucherifyOrder ]); return $result; } catch (\Voucherify\ClientException $e) { - Log::error($e); + Log::error('UpdatesVoucherifyOrder '.$e); return null; } } diff --git a/app/Classes/Modules/Vouchers/Services/Voucherify/ValidatesVoucherifyVoucher.php b/app/Classes/Modules/Vouchers/Services/Voucherify/ValidatesVoucherifyVoucher.php index 3fa322d5..7c22db5c 100644 --- a/app/Classes/Modules/Vouchers/Services/Voucherify/ValidatesVoucherifyVoucher.php +++ b/app/Classes/Modules/Vouchers/Services/Voucherify/ValidatesVoucherifyVoucher.php @@ -41,6 +41,7 @@ class ValidatesVoucherifyVoucher ] ] ]; + if ($validateVoucherifyVoucherObject->getAmount()) { $validateVoucherObj['order'] = [ "amount" => $validateVoucherifyVoucherObject->getAmount() * 100 //converting it to cents @@ -63,7 +64,7 @@ class ValidatesVoucherifyVoucher return $result; } catch (\Voucherify\ClientException $e) { // throw $e; - Log::error($e); + Log::error('ValidatesVoucherifyVoucher '.$e); return null; } } diff --git a/app/Classes/Modules/Vouchers/Standards/Rules/CanCreateVoucher.php b/app/Classes/Modules/Vouchers/Standards/Rules/CanCreateVoucher.php new file mode 100644 index 00000000..af40f6aa --- /dev/null +++ b/app/Classes/Modules/Vouchers/Standards/Rules/CanCreateVoucher.php @@ -0,0 +1,66 @@ +voucherValidation = $voucherValidation; + } + + /** + * @param CreateVoucherObject $object + * @return bool + */ + protected function authorized($object): bool + { + $isAuthorized = true; + switch ($object->getVoucherCode()) { + case Vouchers::SORRY_50: + case Vouchers::SORRY_100: + case Vouchers::SORRY_200: + // $isAuthorized = Auth::user()->can('add voucher'); + $isAuthorized = in_array(Auth::user()->type, RoleTypes::ADMIN_ROLES); + break; + default: + $isAuthorized = true; + break; + } + return $isAuthorized; + } + + /** + * @param CreateVoucherObject $object + * @return bool + * @throws \App\Classes\Exceptions\RequestValidationException + */ + protected function validators($object): bool + { + return true; + } + + /** + * @param CreateVoucherObject $object + * @return bool + */ + protected function criteria($object): bool + { + return true; + } +} diff --git a/app/Classes/Modules/Vouchers/Standards/Rules/CanListVoucherCampaigns.php b/app/Classes/Modules/Vouchers/Standards/Rules/CanListVoucherCampaigns.php new file mode 100644 index 00000000..e5c384ee --- /dev/null +++ b/app/Classes/Modules/Vouchers/Standards/Rules/CanListVoucherCampaigns.php @@ -0,0 +1,42 @@ +can('list voucher campaigns')) { + if (!in_array(Auth::user()->type, RoleTypes::ADMIN_ROLES)) { + return false; + } + return true; + } + + /** + * @param $object + * @return bool + * @throws \App\Classes\Exceptions\RequestValidationException + */ + protected function validators($object): bool + { + return true; + } + + /** + * @param $object + * @return bool + */ + protected function criteria($object): bool + { + return true; + } +} diff --git a/app/Classes/Modules/Vouchers/Standards/Validators/VoucherValidation.php b/app/Classes/Modules/Vouchers/Standards/Validators/VoucherValidation.php new file mode 100644 index 00000000..d22e0064 --- /dev/null +++ b/app/Classes/Modules/Vouchers/Standards/Validators/VoucherValidation.php @@ -0,0 +1,47 @@ + $object->getUser(), + 'voucherCode' => $object->getVoucherCode(), + ]; + + return $data; + } + + /** + * @param null|string $type + * @return array + */ + protected function rules(): array { + return [ + 'user' => [ + 'required', + ], + 'voucherCode' => [ + 'required', + ] + ]; + } + + /** + * @return array + */ + protected function messages(): array { + return []; + } + +} diff --git a/app/Classes/Modules/Wallets/Standards/Rules/CanCreateCompanyWallet.php b/app/Classes/Modules/Wallets/Standards/Rules/CanCreateCompanyWallet.php index 0f1dd065..f07e3ae0 100644 --- a/app/Classes/Modules/Wallets/Standards/Rules/CanCreateCompanyWallet.php +++ b/app/Classes/Modules/Wallets/Standards/Rules/CanCreateCompanyWallet.php @@ -26,7 +26,7 @@ class CanCreateCompanyWallet extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Wallets/Standards/Rules/CanCreateWalletTransaction.php b/app/Classes/Modules/Wallets/Standards/Rules/CanCreateWalletTransaction.php index 8beafb37..ad217040 100644 --- a/app/Classes/Modules/Wallets/Standards/Rules/CanCreateWalletTransaction.php +++ b/app/Classes/Modules/Wallets/Standards/Rules/CanCreateWalletTransaction.php @@ -23,7 +23,7 @@ class CanCreateWalletTransaction extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Wallets/Standards/Rules/CanListWallet.php b/app/Classes/Modules/Wallets/Standards/Rules/CanListWallet.php index c87cb316..de944f61 100644 --- a/app/Classes/Modules/Wallets/Standards/Rules/CanListWallet.php +++ b/app/Classes/Modules/Wallets/Standards/Rules/CanListWallet.php @@ -23,7 +23,7 @@ class CanListWallet extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Wallets/Standards/Rules/CanTopUpWallet.php b/app/Classes/Modules/Wallets/Standards/Rules/CanTopUpWallet.php index 9a005498..0f3cbc64 100644 --- a/app/Classes/Modules/Wallets/Standards/Rules/CanTopUpWallet.php +++ b/app/Classes/Modules/Wallets/Standards/Rules/CanTopUpWallet.php @@ -23,7 +23,7 @@ class CanTopUpWallet extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/Modules/Wallets/Standards/Rules/CanWithdrawWallet.php b/app/Classes/Modules/Wallets/Standards/Rules/CanWithdrawWallet.php index 6fb4019d..a2cd3b6a 100644 --- a/app/Classes/Modules/Wallets/Standards/Rules/CanWithdrawWallet.php +++ b/app/Classes/Modules/Wallets/Standards/Rules/CanWithdrawWallet.php @@ -23,7 +23,7 @@ class CanWithdrawWallet extends AbstractRule /** * @return bool */ - protected function authorized(): bool + protected function authorized($object): bool { // TODO Set Authorization rules return true; diff --git a/app/Classes/ValueObjects/Constants/BankAccountType.php b/app/Classes/ValueObjects/Constants/BankAccountType.php index c1ae288e..0393091f 100644 --- a/app/Classes/ValueObjects/Constants/BankAccountType.php +++ b/app/Classes/ValueObjects/Constants/BankAccountType.php @@ -8,6 +8,8 @@ final class BankAccountType { public const EXTERNAL = 2; - public const ALIPAY= 3; + public const ALIPAY_1688 = 3; + + public const ALIPAY_RECIPIENT = 4; } diff --git a/app/Classes/ValueObjects/Constants/BookingAttributeNames.php b/app/Classes/ValueObjects/Constants/BookingAttributeNames.php new file mode 100644 index 00000000..491ad0a2 --- /dev/null +++ b/app/Classes/ValueObjects/Constants/BookingAttributeNames.php @@ -0,0 +1,8 @@ + 'SORRY 50', 'id' => Vouchers::SORRY_50], + ['text' => 'SORRY 100', 'id' => Vouchers::SORRY_100], + ['text' => 'SORRY 200', 'id' => Vouchers::SORRY_200], + ]; } diff --git a/app/Console/Commands/DeleteDuplicate1688BankAccount.php b/app/Console/Commands/DeleteDuplicate1688BankAccount.php new file mode 100644 index 00000000..57b65733 --- /dev/null +++ b/app/Console/Commands/DeleteDuplicate1688BankAccount.php @@ -0,0 +1,75 @@ +get(); + + $groupedBanks = $records->groupBy(function($item, $key) { + return $item['company_id'] . '-' . $item['account_no']; + }); + + foreach ($groupedBanks as $key => $banksWithSameUserAndAccountNo) { + // Sort banks by created_at or updated_at to find the latest one + $sortedBanks = $banksWithSameUserAndAccountNo->sortByDesc('created_at'); + + // Retain the latest bank + $latestBank = $sortedBanks->first(); + + // Get all IDs except the latest one + $idsToDelete = $sortedBanks->pluck('id')->slice(1); + + foreach ($idsToDelete as $id) { + Booking::where('bank_id', $id)->update([ + 'bank_id' => $latestBank->id + ]); + } + + $this->info('for company id: ' . $latestBank->company_id . ', account no: ' . $latestBank->account_no . ', duplicated id: ' . $idsToDelete); + // Delete the rest + Bank::whereIn('id', $idsToDelete)->delete(); + } + } +} diff --git a/app/Console/Commands/ExpiredBookingCommand.php b/app/Console/Commands/ExpiredBookingCommand.php index fe4f260e..17a0158e 100644 --- a/app/Console/Commands/ExpiredBookingCommand.php +++ b/app/Console/Commands/ExpiredBookingCommand.php @@ -51,11 +51,12 @@ class ExpiredBookingCommand extends Command // 1. Cancel booking without payment & purchase order (1 month) $bookings = Booking::where('status', ApprovalStatus::APPROVED) ->where('created_at', '<', now()->subDays(30)->endOfDay()) + ->where('service_id', '!=', 4) ->where(function ($query) { $query->whereDoesntHave('transactions') ->orWhereDoesntHave('transactions', function($transaction) { return $transaction->where('type', TransactionType::PURCHASE_ORDER)->orWhere(function ($q) { - $q->where('type', TransactionType::PAYMENT)->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]); + $q->where('type', TransactionType::PAYMENT)->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED, ApprovalStatus::REFUNDED]); }); }); })->get(); @@ -78,7 +79,7 @@ class ExpiredBookingCommand extends Command ->where('created_at', '<', now()->subDays(60)->endOfDay()) ->where(function ($query) { $query->whereDoesntHave('transactions', function($transaction) { - return $transaction->where('type', TransactionType::PAYMENT)->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]); + return $transaction->where('type', TransactionType::PAYMENT)->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED, ApprovalStatus::REFUNDED]); })->whereHas('transactions', function($transaction) { return $transaction->where('type', TransactionType::PURCHASE_ORDER); }); diff --git a/app/Console/Commands/FixExpiredBookingWithRefundedPaymentTransactionCommand.php b/app/Console/Commands/FixExpiredBookingWithRefundedPaymentTransactionCommand.php new file mode 100644 index 00000000..b8e27996 --- /dev/null +++ b/app/Console/Commands/FixExpiredBookingWithRefundedPaymentTransactionCommand.php @@ -0,0 +1,67 @@ +whereHas('transactions', function ($q) { + $q->where('type', TransactionType::PAYMENT)->where('status', ApprovalStatus::EXPIRED)->whereHas('transactions', function ($q2) { + $q2->where('type', TransactionType::REFUND)->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]); + }); + })->get(); + + foreach ($bookings as $booking) { + $payment_transactions = $booking->transactions()->where('type', TransactionType::PAYMENT)->whereHas('transactions', function ($q2) { + $q2->where('type', TransactionType::REFUND)->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]); + })->get(); + + foreach ($payment_transactions as $payment) { + $payment_original_amount = $payment->original_amount; + $refund_original_amount = $payment->transactions()->where('type', TransactionType::REFUND)->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])->sum('original_amount'); + + if ($payment_original_amount - $refund_original_amount < 0.01) { + $this->info("Updated booking id: $booking->id, payment transaction id: $payment->id, from EXPIRED to REFUNDED"); + + $payment->status = ApprovalStatus::REFUNDED; + $payment->save(); + } + } + } + } +} diff --git a/app/Console/Commands/OneTimeTestVoucherifyEmailCommand.php b/app/Console/Commands/OneTimeTestVoucherifyEmailCommand.php new file mode 100644 index 00000000..377bf052 --- /dev/null +++ b/app/Console/Commands/OneTimeTestVoucherifyEmailCommand.php @@ -0,0 +1,90 @@ +fetchesVoucher = $fetchesVoucher; + $this->generatesEmailVerificationAttempt = $generatesEmailVerificationAttempt; + $this->sendUserVerificationEmail = $sendUserVerificationEmail; + $this->generatesPasswordReset = $generatesPasswordReset; + $this->sendResetPasswordEmail = $sendResetPasswordEmail; + } + + /** + * Execute the console command. + * + * @return mixed + */ + public function handle() + { + try{ //In case voucher got deleted unintentionally + $user = User::where('id', 3974)->first(); //5436, 3974 + + Log::info(json_encode($user)); + $voucher = $this->fetchesVoucher->execute(['code' => Vouchers::WELCOME_50_PERCENT_OFF]); + Log::info(json_encode($voucher)); + if($voucher) SendWelcomeVoucherEmail::dispatch($user, $voucher, 1); + + // $attempt = $this->generatesEmailVerificationAttempt->execute($user); + // $this->sendUserVerificationEmail::dispatch($user, $attempt); + + // $attempt = $this->generatesPasswordReset->execute($user); + // $this->sendResetPasswordEmail::dispatch($user, $attempt); + } + catch(\Exception $e){} + + } + +} diff --git a/app/Console/Commands/UpdateBillGroupAndGroupToIncludeTransferFee.php b/app/Console/Commands/UpdateBillGroupAndGroupToIncludeTransferFee.php index 72a1c8f2..7b3508c7 100644 --- a/app/Console/Commands/UpdateBillGroupAndGroupToIncludeTransferFee.php +++ b/app/Console/Commands/UpdateBillGroupAndGroupToIncludeTransferFee.php @@ -53,15 +53,24 @@ class UpdateBillGroupAndGroupToIncludeTransferFee extends Command { // update group to include transfer fee - $groups = Group::all(); + $groups = Group::where('created_at', '>=', '2024-06-01')->get(); foreach ($groups as $group) { + $group_transfer_fee = 0; + + $morph_transaction = $group->morphTransactions()->where('type', TransactionType::TRANSFER_FEE)->first(); + + if ($morph_transaction) { + $group_transfer_fee = $morph_transaction->original_amount; + } + + $originalTransferFees = (float)Transaction::where('type', TransactionType::TRANSFER_FEE)->whereIn('owner_id', $group->transactions->pluck('id'))->sum('service_charge'); $correctOriginalAmount = $group->transactions()->sum('original_amount'); - $correctOriginalAmount += $originalTransferFees; + $correctOriginalAmount = $correctOriginalAmount + $originalTransferFees + $group_transfer_fee; $correctAmount = $group->transactions()->sum('amount'); $transferFees = $originalTransferFees / $group->currency_rate; - $correctAmount += $transferFees; + $correctAmount = $correctAmount + $transferFees + ($group_transfer_fee / $group->currency_rate) + $group->service_charge; if ($group->original_amount != $correctOriginalAmount || $group->amount != $correctAmount) { $group->original_amount = $correctOriginalAmount; @@ -73,26 +82,26 @@ class UpdateBillGroupAndGroupToIncludeTransferFee extends Command } // update group calculation to include individual group transfer fee - $groups = Group::whereHas('morphTransactions', function ($q) { - $q->where('type', TransactionType::TRANSFER_FEE); - })->get(); + // $groups = Group::whereHas('morphTransactions', function ($q) { + // $q->where('type', TransactionType::TRANSFER_FEE); + // })->get(); - foreach ($groups as $group) { - $route = FacadesRoute::getRoutes()->getByName('api.transaction.group.update'); - $request = Request::create(route('api.transaction.group.update', $group->id)); - $uri = $route->uri; - $request->setRouteResolver(function () use ($request, $uri) { - // Associate Route to request so we can access route parameters. - return (new Route('PUT', $uri, []))->bind($request); - }); + // foreach ($groups as $group) { + // $route = FacadesRoute::getRoutes()->getByName('api.transaction.group.update'); + // $request = Request::create(route('api.transaction.group.update', $group->id)); + // $uri = $route->uri; + // $request->setRouteResolver(function () use ($request, $uri) { + // // Associate Route to request so we can access route parameters. + // return (new Route('PUT', $uri, []))->bind($request); + // }); - $request['rate'] = $group->currency_rate; - $request['supplier_id'] = $group->issuer; - $this->updateGroupLogic->execute($request); + // $request['rate'] = $group->currency_rate; + // $request['supplier_id'] = $group->issuer; + // $this->updateGroupLogic->execute($request); - $group_transfer_fee = $group->morphTransactions()->where('type', TransactionType::TRANSFER_FEE)->first(); - $this->info("updated group id: {$group->id}, added transfer fee to individual white form CNY {$group_transfer_fee->original_amount}"); - } + // $group_transfer_fee = $group->morphTransactions()->where('type', TransactionType::TRANSFER_FEE)->first(); + // $this->info("updated group id: {$group->id}, added transfer fee to individual white form CNY {$group_transfer_fee->original_amount}"); + // } // update bill group calculation to include individual group transfer fee $billGroups = BillGroup::all(); @@ -103,15 +112,16 @@ class UpdateBillGroupAndGroupToIncludeTransferFee extends Command continue; } - $totalOriginal = $billGroup->groups()->sum('original_amount'); - $total = $billGroup->groups()->sum('amount'); + $totalOriginal = round($billGroup->groups()->sum('original_amount'), 2); + $total = round($billGroup->groups()->sum('amount') + $billGroup->service_charge, 2); // update bill group payment transaction amount if there is only 1 payment transaction $payment_transactions = $billGroup->transactions()->whereIn('status', [ApprovalStatus::PENDING_SUBMISSION, ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])->get(); if ($payment_transactions->count() === 1) { $payment_transaction = $payment_transactions->first(); - if ($payment_transaction->amount === $billGroup->amount) { + + if ($payment_transaction->amount - ($billGroup->amount + $billGroup->service_charge) < 0.01) { $payment_transaction->original_amount = $total; $payment_transaction->amount = $total; $payment_transaction->save(); diff --git a/app/Console/Commands/UpdateWrongFullyRefundPaymentReference.php b/app/Console/Commands/UpdateWrongFullyRefundPaymentReference.php new file mode 100644 index 00000000..20ba3360 --- /dev/null +++ b/app/Console/Commands/UpdateWrongFullyRefundPaymentReference.php @@ -0,0 +1,69 @@ +whereDate('created_at', '>=', Carbon::createFromDate(2024, 4, 2))->get(); + + foreach ($transactions as $transaction) { + $booking_marking = trim(explode('.', $transaction->payment_reference)[1]); + $booking = Booking::where('marking', $booking_marking)->first(); + + if ($booking) { + $payments = $booking->transactions()->payments()->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED, ApprovalStatus::REFUNDED])->get(); + + if ($payments->count() === 0) { + $this->info("Booking ID: {$booking->id}, payment not found"); + } else if ($payments->count() > 1) { + $this->info("Booking ID: {$booking->id}, more than 1 payment found"); + } else { + $payment = $payments->first(); + + if (!($payment->amount - $transaction->amount < 0.01)) { + $transaction->payment_reference = str_replace('Fully', 'Partially', $transaction->payment_reference); + $transaction->save(); + $this->info("Updated Payment Reference of Transaction ID: {$transaction->id}, corrected from Fully Refund to Partially Refund"); + } + } + } + } + } +} diff --git a/app/Console/Commands/UpdateWrongGroupCurrencyRate.php b/app/Console/Commands/UpdateWrongGroupCurrencyRate.php new file mode 100644 index 00000000..fbe7245b --- /dev/null +++ b/app/Console/Commands/UpdateWrongGroupCurrencyRate.php @@ -0,0 +1,126 @@ +createsDocument = $createsDocument; + $this->createsFile = $createsFile; + } + + /** + * Execute the console command. + * + * @return int + */ + public function handle() + { + $groups = Group::where('currency_rate', '>', 100)->get(); + + foreach ($groups as $group) { + $transactions = $group->transactions()->get(); + + $rate = DB::table('transaction_logs')->where('transaction_id', $transactions->first()->id)->latest('updated_at')->first()->currency_rate; + + $supplier = $group->issuerCompany; + + foreach ($transactions as $transaction) { + $transaction->currency_rate = $rate; + $transaction->amount = $transaction->original_amount / $rate; + $transaction->save(); + + $supplierRefundTransactions = $transaction->owner->transactions()->supplierRefunds()->whereIn('status', [ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::APPROVED])->get(); + + foreach ($supplierRefundTransactions as $supplierRefundTransaction) { + $claimBefore = $supplierRefundTransaction->transactions()->where('type', TransactionType::BILL_REFUND)->where('status', ApprovalStatus::APPROVED)->exists(); + + if (!$claimBefore) { + $supplierRefundTransaction->currency_rate = $rate; + $supplierRefundTransaction->amount = $supplierRefundTransaction->original_amount / $rate; + $supplierRefundTransaction->save(); + } + } + } + + $group_transfer_fee = $group->morphTransactions()->where('type', TransactionType::TRANSFER_FEE)->first(); + + $group_transfer_fee_original_amount = 0; + + if ($group_transfer_fee) { + $group_transfer_fee_original_amount = $group_transfer_fee->original_amount; + } + + $transferFeeTransactions = $group->transactions()->with([ + 'transactions' => function ($transaction) { + return $transaction->where('type', TransactionType::TRANSFER_FEE); + } + ])->get()->pluck('transactions')->flatten(); + + $group->original_amount = $group->transactions()->sum('original_amount') + ((float)$transferFeeTransactions->sum('service_charge') + (float)$group_transfer_fee_original_amount); + $group->amount = $group->transactions()->sum('amount') + (((float)$transferFeeTransactions->sum('service_charge') + (float)$group_transfer_fee_original_amount) / $rate) + $group->transactions()->sum('service_charge'); + $group->currency_rate = $rate; + $group->tax = $group->transactions()->sum('tax'); + $group->service_charge = $group->transactions()->sum('service_charge'); + + $group->save(); + + $group->documents()->delete(); + + $pdf = LaravelMpdf::loadView('pages.pdfs.currency_vendor_order', ['transactions' => $group->transactions, 'transferFeeTransactions' => $transferFeeTransactions, 'supplier' => $supplier, 'groupTransferFeeOriginalAmount' => $group_transfer_fee_original_amount]); + + $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($group, $object); + $this->createsFile->execute($document, $object); + + $this->info("Group ID: {$group->id} updated to currency rate {$rate}"); + } + } +} diff --git a/app/Http/Controllers/Banks/UpdateBankMetadataController.php b/app/Http/Controllers/Banks/UpdateBankMetadataController.php new file mode 100644 index 00000000..3b89c1ff --- /dev/null +++ b/app/Http/Controllers/Banks/UpdateBankMetadataController.php @@ -0,0 +1,19 @@ +execute($request); + } +} diff --git a/app/Http/Controllers/Bookings/UpdateBookingOrderReferenceController.php b/app/Http/Controllers/Bookings/UpdateBookingOrderReferenceController.php new file mode 100644 index 00000000..64af979e --- /dev/null +++ b/app/Http/Controllers/Bookings/UpdateBookingOrderReferenceController.php @@ -0,0 +1,20 @@ +execute($request); + } + +} \ No newline at end of file diff --git a/app/Http/Controllers/Transactions/CancelBillGroupController.php b/app/Http/Controllers/Transactions/CancelBillGroupController.php new file mode 100644 index 00000000..2eab79c8 --- /dev/null +++ b/app/Http/Controllers/Transactions/CancelBillGroupController.php @@ -0,0 +1,20 @@ +execute($request); + } +} diff --git a/app/Http/Controllers/Vouchers/ListVoucherCampaignsController.php b/app/Http/Controllers/Vouchers/ListVoucherCampaignsController.php new file mode 100644 index 00000000..ad3268e5 --- /dev/null +++ b/app/Http/Controllers/Vouchers/ListVoucherCampaignsController.php @@ -0,0 +1,21 @@ +execute($request); + } + +} diff --git a/app/Http/Resources/BillGroupResource.php b/app/Http/Resources/BillGroupResource.php index 23c8050e..748dc392 100644 --- a/app/Http/Resources/BillGroupResource.php +++ b/app/Http/Resources/BillGroupResource.php @@ -30,6 +30,7 @@ class BillGroupResource extends JsonResource 'original_currency' => new CurrencyResource($this->original_currency), 'issuer_name' => $this->issuerCompany->name, 'issuer_id' => $this->issuerCompany->id, + 'invoice_amount' => (float) $this->amount + $bill_refund_amount - $this->service_charge, 'amount' => (float) $this->amount, 'service_charge' => (float) $this->service_charge, 'currency' => new CurrencyResource($this->currency), @@ -48,12 +49,12 @@ class BillGroupResource extends JsonResource 'type' => (int) $transaction->type, 'bill_no' => $transaction->bill_no, 'payment_method' => (float) $transaction->payment_method, - 'amount' => (double) $transaction->amount, - 'original_amount' => (double) $transaction->original_amount, + 'amount' => (float) $transaction->amount, + 'original_amount' => (float) $transaction->original_amount, 'currency' => new CurrencyResource($transaction->currency), 'original_currency' => new CurrencyResource($transaction->original_currency), - 'service_charge' => (double) $transaction->service_charge, - 'tax' => (double) $transaction->tax, + 'service_charge' => (float) $transaction->service_charge, + 'tax' => (float) $transaction->tax, 'status' => (int) $transaction->status, 'statusText' => ApprovalStatus::APPROVAL_STATUS_ID[(int) $transaction->status], 'documents' => $transaction->documents()->first() ? new DocumentResource($transaction->documents()->first()) : null, @@ -66,12 +67,12 @@ class BillGroupResource extends JsonResource 'type' => (int) $transaction->type, 'bill_no' => $transaction->bill_no, 'payment_method' => (float) $transaction->payment_method, - 'amount' => (double) $transaction->amount, - 'original_amount' => (double) $transaction->original_amount, + 'amount' => (float) $transaction->amount, + 'original_amount' => (float) $transaction->original_amount, 'currency' => new CurrencyResource($transaction->currency), 'original_currency' => new CurrencyResource($transaction->original_currency), - 'service_charge' => (double) $transaction->service_charge, - 'tax' => (double) $transaction->tax, + 'service_charge' => (float) $transaction->service_charge, + 'tax' => (float) $transaction->tax, 'status' => (int) $transaction->status, 'statusText' => ApprovalStatus::APPROVAL_STATUS_ID[(int) $transaction->status], 'updated_at' => Carbon::parse($transaction->updated_at)->format('d-m-Y h:i:s A'), diff --git a/app/Http/Resources/BookingResource.php b/app/Http/Resources/BookingResource.php index 2612c5b4..83e53249 100644 --- a/app/Http/Resources/BookingResource.php +++ b/app/Http/Resources/BookingResource.php @@ -7,6 +7,7 @@ use App\Classes\Modules\Bookings\Services\CalculatesBookingOutstanding; use App\Classes\Modules\Bookings\Services\CalculatesBookingPayableAmount; use App\Classes\Modules\Bookings\Services\CalculatesBookingRefundAmount; use App\Classes\ValueObjects\Constants\ApprovalStatus; +use App\Classes\ValueObjects\Constants\BookingAttributeNames; use App\Classes\ValueObjects\Constants\TransactionType; use App\Classes\ValueObjects\Constants\DocumentType; use Carbon\Carbon; @@ -45,6 +46,12 @@ class BookingResource extends JsonResource 'proforma_invoice' => new DocumentResource($this->documents()->where('document_type', DocumentType::PROFORMA_INVOICE)->whereNotIn('status', [ApprovalStatus::REJECTED, ApprovalStatus::EXPIRED])->orderByDesc('id')->first()), 'ecommerce_purchase_order' => new DocumentResource($this->documents()->where('document_type', DocumentType::ECOMMERCE_PURCHASE_ORDER)->first()), ], + 'order_reference_no' => $this->modelAttributes()->where('name', BookingAttributeNames::ORDER_REFERENCE_NO)->get()->map(function ($attr) { + return [ + 'id' => $attr->id, + 'value' => $attr->value + ]; + }), 'status' => $this->status, 'created_at' => Carbon::parse($this->created_at)->format('d-m-Y'), 'created_at_with_time' => Carbon::parse($this->created_at)->format('d-m-Y h:i:s A'), diff --git a/app/Http/Resources/CompanyResource.php b/app/Http/Resources/CompanyResource.php index aa7022a1..598ed7b5 100644 --- a/app/Http/Resources/CompanyResource.php +++ b/app/Http/Resources/CompanyResource.php @@ -57,7 +57,7 @@ class CompanyResource extends JsonResource 'last_payment' => $lastPayment ? $lastPayment->created_at->diffForHumans() : 'No Payments', 'personal_banks' => BankResource::collection($this->banks->where('type', BankAccountType::PERSONAL)), 'recipient_banks' => [ - 'accounts' => BankResource::collection($this->banks->where('type', BankAccountType::EXTERNAL)), + 'accounts' => BankResource::collection($this->banks->whereIn('type', [BankAccountType::EXTERNAL, BankAccountType::ALIPAY_1688, BankAccountType::ALIPAY_RECIPIENT])->whereIn('creator_type', [null])), 'default' => new BankResource($this->banks->where('type', BankAccountType::EXTERNAL)->where('default', true)->first()) ], 'segments' => SegmentResource::collection($this->segments), diff --git a/app/Http/Resources/PaymentTransactionResource.php b/app/Http/Resources/PaymentTransactionResource.php index 2acf6d78..73748800 100644 --- a/app/Http/Resources/PaymentTransactionResource.php +++ b/app/Http/Resources/PaymentTransactionResource.php @@ -19,9 +19,20 @@ class PaymentTransactionResource extends JsonResource */ public function toArray($request) { - - $booking = in_array((int)$this->type, [TransactionType::BILL, TransactionType::REFUND])? $this->owner->owner : $this->owner; $current_running_balance = $request['running_balance']; + $booking = null; //cief todo: 66 + $bank = null; + //Check if Transaction of type PAYMENT has an override for recipient bank - starts + if(in_array((int)$this->type, [TransactionType::BILL, TransactionType::REFUND])){ + $booking = $this->owner->owner; + $bank = $this->owner->bank ?? $booking->bank; + } + else{ + $booking = $this->owner; + $bank = $this->bank ?? $booking->bank; + } + //Check if Transaction of type PAYMENT has an override for recipient bank - ends + $booking_marking = ''; switch((int) $this->type){ @@ -55,7 +66,7 @@ class PaymentTransactionResource extends JsonResource 'bill_no' => $this->bill_no, 'payment_reference' => $this->payment_reference, 'payment_method' => (float) $this->payment_method, - 'recipient_bank_account' => new BankResource($booking->bank), + 'recipient_bank_account' => new BankResource($bank), 'issuer_name' => $this->issuerCompany->name, 'issuer_id' => $this->issuerCompany->id, 'amount' => (double) $this->amount, diff --git a/app/Http/Resources/TransactionResource.php b/app/Http/Resources/TransactionResource.php index d259d777..e14c32c0 100644 --- a/app/Http/Resources/TransactionResource.php +++ b/app/Http/Resources/TransactionResource.php @@ -19,8 +19,18 @@ class TransactionResource extends JsonResource */ public function toArray($request) { - - $booking = in_array((int)$this->type, [TransactionType::BILL, TransactionType::REFUND, TransactionType::SUPPLIER_REFUND])? $this->owner->owner : $this->owner; + $booking = null; //cief todo: 66 + $bank = null; + //Check if Transaction of type PAYMENT has an override for recipient bank - starts + if(in_array((int)$this->type, [TransactionType::BILL, TransactionType::REFUND, TransactionType::SUPPLIER_REFUND])){ + $booking = $this->owner->owner; + $bank = $this->owner->bank ?? $booking->bank; + } + else{ + $booking = $this->owner; + $bank = $this->bank ?? $booking->bank; + } + //Check if Transaction of type PAYMENT has an override for recipient bank - ends $days = $this->created_at->endOfDay()->addWeekdays($booking->service_id === 3 ? 3 : 1); return [ @@ -30,7 +40,7 @@ class TransactionResource extends JsonResource 'bill_no' => $this->bill_no, 'payment_reference' => $this->payment_reference, 'payment_method' => (float) $this->payment_method, - 'recipient_bank_account' => new BankResource($booking->bank), + 'recipient_bank_account' => new BankResource($bank), 'issuer_name' => $this->issuerCompany->name, 'issuer_id' => $this->issuerCompany->id, 'amount' => (double) ($this->type === TransactionType::SUPPLIER_REFUND ? $this->amount - $this->transactions()->where('type', TransactionType::BILL_REFUND)->where('status', ApprovalStatus::APPROVED)->sum('amount') : $this->amount), @@ -54,7 +64,8 @@ class TransactionResource extends JsonResource 'duration' => $days->diff(Carbon::now())->format('%d'), ], 'remarks' => RemarkResource::collection($this->remarks), - 'redemption' => new VoucherRedemptionResource($this->voucherRedemption) + 'redemption' => new VoucherRedemptionResource($this->voucherRedemption), + 'bank' => ((int) $this->type === TransactionType::PAYMENT) ? new BankResource($bank) : null, //When a transaction (of type payment) has an override recipient bank details on booking, this is NOT null ]; } } diff --git a/app/Http/Resources/UserRewardResource.php b/app/Http/Resources/UserRewardResource.php index b988a1d3..25080270 100644 --- a/app/Http/Resources/UserRewardResource.php +++ b/app/Http/Resources/UserRewardResource.php @@ -17,7 +17,7 @@ class UserRewardResource extends JsonResource { $emailReminder = null; if ($request->has('isAdmin')) { - $keyValuePairs = $this->user->attributes()->get(); + $keyValuePairs = $this->user->attributesKVP()->get(); $emailReminder = KeyValueBasicResource::collection($keyValuePairs); $this->voucher->email = $emailReminder; } diff --git a/app/Http/Resources/V2/CompanyV2Resource.php b/app/Http/Resources/V2/CompanyV2Resource.php index 11eff32f..9ab5f9e3 100644 --- a/app/Http/Resources/V2/CompanyV2Resource.php +++ b/app/Http/Resources/V2/CompanyV2Resource.php @@ -74,7 +74,7 @@ class CompanyV2Resource extends JsonResource 'last_payment' => $lastPayment ? $lastPayment->created_at->diffForHumans() : 'No Payments', 'personal_banks' => V1\BankResource::collection($this->banks->where('type', BankAccountType::PERSONAL)), 'recipient_banks' => [ - 'accounts' => V1\BankResource::collection($this->banks->where('type', BankAccountType::EXTERNAL)), + 'accounts' => V1\BankResource::collection($this->banks->where('type', BankAccountType::EXTERNAL)->whereIn('creator_type', [null])), 'default' => new V1\BankResource($this->banks->where('type', BankAccountType::EXTERNAL)->where('default', true)->first()) ], 'segments' => V1\SegmentResource::collection($this->segments), diff --git a/app/Http/Resources/V2/ListTransactionJobResource.php b/app/Http/Resources/V2/ListTransactionJobResource.php index df4bbd2d..6a0f23d3 100644 --- a/app/Http/Resources/V2/ListTransactionJobResource.php +++ b/app/Http/Resources/V2/ListTransactionJobResource.php @@ -18,8 +18,18 @@ class ListTransactionJobResource extends JsonResource */ public function toArray($request) { - - $booking = in_array((int)$this->type, [TransactionType::BILL, TransactionType::REFUND])? $this->owner->owner : $this->owner; + $booking = null; //cief todo: 66 + $bank = null; + //Check if Transaction of type PAYMENT has an override for recipient bank - starts + if(in_array((int)$this->type, [TransactionType::BILL, TransactionType::REFUND])){ + $booking = $this->owner->owner; + $bank = $this->owner->bank ?? $booking->bank; + } + else{ + $booking = $this->owner; + $bank = $this->bank ?? $booking->bank; + } + //Check if Transaction of type PAYMENT has an override for recipient bank - ends $days = $this->created_at->endOfDay()->addWeekdays($booking->service_id === 3 ? 3 : 1); $transactionBillQuery = $this->when((int) $this->type === TransactionType::PAYMENT, $this->transactions()->bills()->first()); @@ -46,7 +56,7 @@ class ListTransactionJobResource extends JsonResource 'bill_no' => $this->bill_no, 'payment_reference' => $this->payment_reference, 'payment_method' => (float) $this->payment_method, - 'recipient_bank_account' => new V1\BankResource($booking->bank), + 'recipient_bank_account' => new V1\BankResource($bank), 'issuer_name' => $this->issuerCompany->name, 'issuer_id' => $this->issuerCompany->id, 'amount' => (double) $this->amount, diff --git a/app/Http/Resources/VoucherCampaignResource.php b/app/Http/Resources/VoucherCampaignResource.php new file mode 100644 index 00000000..ebc6964c --- /dev/null +++ b/app/Http/Resources/VoucherCampaignResource.php @@ -0,0 +1,32 @@ +has('include_metadata')) { + $metadata = KeyValueBasicResource::collection($this->attributesKVP()->latest()->get()); + } + + return [ + // 'id' => $this->id, + 'campaign_id' => $this->campaign_id, + 'name' => $this->name, + 'description' => $this->description, + 'limit_per_month' => $this->limit_per_month, + 'metadata' => $metadata + ]; + } +} diff --git a/app/Models/Bank.php b/app/Models/Bank.php index 3b0bb915..42cdf3df 100644 --- a/app/Models/Bank.php +++ b/app/Models/Bank.php @@ -7,6 +7,8 @@ use Illuminate\Database\Eloquent\Relations\HasOne; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\MorphMany; +use App\Classes\General\Interfaces\KeyValueInterface; /** * Class Bank @@ -21,10 +23,29 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; * @property int default * @property int status */ -class Bank extends AbstractModel +class Bank extends AbstractModel implements KeyValueInterface { use SoftDeletes; - + + /** + * + * @var array + */ + protected $fillable = [ + 'company_id', + 'reference', + 'bank_name', + 'holder_name', + 'account_no', + 'bank_branch', + 'swift', + 'snap', + 'type', + 'country_id', + 'created_by', + 'creator_type', + ]; + protected $table = 'banks'; /** @@ -42,7 +63,7 @@ class Bank extends AbstractModel { return $this->BelongsTo(Company::class, 'company_id', 'id'); } - + /** * @return HasMany */ @@ -50,4 +71,12 @@ class Bank extends AbstractModel { return $this->HasMany(Transaction::class, 'recipient_bank_account_id'); } + + /** + * @return MorphMany + */ + public function attributesKVP(): MorphMany + { + return $this->morphMany(KeyValuePair::class, 'owner'); + } } diff --git a/app/Models/Booking.php b/app/Models/Booking.php index ca80d0c3..ff0b45b9 100644 --- a/app/Models/Booking.php +++ b/app/Models/Booking.php @@ -107,6 +107,11 @@ class Booking extends AbstractModel implements Documentable, Transactionable return $this->hasManyDeep(Transaction::class, [Transaction::class.' as alias'], [['owner_type', 'owner_id'], ['owner_type', 'owner_id']], [null, null]); } + public function modelAttributes(): MorphMany + { + return $this->morphMany(ModelAttribute::class, 'owner'); + } + protected static function booted() { if (auth()->user()) { diff --git a/app/Models/KeyValuePair.php b/app/Models/KeyValuePair.php index 3ad6d6cd..8f8ddec8 100644 --- a/app/Models/KeyValuePair.php +++ b/app/Models/KeyValuePair.php @@ -2,10 +2,14 @@ namespace App\Models; use Illuminate\Database\Eloquent\Relations\MorphTo; - +use Illuminate\Database\Eloquent\SoftDeletes; class KeyValuePair extends AbstractModel { + use SoftDeletes; + + protected $dates = ['deleted_at']; + protected $table = 'key_value_pairs'; public function owner(): MorphTo diff --git a/app/Models/ModelAttribute.php b/app/Models/ModelAttribute.php new file mode 100644 index 00000000..bbd3511c --- /dev/null +++ b/app/Models/ModelAttribute.php @@ -0,0 +1,27 @@ + "array" + ]; + + public function owner(): morphTo + { + return $this->morphTo(); + } + +} diff --git a/app/Models/Transaction.php b/app/Models/Transaction.php index 31b67e69..c84c0238 100644 --- a/app/Models/Transaction.php +++ b/app/Models/Transaction.php @@ -3,6 +3,7 @@ namespace App\Models; use App\Classes\General\Interfaces\Documentable; +use App\Classes\General\Interfaces\KeyValueInterface; use App\Classes\General\Interfaces\Remarkable; use App\Classes\General\Interfaces\Transactionable; use App\Classes\General\Interfaces\Voucherifiable; @@ -22,7 +23,7 @@ use Staudenmeir\EloquentHasManyDeep\HasTableAlias; use App\Models\StatementTransactionOwner; -class Transaction extends AbstractModel implements Documentable, Transactionable, Voucherifiable, Remarkable +class Transaction extends AbstractModel implements Documentable, Transactionable, Voucherifiable, Remarkable, KeyValueInterface { use HasTableAlias; use SoftDeletes; @@ -268,4 +269,25 @@ class Transaction extends AbstractModel implements Documentable, Transactionable return $this->morphMany(Remark::class, 'owner'); } + /** + * @return MorphMany + */ + public function attributesKVP(): MorphMany + { + return $this->morphMany(KeyValuePair::class, 'owner'); + } + + /** + * + * @return Model|null + */ + public function getBankAttribute() + { + $keyValuePairs = $this->attributesKVP()->where('key', 'App\Models\Bank')->latest()->first(); + if($keyValuePairs){ + $bank = Bank::where('id', $keyValuePairs->value)->first(); + return $bank; + } + return null; + } } diff --git a/app/Models/User.php b/app/Models/User.php index 7e0a4aa9..46e8635f 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -106,7 +106,7 @@ class User extends AbstractModel implements public function hasAttribute(string $key, $value = null): bool { - $query = $this->attributes()->where('key', $key); + $query = $this->attributesKVP()->where('key', $key); if ($value !== null) { $query->where('value', $value); @@ -116,7 +116,7 @@ class User extends AbstractModel implements } - public function attributes(): MorphMany + public function attributesKVP(): MorphMany { return $this->morphMany(KeyValuePair::class, 'owner'); } diff --git a/app/Models/Voucher.php b/app/Models/Voucher.php index b8df7dca..49001e1d 100644 --- a/app/Models/Voucher.php +++ b/app/Models/Voucher.php @@ -2,6 +2,7 @@ namespace App\Models; +use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\HasMany; @@ -14,6 +15,14 @@ class Voucher extends AbstractModel */ public function redemptions(): HasMany { - return $this->HasMany(VoucherRedemption::class, 'voucher_id', 'id'); + return $this->hasMany(VoucherRedemption::class, 'voucher_id', 'id'); + } + + /** + * @return BelongsTo + */ + public function campaign(): BelongsTo + { + return $this->belongsTo(VoucherCampaign::class, 'voucher_campaign_id'); } } diff --git a/app/Models/VoucherCampaign.php b/app/Models/VoucherCampaign.php new file mode 100644 index 00000000..4e14cc12 --- /dev/null +++ b/app/Models/VoucherCampaign.php @@ -0,0 +1,29 @@ +hasMany(Voucher::class, 'voucher_campaign_id'); + } + + /** + * @return MorphMany + */ + public function attributesKVP(): MorphMany + { + return $this->morphMany(KeyValuePair::class, 'owner'); + } +} diff --git a/database/migrations/2024_07_14_175408_create_model_attributes_table.php b/database/migrations/2024_07_14_175408_create_model_attributes_table.php new file mode 100644 index 00000000..f05f6f8f --- /dev/null +++ b/database/migrations/2024_07_14_175408_create_model_attributes_table.php @@ -0,0 +1,24 @@ +id(); + $table->morphs('owner'); + $table->string('name'); + $table->json('value'); + $table->timestamps(); + }); + } + + public function down() + { + Schema::dropIfExists('model_attributes'); + } +} diff --git a/database/migrations/2024_07_15_194853_create_voucher_campaigns_table.php b/database/migrations/2024_07_15_194853_create_voucher_campaigns_table.php new file mode 100644 index 00000000..f02685d6 --- /dev/null +++ b/database/migrations/2024_07_15_194853_create_voucher_campaigns_table.php @@ -0,0 +1,37 @@ +id(); + $table->string('campaign_id'); + $table->string('name'); + $table->string('slug')->unique(); + $table->text('description')->nullable(); + $table->integer('limit_per_month')->default(0); + $table->boolean('is_display')->default(false); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('voucher_campaigns'); + } +} diff --git a/database/migrations/2024_07_15_195005_add_voucher_campaign_id_to_vouchers_table.php b/database/migrations/2024_07_15_195005_add_voucher_campaign_id_to_vouchers_table.php new file mode 100644 index 00000000..80c5b5a9 --- /dev/null +++ b/database/migrations/2024_07_15_195005_add_voucher_campaign_id_to_vouchers_table.php @@ -0,0 +1,33 @@ +foreignId('voucher_campaign_id')->nullable()->constrained('voucher_campaigns')->onDelete('set null'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('vouchers', function (Blueprint $table) { + $table->dropForeign(['voucher_campaign_id']); + $table->dropColumn('voucher_campaign_id'); + }); + } +} diff --git a/database/migrations/2024_07_25_205651_add_created_by_and_creator_type_to_banks_table.php b/database/migrations/2024_07_25_205651_add_created_by_and_creator_type_to_banks_table.php new file mode 100644 index 00000000..1d99906f --- /dev/null +++ b/database/migrations/2024_07_25_205651_add_created_by_and_creator_type_to_banks_table.php @@ -0,0 +1,35 @@ +unsignedBigInteger('created_by')->nullable()->after('country_id'); + $table->unsignedInteger('creator_type')->nullable()->after('created_by'); // 'admin' or 'customer', see RoleTypes.php for more + $table->foreign('created_by')->references('id')->on('users')->onDelete('set null'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('banks', function (Blueprint $table) { + $table->dropForeign(['created_by']); + $table->dropColumn(['created_by', 'creator_type']); + }); + } +} diff --git a/database/migrations/2024_07_31_212359_add_deleted_at_to_key_value_pairs.php b/database/migrations/2024_07_31_212359_add_deleted_at_to_key_value_pairs.php new file mode 100644 index 00000000..df64b4a8 --- /dev/null +++ b/database/migrations/2024_07_31_212359_add_deleted_at_to_key_value_pairs.php @@ -0,0 +1,32 @@ +softDeletes(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('key_value_pairs', function (Blueprint $table) { + $table->dropSoftDeletes(); + }); + } +} diff --git a/database/seeds/AdminUserPermissionsTableSeeder.php b/database/seeds/AdminUserPermissionsTableSeeder.php index 0c3d5acf..ee86dc8a 100644 --- a/database/seeds/AdminUserPermissionsTableSeeder.php +++ b/database/seeds/AdminUserPermissionsTableSeeder.php @@ -71,6 +71,10 @@ class AdminUserPermissionsTableSeeder extends Seeder ['name' => 'delete milestone', 'guard_name' => 'web'], ['name' => 'delete reward', 'guard_name' => 'web'], + ['name' => 'add voucher', 'guard_name' => 'web'], + ['name' => 'list voucher campaigns', 'guard_name' => 'web'], + + ['name' => 'update bank_metadata', 'guard_name' => 'web'], ]; foreach ($permissions as $permission){ diff --git a/public/images/alipay_logo.png b/public/images/alipay_logo.png new file mode 100644 index 00000000..5bd88d72 Binary files /dev/null and b/public/images/alipay_logo.png differ diff --git a/resources/assets/vue/components/banks/elements/BankAccountComponent.vue b/resources/assets/vue/components/banks/elements/BankAccountComponent.vue index 0585e4aa..54d01e04 100644 --- a/resources/assets/vue/components/banks/elements/BankAccountComponent.vue +++ b/resources/assets/vue/components/banks/elements/BankAccountComponent.vue @@ -11,7 +11,7 @@